§
    éƒtjT(  ã            
      ó"  — d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	Z
ddlmZ ddddddd	d
ddœ	ZdddddddœZ ej        dej        ¦  «        Zd/d„Zed0d„¦   «         Zd1d„Zd2d„Zd2d„Zd3d„Zd4d$„Zd2d%„Zd5d6d*„Zd2d+„Zd2d,„Zd2d-„Zd2d.„ZdS )7zôStructured pandas queries over the finance CSV (Phase 3).

Handles filter-style questions that vector search alone answers poorly, e.g.:
- AP transactions over $500 in Q3 2023
- Companies in oil drilling
- Average debt-to-equity from analytics
é    )ÚannotationsN)Ú	lru_cache)ÚPath)Úget_settingszAccounts PayablezAccounts ReceivableÚCashÚ	InventoryÚRevenue)	Úapzaccounts payableza/pÚarzaccounts receivableza/rÚcashÚ	inventoryÚrevenueÚSaleÚPurchaseÚTransfer)ÚsaleÚsalesÚpurchaseÚ	purchasesÚtransferÚ	transferszí\b(over|above|under|below|greater than|less than|between|q[1-4]|quarter|202[0-9]|accounts?\s+payable|accounts?\s+receivable|\ba/?p\b|\ba/?r\b|industry|companies?\s+in|debt[- ]to[- ]equity|profit margin|average|sum|total|count|how many)\bÚquestionÚstrÚreturnÚboolc                óP   — t          t                               | ¦  «        ¦  «        S ©N)r   Ú_STRUCTURED_HINTÚsearch)r   s    ú./var/www/html/CA-Chatbot/app/rag/structured.pyÚis_structured_queryr!   2   s   € ÝÕ ×'Ò'¨Ñ1Ô1Ñ2Ô2Ð2ó    ú/tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]c                 ó(  — t          t          ¦   «         j        ¦  «        } t          j        | d¬¦  «        }dd„}|d                              |¦  «        }t          j        |¦  «        }t          j        |                     d	¬
¦  «        |gd¬¦  «        }||d         dk              	                    ¦   «         }|j
        sYt          j        |                     d¦  «        d¬¦  «        |d<   dD ]*}||j        v rt          j        ||         d¬¦  «        ||<   Œ+||d         dk              	                    ¦   «         }||d         dk              	                    ¦   «         }	dD ]*}||	j        v rt          j        |	|         d¬¦  «        |	|<   Œ+|||	fS )NF)Ú
low_memoryÚrawr   r   Údictc                óˆ   — 	 t          | t          ¦  «        rt          j        | ¦  «        ni S # t          j        $ r i cY S w xY wr   )Ú
isinstancer   ÚjsonÚloadsÚJSONDecodeError)r&   s    r    Ú
parse_metaz _load_frames.<locals>.parse_meta;   sO   € ð	Ý&0°µcÑ&:Ô&:ÐB•4”:˜c‘?”?�?ÀÐBøÝÔ#ð 	ð 	ð 	ØˆIˆIˆIð	øøøs   ‚*- ­AÁ AÚmetadata_jsonT)Údropé   )ÚaxisÚdata_categoryÚaccounting_transactionÚDateÚcoerce)Úerrors)ÚDebitÚCreditÚcompany_financial_statementsÚaccounting_analytics)úDebt-to-Equity RatioúProfit Marginr	   z
Net Income)r&   r   r   r'   )r   r   Údataset_pathÚpdÚread_csvÚmapÚjson_normalizeÚconcatÚreset_indexÚcopyÚemptyÚto_datetimeÚgetÚcolumnsÚ
to_numeric)
ÚpathÚdfr-   ÚmetasÚmeta_dfÚfullÚtxÚcolÚ	companiesÚ	analyticss
             r    Ú_load_framesrS   6   s£  € å•‘”Ô+Ñ,Ô,€DÝ	Œ�T eÐ	,Ñ	,Ô	,€Bðð ð ð ð ˆÔ×#Ò# JÑ/Ô/€EÝÔ Ñ&Ô&€GÝŒ9�b—n’n¨$�nÑ/Ô/°Ð9ÀÐBÑBÔB€Dà	ˆd�?Ô#Ð'?Ò?Ô	@×	EÒ	EÑ	GÔ	G€BØŒ8ð BÝ”^ B§F¢F¨6¡N¤N¸8ÐDÑDÔDˆˆ6‰
Ø&ð 	Bð 	BˆCØ�b”jÐ Ð Ýœ-¨¨3¬¸ÐAÑAÔA��3‘øà�T˜/Ô*Ð.LÒLÔM×RÒRÑTÔT€IØ�T˜/Ô*Ð.DÒDÔE×JÒJÑLÔL€IØQð Lð LˆØ�)Ô#Ð#Ð#Ýœ]¨9°S¬>À(ÐKÑKÔKˆI�c‰Nøàˆy˜)Ð#Ð#r"   útuple[str | None, float | None]c                óB  — |                       ¦   «                              dd¦  «        }t          j        d|¦  «        }|r$dt	          |                     d¦  «        ¦  «        fS t          j        d|¦  «        }|r$dt	          |                     d¦  «        ¦  «        fS dS )	NÚ,Ú z?(?:over|above|greater than|more than|>)\s*\$?\s*(\d+(?:\.\d+)?)Úgtr0   z3(?:under|below|less than|<)\s*\$?\s*(\d+(?:\.\d+)?)Últ)NN)ÚlowerÚreplaceÚrer   ÚfloatÚgroup)r   ÚqÚms      r    Ú_extract_amount_thresholdra   U   s¢   € Ø�ŠÑÔ× Ò   bÑ)Ô)€AÝ
Œ	ØJØ	ñ	ô 	€Að 	ð 'Ø•U˜1Ÿ7š7 1™:œ:Ñ&Ô&Ð&Ð&Ý
Œ	Ø>Ø	ñ	ô 	€Að 	ð 'Ø•U˜1Ÿ7š7 1™:œ:Ñ&Ô&Ð&Ð&Øˆ:r"   ú
str | Nonec                óê   — |                       ¦   «         }t          t                               ¦   «         d„ ¬¦  «        D ]4\  }}t	          j        dt	          j        |¦  «        › d�|¦  «        r|c S Œ5d S )Nc                ó.   — t          | d         ¦  «         S )Nr   )Úlen)Úxs    r    ú<lambda>z"_extract_account.<locals>.<lambda>h   s   € ÅcÈ!ÈAÌ$ÁiÄiÀZ€ r"   )Úkeyú\b)rZ   ÚsortedÚ_ACCOUNT_ALIASESÚitemsr\   r   Úescape©r   r_   rh   Úvalues       r    Ú_extract_accountrp   f   s}   € Ø�ŠÑÔ€AÝÕ-×3Ò3Ñ5Ô5Ð;OÐ;OÐPÑPÔPð ð ‰
ˆˆUÝŒ9Ð-�2œ9 S™>œ>Ð-Ð-Ð-¨qÑ1Ô1ð 	ØˆLˆLˆLð	àˆ4r"   c                óÊ   — |                       ¦   «         }t                               ¦   «         D ]4\  }}t          j        dt          j        |¦  «        › d�|¦  «        r|c S Œ5d S )Nri   )rZ   Ú_TYPE_ALIASESrl   r\   r   rm   rn   s       r    Ú_extract_tx_typers   n   sk   € Ø�ŠÑÔ€AÝ#×)Ò)Ñ+Ô+ð ð ‰
ˆˆUÝŒ9Ð-�2œ9 S™>œ>Ð-Ð-Ð-¨qÑ1Ô1ð 	ØˆLˆLˆLð	àˆ4r"   útuple[int, int] | Nonec                óL  — |                       ¦   «         }d}t          j        d|¦  «        }|r"t          |                     d¦  «        ¦  «        }t          j        d|¦  «        }|r=t          |                     d¦  «        p|                     d¦  «        ¦  «        }|pd|fS dS )z"Return (year, quarter) if present.Nz\b(20[12]\d)\br0   z"\bq([1-4])\b|\bquarter\s*([1-4])\bé   iç  )rZ   r\   r   Úintr^   )r   r_   ÚyearÚymÚqmÚquarters         r    Ú_extract_quarterr|   v   s›   € à�ŠÑÔ€AØ€DÝ	ŒÐ$ aÑ	(Ô	(€BØ	ð  Ý�2—8’8˜A‘;”;ÑÔˆÝ	ŒÐ8¸!Ñ	<Ô	<€BØ	ð 'Ý�b—h’h˜q‘k”kÐ0 R§X¢X¨a¡[¤[Ñ1Ô1ˆØ�˜˜wÐ&Ð&Øˆ4r"   rx   rw   r{   ú!tuple[pd.Timestamp, pd.Timestamp]c                óê   — |dz
  dz  dz   }t          j        | |d¬¦  «        }|dk    rt          j        | dd¬¦  «        }n0t          j        | |dz   d¬¦  «        t          j        d¬¦  «        z
  }||fS )Nr0   é   )rx   ÚmonthÚdayé   é   é   )Údays)r>   Ú	TimestampÚ	Timedelta)rx   r{   Ústart_monthÚstartÚends        r    Ú_quarter_ranger‹   „   sƒ   € Ø˜Q‘; !Ñ# aÑ'€KÝŒL˜d¨+¸1Ð=Ñ=Ô=€EØ�!‚|€|ÝŒl ¨B°BÐ7Ñ7Ô7ˆˆåŒl ¨K¸!©OÀÐCÑCÔCÅbÄlÐXYÐFZÑFZÔFZÑZˆØ�#ˆ:Ðr"   c                óÆ   — |                       ¦   «         }t          j        d|¦  «        }|r(|                     d¦  «                             d¦  «        S dD ]
}||v r|c S Œd S )NzY(?:companies?\s+in|industry(?:\s+of)?|in the)\s+([a-z0-9 /&\-]+?)(?:\s+industry)?(?:\?|$)r0   z .?)zoil drillingÚoilÚbankingÚsoftwareÚpharmaÚsteel)rZ   r\   r   r^   Ústrip)r   r_   r`   Úphrases       r    Ú_extract_industryr”   Ž   s{   € Ø�ŠÑÔ€AÝ
Œ	ØdØ	ñ	ô 	€Að 	ð 'Ø�wŠw�q‰zŒz×Ò Ñ&Ô&Ð&àSð ð ˆØ�Qˆ;ˆ;ØˆMˆMˆMð àˆ4r"   é   Úrowsúpd.DataFrameÚlimitc                ó   — g }|                       |¦  «                             ¦   «         D ]Ð\  }}|                     d¦  «        }t          j        |¦  «        r|                     d¦  «        nd}|                     d|› d|                     dd¦  «        › d|                     dd¦  «        › d	|                     d
d¦  «        › d|                     dd¦  «        › d|                     dd¦  «        › �¦  «         ŒÑd                     |¦  «        S )Nr4   z%Y-%m-%dÚ?ú- z | ÚAccountz	 | Debit r7   z | Type ÚTransaction_TypeÚCustomer_Vendorz | Payment ÚPayment_MethodÚ
)ÚheadÚiterrowsrG   r>   ÚnotnaÚstrftimeÚappendÚjoin)r–   r˜   ÚlinesÚ_ÚrÚdateÚdate_ss          r    Ú_format_tx_rowsr¬   �   s-  € Ø€EØ—	’	˜%Ñ Ô ×)Ò)Ñ+Ô+ð 
ð 
‰ˆˆ1Ø�uŠu�V‰}Œ}ˆÝ.0¬h°t©n¬nÐE�—’˜zÑ*Ô*Ð*À#ˆØ�Šð6�ð 6ð 6˜AŸEšE )¨SÑ1Ô1ð 6ð 6¸A¿EºEÀ'È3Ñ<OÔ<Oð 6ð 6Ø—E’EÐ,¨cÑ2Ô2ð6ð 6Ø78·u²uÐ=NÐPSÑ7TÔ7Tð6ð 6à—u’uÐ-¨sÑ3Ô3ð6ð 6ñ	
ô 	
ð 	
ð 	
ð
 �9Š9�UÑÔÐr"   c                óh  — t          ¦   «         \  }}}|j        rd S |}t          | ¦  «        }|r\d|j        v rS||d                              t
          ¦  «        j                             ¦   «         |                     ¦   «         k             }t          | ¦  «        }|r3d|j        v r*||d                              t
          ¦  «        |k             }t          | ¦  «        \  }}|r6|�4d|j        v r+|dk    r||d         |k             }n||d         |k              }t          | ¦  «        }|r4d|j        v r+t          |Ž \  }	}
||d         |	k    |d         |
k    z           }t          |||d u|g¦  «        }|sd S t          |¦  «        }|dk    r�g }|r|                     |¦  «         |�"|                     |dk    rdnd› d	|› �¦  «         |r'|                     d
|d         › d	|d         › �¦  «         dd                     |¦  «        pd› d�S d|j        v r't          |d                              ¦   «         ¦  «        nd}t#          |                     dd¬¦  «        ¦  «        }d|d›d�}|�|d|dk    rdnd› d	|› d�z  }|r|d|› �z  }|r|d|d         › d	|d         › �z  }|d|d›d�z  }|› d|› �S )Nrœ   r�   r7   rX   r4   r   Ú>Ú<Ú ÚQr0   z8Structured transaction search found 0 matching records (z, zfilters appliedz).g        F)Ú	ascendingzStructured transaction search: rV   z matching recordsz	 (amount ú)z on z in Qz. Total debit of matches: z,.2fú.z
Examples:
)rS   rE   rp   rH   Úastyper   rZ   rs   ra   r|   r‹   Úanyre   r¥   r¦   r]   Úsumr¬   Úsort_values)r   rO   r¨   ÚfilteredÚaccountÚtx_typeÚopÚamountr{   r‰   rŠ   ÚappliedÚcountÚbitsÚtotal_debitÚsampleÚheaders                    r    Úquery_transactionsrÄ   ª   sq  € Ý‰~Œ~�H€Bˆˆ1Ø	„xð Øˆtà€HÝ˜xÑ(Ô(€GØð \�9 Ô 0Ð0Ð0Ø˜H YÔ/×6Ò6µsÑ;Ô;Ô?×EÒEÑGÔGÈ7Ï=Ê=É?Ì?ÒZÔ[ˆå˜xÑ(Ô(€GØð QÐ%¨Ô)9Ð9Ð9Ø˜HÐ%7Ô8×?Ò?ÅÑDÔDÈÒOÔPˆå*¨8Ñ4Ô4�J€BˆØ	ð <ˆfÐ  W°Ô0@Ð%@Ð%@Ø�Š:ˆ:Ø ¨Ô 1°FÒ :Ô;ˆHˆHà ¨Ô 1°FÒ :Ô;ˆHå˜xÑ(Ô(€GØð U�6˜XÔ-Ð-Ð-Ý# WÐ-‰
ˆˆsØ˜X fÔ-°Ò6¸8ÀFÔ;KÈsÒ;RÑSÔTˆõ �7˜G V°4Ð%7¸ÐAÑBÔB€GØð Øˆtå�‰MŒM€EØ�‚z€zØˆØð 	!Ø�KŠK˜Ñ Ô Ð ØÐØ�KŠK "¨¢* *˜3˜3°#Ð@Ð@¸Ð@Ð@ÑAÔAÐAØð 	7Ø�KŠKÐ5˜G AœJÐ5Ð5¨°¬Ð5Ð5Ñ6Ô6Ð6ð:Ø—’˜4‘”Ð5Ð$5ð:ð :ð :ð	
ð
 5<¸xÔ?OÐ4OÐ4O•%˜ Ô)×-Ò-Ñ/Ô/Ñ0Ô0Ð0ÐUX€KÝ˜X×1Ò1°'ÀUÐ1ÑKÔKÑLÔL€FØI¨uÐIÐIÐIÐI€FØÐØÐD R¨4¢Z Z˜c˜c°SÐDÐD¸6ÐDÐDÐDÑDˆØð #ØÐ"˜Ð"Ð"Ñ"ˆØð 4ØÐ3˜' !œ*Ð3Ð3 w¨q¤zÐ3Ð3Ñ3ˆØ
Ð>¨;Ð>Ð>Ð>Ð>Ñ>€FØÐ+Ð+ 6Ð+Ð+Ð+r"   c                ó   — t          ¦   «         \  }}}|j        s	d|j        vrd S t          | ¦  «        }|sd S ||d                              t
          ¦  «        j                             |dd¬¦  «                 }|j        rd|› d�S g }|                     d¦  «                             ¦   «         D ]¤\  }}| 	                    d| 
                    dd	¦  «        › d
| 
                    dd	¦  «        › d| 
                    dd	¦  «        › d| 
                    dd	¦  «        › d| 
                    dd	¦  «        › d| 
                    dd	¦  «        › �¦  «         Œ¥dt          |¦  «        › d|› d�d                     |¦  «        z   S )NÚIndustryF)ÚcaseÚnaz?Structured company search found 0 companies matching industry 'z'.é
   r›   ÚNamerš   z | Industry: z
 | Price: zCurrent Pricez
 | Sales: ÚSalesz | PAT: zProfit after taxz	 | ROCE: zReturn on capital employedzStructured company search: z companies matching 'z'.
r    )rS   rE   rH   r”   rµ   r   Úcontainsr¡   r¢   r¥   rG   re   r¦   )r   r¨   rQ   ÚindustryÚmatchesr§   r©   s          r    Úquery_companiesrÏ   ä   s×  € Ý"‘n”n�O€A€y�!Ø„ð ˜*¨IÔ,=Ð=Ð=Øˆtå  Ñ*Ô*€HØð ØˆtàØ�*Ô×$Ò$¥SÑ)Ô)Ô-×6Ò6°xÀeÐPUÐ6ÑVÔVô€Gð „}ð ^Ø]ÐQYÐ]Ð]Ð]Ð]à€EØ—’˜RÑ Ô ×)Ò)Ñ+Ô+ð 
ð 
‰ˆˆ1Ø�Šðh�—’�v˜sÑ#Ô#ð hð h°!·%²%¸
ÀCÑ2HÔ2Hð hð hØ—e’e˜O¨SÑ1Ô1ðhð hØ=>¿UºUÀ7ÈCÑ=PÔ=Pðhð hà—E’EÐ,¨cÑ2Ô2ðhð hà=>¿UºUÐC_ÐadÑ=eÔ=eðhð hñ	
ô 	
ð 	
ð 	
ð 	X¥c¨'¡l¤lÐWÐWÈÐWÐWÐWØ
�)Š)�EÑ
Ô
ñ	ðr"   c                ó´  ‡— t          ¦   «         \  }}}|j        rd S |                      ¦   «         Šd‰v od‰v }d‰v pd‰v }t          ˆfd„dD ¦   «         ¦  «        }|s|sd S g }|r¨d|j        v rŸ|d                              ¦   «         }|j        s~|                     dt          |¦  «        › d	|                     ¦   «         d
›d| 	                    ¦   «         d
›d| 
                    ¦   «         d
›d|                     ¦   «         d
›d�¦  «         |r¨d|j        v rŸ|d                              ¦   «         }|j        s~|                     dt          |¦  «        › d	|                     ¦   «         d
›d| 	                    ¦   «         d
›d| 
                    ¦   «         d
›d|                     ¦   «         d
›d�¦  «         |sd S |r|sd S dd                     |¦  «        z   S )NÚdebtÚequityzprofit marginÚmarginc              3  ó    •K  — | ]}|‰v V — Œ	d S r   © )Ú.0Úwr_   s     €r    ú	<genexpr>z"query_analytics.<locals>.<genexpr>  s'   øè è € ÐJÐJ˜q�A˜�FÐJÐJÐJÐJÐJÐJr"   )ÚaverageÚavgÚmeanÚtypicalr;   z/Debt-to-Equity across analytics records: count=z
, average=z.3fz	, median=z, min=z, max=r´   r<   z.Profit Margin across analytics records: count=zStructured analytics summary:
r    )rS   rE   rZ   r¶   rH   Údropnar¥   re   rÛ   ÚmedianÚminÚmaxr¦   )	r   r¨   rR   Ú	wants_dteÚwants_marginÚ	wants_avgr§   Úseriesr_   s	           @r    Úquery_analyticsrå      su  ø€ Ý"‘n”n�O€A€qˆ)Ø„ð Øˆtà�ŠÑÔ€AØ˜!�Ð- ¨A €IØ" aÐ'Ð8¨8°q¨=€LÝÐJÐJÐJÐJÐ$IÐJÑJÔJÑJÔJ€Iàð ˜ð Øˆtà€EØð Ð+¨yÔ/@Ð@Ð@ØÐ1Ô2×9Ò9Ñ;Ô;ˆØŒ|ð 	Ø�LŠLðCÅ#ÀfÁ+Ä+ð Cð CØ!Ÿ;š;™=œ=ÐNðCð CØ7=·}²}±´ÐNðCð Cà—z’z‘|”|ÐBðCð Cà/5¯zªz©|¬|ÐBðCð Cð Cñô ð ð
 ð ˜¨9Ô+<Ð<Ð<Ø˜?Ô+×2Ò2Ñ4Ô4ˆØŒ|ð 	Ø�LŠLðCÅÀVÁÄð Cð CØ!Ÿ;š;™=œ=ÐNðCð CØ7=·}²}±´ÐNðCð Cà—z’z‘|”|ÐBðCð Cà/5¯zªz©|¬|ÐBðCð Cð Cñô ð ð ð ØˆtØð ˜ð ØˆtØ,¨t¯yªy¸Ñ/?Ô/?Ñ?Ð?r"   c                óô   — t          | ¦  «        sdS g }t          t          t          fD ]8}	  || ¦  «        }n# t          $ r d}Y nw xY w|r|                     |¦  «         Œ9|sdS d                     |¦  «        S )z?Return a compact structured summary, or None if not applicable.Nz

)r!   rÄ   rÏ   rå   Ú	Exceptionr¥   r¦   )r   ÚpartsÚfnÚresults       r    Úrun_structured_queryrë   &  s¤   € å˜xÑ(Ô(ð Øˆtà€EÝ!¥?µOÐDð !ð !ˆð	Ø�R˜‘\”\ˆFˆFøÝð 	ð 	ð 	ØˆFˆFˆFð	øøøàð 	!Ø�LŠL˜Ñ Ô Ð øàð ØˆtØ�;Š;�uÑÔÐs   «7·AÁA)r   r   r   r   )r   r#   )r   r   r   rT   )r   r   r   rb   )r   r   r   rt   )rx   rw   r{   rw   r   r}   )r•   )r–   r—   r˜   rw   r   r   )Ú__doc__Ú
__future__r   r*   r\   Ú	functoolsr   Úpathlibr   Úpandasr>   Ú
app.configr   rk   rr   ÚcompileÚ
IGNORECASEr   r!   rS   ra   rp   rs   r|   r‹   r”   r¬   rÄ   rÏ   rå   rë   rÕ   r"   r    ú<module>rô      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð à #Ð #Ð #Ð #Ð #Ð #ð Ø*ØØ
Ø0Ø ØØØð
ð 
Ð ð ØØØØØðð €ð �2”:ð9ð „Mñô Ð ð3ð 3ð 3ð 3ð ð$ð $ð $ñ „ð$ð<ð ð ð ð"ð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ð
ð 
ð 
ð 
ð 
ð7,ð 7,ð 7,ð 7,ðtð ð ð ð8#@ð #@ð #@ð #@ðLð ð ð ð ð r"   