§
    éƒtj%  ã                  ó’   — d Z ddlmZ ddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZ d d
„Zd d„Zd!d„Zd"d„Zd#d„Zd$d„ZdS )%z)Persist structured FDI extracts into SQL.é    )ÚannotationsN)ÚdatetimeÚtimezone)ÚAny)Úget_connection)ÚStructuredExtractÚreturnÚstrc                 ób   — t          j        t          j        ¦  «                             ¦   «         S ©N)r   Únowr   ÚutcÚ	isoformat© ó    ú)/var/www/html/CA-Chatbot/app/fdi/store.pyÚ_nowr      s    € ÝŒ<�œÑ%Ô%×/Ò/Ñ1Ô1Ð1r   c                 óB   — t          t          j        ¦   «         ¦  «        S r   )r
   ÚuuidÚuuid4r   r   r   Ú_uidr      s   € Ý�tŒz‰|Œ|ÑÔÐr   Únamec                óz   — t          j        dd| pd                     ¦   «                              ¦   «         ¦  «        S )Nú\s+Ú Ú )ÚreÚsubÚstripÚlower)r   s    r   Ú_norm_aliasr!      s2   € ÝŒ6�&˜#  
¨×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;Ñ<Ô<Ð<r   Úconnr   Úorg_idÚentity_typec           
     ó  — t          |¦  «        }|st          d¦  «        ‚|                      d||f¦  «                             ¦   «         }|r2t	          t          |t          ¦  «        r|d         n|d         ¦  «        S t          ¦   «         }t          ¦   «         }t          j
        dd|                     ¦   «         ¦  «        }|                      d||||d|f¦  «         |                      d	t          ¦   «         |||d
d|f¦  «         |S )z1Find or create entity by alias; return entity_id.zempty entity namez¤
        SELECT e.id FROM fdi_entities e
        JOIN fdi_entity_aliases a ON a.entity_id = e.id
        WHERE a.org_id = ? AND a.alias = ?
        LIMIT 1
        Úidr   r   r   z’
        INSERT INTO fdi_entities(id, org_id, entity_type, canonical_name, attributes_json, created_at)
        VALUES (?, ?, ?, ?, ?, ?)
        Nz�
        INSERT INTO fdi_entity_aliases(id, org_id, entity_id, alias, source, weight, created_at)
        VALUES (?, ?, ?, ?, ?, ?, ?)
        Úextractg      ð?)r!   Ú
ValueErrorÚexecuteÚfetchoner
   Ú
isinstanceÚdictr   r   r   r   r   )	r"   r#   r$   r   ÚaliasÚrowÚ	entity_idr   Ú	canonicals	            r   Úupsert_entityr1      s   € å˜ÑÔ€EØð .ÝÐ,Ñ-Ô-Ð-Ø
�,Š,ð	ð 
�ˆñô ÷ ‚h�j„jð ð ð CÝ¥
¨3µÑ 5Ô 5ÐA�3�t”9�9¸3¸q¼6ÑBÔBÐBå‘”€IÝ
‰&Œ&€CÝ”�v˜s D§J¢J¡L¤LÑ1Ô1€IØ‡L‚Lð	ð 
�F˜K¨°D¸#Ð>ñô ð ð 	‡L‚Lð	õ 
‰Œ�˜ E¨9°c¸3Ð?ñô ð ð Ðr   Údocument_idÚNonec                ó¾   — |                       d|f¦  «         |                       d|f¦  «         |                       d|f¦  «         |                       d|f¦  «         d S )Nz0DELETE FROM fdi_line_items WHERE document_id = ?z1DELETE FROM fdi_identifiers WHERE document_id = ?z0DELETE FROM fdi_assertions WHERE document_id = ?z2DELETE FROM fdi_entity_links WHERE document_id = ?)r)   )r"   r2   s     r   Údelete_document_datar5   @   sd   € Ø‡L‚LÐCÀkÀ^ÑTÔTÐTØ‡L‚LÐDÀ{ÀnÑUÔUÐUØ‡L‚LÐCÀkÀ^ÑTÔTÐTØ‡L‚LÐEÈÀ~ÑVÔVÐVÐVÐVr   Úagent_idÚ	kb_doc_idÚfilenameÚstorage_uriú
str | NoneÚsha256Ú	mime_typer'   r   c                óÂ  — t          ¦   «         }t          ¦   «         5 }	|	                     d|f¦  «                             ¦   «         }
|
r2t	          t          |
t          ¦  «        r|
d         n|
d         ¦  «        nt          ¦   «         }|
ržt          |	|¦  «         |	                     d|||||j	        |j
        d|j        |j        rdnd|j        |j        |j        |j        |j        |j        |j        |j        r"d                     |j        ¦  «        dd	…         nd||f¦  «         n‘|	                     d
|| |||||||j	        |j
        d|j        |j        rdnd|j        |j        |j        |j        |j        |j        |j        |j        r"d                     |j        ¦  «        dd	…         nd||f¦  «         i }|j        D ]0\  }}t/          |¦  «        }|sŒ||vrt1          |	| ||¦  «        ||<   Œ1|j        D ]ð}d}|j        rGt/          |j        ¦  «        }||vrt1          |	| d|j        ¦  «        ||<   |                     |¦  «        }|	                     dt          ¦   «         | ||j        |j        |j        d|j        |j         |j!        |j"        |j#        |j$        |j%        |j&        |d|j'        |j(        |j)        rtU          j+        |j)        ¦  «        nd|j,        |f¦  «         Œñ|j-        D ]Y}|	                     dt          ¦   «         | ||j.        |j/        |j0        |j1        |j2        |j&        |j3        |j,        d|f¦  «         ŒZ|j4        D ]A}|	                     dt          ¦   «         | |d|j5        |j6        |j7        |j,        |f	¦  «         ŒB	 ddd¦  «         n# 1 swxY w Y   	 ddl8m9}m:}  || ¦  «          || |¦  «         n# tv          $ r Y nw xY w|S )zNReplace any prior FDI rows for this kb_doc and write a fresh structured index.z8SELECT id FROM fdi_documents WHERE kb_doc_id = ? LIMIT 1r&   r   aÏ  
                UPDATE fdi_documents SET
                    filename=?, storage_uri=?, sha256=?, mime_type=?,
                    doc_type=?, doc_type_confidence=?, status=?,
                    page_count=?, ocr_used=?, parse_confidence=?,
                    currency_primary=?, period_start=?, period_end=?,
                    issuer_name=?, holder_name=?, source_type=?, error=?,
                    indexed_at=?
                WHERE id=?
                Úreadyé   z; NiÐ  aà  
                INSERT INTO fdi_documents(
                    id, org_id, agent_id, kb_doc_id, filename, storage_uri, sha256, mime_type,
                    doc_type, doc_type_confidence, status, page_count, ocr_used, parse_confidence,
                    currency_primary, period_start, period_end, issuer_name, holder_name,
                    source_type, error, created_at, indexed_at
                ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
                ÚmerchantaÝ  
                INSERT INTO fdi_line_items(
                    id, org_id, document_id, page_no, row_idx, event_date, posting_date,
                    description_raw, description_norm, amount, debit, credit, balance_after,
                    direction, currency, counterparty_entity_id, account_entity_id, category,
                    event_class, extras_json, confidence, created_at
                ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
                a  
                INSERT INTO fdi_assertions(
                    id, org_id, document_id, kind, label, value_numeric, value_text,
                    unit, currency, source, confidence, evidence_json, created_at
                ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)
                zñ
                INSERT INTO fdi_identifiers(
                    id, org_id, document_id, line_item_id, id_type, value_raw, value_norm,
                    confidence, created_at
                ) VALUES (?,?,?,?,?,?,?,?,?)
                )Úensure_seed_aliasesÚrelink_line_counterparties)<r   r   r)   r*   r
   r+   r,   r   r5   Údoc_typeÚdoc_type_confidenceÚ
page_countÚocr_usedÚparse_confidenceÚcurrency_primaryÚperiod_startÚ
period_endÚissuer_nameÚholder_nameÚsource_typeÚwarningsÚjoinÚpartiesr!   r1   ÚlinesÚcounterparty_nameÚgetÚpage_noÚrow_idxÚ
event_dateÚdescription_rawÚdescription_normÚamountÚdebitÚcreditÚbalance_afterÚ	directionÚcurrencyÚcategoryÚevent_classÚextrasÚjsonÚdumpsÚ
confidenceÚ
assertionsÚkindÚlabelÚvalue_numericÚ
value_textÚunitÚsourceÚidentifiersÚid_typeÚ	value_rawÚ
value_normÚapp.fdi.entitiesrA   rB   Ú	Exception)r#   r6   r7   r8   r9   r;   r<   r'   r   r"   ÚexistingÚdoc_idÚname_to_entityÚetyper   ÚkeyÚlineÚcp_idÚcp_keyÚ	assertionÚidentrA   rB   s                          r   Úpersist_structuredr|   G   s"  € õ ‰&Œ&€CÝ	Ñ	Ô	ð n˜TØ—<’<ØFØˆLñ
ô 
÷ Š(‰*Œ*ð 	ð X`Ðk•¥z°(½DÑ'AÔ'AÐR�X˜d”^�^ÀxÐPQÄ{ÑSÔSÐSÕeiÑekÔekˆàð F	Ý   vÑ.Ô.Ð.Ø�LŠLð	ð ØØØØÔ$ØÔ/ØØÔ&Ø Ô)Ð0�A�A¨qØÔ,ØÔ,ØÔ(ØÔ&ØÔ'ØÔ'ØÔ'Ø:AÔ:JÐT�D—I’I˜gÔ.Ñ/Ô/°°°Ô6Ð6ÐPTØØð'ñ ô  ð  ð  ðD �LŠLðð ØØØØØØØØÔ$ØÔ/ØØÔ&Ø Ô)Ð0�A�A¨qØÔ,ØÔ,ØÔ(ØÔ&ØÔ'ØÔ'ØÔ'Ø:AÔ:JÐT�D—I’I˜gÔ.Ñ/Ô/°°°Ô6Ð6ÐPTØØð/ñ"ô "ð "ðJ *,ˆØ"œ?ð 	Oð 	O‰KˆE�4Ý˜dÑ#Ô#ˆCØð ØØ˜.Ð(Ð(Ý&3°D¸&À%ÈÑ&NÔ&N�˜sÑ#øà”Mð (	ð (	ˆDØˆEØÔ%ð 3Ý$ TÔ%;Ñ<Ô<�Ø Ð/Ð/Ý-:¸4ÀÈÐUYÔUkÑ-lÔ-l�N 6Ñ*Ø&×*Ò*¨6Ñ2Ô2�Ø�LŠLðõ ‘F”FØØØ”LØ”LØ”OØØÔ(ØÔ)Ø”KØ”JØ”KØÔ&Ø”NØ”MØØØ”MØÔ$Ø/3¬{ÐD•D”J˜tœ{Ñ+Ô+Ð+ÀØ”OØð-ñ!ô !ð !ð !ðF !Ô+ð 	ð 	ˆIØ�LŠLðõ ‘F”FØØØ”NØ”OØÔ+ØÔ(Ø”NØÔ&ØÔ$ØÔ(ØØðñô ð ð ð0 Ô(ð 	ð 	ˆEØ�LŠLðõ ‘F”FØØØØ”MØ”OØÔ$ØÔ$Øð
ñô ð ð ð	ðwnð nð nñ nô nð nð nð nð nð nð nøøøð nð nð nð nðbØTÐTÐTÐTÐTÐTÐTÐTàÐ˜FÑ#Ô#Ð#Ø"Ð" 6¨6Ñ2Ô2Ð2Ð2øÝð ð ð Øˆðøøøð €Ms$   �M9N#Î#N'Î*N'Î/O Ï
OÏO)r	   r
   )r   r
   r	   r
   )
r"   r   r#   r
   r$   r
   r   r
   r	   r
   )r"   r   r2   r
   r	   r3   )r#   r
   r6   r
   r7   r
   r8   r
   r9   r:   r;   r:   r<   r:   r'   r   r	   r
   )Ú__doc__Ú
__future__r   rb   r   r   r   r   Útypingr   Úapp.databaser   Úapp.fdi.extractr   r   r   r!   r1   r5   r|   r   r   r   ú<module>r‚      s  ðØ /Ð /à "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð à 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø -Ð -Ð -Ð -Ð -Ð -ð2ð 2ð 2ð 2ðð ð ð ð=ð =ð =ð =ð"ð "ð "ð "ðJWð Wð Wð WðFð Fð Fð Fð Fð Fr   