Ë
    éƒtjûž  ã                  óâ  — U d Z ddlmZ ddlZddlmZ ddlmZ d,d„Zd,d„Z	d,d„Z
d	d
œ	 	 	 	 	 d-d„Zd.d„Zddœ	 	 	 	 	 	 	 d/d„Zddœ	 	 	 	 	 d0d„Zd1d„Zd	ddœ	 	 	 	 	 	 	 d2d„Zd3d„Z ej$                  d«      Zg d¢Zded<    ej$                  d«      Z ej$                  d«      Z ej$                  d«      Z ej$                  d«      Zd4d„Zg Zded<   eD ]q  \  ZZeD ]g  Zej?                  d «      jA                  «       jC                  «       Z"e"r  e#e"«      d!k  se"d"v se"jI                  e«      rŒSejK                  e"ee"ff«       Œi Œs d5d#„Z&d5d$„Z'd6d%„Z(d7d&„Z)d8d'„Z*d8d(„Z+d9d:d)„Z,d3d*„Z-d3d+„Z.y);z8Validation and calculation for confirmed PDF line items.é    )ÚannotationsN)ÚCounter)ÚAnyc                ó¾   — | j                  d«      �t        | d   «      S | j                  d«      �t        | d   «      S | j                  d«      �t        | d   «      S y)NÚdebitÚcreditÚamountç        ©ÚgetÚfloat©Úrows    ú(/var/www/html/CA-Chatbot/app/pdf/calc.pyÚ
_amount_ofr   
   s_   € Ø
‡w�wˆwÓÐ#Ü�S˜‘\Ó"Ð"Ø
‡w�wˆxÓÐ$Ü�S˜‘]Ó#Ð#Ø
‡w�wˆxÓÐ$Ü�S˜‘]Ó#Ð#Øó    c                ó   — | j                  d«      �t        t        | d   «      «      S | j                  d«      €0| j                  d«      �	 t        | d   «      }|dk  rt        |«      S y# t        t        f$ r Y yw xY w)z&Withdrawals / debits from the account.r   r   r	   r
   r   ©r   Úabsr   Ú	TypeErrorÚ
ValueError©r   Úvals     r   Ú
_money_outr      sƒ   € à
‡w�wˆwÓÐ#Ü”5˜˜W™Ó&Ó'Ð'à
‡w�wˆxÓÐ  S§W¡W¨XÓ%6Ð%Bð	Ü˜˜H™Ó&ˆCð �Š7Ü�s“8ˆOØøô	 œ:Ð&ò 	Ùð	ús   ÁA+ Á+A=Á<A=c                óî   — | j                  d«      �t        t        | d   «      «      S | j                  d«      €'| j                  d«      �	 t        | d   «      }|dkD  r|S y# t        t        f$ r Y yw xY w)z$Deposits / credits into the account.r   r   r	   r
   r   r   r   s     r   Ú	_money_inr   #   s   € à
‡w�wˆxÓÐ$Ü”5˜˜X™Ó'Ó(Ð(Ø
‡w�wˆwÓÐ C§G¡G¨HÓ$5Ð$Að	Ü˜˜H™Ó&ˆCð �Š7ØˆJØøô	 œ:Ð&ò 	Ùð	ús   ÁA" Á"A4Á3A4Úunknown©Údocument_kindc               ó2  ‡— g }| s|j                  d«       d|ddœS d}t        | d¬«      D ]6  \  }Št        ˆfd„dD «       «      }|rŒ|dz  }|j                  d	|› d
�«       Œ8 t        d„ | D «       «      }t        d„ | D «       «      }t        d„ | D «       «      }d}	|dk(  rd}	n3|r1|r/|r-t	        ||z
  «      dkD  rd}	|j                  d|d›d|d›d�«       |dk(  xr |	}
|
|t        | «      t        |d«      t        |d«      |dk(  rd |dœS |r|	|dœS d |dœS )NzNo line items to validate.Fr   )ÚokÚissuesÚ	row_counté   )Ústartc              3  óD   •K  — | ]  }‰j                  |«      d u–— Œ y ­w©N©r   ©Ú.0Úkr   s     €r   Ú	<genexpr>z validate_rows.<locals>.<genexpr>=   s!   øè ø€ ÐTÑ6S°�c—g‘g˜a“j¨Ô,Ñ6Sùs   ƒ ©r   r   r	   zRow z has no numeric amount.c              3  ó\   K  — | ]$  }|j                  d «      €Œt        |d    «      –— Œ& y­w)r   Nr   ©r*   Úrs     r   r,   z validate_rows.<locals>.<genexpr>B   s'   è ø€ ÐO©D q°A·E±E¸'³NÑ4N”�q˜‘z×"©Dùó   ‚,™,c              3  ó\   K  — | ]$  }|j                  d «      €Œt        |d    «      –— Œ& y­w)r   Nr   r/   s     r   r,   z validate_rows.<locals>.<genexpr>C   s'   è ø€ ÐR©d¨°a·e±e¸H³oÑ6Q”%˜˜(™×$©dùr1   c              3  ól   K  — | ],  }|j                  d «      duxs |j                  d«      du–— Œ. y­w)r   Nr   r(   r/   s     r   r,   z validate_rows.<locals>.<genexpr>D   s5   è ø€ ÐYÑTXÈq�—‘�w“ tÐ+ÒJ¨q¯u©u°X«ÀdÐ/JÓJÑTXùs   ‚24TÚbank_statementg{®Gáz„?zDebits (z.2fz) and credits (z) do not balance.é   ©r!   r"   r#   Údebit_totalÚcredit_totalÚbalancedr   )ÚappendÚ	enumerateÚanyÚsumr   ÚlenÚround)Úrowsr   r"   Úmissing_amountÚiÚhas_numÚdebitsÚcreditsÚhas_dcÚ
balance_okr!   r   s              @r   Úvalidate_rowsrH   1   sr  ø€ ð
 €FÙØ�‰Ð2Ô3Ø v¸AÑ>Ð>à€NÜ˜D¨×*‰ˆˆ3ÜÓTÑ6SÓTÓTˆÚØ˜aÑˆNØ�M‰M˜D  Ð#:Ð;Õ<ð	 +ô ÑO©DÓOÓO€FÜÑR©dÓRÓR€GÜÑYÑTXÓYÓY€Fð €JØÐ(Ò(Ø‰
Ù	‘F™wÜˆv˜ÑÓ  4Ò'ØˆJØ�M‰MØ˜6 #˜, o°g¸c°]ÐBSÐTôð 
˜1Ñ	Ò	+ €Bð ØÜ˜“YÜ˜V QÓ'Ü˜g qÓ)Ø)Ð-=Ò=�Dð 'ñ
ð 
ñ !ˆJà&ñ
ð 
ð '+à&ñ
ð 
r   c                óz   ‡— | xs dj                  «       Šg d¢}|D ]  \  }}t        ˆfd„|D «       «      sŒ|c S  y)NÚ ))Ú	groceries)ú# groceriesÚgroceryÚzeptoÚ	instamartÚ	bigbasketÚblinkit)Úfood)ú# foodÚzomatoÚswiggyÚ
restaurant)Útaxi)ú# taxiÚuberÚola)Úbills)ú# billÚrechargeúbill payment)zsalary / payroll)ÚsalaryÚpayrollÚwageÚstipend)zupi / digital pay)ÚupiÚgpayÚphonepeÚpaytmÚbhim)zneft / imps / rtgs)ÚneftÚimpsÚrtgs)z
atm / cash)Úatmzcash wdlzcash withdrawal)z
card spend)ÚposÚvisaÚ
mastercardÚcard)Úcheque)rp   ÚchqÚcheck)zinterest / charges)ÚinterestÚchargeÚfeeÚgstÚpenalty)Útransfer)rx   ÚtfrÚselfc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr'   © )r*   r+   Úds     €r   r,   z"_rough_category.<locals>.<genexpr>q   s   øè ø€ Ð$™t˜!ˆq�AŒv™tùó   ƒÚother)Úlowerr<   )ÚdescriptionÚrulesÚlabelÚkeysr}   s       @r   Ú_rough_categoryr…   `   sE   ø€ Ø	Ò	˜×!Ñ!Ó#€Aò€Eó ‰ˆˆtÜÓ$™tÓ$Õ$ØŠLð ð r   ©Ústatement_totalsc               óø	  — g }| D ]‰  }g }dD ];  }|j                  |«      €Œ	 |j                  t        t        ||   «      «      «       Œ= |rt        |«      dkD  rŒV|r!t        |«      dk\  rt        d„ |D «       «      rŒy|j                  |«       Œ‹ |xs | } t        t        d„ | D «       «      d«      }t        t        d„ | D «       «      d«      }| D �cg c]7  }|j                  d«      €$|j                  d	«      €|j                  d
«      �|‘Œ9 }	}|	rP|dk(  rK|dk(  rF|	D ])  }t        |d
   «      }
|
dk\  r||
z  }Œ|t        |
«      z  }Œ+ t        |d«      }t        |d«      }|xs i }d}|j                  d«      €|j                  d«      �p|j                  d«      �t        t        |d   «      d«      }|j                  d«      �t        t        |d   «      d«      }t        |j                  d«      xs d«      }t        ||z
  d«      }| D �cg c]<  }|j                  d«      sŒt        |j                  d«      «      j                  «       ‘Œ> }}|r|d   nd }|r|d   nd }t        | t        d¬«      }t        | t        d¬«      }|rt        |d   «      dkD  r|d   nd }|rt        |d   «      dkD  r|d   nd }t        d„ | D «       «      }|j!                  d«      D ��cg c]
  \  }}||dœ‘Œ }}}t        t#        | «      «      }|j                  d«      €|j                  d«      �Rt%        |j                  d«      xs d«      }t%        |j                  d«      xs d«      }||z   dkD  rt        ||z   «      }i dd“dt        t#        | «      «      “d|“d|“d|“d|“d|“d |“d!|“d|j                  d«      “d|j                  d«      “d"|“d#|“d$|“d%|rt        t        |«      d«      nd “d&|r|xs i j                  d'«      nd “d(|rt        t        |«      d«      nd “|r|xs i j                  d'«      nd |d d d d d d d)œ¥}d*}|s|rd+|xs d,› d-|xs d,› �}d.t#        | «      › d/|› d0|d1›d2|d1›d3|d1›�
}|dk(  rMd4|d1›d5|d1›d3|d1›�}|j                  d«      �.|d6|j                  d«      › d7|j                  d«      xs d› d8�z  }d|||dd9œS # t        t
        f$ r Y �ŒÜw xY wc c}w c c}w c c}}w ):Nr-   i€ðúg    eÍÍAc              3  ó8   K  — | ]  }|t        |«      k(  –— Œ y ­wr'   )Úint)r*   Úvs     r   r,   z,_calculate_bank_statement.<locals>.<genexpr>ˆ   s   è ø€ Ð,GÁ$¸Q¨Q´#°a³&­[Á$ùs   ‚c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr'   ©r   r/   s     r   r,   z,_calculate_bank_statement.<locals>.<genexpr>�   s   è ø€ Ð6±¨Aœ* QŸ-±ùó   ‚r5   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr'   )r   r/   s     r   r,   z,_calculate_bank_statement.<locals>.<genexpr>Ž   s   è ø€ Ð4©t¨!œ 1Ÿ©tùrŽ   r   r   r	   r   Ú
line_itemsÚ	money_outÚmoney_inÚsourceÚstatement_headerÚdateéÿÿÿÿT)ÚkeyÚreversec              3  ój   K  — | ]+  }t        t        |j                  d «      xs d«      «      –— Œ- y­w)r�   rJ   N)r…   Ústrr   r/   s     r   r,   z,_calculate_bank_statement.<locals>.<genexpr>³   s)   è ø€ ÐRÉTÈ”?¤3 q§u¡u¨]Ó';Ò'A¸rÓ#B×CÉTùs   ‚13é   )ÚcategoryÚcountÚpayments_madeÚpayments_receivedr   r4   Ú
line_countÚnet_cashflowr7   r8   ÚnetÚtransaction_countÚtotals_sourceÚ
date_startÚdate_endÚlargest_withdrawalÚlargest_withdrawal_descr�   Úlargest_deposit)Úlargest_deposit_descÚtop_categoriesÚassets_totalÚliabilities_totalÚequity_totalÚcurrent_ratioÚdebt_to_equityÚworking_capitalrJ   z
 | period Ú?õ    â†’ zBank statement: z transactionsz | money in ú,.2fz | money out ú | net z8Statement totals (from document header): money paid/out z | money received/in ú | z payments made, z	 received©r!   Ú
validationÚmetricsÚsummaryr   )r   r:   r   r   r   r   ÚmaxÚallr?   r=   rš   ÚstripÚsortedr   r   r   Úmost_commonr>   rŠ   )r@   r¸   r‡   Ú
clean_rowsr0   Úvalsr+   r‘   r’   Úamount_onlyÚamtÚheaderr¤   r¢   Údatesr¥   r¦   Úout_rowsÚin_rowsÚlargest_outÚ
largest_inÚcatsÚnamer�   r«   Ú	txn_countÚmadeÚrecvr¹   Úperiodrº   s                                  r   Ú_calculate_bank_statementrÐ   v   s÷  € ð (*€JÛˆØˆÛ.ˆAØ�u‰u�Q‹xÑ#ðØ—K‘K¤¤E¨!¨A©$£KÓ 0Õ1ð /ñ ”C˜“I 
Ò*ØÙ”C˜“I Ò$¬Ñ,GÁ$Ó,GÔ)GØØ×Ñ˜!Õð ð Ò˜€Dä”cÑ6±Ó6Ó6¸Ó:€IÜ”SÑ4©tÓ4Ó4°aÓ8€Hñ óÙˆaØ�5‰5�‹>Ð! a§e¡e¨H£oÐ&=À!Ç%Á%ÈÃ/ÐB]ò 	
�4ð ð ñ �x 1’}¨°aªÛˆAÜ˜˜(™Ó$ˆCØ�aŠxØ˜C‘‘àœS ›XÑ%‘	ð ô ˜ 1Ó%ˆÜ˜) QÓ'ˆ	àÒ# €FØ €Mà‡z�z�+ÓÐ*¨f¯j©j¸Ó.DÐ.PØ�:‰:�kÓ"Ð.Üœe F¨;Ñ$7Ó8¸!Ó<ˆIØ�:‰:�jÓ!Ð-ÜœU 6¨*Ñ#5Ó6¸Ó:ˆHÜ˜FŸJ™J xÓ0ÒFÐ4FÓGˆä
�˜9Ñ$ aÓ
(€CÙ15ÓG±¨A¸¿¹¸v½ŒS�—‘�v“Ó×%Ñ%Õ'°€EÐGÙ"��q’¨€JÙ!ˆu�RŠy t€Hä�d¤
°DÔ9€HÜ�Tœy°$Ô7€GÙ!)¬j¸À!¹Ó.EÈÒ.I�(˜1’+Èt€KÙ&¬9°W¸Q±ZÓ+@À1Ò+D�˜’È$€JäÑRÉTÓRÓR€Dð  ×+Ñ+¨AÔ.ôá.‰KˆD�%ð  EÓ*Ø.ð ñ ô
 ”c˜$“iÓ €IØ‡z�z�/Ó"Ð.°&·*±*Ð=PÓ2QÐ2]Ü�6—:‘:˜oÓ.Ò3°!Ó4ˆÜ�6—:‘:Ð1Ó2Ò7°aÓ8ˆØ�$‰;˜Š?Ü˜d T™kÓ*ˆIðØÐ)ðà”eœC ›IÓ&ðð 	�Hðð 	�Yð	ð
 	˜ðð 	�yðð 	˜ðð 	ˆsðð 	˜Yðð 	˜Ÿ™ OÓ4ðð 	˜VŸZ™ZÐ(;Ó<ðð 	˜ðð 	�jðð 	�Hðð 	Á;œe¤J¨{Ó$;¸QÔ?ÐTXðð  	"É[ KÒ$5°2×#:Ñ#:¸=Ô#IÐ^bð!ð" 	¹jœ5¤¨:Ó!6¸Ô:Èdð#ñ$ JT Ò!1¨r× 6Ñ 6°}Ô EÐY]Ø(àØ!ØØØØò5€Gð: €FÙ‘XØ˜jÒ/¨CÐ0°°h²oÀ#Ð5FÐGˆð œ3˜t›9˜+ ]°6°(ð ;Ø˜T�? -°	¸$Ð/?¸wÀsÈ4Àjð	Rð ð Ð*Ò*ðØ'¨Ð-Ð-BÀ8ÈDÀ/ð RØ�t�*ðð 	ð
 �:‰:�oÓ&Ð2ØØ�f—j‘j Ó1Ð2Ð2BØ—:‘:Ð1Ó2Ò7°aÐ8¸	ðCñˆGð Ø ØØØ)ñð øô[ "¤:Ð.ò Úðüòùò2 Hùós)   ¢&SÃ<S,ÈS1È'*S1Ë#S6ÓS)Ó(S))r@   c               ó\   — |xs g }|rt        |d¬«      n	dg ddddddœ}t        ||| ¬«      S )zDBuild bank-statement metrics from totals parsed out of the PDF text.r4   r   Tr   Nr6   r†   )rH   rÐ   )r‡   r@   r¸   s      r   Úcalculate_from_statement_totalsrÒ   ú   sI   € ð Š:�2€DÙHL”˜tÐ3CÕDØØØØØØØ)ñS€Jô % T¨:ÐHXÔYÐYr   c                ó\  ‡— | D �cg c]  }t        |«      ‘Œ }}| D �cg c]"  }|j                  d«      €Œt        |d   «      ‘Œ$ }}| D �cg c]"  }|j                  d«      €Œt        |d   «      ‘Œ$ }}t        t	        |«      d«      }t        t	        |«      d«      }t        t	        |«      d«      }|s|rt        ||z
  d«      n|}	d}
d}d}| D ]³  }|j                  d«      xs d› d|j                  d«      xs d› �j                  «       Št        t        |«      «      }t        ˆfd	„d
D «       «      rt        ˆfd„dD «       «      s|
|z  }
Œ€t        ˆfd„dD «       «      r||z  }Œšt        ˆfd„dD «       «      sŒ¯||z  }Œµ |
dk(  r|dk(  r|dk(  r	|r|r|}
|}n|
dk(  r|r|s|r|}
t        ||z   d«      }|rt        |
|z  d«      nd }|rt        ||z  d«      nd }|
s|rt        |
|z
  d«      nd }i dd“dt        t        | «      «      “d|“d|“d|“d|	“d| rt        |t        | «      z  d«      nd“d|rt        t        |«      d«      nd“d|rt        t        |«      d«      nd“d|
rt        |
d«      nd “d|rt        |d«      nd “d|rt        |d«      nd “d |
s|s|r|nd “d!|“d"|“d#|“}g }|d   �|j                  d$|d   d%›�«       |d   �|j                  d&|d   d%›�«       |d   �|j                  d'|d   d%›�«       |�|j                  d(|› �«       |�|j                  d)|› �«       |�|j                  d*|d%›�«       |s|rt        | «      › d+|d%›d,|d%›d-|	d%›�}nt        | «      › d.�}|r|d/d/j                  |«      z   z  }|d0   |||dd1œS c c}w c c}w c c}w )2Nr   r   r5   r
   ÚaccountrJ   Ú r�   c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr'   r|   ©r*   r+   Úaccts     €r   r,   z+_calculate_balance_sheet.<locals>.<genexpr>  s!   øè ø€ ð 
ñ�ð �ŒIñùr~   )ÚassetÚcashÚ
receivableÚ	inventoryÚprepaidÚ	equipmentÚ	machineryÚpropertyÚplantÚbuildingÚvehicleÚ	furnitureÚgoodwillÚ
investmentzbank accountzcash at bankzcash in bankc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr'   r|   r×   s     €r   r,   z+_calculate_balance_sheet.<locals>.<genexpr>&  s   øè ø€ ÐTÑ)S A�a˜4”iÑ)Sùr~   )ÚpayableÚloanÚborrowÚ	overdraftc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr'   r|   r×   s     €r   r,   z+_calculate_balance_sheet.<locals>.<genexpr>(  ó!   øè ø€ ð 
ñ�ð �ŒIñùr~   )
Úliabilitrè   ré   Údebtrê   ÚaccruedÚunearnedrë   ÚmortgageÚbondc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr'   r|   r×   s     €r   r,   z+_calculate_balance_sheet.<locals>.<genexpr>0  rí   r~   )ÚequityÚcapitalÚretainedÚstockÚownerÚshareholderÚdrawingsÚsurplusr   é   r   Úbalance_sheetr    Útotal_amountr7   r8   r¢   Úaverage_lineÚmax_lineÚmin_liner¬   r­   r®   Úliabilities_and_equityr¯   r°   r±   úassets r´   úliabilities úequity úcurrent ratio úD/E úworking capital z line items | debits z | credits rµ   zG line items | classified balances below (do not use line-sum as assets)r¶   r!   r·   )r   r   r   r?   r=   r€   r   r<   r>   r»   Úminr:   Újoin)r@   r¸   r0   ÚamountsrD   rE   rÿ   r7   r8   r¢   ÚassetsÚliabilitiesrõ   rÃ   r  r¯   r°   r±   r¹   Úextrarº   rØ   s                        @r   Ú_calculate_balance_sheetr    s§  ø€ Ù&*Ó+¡d Œz˜!�} d€GÐ+Ù)-ÓL© A°·±°w³Ñ1KŒe�A�g‘JÕ¨€FÐLÙ+/ÓO©4 a°1·5±5¸³?Ñ3NŒu�Q�x‘[Õ!¨4€GÐOäœ˜W› qÓ)€LÜœ˜F› QÓ'€KÜœ˜W› qÓ)€LÙ39¹WŒ%�˜lÑ*¨AÔ
.È<€Cà€FØ€KØ€FÛˆØ—%‘%˜	Ó"Ò( bÐ)¨¨1¯5©5°Ó+?Ò+EÀ2Ð*FÐG×MÑMÓOˆÜ”*˜Q“-Ó ˆäó 
ñó
ô 
ô ÓTÑ)SÓTÔTØ�c‰M‰FÜó 
ñó
ô 
ð ˜3Ñ‰KÜó 
ñó
õ 
ð �c‰M‰Fð; ð> �‚{�{ aÒ'¨F°aªK¹FÁwØˆØ!-Ñà�QŠ;™6¡{±fØ ˆFÜ!& {°VÑ';¸QÓ!?Ðá6A”E˜& ;Ñ.°Ô2Àt€MÙ7=”U˜;¨Ñ/°Ô3À4€NÙ9?Á;”e˜F [Ñ0°!Ô4ÐUY€Oð(Ø˜ð(à”eœC ›IÓ&ð(ð 	˜ð(ð 	�{ð	(ð
 	˜ð(ð 	ˆsð(ð 	¹dœ˜l¬S°«YÑ6¸Ô:Èð(ð 	©g”Eœ#˜g›,¨Ô*¸3ð(ð 	©g”Eœ#˜g›,¨Ô*¸3ð(ð 	©Fœ˜f aÔ(¸ð(ð 	±kœU ;°Ô2Àtð(ð 	©Fœ˜f aÔ(¸ð(ð 	!¹VÁ{ÑV\Ñ"8Ðcgð(ð 	˜ð(ð 	˜.ð(ð  	˜?ð!(€Gð& €EØˆ~ÑÐ*Ø�‰�w˜w ~Ñ6°tÐ<Ð=Ô>ØÐ"Ñ#Ð/Ø�‰�| GÐ,?Ñ$@ÀÐ#FÐGÔHØˆ~ÑÐ*Ø�‰�w˜w ~Ñ6°tÐ<Ð=Ô>ØÐ Ø�‰�~ m _Ð5Ô6ØÐ!Ø�‰�t˜NÐ+Ð,Ô-ØÐ"Ø�‰Ð'¨¸Ð'=Ð>Ô?á‘ä�4‹yˆkð Ø! $Ð' {°<ÀÐ2EÀWÈSÐQUÈJðXñ 	ô �4‹yˆkð Hð Hð 	ñ
 Ø�5˜5Ÿ:™: eÓ,Ñ,Ñ,ˆð ˜ÑØ ØØØ(ñð ùòM ,ùÚLùÚOs   †NžN$µN$ÁN)Á"N))r   r‡   c               óü   — t        | |¬«      }| s+|r"|j                  d«      €|j                  d«      €dd||dœS |dk(  s$|r0|j                  d«      €|j                  d«      �t        | ||¬«      S t        | |«      S )	uJ   Deterministic totals â€” bank statement cashflow or balance-sheet metrics.r   r‘   r’   FzNo rows to calculate.)r!   Úerrorr¸   r   r4   r†   )rH   r   rÐ   r  )r@   r   r‡   r¸   s       r   Ú	calculater  }  s¥   € ô ˜t°=ÔA€JÙÑ)Ø×Ñ˜[Ó)Ð5Ð9I×9MÑ9MÈjÓ9YÐ9eð Ø,Ø$Ø*ñ	
ð 	
ð Ð(Ò(ÙØ×!Ñ! +Ó.Ð:Ð>N×>RÑ>RÐS]Ó>^Ð>jä(Ø�*Ð/?ô
ð 	
ô $ D¨*Ó5Ð5r   c                óœ  — | j                  d«      xs g }| j                  d«      xs i }|j                  d«      xs i }|j                  d«      xs | j                  d«      xs i }| j                  d«      xs | j                  d«      xs dj                  «       }| j                  d«      xs( |j                  d«      xs |j                  d«      xs d	}d
| j                  d«      › �d|› �d| j                  d«      › d| j                  d«      › �dg}|dk(  �rD|j                  d«       |j                  |j                  d«      xs d«       |j                  d«      �#|j                  d|j                  d«      › �«       |j                  d«      �#|j                  d|j                  d«      › �«       |j                  d«      �#|j                  d|j                  d«      › �«       |j                  d«      r#|j                  d|j                  d«      › �«       |j                  d«      �5|j                  d|j                  d«      › d |j                  d!«      › �«       |j                  d"«      s|j                  d#«      r=|j                  d$|j                  d"«      xs d%› d&|j                  d#«      xs d%› �«       |j                  d'«      �:|j                  d(|j                  d'«      › d)|j                  d*«      xs d› d+�«       |j                  d,«      �:|j                  d-|j                  d,«      › d)|j                  d.«      xs d› d+�«       |j                  d/«      xs g }|r-|j                  d0d1j                  d2„ |dd3 D «       «      z   «       |j                  d«       |j                  d4«       |dd5 }	t	        |«      d6kD  r"|dd5 d7d8t	        |«      d6z
  › d9�igz   |d:d z   }	nt	        |«      d5kD  r|}	|	D ]×  }
t        |
t        «      sŒt        |
j                  d7«      xs d«      j                  d;«      r$|j                  d<|
j                  d7«      › �«       Œe|j                  d<|
j                  d=«      xs d› d>|
j                  d7«      xs d%› d?|
j                  d@«      › dA|
j                  dB«      › dC|
j                  dD«      › �
«       ŒÙ |j                  d«       |j                  dE«       |r|j                  |ddF «       n|j                  dG«       |j                  d«       |j                  dH«       dIj                  |«      S |j                  dJ«       |r|j                  |ddK «       n|j                  dL«       |j                  d«       |j                  dM«       |ddN D ]u  }
|j                  d<|
j                  d7«      xs d%› dO|
j                  dP«      xs dQ› dR|
j                  d@«      › dS|
j                  dB«      › dC|
j                  dD«      › �
«       Œw |s|j                  dT«       |j                  d«       |j                  dU«       |j                  dV«      dWu r7|j                  dX|j                  dY«      › dZ|j                  d[«      › d\�«       n$|j                  dV«      d]u r|j                  d^«       |j                  d_«      �$|j                  d`|j                  d_«      › d\�«       |j                  da«      �$|j                  db|j                  da«      › d\�«       |j                  dc«      �$|j                  dd|j                  dc«      › d\�«       |j                  de«      �$|j                  df|j                  de«      › d\�«       |j                  dg«      �$|j                  dh|j                  dg«      › d\�«       |j                  di«      �$|j                  dj|j                  di«      › d\�«       | j                  d«      r|j                  dk«       dIj                  |«      S )lz=Context for the chat LLM: document text + supporting figures.r@   Úcalculationr¹   r¸   Údocument_textÚtext_previewrJ   r   r   z
Filename: ÚfilenamezDocument type: zExtraction: Úsource_typez | OCR=Úocr_usedr4   zK=== BANK STATEMENT SUMMARY (prefer these totals for cashflow questions) ===rº   z(no summary yet)r’   Nz,Total money in (deposits/credits/received): r‘   z1Total money out (withdrawals/debits/spent/paid): r¡   u   Net cashflow (in âˆ’ out): r¤   zTotals source: rž   zPayments made: z; payments received: rŸ   r¥   r¦   zDate range seen: r²   r³   r©   zLargest deposit: ú (rª   Ú)r§   zLargest withdrawal: r¨   r«   zRough narration categories: ú, c              3  ó6   K  — | ]  }|d    › d|d   › �–— Œ y­w)rœ   ô   Ã—r�   Nr|   )r*   Úcs     r   r,   z%format_job_context.<locals>.<genexpr>Ð  s$   è ø€ ÐOÁhÀ˜q ™}˜o¨R°°'±
¨|Ô<Áhùs   ‚é   z0=== SAMPLE TRANSACTIONS (first 25 + last 25) ===é   é2   r�   u   â€¦ u    more rows â€¦içÿÿÿu   â€¦z- r•   r¶   z | out=r   z | in=r   z
 | amount=r	   z@=== PDF DOCUMENT TEXT (may be truncated for long statements) ===i@  z(No readable text extracted.)zÒAnswer using the BANK STATEMENT SUMMARY for totals. For 'how much spent/paid', use money out. For 'received/deposited', use money in. Do not invent balance-sheet ratios (current ratio, D/E, assets/liabilities).Ú
zQ=== PDF DOCUMENT TEXT (read this carefully; answer from what is written here) ===ià.  z0(No readable text extracted from the PDF pages.)z'=== SUPPORTING EXTRACTED LINE ITEMS ===é<   z | account=rÔ   Ú-z	 | debit=z
 | credit=z(No structured line items.)uW   === FIGURE CHECKS (for your reasoning only â€” do not copy this format to the user) ===r9   FzSheet does not balance: debits r7   z vs credits r8   Ú.TzDebits equal credits.r¬   zAssets come to r­   zLiabilities come to r®   zEquity comes to r¯   zCurrent ratio is about r°   zDebt-to-equity is about r±   zWorking capital is about z"Text may include OCR draft values.)	r   r½   r:   r  r>   Ú
isinstanceÚdictrš   Ú
startswith)Újobr@   Úcalcr¹   r¸   Údoc_textÚkindÚlinesrÊ   Úsampler0   s              r   Úformat_job_contextr1  ™  sÒ  € à�7‰7�6‹?Ò ˜b€DØ�7‰7�=Ó!Ò' R€DØ�h‰h�yÓ!Ò' R€GØ—‘˜,Ó'ÒF¨3¯7©7°<Ó+@ÒFÀB€JØ—‘˜Ó(ÒI¨C¯G©G°NÓ,CÒIÀr×PÑPÓR€Hà�‰�Ó ò 	Ø�8‰8�OÓ$ò	à�;‰;�Ó'ò	ð ð	 	ð �S—W‘W˜ZÓ(Ð)Ð*Ø
˜$˜Ð Ø
�s—w‘w˜}Ó-Ð.¨g°c·g±g¸jÓ6IÐ5JÐKØ
ð	€Eð ÐÓØ�‰ÐbÔcØ�‰�T—X‘X˜iÓ(Ò>Ð,>Ô?Ø�;‰;�zÓ"Ð.Ø�L‰LÐGÈÏÉÐT^ÓH_ÐG`ÐaÔbØ�;‰;�{Ó#Ð/Ø�L‰LÐLÈWÏ[É[ÐYdÓMeÐLfÐgÔhØ�;‰;�~Ó&Ð2Ø�L‰LÐ6°w·{±{À>Ó7RÐ6SÐTÔUØ�;‰;�Ô'Ø�L‰L˜?¨7¯;©;°Ó+GÐ*HÐIÔJØ�;‰;�Ó'Ð3Ø�L‰LØ! '§+¡+¨oÓ">Ð!?ð @&Ø&-§k¡kÐ2EÓ&FÐ%GðIôð �;‰;�|Ô$¨¯©°JÔ(?Ø�L‰LØ# G§K¡K°Ó$=Ò$DÀÐ#EÀUÈ7Ï;É;ÐWaÓKbÒKiÐfiÐJjÐkôð �;‰;Ð(Ó)Ð5Ø�L‰LØ# G§K¡KÐ0AÓ$BÐ#Cð DØ—K‘KÐ 6Ó7Ò=¸2Ð>¸aðAôð �;‰;Ð+Ó,Ð8Ø�L‰LØ& w§{¡{Ð3GÓ'HÐ&Ið JØ—K‘KÐ 9Ó:Ò@¸bÐAÀðDôð �{‰{Ð+Ó,Ò2°ˆÙØ�L‰LØ.Ø—)‘)ÑOÀdÈ2ÈAÁhÓOÓOñPôð 	�‰�RÔØ�‰ÐGÔHØ�c�r�ˆÜˆt‹9�rŠ>Ø˜#˜2�Y =°D¼¸T»ÀR¹Ð8HÈÐ2WÐ"XÐ!YÑYÐ\`ÐadÐaeÐ\fÑf‰FÜ�‹Y˜Š^ØˆFÛˆAÜ˜a¤Ô&ØÜ�1—5‘5˜Ó'Ò-¨2Ó.×9Ñ9¸%Ô@Ø—‘˜r !§%¡%¨Ó"6Ð!7Ð8Ô9ØØ�L‰LØ�Q—U‘U˜6“]Ò( bÐ)¨¨Q¯U©U°=Ó-AÒ-HÀSÐ,Ið JØ—u‘u˜W“~Ð& f¨Q¯U©U°8«_Ð,=¸ZÈÏÉÈhËÐGXðZõð ð 	�‰�RÔØ�‰ÐWÔXáØ�L‰L˜ % 4˜Õ)à�L‰LÐ8Ô9Ø�‰�RÔØ�‰ð[ô	
ð
 �y‰y˜ÓÐð 
‡L�LÐdÔeÙØ�‰�X˜f˜uÐ%Õ&à�‰ÐGÔHà	‡L�L�ÔØ	‡L�LÐ:Ô;Ø�#�2‹YˆØ�‰Ø�—‘�}Ó%Ò,¨Ð-¨[¸¿¹¸yÓ9IÒ9PÈSÐ8Qð RØ—U‘U˜7“^Ð$ J¨q¯u©u°X«Ð.?¸zÈ!Ï%É%ÐPXË/ÐIZð\õ	
ð ñ
 Ø�‰Ð2Ô3à	‡L�L�ÔØ	‡L�LÐjÔkØ‡~�~�jÓ! UÑ*Ø�‰Ø-¨j¯n©n¸]Ó.KÐ-Lð MØ!—~‘~ nÓ5Ð6°að9õ	
ð 
�‰˜
Ó	# tÑ	+Ø�‰Ð,Ô-Ø‡{�{�>Ó"Ð.Ø�‰� w§{¡{°>Ó'BÐ&CÀ1ÐEÔFØ‡{�{Ð&Ó'Ð3Ø�‰Ð+¨G¯K©KÐ8KÓ,LÐ+MÈQÐOÔPØ‡{�{�>Ó"Ð.Ø�‰Ð'¨¯©°NÓ(CÐ'DÀAÐFÔGØ‡{�{�?Ó#Ð/Ø�‰Ð.¨w¯{©{¸?Ó/KÐ.LÈAÐNÔOØ‡{�{Ð#Ó$Ð0Ø�‰Ð/°·±Ð<LÓ0MÐ/NÈaÐPÔQØ‡{�{Ð$Ó%Ð1Ø�‰Ð0°·±Ð=NÓ1OÐ0PÐPQÐRÔSØ
‡w�wˆzÔØ�‰Ð9Ô:Ø�9‰9�UÓÐr   a  (?i)^\s*(what\s+is\s+(this|the|my)\s+(pdf|file|document|statement|bank\s+statement|balance\s*sheet|sheet|knowledge\s*base)(\s+about)?|what('?s|\s+is)\s+(this|it)\s+about|what\s+does\s+(this|the|my)\s+(pdf|file|document|statement|bank\s+statement|knowledge\s*base)\s+(contain|show|say|have)|describe\s+(this|the|my)\s+(pdf|file|document|statement|bank\s+statement|balance\s*sheet|knowledge\s*base)?|summarize\s+(this|the|my)\s+(pdf|file|document|statement|bank\s+statement|balance\s*sheet|knowledge\s*base)?|analy[sz]e\s+(this|the|my)?\s*(pdf|file|docu?m?e?n?t|statement|bank\s+statement|upload|uploads)?|analy[sz]e\s+(it|this)|(give\s+me\s+)?(an?\s+)?(overview|summary)\s+(of\s+)?(this|the|my)?\s*(pdf|file|document|statement|bank\s+statement|knowledge\s*base)?|tell\s+me\s+about\s+(this|the|my)\s+(pdf|file|document|statement|bank\s+statement|balance\s*sheet|knowledge\s*base)?|tell\s+me\s+about\s+(the\s+)?knowledge\s*base|what('?s|\s+is)\s+in\s+(my|the)\s+knowledge\s*base|tell\s+me\s+about\s+my\s+(finances?|upi|payments?|transactions?))\s*[?.!]?\s*$))rK   )rM   rK   rL   rN   rO   rP   rQ   zcountry delightÚ	beejapuriÚbbdailyÚ
milkbasketÚdunzoÚjiomartznature's basketznatures basket)rR   )rS   rT   rU   rV   úfood delivery)rW   )rX   rY   rZ   rW   Úcab)r[   )r\   r^   r]   ÚjioÚairtelÚelectricity)Ú	transfers)úmoney transferú
money sentúself transferz# money transferz!list[tuple[str, tuple[str, ...]]]Ú_CATEGORY_KEYSa  (?i)\b(how\s+much.*(spent|spend|paid|payment|debit|withdrawn|withdrawal|outflow|money\s+out|total\s+out)|total\s+(spent|spend|paid|payments?|debits?|withdrawals?|money\s+paid|money\s+out)|(spent|paid)\s+in\s+total|total\s+amount\s+(spent|paid)|money\s+paid)\bz¡(?i)\b(how\s+much.*(received|credited|deposit|money\s+in|inflow|total\s+in)|total\s+(received|credits?|deposits?|money\s+received|money\s+in)|money\s+received)\bz`(?i)\b(net\s+(cashflow|cash\s*flow|amount|total)|how\s+much\s+(left|net)|difference\s+between)\bz¹(?i)\b(how\s+many\s+(transactions?|payments?|txns?)(?:\s+\w+){0,4}|transactions?\s+(are\s+)?made|payments?\s+(are\s+)?made|transaction\s+count|number\s+of\s+(transactions?|payments?))\bc                ób   — t        t        j                  | xs dj                  «       «      «      S )NrJ   )ÚboolÚ_PDF_OVERVIEW_REÚmatchr½   )Úquestions    r   Úis_pdf_overview_questionrF  h  s&   € ÜÔ ×&Ñ&¨ª°B×'=Ñ'=Ó'?Ó@ÓAÐAr   z&list[tuple[str, str, tuple[str, ...]]]Ú_MERCHANT_ALIAS_KEYSú# rý   >   r8  ÚbillrR   rW   r[   rM   r]   rx   rK   r<  rV   r>  r^   r7  r?  r=  c                ó  — | xs dj                  «       }g }t        D ]G  \  }}}t        j                  dt        j                  |«      › d�|«      sŒ5|j                  ||f«       ŒI t        |«      dk(  r|d   \  }}||fS y)uT   If the user names a specific merchant alias (Zepto, Blinkit, â€¦), return that only.rJ   ú(?<![a-z0-9])ú(?![a-z0-9])r$   r   N)r€   rG  ÚreÚsearchÚescaper:   r>   )rE  ÚqÚhitsÚaliasÚ_labelr„   s         r   Ú_named_merchant_aliasrT  Œ  s‚   € à	Š�R×ÑÓ €AØ.0€Dß3Ñˆˆv�tÜ�9‰9˜¤b§i¡i°Ó&6Ð%7°|ÐDÀaÕHØ�K‰K˜ ˜Õ&ð  4ô ˆ4ƒy�A‚~Ø˜1‘g‰ˆˆtØ�dˆ{ÐØr   c                ó  ‡‡	— | xs dj                  «       Š	t        | «      }|r|S t        D ]H  \  }}t        D ��ch c]  \  }}}|’Œ
 c}}Š|‰	v st	        ˆˆ	fd„|D «       «      sŒ:|dk(  rd‰	v rŒD||fc S  t        j                  d‰	«      }|rt|j                  d«      j                  «       }|j                  d«      rdt        d	   d   fS t        D ]-  \  }}|j                  |«      s|j                  |«      sŒ)||fc S  y c c}}w )
NrJ   c              3  óÂ   •K  — | ]V  }t        |«      d kD  rF|j                  d«      j                  «       ‰v xr! |j                  d«      j                  «       ‰v–— ŒX y­w)rý   rH  N)r>   Úlstripr€   )r*   r+   Ú	alias_setrP  s     €€r   r,   z)_detect_spend_category.<locals>.<genexpr>£  sX   øè ø€ ð 
á�Ü�1‹v˜Šzð �X‰X�d‹^×!Ñ!Ó# qÐ(ÒT¨Q¯X©X°d«^×-AÑ-AÓ-CÈ9Ð-TÓTÙùs   ƒAArR   rM   z:(?i)\bon\s+(grocer(?:y|ies)|food|taxi|bills?|transfers?)\br$   ÚgrocerrK   r   )	r€   rT  r@  rG  r<   rM  rN  Úgroupr*  )
rE  Únarrowedrƒ   r„   ÚaÚ_ÚmÚwordrX  rP  s
           @@r   Ú_detect_spend_categoryr`  ™  s  ù€ Ø	Š�R×ÑÓ €Aä$ XÓ.€HÙØˆß%‰ˆˆtõ ';Ô;Ñ&:™7˜1˜a ’QÐ&:Ò;ˆ	Ø�A‰:œô 
áó
õ 
ð ˜Š 9°¡>ØØ˜$�;Òð &ô 	�	‰	ÐOÐQRÓS€AÙØ�w‰w�q‹z×ÑÓ!ˆØ�?‰?˜8Ô$Ø¤¨qÑ 1°!Ñ 4Ð4Ð4ß)‰KˆE�4Ø×Ñ Ô%¨¯©¸Õ)?Ø˜d�{Ò"ð *ð ùó' <s   »Dc                óT   ‡ — dj                  ˆ fd„dD «       «      j                  «       S )NrÕ   c              3  óZ   •K  — | ]"  }t        ‰j                  |«      xs d «      –— Œ$ y­w)rJ   N)rš   r   r)   s     €r   r,   z_row_blob.<locals>.<genexpr>¹  s(   øè ø€ ð Ù'P !ŒˆC�G‰G�A‹JÒ˜"×Ñ'Pùs   ƒ(+)r�   ÚrawrÔ   r•   )r  r€   r   s   `r   Ú	_row_blobrd  ¸  s(   ø€ Ø�8‰8ó Ù'Póó ç�eƒgðr   c                óø   — t        | «      }|D ]j  }|j                  «       j                  «       }|sŒ$|j                  d«      r||v r yŒ<t	        j
                  dt	        j                  |«      › d�|«      sŒj y y)NÚ#TrK  rL  F)rd  r€   r½   r*  rM  rN  rO  )r   r„   Úblobr—   r+   s        r   Ú_row_matches_keysrh  ¾  so   € Ü�S‹>€DÛˆØ�I‰I‹K×ÑÓˆÙØØ�<‰<˜ÔØ�D‰yÙØä�9‰9˜¤b§i¡i°£l ^°<Ð@À$ÕGÙð ð r   c                ó  ‡— t        |«      }|sy|j                  «       }t        j                  |«      st	        j                  d|«      sy|\  }}| j                  d«      xs g }|D �cg c]   }t        ||«      sŒt        |«      dkD  sŒ|‘Œ" }}t        | «      }	|sÛ| j                  d«      xs d}
d}d}|
j                  «       D ]u  }|j                  «       Št        ˆfd„|D «       «      sŒ(t	        j                  d	|«      D ]5  }	 |t        |j                  d
«      j                  dd«      «      z  }|d
z  }Œ7 Œw |r d|› d|› dt!        t#        |d«      |	«      › d�S d|› d| j                  d«      › d�S t#        t%        d„ |D «       «      d«      }g }|dd D ]_  }t'        |j                  d«      xs d«      j)                  d«      d   dd }|j+                  |› dt!        t        |«      |	«      › d�«       Œa d}|rddj-                  |«      z   dz   }t/        |«      dkD  rd t/        |«      dz
  › d!�nd}d"|› d#| j                  d«      › d$t!        ||	«      › d%t/        |«      › d&|› d|› �S c c}w # t        $ r Y �Œ}w xY w)'ua   Sum spend for a named category from extracted statement rows â€” never the whole-statement total.Nz0(?i)\b(spent|spend|paid|cost|expense|expenses)\br@   r   r  rJ   r
   c              3  óB   •K  — | ]  }|j                  «       ‰v –— Œ y ­wr'   )r€   )r*   r+   Úlows     €r   r,   z1answer_category_spend_question.<locals>.<genexpr>å  s   øè ø€ Ð6±¨A�q—w‘w“y CÔ'±ùs   ƒu&   (?i)-\s*(?:â‚¹|rs\.?)\s*([\d,]+\.?\d*)r$   Ú,z0From the uploaded statement text, I found about rÕ   z outflow line(s) totaling r5   z'. This is not the full-statement total.zI couldn't find u-    transactions in the extracted lines from â€œr  uD   â€�. Try asking about a merchant name that appears on the statement.c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr'   r�   r/   s     r   r,   z1answer_category_spend_question.<locals>.<genexpr>ù  s   è ø€ Ð5©W¨”j —m©WùrŽ   é   r�   Úpaymentr$  r%  r  r  z Examples: ú; r'  z (+z more)z	Spent on u    in â€œu   â€�: ú across z payment(s))r`  r€   Ú_SPEND_Q_RErN  rM  r   rh  r   Ú_detect_currency_symbolÚ
splitlinesr<   Úfinditerr   rZ  Úreplacer   Ú_pretty_moneyr?   r=   rš   Úsplitr:   r  r>   )r+  rE  ÚcatrP  rƒ   r„   r@   r0   ÚmatchedÚcurÚtextÚtotalrQ  Úliner^  r0  Údescr  Úmorerk  s                      @r   Úanswer_category_spend_questionr�  Î  s¹  ø€ ä
  Ó
*€CÙØØ�‰Ó€Aä×Ñ˜8Ô$Ü�9‰9ÐHÈ!ÔLàà�K€Eˆ4Ø�7‰7�6‹?Ò ˜b€DÙÓS™$�QÔ"3°A°tÕ"<ÄÈAÃÐQRÓARŠq˜$€GÐSÜ
! #Ó
&€CÙà�w‰w�Ó'Ò-¨2ˆØˆØˆØ—O‘OÖ%ˆDØ—*‘*“,ˆCÜÓ6±Ó6Ô6Øä—[‘[Ð!JÈDÖQ�ðØœU 1§7¡7¨1£:×#5Ñ#5°c¸2Ó#>Ó?Ñ?�EØ˜A‘I‘Dñ Rð &ñ àBÀ4À&ÈÈ%Èð QÜ)¬%°°q«/¸3Ó?Ð@ð A8ð9ðð ˜u˜gð &Ø—'‘'˜*Ó%Ð&Ð&jðlð	
ô
 ”#Ñ5©WÓ5Ó5°qÓ9€EØ€FØ�R�a‹[ˆÜ�1—5‘5˜Ó'Ò4¨9Ó5×;Ñ;¸DÓAÀ!ÑDÀSÀbÐIˆØ�‰˜˜˜b¤¬z¸!«}¸cÓ!BÐ CÀ1ÐEÕFð ð €EÙØ §	¡	¨&Ó 1Ñ1°CÑ7ˆÜ-0°«\¸AÒ-=ˆS”�W“ Ñ!Ð" &Ñ)À2€Dà
�E�7˜' #§'¡'¨*Ó"5Ð!6°e¼MÈ%ÐQTÓ<UÐ;Vð WÜ�g“,�˜{¨4¨&°°%°ð	:ðùòM Tøô  "ò Úðús$   Á*I1Á<I1ÂI1Ä	2I6É6	JÊJc                ó&  — | j                  d«      xs i }|j                  d«      xs i }| j                  d«      xs( |j                  d«      xs |j                  d«      xs d}| j                  d«      xs i }|j                  d«      }|j                  d«      }|€"|j                  d«      �|j                  d«      }|€"|j                  d«      �|j                  d«      }|xs dj                  «       }|syt        |«      rt        | «      S t	        | |«      }	|	r|	S t        |«      rt        j                  |«      ryt        j                  d	|«      ryt        | «      }
t        ||
«      }t        ||
«      }d}|�|�	 t        |«      t        |«      z
  }n"|j                  d
«      �|j                  d
«      }t        ||
«      }|dv s|s|�r^t        j                  |«      rY|rWd}|j                  d«      �d|j                  d«      › d�}n&|j                  d«      �d|j                  d«      › d�}d|› |› d�S t        j                  |«      rY|rWd}|j                  d«      �d|j                  d«      › d�}n&|j                  d«      �d|j                  d«      › d�}d|› |› d�S t        j                  |«      r0|r.t        ||
«      }t        ||
«      }|r|rd|› d|› d|› d�S d|› d�S t         j                  |«      r³|j                  d«      }|€|j                  d«      }|j                  d«      }|€|j                  d«      }g }|�|j#                  |› d�«       |�|j#                  |› d�«       |rddj%                  |«      › d�S | j                  d«      xs g }|rdt'        |«      › d�S t        j                  d|«      r_|s|r[g }|r|j#                  d|› �«       |r|j#                  d |› �«       |r|j#                  d!|› �«       d"d#j%                  |«      z   dz   S |d$k(  s|j                  d%«      ��#t        |j                  d%«      |
«      }t        |j                  d&«      |
«      }t        |j                  d'«      |
«      }t        j                  d(|«      r|rd)|› d�S t        j                  d*|«      r|rd+|› d�S t        j                  d,|«      r|rd-|› d�S t        j                  d.|«      r&|j                  d/«      �d0|j                  d/«      › d�S t        j                  d1|«      r&|j                  d2«      �d3|j                  d2«      › d�S y# t        t        f$ r |j                  d
«      }Y �ŒÑw xY w)4u\   Deterministic answers for spend/received/net/balance questions â€” values from the PDF only.r  r¹   r   rJ   r‡   r‘   r’   Nz`(?i)\b(each|every|per|all)\s+(date|day)\b|\bdate[\s-]?wise\b|\bday[\s-]?wise\b|\bdaily\s+spend\br¡   >   r   r4   rž   rq  z	 paymentsz.Total spent (money paid) on this statement is r'  rŸ   z/Total received (money in) on this statement is zNet cashflow is z (received u
    âˆ’ paid z).ú payments madeú payments receivedzThis statement shows ú and r@   úI extracted z" transactions from this statement.z3(?i)\b(total|totals|cashflow|cash\s*flow|summary)\bzspent/paid z	received únet zStatement totals: rp  rþ   r¬   r­   r®   z(?i)\bassets?\bz#Total assets on this statement are z(?i)\bliabilitz(Total liabilities on this statement are z(?i)\bequity|capital\bz"Total equity on this statement is z(?i)\bcurrent\s+ratio\br¯   zCurrent ratio is z&(?i)\b(d/e|debt[\s-]*to[\s-]*equity)\br°   zDebt-to-equity is )r   r½   rF  Údescribe_pdf_jobr�  r`  rr  rN  rM  rs  rw  r   r   r   Ú_RECEIVED_Q_REÚ	_NET_Q_REÚ_TXN_COUNT_Q_REr:   r  r>   )r+  rE  r,  r¹   r.  rÄ   r‘   r’   rP  Úcat_ansr{  Úout_sÚin_sÚnet_valÚnet_sr  Úin_partÚout_partrÍ   rÎ   Úbitsr@   r  Úliabrõ   s                            r   Ú answer_statement_metric_questionr•    s³  € à�7‰7�=Ó!Ò' R€DØ�h‰h�yÓ!Ò' R€Gà�‰�Ó ò 	Ø�8‰8�OÓ$ò	à�;‰;�Ó'ò	ð ð	 	ð �W‰WÐ'Ó(Ò.¨B€FØ—‘˜KÓ(€IØ�{‰{˜:Ó&€HØÐ˜VŸZ™Z¨Ó4Ð@Ø—J‘J˜{Ó+ˆ	ØÐ˜FŸJ™J zÓ2Ð>Ø—:‘:˜jÓ)ˆà	Š�R×ÑÓ €AÙØä Ô"Ü Ó$Ð$ô -¨S°!Ó4€GÙØˆô ˜aÔ ¤[×%7Ñ%7¸Ô%:Øô 
‡y�yØkØ	ôð ä
! #Ó
&€CÜ˜) SÓ)€EÜ˜ 3Ó'€DØ€GØÐ 	Ð 5ð	2Ü˜H“o¬¨iÓ(8Ñ8‰Gð 
�‰�^Ó	$Ð	0Ø—+‘+˜nÓ-ˆÜ˜' 3Ó'€EàÐ,Ñ,±ºÜ×Ñ˜aÔ ¡UØˆEØ�{‰{˜?Ó+Ð7Ø" 7§;¡;¨Ó#?Ð"@À	ÐJ‘Ø—‘˜OÓ,Ð8Ø" 6§:¡:¨oÓ#>Ð"?¸yÐI�ØCÀEÀ7È5È'ÐQRÐSÐSä× Ñ  Ô#©ØˆEØ�{‰{Ð.Ó/Ð;Ø" 7§;¡;Ð/BÓ#CÐ"DÀIÐN‘Ø—‘Ð/Ó0Ð<Ø" 6§:¡:Ð.AÓ#BÐ"CÀ9ÐM�ØDÀTÀFÈ5È'ÐQRÐSÐSä×Ñ˜AÔ¡5Ü# H¨cÓ2ˆGÜ$ Y°Ó4ˆHÙ™8à& u gð .!Ø!( 	¨°H°:¸RðAðð & e W¨AÐ.Ð.ä×!Ñ! !Ô$Ø—;‘;˜Ó/ˆDØˆ|Ø—z‘z /Ó2�Ø—;‘;Ð2Ó3ˆDØˆ|Ø—z‘zÐ"5Ó6�ØˆDØÐØ—‘˜t˜f NÐ3Ô4ØÐØ—‘˜t˜fÐ$6Ð7Ô8ÙØ.¨w¯|©|¸DÓ/AÐ.BÀ!ÐDÐDØ—7‘7˜6“?Ò( bˆDÙØ%¤c¨$£i [Ð0RÐSÐSä�9‰9ÐKÈQÔOÑUZÑ^bØˆDÙØ—‘˜k¨%¨Ð1Ô2ÙØ—‘˜i¨ vÐ.Ô/ÙØ—‘˜d 5 '˜NÔ+Ø'¨$¯)©)°D«/Ñ9¸CÑ?Ð?àˆÒ '§+¡+¨nÓ"=Ñ"IÜ˜wŸ{™{¨>Ó:¸CÓ@ˆÜ˜WŸ[™[Ð)<Ó=¸sÓCˆÜ˜wŸ{™{¨>Ó:¸CÓ@ˆÜ�9‰9Ð'¨Ô+±Ø8¸¸ÀÐBÐBÜ�9‰9Ð&¨Ô*©tØ=¸d¸VÀ1ÐEÐEÜ�9‰9Ð.°Ô2±vØ7¸°x¸qÐAÐAÜ�9‰9Ð/°Ô3¸¿¹ÀOÓ8TÐ8`Ø& w§{¡{°?Ó'CÐ&DÀAÐFÐFÜ�9‰9Ð>ÀÔBÀwÇ{Á{ÐScÓGdÐGpØ'¨¯©Ð4DÓ(EÐ'FÀaÐHÐHàøôY œ:Ð&ò 	2Ø—k‘k .Ó1‹Gð	2ús   ÆU, Õ, VÖVc                ól   — | €y 	 t        | «      d›}|r|› d�nd}|› |› �S # t        t        f$ r Y y w xY w)Nr´   rÕ   rJ   )r   r   r   )ÚvalueÚcurrencyÚnumÚprefixs       r   rw  rw  ‡  sV   € Ø€}ØðÜ�u“˜dÐ#ˆñ  (�ˆz˜‰^¨R€FØˆX�c�UÐÐøô ”zÐ"ò Ùðús   …! ¡3²3c                ó<  — | j                  d«      xs d› d| j                  d«      xs d› �d d }d|v st        j                  d|«      ryd|v st        j                  d	|«      ryd
|v st        j                  d|«      ry
d|v st        j                  d|«      ryy)Nr  rJ   rÕ   r  i¸  u   â‚¹z(?i)\b(?:rs\.?|inr)\bÚ$z(?i)\busd\bu   â‚¬z(?i)\beur\bô   Â£z(?i)\bgbp\b)r   rM  rN  )r+  rg  s     r   rs  rs  ’  s˜   € Ø�g‰g�oÓ&Ò,¨"Ð-¨Q¨s¯w©w°~Ó/FÒ/LÈ"Ð.MÐNÈuÐPTÐU€DØ��}œŸ	™	Ð":¸DÔAØØ
ˆd�{”b—i‘i °Ô5ØØ��}œŸ	™	 .°$Ô7ØØˆt�|”r—y‘y °Ô6ØØr   c                ó  — t        | j                  d«      xs d«      }| j                  d«      xs g }| j                  d«      xs i }|j                  d«      xs i }| j                  d«      xs i }|j                  d«      xs | j                  d«      xs i }| j                  d«      xs$ |j                  d«      xs |j                  d«      }t        | «      }|d	k(  �rÃt        |j                  d
«      |«      }	t        |j                  d«      |«      }
t        |j                  d«      |«      }|j                  d«      }|€|j                  d«      }|j                  d«      }|€|j                  d«      }d|› d�g}g }|�|j	                  |› d�«       |�|j	                  |› d�«       |r'|j	                  ddj                  |«      z   dz   «       n |r|j	                  dt        |«      › d�«       g }|
r|j	                  d|
› �«       |	r|j	                  d|	› �«       |r|j	                  d|› �«       |r&|j	                  ddj                  |«      z   dz   «       | j                  d«      xs | j                  d«      xs d dd! }t        j                  d"|«      }|r%|j	                  d#|j                  d$«      › d�«       n¶|j                  d%«      s|j                  d&«      r”t        |j                  d%«      xs d'«      j                  d(«      d)   j                  «       }t        |j                  d&«      xs d'«      j                  d(«      d)   j                  «       }|j	                  d*|› d+|› d�«       |j	                  d,«       d-j                  |«      S t        |j                  d.«      |«      }t        |j                  d/«      |«      }t        |j                  d0«      |«      }|j                  d1«      }|j                  d2«      }t        |j                  d3«      |«      }t        |j                  d4«      xs |j                  d4«      |«      }t        |j                  d5«      xs |j                  d5«      |«      }g }|j                  d6«      d7u r3d }|r|r	d8|› d9|› d�}|j	                  d|› d:t        |«      › d;|› �«       n!|j	                  d|› d<t        |«      › d;�«       g }|r|j	                  d=|› �«       |r|j	                  d>|› �«       |r|j	                  d?|› �«       |r&|j	                  d@dj                  |«      z   dz   «       g }|�|j	                  dA|› �«       |�|j	                  dB|› �«       |r|j	                  dC|› �«       |r&|j	                  dDdj                  |«      z   dz   «       |j                  d6«      dEu r|j	                  dF«       d-j                  |«      S )GuZ   Human overview of an uploaded statement â€” no LLM. Values come only from the PDF extract.r  zthis PDFr@   r  r¹   r‡   r¸   r   r4   r’   r‘   r¡   rž   NrŸ   u   â€œu!   â€� is a bank / wallet statement.rƒ  r„  z	It lists r…  r'  r†  z transaction lines from it.zmoney paid/out zmoney received/in r‡  zTotals from the document: r  r  r  rJ   iÐ  uK   (?i)(\d{1,2}\s+[A-Z]{3}'?\d{2,4}\s*[-â€“â€”]\s*\d{1,2}\s+[A-Z]{3}'?\d{2,4})zPeriod on the statement: r$   r¥   r¦   r²   r$  r   zDates seen in lines: r³   zcYou can ask how much was spent or received, how many payments were made, or about a specific month.rÕ   r¬   r­   r®   r¯   r°   r±   r7   r8   r9   Fz Debits are z but credits are u(   â€� is an unbalanced balance sheet with z line items.u   â€� is a balance sheet with r  r  r  zKey balances: r  r  r	  zRatios: Tz%The debit and credit columns balance.)rš   r   rs  rw  r:   r  r>   rM  rN  rZ  rx  r½   ) r+  r  r@   r,  r¹   rÄ   r¸   r.  r{  r’   r‘   r¢   rÍ   rÎ   ÚpartsÚ
count_bitsr“  r|  rÏ   r%   Úendr  r”  rõ   ÚcrÚdeÚwcr7   r8   ÚissueÚbalance_bitsÚ
ratio_bitss                                    r   rˆ  rˆ  Ÿ  sŸ  € ä�3—7‘7˜:Ó&Ò4¨*Ó5€HØ�7‰7�6‹?Ò ˜b€DØ�7‰7�=Ó!Ò' R€DØ�h‰h�yÓ!Ò' R€GØ�W‰WÐ'Ó(Ò.¨B€FØ—‘˜,Ó'ÒF¨3¯7©7°<Ó+@ÒFÀB€JØ�7‰7�?Ó#Ò` t§x¡x°Ó'@Ò`ÀGÇKÁKÐP_ÓD`€DÜ
! #Ó
&€CàÐÓÜ  §¡¨ZÓ!8¸#Ó>ˆÜ! '§+¡+¨kÓ":¸CÓ@ˆ	Ü˜GŸK™K¨Ó7¸Ó=ˆØ�{‰{˜?Ó+ˆØˆ<Ø—:‘:˜oÓ.ˆDØ�{‰{Ð.Ó/ˆØˆ<Ø—:‘:Ð1Ó2ˆDà�x�jÐ AÐBÐCˆØˆ
ØÐØ×Ñ   nÐ5Ô6ØÐØ×Ñ  Ð&8Ð9Ô:ÙØ�L‰L˜ w§|¡|°JÓ'?Ñ?À#ÑEÕFÙØ�L‰L˜<¬¨D«	 {Ð2MÐNÔOàˆÙØ�K‰K˜/¨)¨Ð5Ô6ÙØ�K‰KÐ,¨X¨JÐ7Ô8ÙØ�K‰K˜$˜s˜e˜Ô%ÙØ�L‰LÐ5¸¿	¹	À$»ÑGÈ#ÑMÔNð —‘˜Ó(ÒI¨C¯G©G°NÓ,CÒIÀrÈ5ÈDÐQˆÜ—‘ØZØó
ˆñ Ø�L‰LÐ4°V·\±\À!³_Ð4EÀQÐGÕHØ�[‰[˜Ô&¨'¯+©+°jÔ*AÜ˜Ÿ™ LÓ1Ò8°SÓ9×?Ñ?ÀÓEÀaÑH×NÑNÓPˆEÜ�g—k‘k *Ó-Ò4°Ó5×;Ñ;¸DÓAÀ!ÑD×JÑJÓLˆCØ�L‰LÐ0°°°u¸S¸EÀÐCÔDà�‰Øqô	
ð �x‰x˜‹Ðä˜7Ÿ;™; ~Ó6¸Ó<€FÜ˜Ÿ™Ð%8Ó9¸3Ó?€DÜ˜7Ÿ;™; ~Ó6¸Ó<€FØ	�‰�_Ó	%€BØ	�‰Ð%Ó	&€BÜ	�w—{‘{Ð#4Ó5°sÓ	;€BÜ 
§¡¨}Ó =Ò [ÀÇÁÈ]ÓA[Ð]`Óa€KÜ  §¡°Ó!?Ò!^À7Ç;Á;È~ÓC^Ð`cÓd€Là€Eà‡~�~�jÓ! UÑ*ØˆÙ™<Ø" ; -Ð/@ÀÀÈaÐPˆEØ�‰Ø�(�ÐCÄCÈÃIÀ;ÈlØˆgðõ	
ð
 	�‰�s˜8˜*Ð$@ÄÀTÃÀÈ<ÐXÔYà€LÙØ×Ñ˜g f XÐ.Ô/ÙØ×Ñ˜l¨4¨&Ð1Ô2ÙØ×Ñ˜g f XÐ.Ô/ÙØ�‰Ð%¨¯	©	°,Ó(?Ñ?À#ÑEÔFà€JØ	€~Ø×Ñ˜N¨2¨$Ð/Ô0Ø	€~Ø×Ñ˜D  ˜+Ô&Ù	Ø×ÑÐ,¨R¨DÐ1Ô2ÙØ�‰�Z $§)¡)¨JÓ"7Ñ7¸#Ñ=Ô>à‡~�~�jÓ! TÑ)Ø�‰Ð<Ô=à�8‰8�E‹?Ðr   )r   údict[str, Any]Úreturnr   )r@   úlist[dict[str, Any]]r   rš   r©  r¨  )r�   rš   r©  rš   )r@   rª  r¸   r¨  r‡   údict[str, Any] | Noner©  r¨  )r‡   r¨  r@   zlist[dict[str, Any]] | Noner©  r¨  )r@   rª  r¸   r¨  r©  r¨  )r@   rª  r   rš   r‡   r«  r©  r¨  )r+  r¨  r©  rš   )rE  rš   r©  rB  )rE  rš   r©  z"tuple[str, tuple[str, ...]] | None)r   r¨  r©  rš   )r   r¨  r„   ztuple[str, ...]r©  rB  )r+  r¨  rE  rš   r©  ú
str | None)rJ   )r—  Úobjectr˜  rš   r©  r¬  )/Ú__doc__Ú
__future__r   rM  Úcollectionsr   Útypingr   r   r   r   rH   r…   rÐ   rÒ   r  r  r1  ÚcompilerC  r@  Ú__annotations__rr  r‰  rŠ  r‹  rF  rG  rS  Ú_keysÚ_krW  r€   r½   Ú_kkr>   r*  r:   rT  r`  rd  rh  r�  r•  rw  rs  rˆ  r|   r   r   Ú<module>r·     s0  ðÚ >å "ã 	Ý Ý óóóð" #ñ,Ø
ð,ð ð,ð ó	,ó^ð4 /3ñ	AØ
ðAàðAð ,ð	Að
 óAðN )-ñZØ$ðZð &ðZð ó	Zó&mðf #Ø.2ñ	6Ø
ð6ð ð6ð ,ð	6ð
 ó6ó8AðH �2—:‘:ðóÐ ò$5€Ð1ó ð6 ˆb�j‰jðó€ð �—‘ðó€ð ˆB�J‰JØgó€	ð �"—*‘*ðó€óBð
 @BÐ Ð<Ó AÛ#�M€FˆEÛˆØ�i‰i˜‹o×#Ñ#Ó%×+Ñ+Ó-ˆáÙ�3‹x˜1Š}Øð ñ ð$ �~‰~˜fÔ%àØ×#Ñ# S¨&°3°&Ð$9Õ:ñ5 ð $ó<
óó>óó 7ót|ô~ó
ôjr   