§
    Âði—?  ã                   óâ  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZmZmZmZmZ d dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ  d d	l!m"Z" d d
l#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9 de$dede:fd„Z;de<de=e<         deddfd„Z>de?de:fd„Z@ e
ddg¬¦  «        ZAejB         C                    ejB         D                    eE¦  «        d¦  «        ZFeA G                    d e2e0         ¬!¦  «         ed¦  «         ed¦  «         ed¦  «         ed¦  «         ed"d"¬#¦  «         ed$d"d%¬&¦  «         ee"¦  «         ee4¦  «        fd'ee?         d(ee<         d)ee<         d*ee?         d+e<d,e<ded-e(fd.„¦   «         ZHeA I                    d/¦  «         ed0¦  «         ee4¦  «        fd1ed-e(fd2„¦   «         ZJeA I                    d e0d3¬4¦  «         ee"¦  «         ee4¦  «        fd5e.ded6e(fd7„¦   «         ZKeA G                    d8e0¬!¦  «         ee"¦  «         ee4¦  «        fde<ded-e(fd9„¦   «         ZLeA M                    d8e0¬!¦  «         ee"¦  «         ee4¦  «        fde<d5e/ded-e(fd:„¦   «         ZNeA I                    d;e0¬!¦  «         ee"¦  «         ee4¦  «        fde<d5e:ded-e(fd<„¦   «         ZOeA P                    d=e0¬!¦  «         ee"¦  «         ee4¦  «        fde<d>e<ded-e(fd?„¦   «         ZQeA P                    d8d@¬A¦  «         ee"¦  «         e e5dB¦  «        ¦  «        fde<ded-e(fdC„¦   «         ZReA I                    dDe0¬!¦  «         ed0¦  «         ee"¦  «         ee4¦  «        fde<d1eded-e(fdE„¦   «         ZSeA I                    dFe0¬!¦  «         ed0¦  «         ee"¦  «         ee4¦  «        fde<d1eded-e(fdG„¦   «         ZTdS )Hé    N)Ú	APIRouterÚDependsÚHTTPExceptionÚQueryÚ
UploadFileÚFile)ÚAsyncSession)ÚselectÚfuncÚand_Úor_)Údate)ÚOptional)Úgenai)Útypes)Úget_db)ÚContract)ÚContractLink)ÚUser)ÚCompany)ÚVendor)ÚContractCreateÚContractUpdateÚContractOut)ÚPagedOut)Úget_current_userÚrequire_role)Únotify_adminsÚnotify_admin_groupÚnotify_user_groupÚcontractÚdbÚreturnc              ƒ   óÚ  K  — d }d }| j         rr|                     t          t          ¦  «                             t          j        | j         k    ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «         }|r|j        nd }| j        rr|                     t          t          ¦  «                             t          j        | j        k    ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «         }|r|j        nd }|                     t          t          j        t          j        ¦  «                             t          t          j        t          j        k    ¦  «                             t          j        | j        k    ¦  «        ¦  «        ƒ d {V —†}d„ |                     ¦   «         D ¦   «         }|                     t          t          j        t          j        ¦  «                             t          t          j        t          j        k    ¦  «                             t          j        | j        k    ¦  «        ¦  «        ƒ d {V —†}d„ |                     ¦   «         D ¦   «         }i | j        ¥||||dœ¥S )Nc                 ó,   — g | ]}|j         |j        d œ‘ŒS ©©ÚidÚtitler'   ©Ú.0Úrows     ú=/var/www/html/jarvis.com/web/backend/app/routers/contracts.pyú
<listcomp>z_enrich.<locals>.<listcomp>/   s$   € ÐJÐJÐJ¸3˜3œ6¨C¬IÐ6Ð6ÐJÐJÐJó    c                 ó,   — g | ]}|j         |j        d œ‘ŒS r&   r'   r*   s     r-   r.   z_enrich.<locals>.<listcomp>6   s$   € ÐHÐHÐH¸˜œ¨#¬)Ð4Ð4ÐHÐHÐHr/   )Úcompany_nameÚvendor_nameÚpredecessorsÚ
successors)Ú
company_idÚexecuter
   r   Úwherer(   Úscalar_one_or_noneÚnameÚ	vendor_idr   r   r)   Újoinr   Úpredecessor_idÚsuccessor_idÚallÚ__dict__)	r!   r"   r1   r2   ÚrÚcÚvr3   r4   s	            r-   Ú_enrichrC      s:  è è € Ø€LØ€KØÔð -Ø—*’*�V¥G™_œ_×2Ò2µ7´:ÀÔATÒ3TÑUÔUÑVÔVÐVÐVÐVÐVÐVÐVˆØ× Ò Ñ"Ô"ˆØ!"Ð,�q”v�v¨ˆØÔð ,Ø—*’*�V¥F™^œ^×1Ò1µ&´)¸xÔ?QÒ2QÑRÔRÑSÔSÐSÐSÐSÐSÐSÐSˆØ× Ò Ñ"Ô"ˆØ !Ð+�a”f�f tˆà�jŠjÝ�xŒ{�HœNÑ+Ô+ß	Š�l�LÔ7½8¼;ÒFÑ	GÔ	Gß	Š�|Ô(¨H¬KÒ7Ñ	8Ô	8ñô ð 	ð 	ð 	ð 	ð 	ð 	€Að
 KÐJÀ!Ç%Â%Á'Ä'ÐJÑJÔJ€Là�jŠjÝ�xŒ{�HœNÑ+Ô+ß	Š�l�LÔ5½¼ÒDÑ	EÔ	Eß	Š�|Ô*¨h¬kÒ9Ñ	:Ô	:ñô ð 	ð 	ð 	ð 	ð 	ð 	€Að
 IÐHÀÇÂÁÄÐHÑHÔH€JðØ
Ô
ðà$Ø"Ø$Ø ðð ð ð r/   Úcontract_idÚpredecessor_idsc              ƒ   ó*  K  — |                      t          d¦  «                             t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d{V —† |D ],}|| k    r$|                     t          || ¬¦  «        ¦  «         Œ-dS )z-Replace all predecessor links for a contract.Ú
sqlalchemyN©r<   r=   )r6   Ú
__import__Údeleter   r7   r=   Úadd)rD   rE   r"   Úpids       r-   Ú_sync_predecessorsrM   @   s´   è è € à
�*Š*Ý�<Ñ Ô ×'Ò'­Ñ5Ô5×;Ò;½LÔ<UÐYdÒ<dÑeÔeñô ð ð ð ð ð ð ð ð ð Oð OˆØ�+ÒÐØ�FŠF•<¨sÀÐMÑMÔMÑNÔNÐNøðOð Or/   Úrawc                 ó  — 	 t          j        | ¦  «        S # t           j        $ rf t          d| dd…         ›�¦  «         t	          j        d| t          j        ¦  «        }|r(t          j        |                     ¦   «         ¦  «        cY S ‚ w xY w)zDParse JSON from Gemini response, with regex fallback for edge cases.zF[analyze-pdf] json.loads failed, attempting regex fallback. raw[:200]=NéÈ   z\{.*\})ÚjsonÚloadsÚJSONDecodeErrorÚprintÚreÚsearchÚDOTALLÚgroup)rN   Úms     r-   Úparse_gemini_jsonrZ   I   s•   € ðÝŒz˜#‰ŒÐøÝÔð ð ð åÐdÐWZÐ[_Ð\_Ð[_ÔW`ÐdÐdÑeÔeÐeÝŒI�i ¥b¤iÑ0Ô0ˆØð 	)Ý”:˜aŸgšg™iœiÑ(Ô(Ð(Ð(Ð(Øðøøøs   ‚ –A1BÂ	Bz
/contractsÚ	contracts)ÚprefixÚtagsz../../uploadsÚ )Úresponse_modelé   )Úgeé   éô  )ra   ÚlerV   r5   r:   ÚstatusÚpageÚlimitÚ_c              ƒ   óð  ‡K  — t          j        ¦   «         }g }	| r6|	                     t          j                             d| › d�¦  «        ¦  «         |r#|	                     t          j        |k    ¦  «         |r#|	                     t          j        |k    ¦  «         |dk    r@|	                     t          t          j	        |k    t          j
        |k    ¦  «        ¦  «         nS|dk    r$|	                     t          j	        |k     ¦  «         n)|dk    r#|	                     t          j
        |k    ¦  «         t          t          j        ¦   «         ¦  «                             t          ¦  «        }
|	r
 |
j        |	Ž }
‰                     |
¦  «        ƒ d {V —†}t          t          ¦  «                             t          j                             ¦   «         ¦  «        }|	r
 |j        |	Ž }|                     |dz
  |z  ¦  «                             |¦  «        }‰                     |¦  «        ƒ d {V —†}|                     ¦   «                              ¦   «         }ˆfd„|D ¦   «         ƒ d {V —†}t3          ||||¬¦  «        S )Nú%ÚactiveÚexpiredÚupcomingr`   c              “   ó@   •K  — g | ]}t          |‰¦  «        ƒ d {V —†‘ŒS )N)rC   )r+   rA   r"   s     €r-   r.   z"list_contracts.<locals>.<listcomp>   s7   øè è € Ð4Ð4Ð4¨•g˜a ‘n”nÐ$Ð$Ð$Ð$Ð$Ð$Ð4Ð4Ð4r/   )ÚitemsÚtotalrf   rg   )Ú_dateÚtodayÚappendr   r)   Úiliker5   r:   r   Ú
period_endÚperiod_startr
   r   ÚcountÚselect_fromr7   ÚscalarÚorder_byÚ
created_atÚdescÚoffsetrg   r6   Úscalarsr>   r   )rV   r5   r:   re   rf   rg   r"   rh   rr   ÚfiltersÚcount_qrp   ÚqÚresultro   Úenricheds         `         r-   Úlist_contractsr„   Z   sW  øè è € õ ŒK‰MŒM€EØ€GØð <Ø�Š•x”~×+Ò+¨M°¨M¨M¨MÑ:Ô:Ñ;Ô;Ð;Øð :Ø�Š•xÔ*¨jÒ8Ñ9Ô9Ð9Øð 8Ø�Š•xÔ)¨YÒ6Ñ7Ô7Ð7Ø�ÒÐØ�Š•t�HÔ/°5Ò8½(Ô:OÐSXÒ:XÑYÔYÑZÔZÐZÐZØ	�9Ò	Ð	Ø�Š•xÔ*¨UÒ2Ñ3Ô3Ð3Ð3Ø	�:Ò	Ð	Ø�Š•xÔ,¨uÒ4Ñ5Ô5Ð5å•T”Z‘\”\Ñ"Ô"×.Ò.­xÑ8Ô8€GØð *Ø�'”- Ð)ˆØ—)’)˜GÑ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$€Eå�xÑÔ×!Ò!¥(Ô"5×":Ò":Ñ"<Ô"<Ñ=Ô=€AØð ØˆAŒG�WÐˆØ	�Š�$˜‘(˜eÑ#Ñ$Ô$×*Ò*¨5Ñ1Ô1€AØ—:’:˜a‘=”=Ð Ð Ð Ð Ð Ð €FØ�NŠNÑÔ× Ò Ñ"Ô"€EØ4Ð4Ð4Ð4¨eÐ4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4€Hå˜(¨%°dÀ%ÐHÑHÔHÐHr/   z/analyze-pdf.Úfilec              ƒ   óX  K  — ddl m} |j        st          dd¦  «        ‚|                      ¦   «         ƒ d{V —†}|st          dd¦  «        ‚d}t          j        |j        ¬	¦  «        }	 t          j        t          j
        |¦  «        ¦  «        }d
                     d„ |j        D ¦   «         ¦  «                             ¦   «         }n# t          $ r d}Y nw xY wt          j        dd¬¦  «        }	 |r,|j                             d|› d|dd…         › �|¬¦  «        }	�n.t'          j        dd¬¦  «        5 }
|
                     |¦  «         |
j        }ddd¦  «         n# 1 swxY w Y   	 |j                             |ddi¬¦  «        }t3          j        |¦  «         n# t3          j        |¦  «         w xY wt7          d¦  «        D ]h}|j                             |j        ¬¦  «        }|j        j        dk    r n5|j        j        dk    rt          dd¦  «        ‚t=          j        d ¦  «         Œi|j                             d||g|¬¦  «        }	tA          |	j!        ¦  «        }d!„ }|                     d"d¦  «        |                     d#d¦  «         ||                     d$¦  «        ¦  «         ||                     d%¦  «        ¦  «        d&œS # t          $ r ‚ t          $ rL}tE          d'tG          |¦  «        j$        › d(|› �¦  «         t          dd)tK          |¦  «        › �¦  «        ‚d}~ww xY w)*zyUpload a PDF contract and extract summary + dates using Gemini AI.
    Supports both text-based and scanned (image) PDFs.r   )Úsettingsi÷  zAI analysis not configuredNé�  zEmpty file uploadeduà  Kamu adalah Legal Counsel berpengalaman 25+ tahun yang ahli dalam hukum kontrak komersial Indonesia. Tugasmu adalah menganalisis kontrak ini secara mendalam dan profesional dalam BAHASA INDONESIA.

Berikan analisis lengkap dengan format HTML berikut:

<h4>ðŸ“‹ Ringkasan Kontrak</h4>
<p>Jelaskan secara ringkas: nama kontrak, para pihak yang terlibat (siapa pemberi kerja, siapa pelaksana), ruang lingkup pekerjaan/jasa, dan esensi utama kesepakatan. Sertakan nomor kontrak jika ada.</p>

<h4>ðŸ’° Harga & Nilai Kontrak</h4>
[Jika ada tabel harga/tarif, buat tabel HTML lengkap. Jika nilai kontrak tunggal, jelaskan dalam paragraf. Sertakan mata uang, PPN, dan syarat pembayaran.]
<table class="table table-bordered table-sm"><thead><tr><th>Item</th><th>Satuan</th><th>Harga</th></tr></thead><tbody><tr><td>...</td><td>...</td><td>...</td></tr></tbody></table>

<h4>ðŸ“… Jangka Waktu</h4>
<p>Tanggal mulai, tanggal berakhir, total durasi. Sebutkan apakah ada klausul perpanjangan otomatis atau opsi renewal, beserta syaratnya.</p>

<h4>âš ï¸� Sanksi & Denda</h4>
<ul>
<li>Setiap klausul sanksi, denda keterlambatan, penalti kinerja, atau konsekuensi wanprestasi â€” kutip pasal yang relevan</li>
</ul>

<h4>ðŸ”´ Pasal-Pasal Kritis & Risiko Hukum</h4>
<p><strong>Sebagai legal counsel berpengalaman, berikut pasal-pasal yang perlu diwaspadai karena berpotensi merugikan:</strong></p>
<ul>
<li><strong>Pasal [X] â€” [Judul risiko]:</strong> Penjelasan mengapa pasal ini berisiko dan rekomendasi negosiasi atau mitigasi</li>
</ul>
<p><em>Catatan: Identifikasi minimal 3-5 risiko konkret seperti: klausul sepihak, force majeure yang terlalu luas, pembatasan tanggung jawab yang tidak adil, ketentuan pemutusan yang merugikan, hak audit, kerahasiaan, atau ketentuan hukum yang berlaku.</em></p>

Kembalikan HANYA JSON valid, tanpa markdown, tanpa code block:
{"title": "Judul singkat kontrak (maks 100 karakter)", "summary": "<h4>...</h4>...", "period_start": "YYYY-MM-DD atau null", "period_end": "YYYY-MM-DD atau null"})Úapi_keyú
c              3   óB   K  — | ]}|                      ¦   «         pd V — ŒdS )r^   N)Úextract_text)r+   rf   s     r-   ú	<genexpr>zanalyze_pdf.<locals>.<genexpr>¶   s3   è è € ÐLÐL°t˜×*Ò*Ñ,Ô,Ð2°ÐLÐLÐLÐLÐLÐLr/   r^   zapplication/jsoni    )Úresponse_mime_typeÚmax_output_tokenszgemini-2.5-flashz

Contract text:
i N  )ÚmodelÚcontentsÚconfigz.pdfF)ÚsuffixrJ   Ú	mime_typezapplication/pdf)r…   r’   é   )r9   ÚACTIVEÚFAILEDrc   zGemini file processing failedé   c                 ó   — | r| dvr| nd S )N)Únullr^   © )rB   s    r-   Ú
clean_datezanalyze_pdf.<locals>.clean_dateé   s   € ØÐ=˜a |Ð3Ð3�1�1¸Ð=r/   r)   Úsummaryrv   ru   )r)   r�   rv   ru   z[analyze-pdf] exception: z: zAI analysis failed: )&Ú
app.configr‡   ÚGEMINI_API_KEYr   Úreadr   ÚClientÚpypdfÚ	PdfReaderÚioÚBytesIOr;   ÚpagesÚstripÚ	ExceptionÚgenai_typesÚGenerateContentConfigÚmodelsÚgenerate_contentÚtempfileÚNamedTemporaryFileÚwriter9   ÚfilesÚuploadÚosÚunlinkÚrangeÚgetÚstateÚtimeÚsleeprZ   ÚtextrT   ÚtypeÚ__name__Ústr)r…   rh   r‡   ÚcontentÚPROMPTÚclientÚreaderr¹   Újson_configÚresponseÚtmpÚtmp_pathÚuploadedÚfr‚   rœ   Úes                    r-   Úanalyze_pdfrÈ   „   sè  è è € ð $Ð#Ð#Ð#Ð#Ð#àÔ"ð ?Ý˜CÐ!=Ñ>Ô>Ð>à—I’I‘K”KÐÐÐÐÐÐ€GØð 8Ý˜CÐ!6Ñ7Ô7Ð7ðf€Fõ: Œ\ (Ô"9Ð:Ñ:Ô:€Fðå”¥¤¨GÑ!4Ô!4Ñ5Ô5ˆØ�yŠyÐLÐL¸v¼|ÐLÑLÔLÑLÔL×RÒRÑTÔTˆˆøÝð ð ð Øˆˆˆðøøøõ
 Ô3Ø-Øðñ ô €Kð
4BØð #	à”}×5Ò5Ø(Ø"ÐFÐF¸¸V¸e¸V¼ÐFÐFØ"ð 6ñ ô ˆH‰Hõ Ô,°FÀ5ÐIÑIÔIð $ÈSØ—	’	˜'Ñ"Ô"Ð"Øœ8�ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð$Ø!œ<×.Ò.Ø!Ø'Ð):Ð;ð /ñ ô �õ
 ”	˜(Ñ#Ô#Ð#Ð#ø•”	˜(Ñ#Ô#Ð#Ð#øøøõ ˜2‘Y”Yð ð �Ø”L×$Ò$¨(¬-Ð$Ñ8Ô8�Ø”7”< 8Ò+Ð+Ø�EØ”7”< 8Ò+Ð+Ý'¨Ð-LÑMÔMÐMÝ”
˜1‘”��à”}×5Ò5Ø(Ø" FÐ+Ø"ð 6ñ ô ˆHõ # 8¤=Ñ1Ô1ˆð	>ð 	>ð 	>ð #ŸJšJ w°Ñ3Ô3Ø"ŸJšJ y°"Ñ5Ô5Ø&˜J v§z¢z°.Ñ'AÔ'AÑBÔBØ&˜J v§z¢z°,Ñ'?Ô'?Ñ@Ô@ð	
ð 
ð 	
øõ ð ð ð ØÝð Bð Bð BÝÐA­$¨q©'¬'Ô*:ÐAÐA¸aÐAÐAÑBÔBÐBÝ˜CÐ!@½¸A¹¼Ð!@Ð!@ÑAÔAÐAøøøøðBøøøsj   Á)AC ÃCÃCÃ/AK	 Ä3EÅK	 ÅE Å K	 Å#E Å$K	 Å(F ÆK	 ÆF1Æ1DK	 Ë	L)ËAL$Ì$L)éÉ   )r_   Ústatus_codeÚbodyÚcurrent_userc              ƒ   óò  K  — |                       ¦   «         }|                     dg ¦  «        }t          d	i |¤d|j        i¤Ž}|                     |¦  «         |                     ¦   «         ƒ d {V —† t          |j        ||¦  «        ƒ d {V —† |                     ¦   «         ƒ d {V —† |                     |¦  «        ƒ d {V —† |j	        dk    rJt          |d|j        › �d|j        › �d|j        › �¦  «        ƒ d {V —† |                     ¦   «         ƒ d {V —† t          |d|j        › �d|j        › �d|j        › �d¬¦  «        ƒ d {V —† |                     ¦   «         ƒ d {V —† t          ||¦  «        ƒ d {V —†S )
NrE   Ú
created_byÚadminzKontrak baru: zDitambahkan oleh z/contracts/Útelegram_thread_contract)Ú
thread_keyr›   )Ú
model_dumpÚpopr   r(   rK   ÚflushrM   ÚcommitÚrefreshÚroler   r)   Úusernamer    rC   )rË   r"   rÌ   ÚdatarE   r!   s         r-   Úcreate_contractrÚ   ø   sX  è è € ð �?Š?ÑÔ€DØ—h’hÐ0°"Ñ5Ô5€OÝÐ;Ð;˜$Ð;Ð;¨<¬?Ð;Ð;Ð;€HØ‡F‚Fˆ8ÑÔÐØ
�(Š(‰*Œ*ÐÐÐÐÐÐÐÝ
˜Xœ[¨/¸2Ñ
>Ô
>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ø
�)Š)‰+Œ+ÐÐÐÐÐÐÐØ
�*Š*�XÑ
Ô
ÐÐÐÐÐÐÐàÔ˜GÒ#Ð#Ý˜BÐ A°´Ð AÐ AÐCnÐWcÔWlÐCnÐCnð  qLð  Gô  Jð  qLð  qLñ  Mô  Mð  	Mð  	Mð  	Mð  	Mð  	Mð  	Mð  	MØ�iŠi‰kŒkÐÐÐÐÐÐÐÝ
˜BÐ A°´Ð AÐ AÐCnÐWcÔWlÐCnÐCnð  qLð  Gô  Jð  qLð  qLð  Ysð  tñ  tô  tð  tð  tð  tð  tð  tð  tð  tØ
�)Š)‰+Œ+ÐÐÐÐÐÐÐÝ˜ 2Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r/   z/{contract_id}c              ƒ   ó  K  — |                      t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «         }|st          dd¬¦  «        ‚t          ||¦  «        ƒ d {V —†S ©Né”  úContract not found©rÊ   Údetail)r6   r
   r   r7   r(   r8   r   rC   ©rD   r"   rh   r‚   r!   s        r-   Úget_contractrâ     s˜   è è € ð —:’:�f¥XÑ.Ô.×4Ò4µX´[ÀKÒ5OÑPÔPÑQÔQÐQÐQÐQÐQÐQÐQ€FØ×(Ò(Ñ*Ô*€HØð JÝ¨Ð4HÐIÑIÔIÐIÝ˜ 2Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r/   c              ƒ   óf  K  — |                      t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «         }|st          dd¬¦  «        ‚|                     d¬¦  «        }|                     dd ¦  «        }| 	                    ¦   «         D ]\  }}	t          |||	¦  «         Œ|�t          | ||¦  «        ƒ d {V —† |                     ¦   «         ƒ d {V —† |                     |¦  «        ƒ d {V —† t          ||¦  «        ƒ d {V —†S )NrÝ   rÞ   rß   T)Úexclude_unsetrE   )r6   r
   r   r7   r(   r8   r   rÒ   rÓ   ro   ÚsetattrrM   rÕ   rÖ   rC   )
rD   rË   r"   rh   r‚   r!   rÙ   rE   ÚkrB   s
             r-   Úupdate_contractrç     s]  è è € ð —:’:�f¥XÑ.Ô.×4Ò4µX´[ÀKÒ5OÑPÔPÑQÔQÐQÐQÐQÐQÐQÐQ€FØ×(Ò(Ñ*Ô*€HØð JÝ¨Ð4HÐIÑIÔIÐIØ�?Š?¨ˆ?Ñ.Ô.€DØ—h’hÐ0°$Ñ7Ô7€OØ—
’
‘”ð  ð  ‰ˆˆ1Ý�˜!˜QÑÔÐÐØÐ"Ý  ¨o¸rÑBÔBÐBÐBÐBÐBÐBÐBÐBØ
�)Š)‰+Œ+ÐÐÐÐÐÐÐØ
�*Š*�XÑ
Ô
ÐÐÐÐÐÐÐÝ˜ 2Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r/   z/{contract_id}/predecessorsc              ƒ   óÒ  K  — |                      d¦  «        }|r|| k    rt          dd¦  «        ‚|                     t          t          ¦  «                             t          j        |k    t          j        | k    ¦  «        ¦  «        ƒ d{V —†}|                     ¦   «         s>| 	                    t	          || ¬¦  «        ¦  «         | 
                    ¦   «         ƒ d{V —† |                     t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d{V —†}|                     ¦   «         }|st          dd¦  «        ‚t          ||¦  «        ƒ d{V —†S )zGAdd a single predecessor link (from old contract's 'Tandai Pengganti').r<   rˆ   zInvalid predecessor_idNrH   rÝ   rÞ   )rµ   r   r6   r
   r   r7   r<   r=   r8   rK   rÕ   r   r(   rC   )rD   rË   r"   rh   r<   Úexistingr‚   r!   s           r-   Úadd_predecessorrê   2  s€  è è € ð —X’XÐ.Ñ/Ô/€NØð ;˜^¨{Ò:Ð:Ý˜CÐ!9Ñ:Ô:Ð:à—Z’ZÝ�|ÑÔ×"Ò"ÝÔ'¨>Ò9ÝÔ%¨Ò4ñ	
ô 	
ñô ð ð ð ð ð ð €Hð ×&Ò&Ñ(Ô(ð Ø
�Š�|¨>ÈÐTÑTÔTÑUÔUÐUØ�iŠi‰kŒkÐÐÐÐÐÐÐØ—:’:�f¥XÑ.Ô.×4Ò4µX´[ÀKÒ5OÑPÔPÑQÔQÐQÐQÐQÐQÐQÐQ€FØ×(Ò(Ñ*Ô*€HØð 7Ý˜CÐ!5Ñ6Ô6Ð6Ý˜ 2Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r/   z,/{contract_id}/predecessors/{predecessor_id}r<   c              ƒ   ó.  K  — |                      t          d¦  «                             t          ¦  «                             t          j        |k    t          j        | k    ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† |                      t          t          ¦  «                             t          j
        | k    ¦  «        ¦  «        ƒ d{V —†}|                     ¦   «         }|st          dd¦  «        ‚t          ||¦  «        ƒ d{V —†S )z!Remove a single predecessor link.rG   NrÝ   rÞ   )r6   rI   rJ   r   r7   r<   r=   rÕ   r
   r   r(   r8   r   rC   )rD   r<   r"   rh   r‚   r!   s         r-   Úremove_predecessorrì   N  s)  è è € ð �*Š*Ý�<Ñ Ô ×'Ò'­Ñ5Ô5×;Ò;ÝÔ'¨>Ò9ÝÔ%¨Ò4ñ	
ô 	
ñô ð ð ð ð ð ð ð ð �)Š)‰+Œ+ÐÐÐÐÐÐÐØ—:’:�f¥XÑ.Ô.×4Ò4µX´[ÀKÒ5OÑPÔPÑQÔQÐQÐQÐQÐQÐQÐQ€FØ×(Ò(Ñ*Ô*€HØð 7Ý˜CÐ!5Ñ6Ô6Ð6Ý˜ 2Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r/   éÌ   )rÊ   rÏ   c              ƒ   ó^  K  — |                      t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «         }|st          dd¬¦  «        ‚|                     |¦  «        ƒ d {V —† |                     ¦   «         ƒ d {V —† d S rÜ   )	r6   r
   r   r7   r(   r8   r   rJ   rÕ   rá   s        r-   Údelete_contractrï   d  sÀ   è è € ð —:’:�f¥XÑ.Ô.×4Ò4µX´[ÀKÒ5OÑPÔPÑQÔQÐQÐQÐQÐQÐQÐQ€FØ×(Ò(Ñ*Ô*€HØð JÝ¨Ð4HÐIÑIÔIÐIØ
�)Š)�HÑ
Ô
ÐÐÐÐÐÐÐØ
�)Š)‰+Œ+ÐÐÐÐÐÐÐÐÐr/   z/{contract_id}/filec              ƒ   ó˜  K  — |                      t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «         }|st          dd¬¦  «        ‚t          j         	                    |j
        pd¦  «        d         }t          j        ¦   «         j        › |› �}t          j                             t          d|¦  «        }t          j        t          j                             |¦  «        d¬¦  «         t%          j        |d	¦  «        4 ƒd {V —†}	|	                     |                     ¦   «         ƒ d {V —†¦  «        ƒ d {V —† d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   d
|› �|_        |                     ¦   «         ƒ d {V —† |                     |¦  «        ƒ d {V —† |S )NrÝ   rÞ   rß   r^   r`   r[   T©Úexist_okÚwbz/uploads/contracts/)r6   r
   r   r7   r(   r8   r   r²   ÚpathÚsplitextÚfilenameÚuuidÚuuid4Úhexr;   Ú
UPLOAD_DIRÚmakedirsÚdirnameÚaiofilesÚopenr¯   r    Ú	file_pathrÕ   rÖ   ©
rD   r…   r"   rh   r‚   r!   ÚextÚfnameÚfpathrÆ   s
             r-   Úupload_contract_filer  r  sA  è è € ð —:’:�f¥XÑ.Ô.×4Ò4µX´[ÀKÒ5OÑPÔPÑQÔQÐQÐQÐQÐQÐQÐQ€FØ×(Ò(Ñ*Ô*€HØð JÝ¨Ð4HÐIÑIÔIÐIå
Œ'×
Ò
˜4œ=Ð.¨BÑ
/Ô
/°Ô
2€CÝŒz‰|Œ|ÔÐ& Ð&Ð&€EÝŒG�LŠL� [°%Ñ8Ô8€EÝ„K•”—’ Ñ&Ô&°Ð6Ñ6Ô6Ð6ÝŒ}˜U DÑ)Ô)ð )ð )ð )ð )ð )ð )ð )¨QØ�gŠg˜DŸIšI™KœKÐ'Ð'Ð'Ð'Ð'Ð'Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð 7¨uÐ6Ð6€HÔØ
�)Š)‰+Œ+ÐÐÐÐÐÐÐØ
�*Š*�XÑ
Ô
ÐÐÐÐÐÐÐØ€Oó   Ä44E:Å:
FÆFz/{contract_id}/buktic              ƒ   ó˜  K  — |                      t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «         }|st          dd¬¦  «        ‚t          j         	                    |j
        pd¦  «        d         }t          j        ¦   «         j        › |› �}t          j                             t          d|¦  «        }t          j        t          j                             |¦  «        d¬¦  «         t%          j        |d	¦  «        4 ƒd {V —†}	|	                     |                     ¦   «         ƒ d {V —†¦  «        ƒ d {V —† d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   d
|› �|_        |                     ¦   «         ƒ d {V —† |                     |¦  «        ƒ d {V —† |S )NrÝ   rÞ   rß   r^   r`   ÚbuktiTrñ   ró   z/uploads/bukti/)r6   r
   r   r7   r(   r8   r   r²   rô   rõ   rö   r÷   rø   rù   r;   rú   rû   rü   rý   rþ   r¯   r    Úbukti_transfer_pathrÕ   rÖ   r   s
             r-   Úupload_bukti_transferr	  ‹  sA  è è € ð —:’:�f¥XÑ.Ô.×4Ò4µX´[ÀKÒ5OÑPÔPÑQÔQÐQÐQÐQÐQÐQÐQ€FØ×(Ò(Ñ*Ô*€HØð JÝ¨Ð4HÐIÑIÔIÐIå
Œ'×
Ò
˜4œ=Ð.¨BÑ
/Ô
/°Ô
2€CÝŒz‰|Œ|ÔÐ& Ð&Ð&€EÝŒG�LŠL� W¨eÑ4Ô4€EÝ„K•”—’ Ñ&Ô&°Ð6Ñ6Ô6Ð6ÝŒ}˜U DÑ)Ô)ð )ð )ð )ð )ð )ð )ð )¨QØ�gŠg˜DŸIšI™KœKÐ'Ð'Ð'Ð'Ð'Ð'Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð $=°UÐ#<Ð#<€HÔ Ø
�)Š)‰+Œ+ÐÐÐÐÐÐÐØ
�*Š*�XÑ
Ô
ÐÐÐÐÐÐÐØ€Or  )Ur¤   rQ   r²   rU   r­   r·   r÷   rý   r¢   Úfastapir   r   r   r   r   r   Úsqlalchemy.ext.asyncior	   rG   r
   r   r   r   Údatetimer   rq   Útypingr   Úgoogler   Úgoogle.genair   r©   Úapp.databaser   Úapp.models.contractr   Úapp.models.contract_linkr   Úapp.models.userr   Úapp.models.companyr   Úapp.models.vendorr   Úapp.schemas.contractr   r   r   Úapp.schemas.pagedr   Úapp.depsr   r   Úapp.services.notifierr   r   r    ÚdictrC   ÚintÚlistrM   r¼   rZ   Úrouterrô   r;   rü   Ú__file__rú   rµ   r„   ÚpostrÈ   rÚ   râ   Úputrç   rê   rJ   rì   rï   r  r	  r›   r/   r-   ú<module>r!     sÑ  ðØ 	€	€	€	Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ /Ð /Ð /Ð /Ð /Ð /Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -à Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø  Ð  Ð  Ð  Ð  Ð  Ø &Ð &Ð &Ð &Ð &Ð &Ø $Ð $Ð $Ð $Ð $Ð $Ø LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LØ &Ð &Ð &Ð &Ð &Ð &Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ Vð˜Hð ¨,ð ¸4ð ð ð ð ðDO¨#ð OÀÀSÄ	ð OÈ|ð OÐ`dð Oð Oð Oð Oð
˜3ð 
 4ð 
ð 
ð 
ð 
ð 
ˆ˜,¨k¨]Ð	;Ñ	;Ô	;€ØŒW�\Š\˜"œ'Ÿ/š/¨(Ñ3Ô3°_ÑEÔE€
ð ‡‚ˆB˜x¨Ô4€Ñ5Ô5à!˜E $™KœKØ %  d¡¤Ø$˜u T™{œ{Ø!˜E $™KœKØ��a˜A�‘”Ø��r˜a CÐ(Ñ(Ô(Ø�w˜v‘”ØˆgÐ&Ñ'Ô'ð&Ið &IØ�SŒMð&Ià˜”ð&Ið ˜Œ}ð&Ið �SŒMð	&Ið
 ð&Ið ð&Ið 	ð&Ið ð&Ið &Ið &Iñ 6Ô5ð&IðR ‡‚ˆ^ÑÔà�t˜C‘y”yØˆgÐ&Ñ'Ô'ðpBð pBØ
ðpBàðpBð pBð pBñ ÔðpBðf ‡‚ˆR ¸€Ñ=Ô=ð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ð'ð 'Ø
ð'àð'ð ð'ð 'ð 'ñ >Ô=ð'ð, ‡‚Ð¨[€Ñ9Ô9ð �w˜v‘”ØˆgÐ&Ñ'Ô'ð	'ð 	'Øð	'àð	'ð ð	'ð 	'ð 	'ñ :Ô9ð	'ð ‡‚Ð¨[€Ñ9Ô9ð �w˜v‘”ØˆgÐ&Ñ'Ô'ð	'ð 'Øð'à
ð'ð 	ð'ð ð	'ð 'ð 'ñ :Ô9ð'ð* ‡‚Ð*¸;€ÑGÔGð �w˜v‘”ØˆgÐ&Ñ'Ô'ð	'ð 'Øð'à
ð'ð 	ð'ð ð	'ð 'ð 'ñ HÔGð'ð6 ‡‚Ð=Èk€ÑZÔZð �w˜v‘”ØˆgÐ&Ñ'Ô'ð	'ð 'Øð'àð'ð 	ð'ð ð	'ð 'ð 'ñ [ÔZð'ð* ‡‚Ð¨S€Ñ1Ô1ð �w˜v‘”Øˆg�l�l 7Ñ+Ô+Ñ,Ô,ð
ð 
Øð
àð
ð ð
ð 
ð 
ñ 2Ô1ð
ð ‡‚Ð"°;€Ñ?Ô?ð �t˜C‘y”yØ�w˜v‘”ØˆgÐ&Ñ'Ô'ð	ð Øðà
ðð 	ðð ð	ð ð ñ @Ô?ðð0 ‡‚Ð#°K€Ñ@Ô@ð �t˜C‘y”yØ�w˜v‘”ØˆgÐ&Ñ'Ô'ð	ð Øðà
ðð 	ðð ð	ð ð ñ AÔ@ðð ð r/   