§
    �ñi&I  ã                   ó˜  — d dl Z d dlZd dlm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 d dlmZ d dlmZmZmZ d dlmZ d d	lmZmZmZmZmZ d d
lmZ d dlmZm Z   eddg¬¦  «        Z!dZ"de#dedefd„Z$dedede%fd„Z&dedede%fd„Z'dedede%fd„Z(dede)fd„Z*de#dede)fd„Z+de)de)d e)ddfd!„Z,d"e-e         d#e%e#ef         de#dz  fd$„Z.e! /                    d%e-e         ¬&¦  «         ee¦  «         ee¦  «        fded'efd(„¦   «         Z0e! 1                    d%e¬&¦  «         ee¦  «         ee¦  «        fd)eded*efd+„¦   «         Z2e! 3                    d,e¬&¦  «         ee¦  «         ee¦  «        fde#d)eded*efd-„¦   «         Z4e! 5                    d,d.¬/¦  «         ee¦  «         ee¦  «        fde#ded*efd0„¦   «         Z6e! /                    d1e-e         ¬&¦  «         ee¦  «         ee¦  «        fded*efd2„¦   «         Z7e! 1                    d1e¬&¦  «         ee¦  «         ee¦  «        fd)eded*efd3„¦   «         Z8e! /                    d4e¬&¦  «         ee¦  «         ee¦  «        fde#ded'efd5„¦   «         Z9e! 1                    d6e¬&¦  «         e	d7¦  «         e	d7¦  «         e	d7¦  «         ed7¦  «         ee¦  «         ee¦  «        fde#d8e)d9e)d:e)d;eded'efd<„¦   «         Z:e! 1                    d=e¬&¦  «         e	d7¦  «         e	d7¦  «         e	d7¦  «         ed7¦  «         ee¦  «         ee¦  «        fde#d8e)d9e)d>e)d;eded'efd?„¦   «         Z;e! 1                    d@e¬&¦  «         ee¦  «         ee¦  «        fde#ded*efdA„¦   «         Z<e! 3                    dBe¬&¦  «         ee¦  «         ee¦  «        fde#ded*efdC„¦   «         Z=e! 3                    dDe¬&¦  «         ee¦  «         ee¦  «        fde#ded*efdE„¦   «         Z>e! /                    dFe-e         ¬&¦  «         ee¦  «         ee¦  «        fde#ded'efdG„¦   «         Z?dS )Hé    N)Údatetime)Ú	APIRouterÚDependsÚHTTPExceptionÚ
UploadFileÚFileÚForm)ÚAsyncSession)Úselect)Úget_db)ÚDocumentÚBorrowRequestÚBorrowRequestItem)ÚUser)ÚDocumentCreateÚDocumentUpdateÚDocumentOutÚBorrowRequestCreateÚBorrowRequestOut)Úget_current_user)Únotify_user_by_idÚnotify_user_groupú
/documentsÚ	documents)ÚprefixÚtagszuploads/borrowÚdoc_idÚdbÚreturnc              ƒ   óp   K  — |                      t          | ¦  «        ƒ d {V —†}|st          dd¦  «        ‚|S )Né”  zDocument not found)Úgetr   r   )r   r   Údocs      ú=/var/www/html/jarvis.com/web/backend/app/routers/documents.pyÚ_get_doc_or_404r%      sI   è è € Ø—’•x Ñ(Ô(Ð
(Ð
(Ð
(Ð
(Ð
(Ð
(€CØð 7Ý˜CÐ!5Ñ6Ô6Ð6Ø€Jó    r#   c              ƒ   ó�   K  — | j         r&|                     t          | j         ¦  «        ƒ d {V —†nd }i | j        ¥d|r|j        nd i¥S )NÚcustodian_name)Úcustodian_idr"   r   Ú__dict__Úusername)r#   r   Ú	custodians      r$   Ú_enrich_docr-       sk   è è € Ø8;Ô8HÐR�b—f’f�T 3Ô#3Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Èd€IðØ
Œ,ðà°	ÐC˜)Ô,Ð,¸tðð ð r&   Úitemc              ƒ   óº   K  — |                      t          | j        ¦  «        ƒ d {V —†}i | j        ¥|r|j        nd |r|j        nd |r|j        nd |r|j        nd dœ¥S )N)Údocument_nameÚdocument_locationÚdocument_typeÚdocument_custodian_id)r"   r   Údocument_idr*   ÚnameÚlocationÚdoc_typer)   )r.   r   r#   s      r$   Ú_enrich_itemr8   (   s‹   è è € Ø—’•x Ô!1Ñ2Ô2Ð
2Ð
2Ð
2Ð
2Ð
2Ð
2€CðØ
Œ-ðà%(Ð2˜œ˜¨dØ-0Ð:˜Sœ\˜\°dØ),Ð6˜œ˜°$Ø58Ð!B Ô!1Ð!1¸dðð ð ð r&   Úreqc              ƒ   ó˜  ‡K  — ‰                      t          | j        ¦  «        ƒ d {V —†}‰                     t	          t
          ¦  «                             t
          j        | j        k    ¦  «        ¦  «        ƒ d {V —†}ˆfd„| 	                    ¦   «          
                    ¦   «         D ¦   «         ƒ d {V —†}i | j        ¥|r|j        nd |dœ¥S )Nc              “   ó@   •K  — g | ]}t          |‰¦  «        ƒ d {V —†‘ŒS ©N)r8   )Ú.0Úir   s     €r$   ú
<listcomp>z#_enrich_request.<locals>.<listcomp>8   s9   øè è € ÐJÐJÐJ¨1•<  2Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&ÐJÐJÐJr&   )Úrequester_nameÚitems)r"   r   Úrequester_idÚexecuter   r   ÚwhereÚborrow_request_idÚidÚscalarsÚallr*   r+   )r9   r   Ú	requesterÚ	items_resrA   s    `   r$   Ú_enrich_requestrK   3   s  øè è € Ø—f’f�T 3Ô#3Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4€IØ—j’jÝÕ Ñ!Ô!×'Ò'Õ(9Ô(KÈsÌvÒ(UÑVÔVñô ð ð ð ð ð ð €Ið KÐJÐJÐJ°	×0AÒ0AÑ0CÔ0C×0GÒ0GÑ0IÔ0IÐJÑJÔJÐJÐJÐJÐJÐJÐJ€EðØ
Œ,ðà09ÐC˜)Ô,Ð,¸tØðð ð ð r&   Úfilec              ƒ   ó¼  K  — t           j                             | j        pd¦  «        d                              ¦   «         pd}t          j        ¦   «         j        › |› �}t           j                             t          |¦  «        }t          |d¦  «        5 }|                     |                      ¦   «         ƒ d{V —†¦  «         ddd¦  «         n# 1 swxY w Y   d|› �S )z<Save uploaded file to uploads/borrow/, return relative path.Ú é   z.jpgÚwbNú/)ÚosÚpathÚsplitextÚfilenameÚlowerÚuuidÚuuid4ÚhexÚjoinÚBORROW_UPLOAD_DIRÚopenÚwriteÚread)rL   ÚextrU   rS   Úfs        r$   Ú_save_uploadra   @   s  è è € å
Œ'×
Ò
˜4œ=Ð.¨BÑ
/Ô
/°Ô
2×
8Ò
8Ñ
:Ô
:Ð
D¸f€CÝ”*‘,”,Ô"Ð) CÐ)Ð)€HÝŒ7�<Š<Õ)¨8Ñ4Ô4€DÝ	ˆd�DÑ	Ô	ð #˜QØ	�Š�d—i’i‘k”kÐ!Ð!Ð!Ð!Ð!Ð!Ñ"Ô"Ð"ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #àˆtˆ:ˆ:Ðs   Â.CÃCÃCÚreq_idc              ƒ   ó®  K  — |                      t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d{V —†}g }|                     ¦   «                              ¦   «         D ]D}|                     t          |j	        ¦  «        ƒ d{V —†}|r| 
                    |j        ¦  «         ŒE|rd                     |¦  «        ndS )z;Return comma-separated document names for a borrow request.Nú, Ú-)rC   r   r   rD   rE   rG   rH   r"   r   r4   Úappendr5   rZ   )rb   r   rJ   Únamesr.   r#   s         r$   Ú_get_doc_names_for_requestrh   J   sé   è è € à—j’jÝÕ Ñ!Ô!×'Ò'Õ(9Ô(KÈvÒ(UÑVÔVñô ð ð ð ð ð ð €Ið €EØ×!Ò!Ñ#Ô#×'Ò'Ñ)Ô)ð #ð #ˆØ—F’F�8 TÔ%5Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6ˆØð 	#Ø�LŠL˜œÑ"Ô"Ð"øØ$Ð-ˆ4�9Š9�UÑÔÐ¨#Ð-r&   Ú	file_pathrU   Úcaptionc              ƒ   óª  K  — 	 ddl m} ddlm} ddlm}  |¦   «         4 ƒd{V —†}|                     |d¦  «        ƒ d{V —†}|                     |d¦  «        ƒ d{V —†}	|r|j        s	 ddd¦  «        ƒd{V —† dS |	r|	j        rt          |	j        ¦  «        nd}
ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   | 	                    d¦  «        }t          |d	¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y    ||j        ||||
¦  «        ƒ d{V —† dS # t          $ r}t          d
|› �¦  «         Y d}~dS d}~ww xY w)zGRead saved photo from disk and send to Document Request Telegram topic.r   )Ú
send_photo)Ú
AppSetting)ÚAsyncSessionLocalNÚtelegram_user_group_idÚtelegram_thread_documentrQ   Úrbz*[documents] send_photo_to_telegram error: )Úapp.services.telegramrl   Úapp.models.app_settingrm   Úapp.databasern   r"   ÚvalueÚintÚlstripr\   r^   Ú	ExceptionÚprint)r   ri   rU   rj   rl   rm   rn   ÚsessionÚchat_settingÚthread_settingÚ	thread_idÚ	disk_pathr`   Ú
file_bytesÚes                  r$   Ú_send_photo_to_document_topicr�   W   sý  è è € ð@Ø4Ð4Ð4Ð4Ð4Ð4Ø5Ð5Ð5Ð5Ð5Ð5Ø2Ð2Ð2Ð2Ð2Ð2Ø$Ð$Ñ&Ô&ð 	gð 	gð 	gð 	gð 	gð 	gð 	g¨'Ø!(§¢¨ZÐ9QÑ!RÔ!RÐRÐRÐRÐRÐRÐRˆLØ#*§;¢;¨zÐ;UÑ#VÔ#VÐVÐVÐVÐVÐVÐVˆNØð  |Ô'9ð Øð		gð 	gð 	gñ 	gô 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð
 6DÐfÈÔH\Ðf�˜NÔ0Ñ1Ô1Ð1ÐbfˆIð	gð 	gð 	gñ 	gô 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gøøøð 	gð 	gð 	gð 	gð ×$Ò$ SÑ)Ô)ˆ	Ý�)˜TÑ"Ô"ð 	" aØŸš™œˆJð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"àˆj˜Ô+¨Z¸À7ÈIÑVÔVÐVÐVÐVÐVÐVÐVÐVÐVÐVøÝð @ð @ð @ÝÐ>¸1Ð>Ð>Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð@øøøsk   „"D+ ¦AB-Á)D+ Á<B-ÂD+ Â-
B7Â7D+ Â:B7Â;(D+ Ã#DÃ8D+ ÄDÄD+ ÄDÄD+ Ä+
EÄ5EÅErA   Údocsc                 óh   — | D ].}|                      |j        ¦  «        }|r|j        r	|j        c S Œ/d S r<   )r"   r4   r)   )rA   r‚   r.   r#   s       r$   Ú_get_custodian_id_for_requestr„   l   sL   € Øð $ð $ˆØ�hŠh�tÔ'Ñ(Ô(ˆØð 	$�3Ô#ð 	$ØÔ#Ð#Ð#Ð#øØˆ4r&   rN   )Úresponse_modelÚ_c              ƒ   ó  ‡ K  — ‰                       t          t          ¦  «                             t          j        ¦  «        ¦  «        ƒ d {V —†}ˆ fd„|                     ¦   «                              ¦   «         D ¦   «         ƒ d {V —†S )Nc              “   ó@   •K  — g | ]}t          |‰¦  «        ƒ d {V —†‘ŒS r<   )r-   )r=   Údr   s     €r$   r?   z"list_documents.<locals>.<listcomp>|   s9   øè è € ÐEÐEÐE¨•+˜a Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$ÐEÐEÐEr&   )rC   r   r   Úorder_byr5   rG   rH   )r   r†   Úresults   `  r$   Úlist_documentsrŒ   v   s†   øè è € ð
 —:’:�f¥XÑ.Ô.×7Ò7½¼ÑFÔFÑGÔGÐGÐGÐGÐGÐGÐG€FØEÐEÐEÐE¨f¯nªnÑ.>Ô.>×.BÒ.BÑ.DÔ.DÐEÑEÔEÐEÐEÐEÐEÐEÐEÐEr&   ÚpayloadÚcurrent_userc              ƒ   óJ  K  — |j         dk    rt          dd¦  «        ‚t          | j        | j        | j        | j        ¬¦  «        }|                     |¦  «         |                     ¦   «         ƒ d {V —† | 	                    |¦  «        ƒ d {V —† t          ||¦  «        ƒ d {V —†S )NÚadminé“  ú
Admin only)r5   r7   r6   r)   )Úroler   r   r5   r7   r6   r)   ÚaddÚcommitÚrefreshr-   )r�   r   rŽ   r#   s       r$   Úcreate_documentr—      sÆ   è è € ð Ô˜GÒ#Ð#Ý˜C Ñ.Ô.Ð.Ý
ØŒ\ØÔ!ØÔ!ØÔ)ð	ñ ô €Cð ‡F‚Fˆ3�K„K€KØ
�)Š)‰+Œ+ÐÐÐÐÐÐÐØ
�*Š*�S‰/Œ/ÐÐÐÐÐÐÐÝ˜S "Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%r&   z	/{doc_id}c              ƒ   óô  K  — |j         dk    rt          dd¦  «        ‚t          | |¦  «        ƒ d {V —†}|j        dk    r|j        dvrt          dd¦  «        ‚|                     d¬	¦  «                             ¦   «         D ]\  }}t          |||¦  «         Œt          j        ¦   «         |_	        | 
                    ¦   «         ƒ d {V —† |                     |¦  «        ƒ d {V —† t          ||¦  «        ƒ d {V —†S )
Nr�   r‘   r’   Úborrowed)Nr™   Úlosté¦  z/Cannot change status while document is borrowedT)Úexclude_none)r“   r   r%   ÚstatusÚ
model_dumprA   Úsetattrr   ÚutcnowÚ
updated_atr•   r–   r-   )r   r�   r   rŽ   r#   Úfieldru   s          r$   Úupdate_documentr£   “   s*  è è € ð Ô˜GÒ#Ð#Ý˜C Ñ.Ô.Ð.Ý ¨Ñ+Ô+Ð
+Ð
+Ð
+Ð
+Ð
+Ð
+€CØ
„z�ZÒÐ G¤NÐ:TÐ$TÐ$TÝ˜CÐ!RÑSÔSÐSØ×*Ò*¸Ð*Ñ=Ô=×CÒCÑEÔEð #ð #‰ˆˆuÝ��U˜EÑ"Ô"Ð"Ð"Ý”_Ñ&Ô&€C„NØ
�)Š)‰+Œ+ÐÐÐÐÐÐÐØ
�*Š*�S‰/Œ/ÐÐÐÐÐÐÐÝ˜S "Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%r&   éÌ   )Ústatus_codec              ƒ   ó  K  — |j         dk    rt          dd¦  «        ‚t          | |¦  «        ƒ d {V —†}|j        dk    rt          dd¦  «        ‚|                     |¦  «        ƒ d {V —† |                     ¦   «         ƒ d {V —† d S )Nr�   r‘   r’   r™   r›   z3Cannot delete a document that is currently borrowed)r“   r   r%   r�   Údeleter•   ©r   r   rŽ   r#   s       r$   Údelete_documentr©   §   s­   è è € ð Ô˜GÒ#Ð#Ý˜C Ñ.Ô.Ð.Ý ¨Ñ+Ô+Ð
+Ð
+Ð
+Ð
+Ð
+Ð
+€CØ
„z�ZÒÐÝ˜CÐ!VÑWÔWÐWØ
�)Š)�C‰.Œ.ÐÐÐÐÐÐÐØ
�)Š)‰+Œ+ÐÐÐÐÐÐÐÐÐr&   z/borrow-requestsc              ƒ   óP  ‡ K  — |j         dk    rƒ‰                      t          t          ¦  «                             t          j                             ¦   «         ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «                              ¦   «         }n‚‰                      t          t          ¦  «                             t          j                             ¦   «         ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «                              ¦   «         }ˆ fd„|D ¦   «         ƒ d {V —†S )Nr�   c              “   ó@   •K  — g | ]}t          |‰¦  «        ƒ d {V —†‘ŒS r<   ©rK   ©r=   Úrr   s     €r$   r?   z(list_borrow_requests.<locals>.<listcomp>Ä   s9   øè è € Ð7Ð7Ð7¨Q•/ ! RÑ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð7Ð7Ð7r&   )	r“   rC   r   r   rŠ   Ú
created_atÚdescrG   rH   )r   rŽ   r‹   Úrowss   `   r$   Úlist_borrow_requestsr²   ¸   s  øè è € ð
 Ô˜GÒ#Ð#Ø—z’z¥&­Ñ"7Ô"7×"@Ò"@ÅÔAY×A^ÒA^ÑA`ÔA`Ñ"aÔ"aÑbÔbÐbÐbÐbÐbÐbÐbˆØ�~Š~ÑÔ×#Ò#Ñ%Ô%ˆˆð —z’z¥&­Ñ"7Ô"7×"@Ò"@ÅÔAY×A^ÒA^ÑA`ÔA`Ñ"aÔ"aÑbÔbÐbÐbÐbÐbÐbÐbˆØ�~Š~ÑÔ×#Ò#Ñ%Ô%ˆØ7Ð7Ð7Ð7°$Ð7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7r&   c              ƒ   ó
  K  — | j         st          dd¦  «        ‚g }| j         D ]z}|                     t          |¦  «        ƒ d {V —†}|st          dd|› d�¦  «        ‚|j        dk    r!t          dd|j        › d|j        › d	�¦  «        ‚|                     |¦  «         Œ{d
„ |D ¦   «         }t          |¦  «        dk    rt          dd¦  «        ‚t          |j	        | j
        d¬¦  «        }|                     |¦  «         |                     ¦   «         ƒ d {V —† g }|D ]f}t          |j	        |j	        ¬¦  «        }	|                     |	¦  «         |                     |	¦  «         d|_        t          j        ¦   «         |_        Œg|                     ¦   «         ƒ d {V —† |                     |¦  «        ƒ d {V —† t'          |¦  «        d         }
|
r:t)          ||
d|j        › �d| j
        › dt          |¦  «        › d�d¦  «        ƒ d {V —† d                     d„ |D ¦   «         ¦  «        }t/          |d|j        › �d| j
        › d|› �dd¬¦  «        ƒ d {V —† |                     ¦   «         ƒ d {V —† t1          ||¦  «        ƒ d {V —†S )Nr›   zSelect at least one documentr!   z	Document z
 not foundÚ	availablez
Document 'z' is not available (status: ú)c                 ó   — h | ]	}|j         ’Œ
S © )r)   ©r=   r‰   s     r$   ú	<setcomp>z(create_borrow_request.<locals>.<setcomp>Ù   s   € Ð2Ð2Ð2¨�Q”^Ð2Ð2Ð2r&   rO   zXAll documents in one request must have the same custodian. Split into separate requests.Úactive)rB   Úpurposer�   )rE   r4   r™   r   zPinjam dokumen dari zKeperluan: z (z	 dokumen)r   rd   c              3   ó$   K  — | ]}|j         V — Œd S r<   )r5   r¸   s     r$   ú	<genexpr>z(create_borrow_request.<locals>.<genexpr>û   s$   è è € Ð/Ð/ Q˜!œ&Ð/Ð/Ð/Ð/Ð/Ð/r&   zPermintaan pinjam dokumen: ú

Dokumen: rp   ©Ú
thread_key)Údocument_idsr   r"   r   r�   r5   rf   Úlenr   rF   r»   r”   Úflushr   r   r    r¡   r•   r–   Úlistr   r+   rZ   r   rK   )r�   r   rŽ   r‚   r   r#   Úcustodian_idsr9   rA   r.   r)   Ú	doc_namess               r$   Úcreate_borrow_requestrÇ   Ç   sO  è è € ð Ôð AÝ˜CÐ!?Ñ@Ô@Ð@à€DØÔ&ð ð ˆØ—F’F�8 VÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,ˆØð 	EÝ Ð%C°Ð%CÐ%CÐ%CÑDÔDÐDØŒ:˜Ò$Ð$Ý Ð%e°#´(Ð%eÐ%eÐX[ÔXbÐ%eÐ%eÐ%eÑfÔfÐfØ�Š�CÑÔÐÐà2Ð2¨TÐ2Ñ2Ô2€MÝ
ˆ=ÑÔ˜AÒÐÝ˜CÐ!{Ñ|Ô|Ð|å
Ø!”_Ø”Øðñ ô €Cð
 ‡F‚Fˆ3�K„K€KØ
�(Š(‰*Œ*ÐÐÐÐÐÐÐà€EØð +ð +ˆÝ Ø!œfØœð
ñ 
ô 
ˆð 	�Šˆt‰ŒˆØ�Š�TÑÔÐØˆŒ
Ý!œÑ*Ô*ˆŒˆà
�)Š)‰+Œ+ÐÐÐÐÐÐÐØ
�*Š*�S‰/Œ/ÐÐÐÐÐÐÐå˜Ñ&Ô& qÔ)€LØð 
ÝØ�Ø: <Ô#8Ð:Ð:ØA˜'œ/ÐAÐA­S°©Y¬YÐAÐAÐAØñ	
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð —	’	Ð/Ð/¨$Ð/Ñ/Ô/Ñ/Ô/€IÝ
Ø
Ø= lÔ&;Ð=Ð=Ø=�g”oÐ=Ð=°)Ð=Ð=ØØ-ðñ ô ð ð ð ð ð ð ð ð �)Š)‰+Œ+ÐÐÐÐÐÐÐå   bÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)r&   z/borrow-requests/{req_id}c              ƒ   ó˜   K  — |                      t          | ¦  «        ƒ d {V —†}|st          dd¦  «        ‚t          ||¦  «        ƒ d {V —†S )Nr!   ú	Not found)r"   r   r   rK   )rb   r   r†   r9   s       r$   Úget_borrow_requestrÊ     sg   è è € ð —’•} fÑ-Ô-Ð
-Ð
-Ð
-Ð
-Ð
-Ð
-€CØð .Ý˜C Ñ-Ô-Ð-Ý   bÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)r&   z"/borrow-requests/{req_id}/handover.Ú	handed_byÚ	recipientÚhandover_dateÚphotoc              ƒ   ó¬  K  — |                      t          | ¦  «        ƒ d{V —†}|st          dd¦  «        ‚|j        dk    rt          dd|j        › d�¦  «        ‚	 t	          j        |¦  «        }n# t          $ r t          dd¦  «        ‚w xY wt          |¦  «        ƒ d{V —†}	||_        ||_	        ||_
        |	|_        d	|_        |                     t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d{V —†}
|
                     ¦   «                              ¦   «         D ]I}|                      t&          |j        ¦  «        ƒ d{V —†}|rd
|_        t	          j        ¦   «         |_        ŒJt1          |j        |¦  «        ƒ d{V —†}t5          |d|j        › �d|› d|› d|› �dd¬¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† ddl}|                     t=          ||	|j        pdd|j        › d|› d|› d|› �¦  «        ¦  «         |                      |¦  «        ƒ d{V —† tC          ||¦  «        ƒ d{V —†S )zQRecord that documents were handed over to recipient. Any Jarvis user can do this.Nr!   rÉ   rº   r›   z+Cannot record handover: request status is 'ú'z*Invalid handover_date format, use ISO 8601Úhanded_overÚwith_borrowerzSerah terima dokumen: #zDiserahkan oleh: õ    â†’ kepada: r¾   r   rp   r¿   r   zhandover.jpgu   ðŸ“¸ Foto serah terima #Ú
õ    â†’ )"r"   r   r   r�   r   ÚfromisoformatÚ
ValueErrorra   Úhandover_handed_byÚhandover_recipientrÍ   Úhandover_photo_pathrC   r   r   rD   rE   rG   rH   r   r4   r6   r    r¡   rh   rF   r   r•   ÚasyncioÚcreate_taskr�   rU   r–   rK   )rb   rË   rÌ   rÍ   rÎ   r   r†   r9   Úparsed_dateÚ
photo_pathrJ   r.   r#   rÆ   rÛ   s                  r$   Úrecord_handoverrß     s  è è € ð —’•} fÑ-Ô-Ð
-Ð
-Ð
-Ð
-Ð
-Ð
-€CØð .Ý˜C Ñ-Ô-Ð-Ø
„z�XÒÐÝ˜CÐ!\ÈsÌzÐ!\Ð!\Ð!\Ñ]Ô]Ð]ðOÝÔ,¨]Ñ;Ô;ˆˆøÝð Oð Oð OÝ˜CÐ!MÑNÔNÐNðOøøøõ $ EÑ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*€Jà&€CÔØ&€CÔØ#€CÔØ(€CÔØ€C„Jð —j’jÝÕ Ñ!Ô!×'Ò'Õ(9Ô(KÈvÒ(UÑVÔVñô ð ð ð ð ð ð €Ið ×!Ò!Ñ#Ô#×'Ò'Ñ)Ô)ð /ð /ˆØ—F’F�8 TÔ%5Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6ˆØð 	/Ø*ˆCŒLÝ%œ_Ñ.Ô.ˆCŒNøå0°´¸Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<€IÝ
Ø
Ø* #¤&Ð*Ð*ØU˜IÐUÐU°IÐUÐUÈ)ÐUÐUØØ-ðñ ô ð ð ð ð ð ð ð ð �)Š)‰+Œ+ÐÐÐÐÐÐÐØ€N€N€NØ×ÒÕ5Ø
ˆJ˜œÐ8¨.Ø^ 3¤6Ð^Ð^¨YÐ^Ð^¸YÐ^Ð^ÐS\Ð^Ð^ñô ñ ô ð ð �*Š*�S‰/Œ/ÐÐÐÐÐÐÐÝ   bÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ó   ÁA0 Á0Bz&/borrow-requests/{req_id}/return-photoÚreturn_datec              ƒ   óÒ  K  — |                      t          | ¦  «        ƒ d{V —†}|st          dd¦  «        ‚|j        dk    rt          dd|j        › d�¦  «        ‚	 t	          j        |¦  «         n# t          $ r t          dd¦  «        ‚w xY wt          |¦  «        ƒ d{V —†}||_        ||_	        ||_
        d	|_        |                     ¦   «         ƒ d{V —† |                     t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d{V —†}	|	                     ¦   «                              ¦   «         }
|
rW|                      t&          |
d
         j        ¦  «        ƒ d{V —†}|r)|j        r"t-          ||j        dd| › d�d¦  «        ƒ d{V —† t/          | |¦  «        ƒ d{V —†}t1          |d| › �d|› d|› d|› �dd¬¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† d
dl}|                     t7          |||j        pdd| › d|› d|› d|› �¦  «        ¦  «         |                     |¦  «        ƒ d{V —† t=          ||¦  «        ƒ d{V —†S )z7Record return photo proof. Any Jarvis user can do this.Nr!   rÉ   rÑ   r›   z)Cannot record return: request status is 'rÐ   z(Invalid return_date format, use ISO 8601Úreturn_pendingr   zDokumen sedang dikembalikanúPermintaan #z, menunggu konfirmasi pengembalian dari kamu.r   zPengembalian dokumen: #zDikembalikan oleh: rÓ   r¾   rp   r¿   z
return.jpgu   ðŸ“¸ Foto pengembalian #rÔ   rÕ   )r"   r   r   r�   r   rÖ   r×   ra   Úreturn_handed_byÚreturn_recipientÚreturn_photo_pathr•   rC   r   r   rD   rE   rG   rH   r   r4   r)   r   rh   r   rÛ   rÜ   r�   rU   r–   rK   )rb   rË   rÌ   rá   rÎ   r   r†   r9   rÞ   rJ   rA   r#   rÆ   rÛ   s                 r$   Úrecord_return_photorè   N  sp  è è € ð —’•} fÑ-Ô-Ð
-Ð
-Ð
-Ð
-Ð
-Ð
-€CØð .Ý˜C Ñ-Ô-Ð-Ø
„z�]Ò"Ð"Ý˜CÐ!ZÈSÌZÐ!ZÐ!ZÐ!ZÑ[Ô[Ð[ðMÝÔ˜{Ñ+Ô+Ð+Ð+øÝð Mð Mð MÝ˜CÐ!KÑLÔLÐLðMøøøõ $ EÑ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*€JØ$€CÔØ$€CÔØ&€CÔØ!€C„Jà
�)Š)‰+Œ+ÐÐÐÐÐÐÐð —j’jÝÕ Ñ!Ô!×'Ò'Õ(9Ô(KÈvÒ(UÑVÔVñô ð ð ð ð ð ð €Ið ×ÒÑÔ×#Ò#Ñ%Ô%€EØð Ø—F’F�8 U¨1¤XÔ%9Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:ˆØð 	�3Ô#ð 	Ý#Ø�CÔ$Ø-ØS˜vÐSÐSÐSØñ	ô ð ð ð ð ð ð ð õ 1°¸Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<€IÝ
Ø
Ø* &Ð*Ð*ØW˜iÐWÐW°iÐWÐWÈIÐWÐWØØ-ðñ ô ð ð ð ð ð ð ð ð �)Š)‰+Œ+ÐÐÐÐÐÐÐØ€N€N€NØ×ÒÕ5Ø
ˆJ˜œÐ6¨,Ø^ 6Ð^Ð^¨YÐ^Ð^¸YÐ^Ð^ÐS\Ð^Ð^ñô ñ ô ð ð
 �*Š*�S‰/Œ/ÐÐÐÐÐÐÐÝ   bÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)rà   z!/borrow-requests/{req_id}/confirmc              ƒ   óÀ  K  — |                      t          | ¦  «        ƒ d{V —†}|st          dd¦  «        ‚|j        dk    rt          dd|j        › d�¦  «        ‚|                     t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d{V —†}| 	                    ¦   «          
                    ¦   «         }|j        dk    rP|rN|                      t          |d	         j        ¦  «        ƒ d{V —†}|r |j        |j        k    rt          d
d¦  «        ‚d|_        t!          j        ¦   «         |_        |D ]P}|                      t          |j        ¦  «        ƒ d{V —†}|r&d|_        d|_        t!          j        ¦   «         |_        ŒQ|                     ¦   «         ƒ d{V —† t-          ||j        dd| › d�d¦  «        ƒ d{V —† t1          | |¦  «        ƒ d{V —†}t3          |d| › �d|j        › d|› �dd¬¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† |                     |¦  «        ƒ d{V —† t9          ||¦  «        ƒ d{V —†S )z?Custodian confirms documents received. Only custodian or admin.Nr!   rÉ   rã   r›   z#Cannot confirm: request status is 'rÐ   r�   r   r‘   z&Only the custodian can confirm receiptÚ	completedr´   Úhomez!Pengembalian dokumen dikonfirmasirä   z) selesai. Dokumen sudah diterima kembali.r   z Konfirmasi penerimaan dokumen: #zDiterima kembali oleh r¾   rp   r¿   )r"   r   r   r�   rC   r   r   rD   rE   rG   rH   r“   r   r4   r)   rF   r   r    Úcompleted_atr6   r¡   r•   r   rB   rh   r   r+   r–   rK   )	rb   r   rŽ   r9   rJ   rA   r#   r.   rÆ   s	            r$   Úconfirm_receiptrí   �  s  è è € ð —’•} fÑ-Ô-Ð
-Ð
-Ð
-Ð
-Ð
-Ð
-€CØð .Ý˜C Ñ-Ô-Ð-Ø
„zÐ%Ò%Ð%Ý˜CÐ!TÀsÄzÐ!TÐ!TÐ!TÑUÔUÐUð —j’jÝÕ Ñ!Ô!×'Ò'Õ(9Ô(KÈvÒ(UÑVÔVñô ð ð ð ð ð ð €Ið ×ÒÑÔ×#Ò#Ñ%Ô%€EØÔ˜GÒ#Ð#¨Ð#Ø—F’F�8 U¨1¤XÔ%9Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:ˆØð 	O�3Ô# |¤Ò6Ð6Ý Ð%MÑNÔNÐNà€C„JÝ”Ñ(Ô(€CÔàð /ð /ˆØ—F’F�8 TÔ%5Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6ˆØð 	/Ø$ˆCŒJØ!ˆCŒLÝ%œ_Ñ.Ô.ˆCŒNøà
�)Š)‰+Œ+ÐÐÐÐÐÐÐå
Ø
ˆCÔØ+ØH�vÐHÐHÐHØñ	ô ð ð ð ð ð ð ð õ 1°¸Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<€IÝ
Ø
Ø3¨6Ð3Ð3ØN Ô!6ÐNÐNÀ9ÐNÐNØØ-ðñ ô ð ð ð ð ð ð ð ð �)Š)‰+Œ+ÐÐÐÐÐÐÐà
�*Š*�S‰/Œ/ÐÐÐÐÐÐÐÝ   bÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)r&   z/{doc_id}/move-to-bankc              ƒ   ó   K  — |j         dk    rt          dd¦  «        ‚t          | |¦  «        ƒ d{V —†}|j        dk    rt          dd|j        › d�¦  «        ‚d	|_        t	          j        ¦   «         |_        |                     ¦   «         ƒ d{V —† t          |d
|j	        › �d|j
        pd› d|j        › �dd¬¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† |                     |¦  «        ƒ d{V —† t          ||¦  «        ƒ d{V —†S )z,Move document from home to bank. Admin only.r�   r‘   r’   Nrë   r›   úDocument is at 'z', not homeÚbankzDokumen dipindah ke bank: úTipe: re   ú	 | Oleh: r   rp   r¿   ©r“   r   r%   r6   r   r    r¡   r•   r   r5   r7   r+   r–   r-   r¨   s       r$   Úmove_to_bankrô   Æ  sv  è è € ð Ô˜GÒ#Ð#Ý˜C Ñ.Ô.Ð.Ý ¨Ñ+Ô+Ð
+Ð
+Ð
+Ð
+Ð
+Ð
+€CØ
„|�vÒÐÝ˜CÐ!M°C´LÐ!MÐ!MÐ!MÑNÔNÐNØ€C„LÝ”_Ñ&Ô&€C„NØ
�)Š)‰+Œ+ÐÐÐÐÐÐÐÝ
Ø
Ø/ S¤XÐ/Ð/ØF�”Ð$ ÐFÐF¨|Ô/DÐFÐFØØ-ðñ ô ð ð ð ð ð ð ð ð �)Š)‰+Œ+ÐÐÐÐÐÐÐØ
�*Š*�S‰/Œ/ÐÐÐÐÐÐÐÝ˜S "Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%r&   z/{doc_id}/retrieve-from-bankc              ƒ   ó   K  — |j         dk    rt          dd¦  «        ‚t          | |¦  «        ƒ d{V —†}|j        dk    rt          dd|j        › d�¦  «        ‚d	|_        t	          j        ¦   «         |_        |                     ¦   «         ƒ d{V —† t          |d
|j	        › �d|j
        pd› d|j        › �dd¬¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† |                     |¦  «        ƒ d{V —† t          ||¦  «        ƒ d{V —†S )z,Move document from bank to home. Admin only.r�   r‘   r’   Nrð   r›   rï   z', not bankrë   zDokumen diambil dari bank: rñ   re   rò   r   rp   r¿   ró   r¨   s       r$   Úretrieve_from_bankrö   á  sv  è è € ð Ô˜GÒ#Ð#Ý˜C Ñ.Ô.Ð.Ý ¨Ñ+Ô+Ð
+Ð
+Ð
+Ð
+Ð
+Ð
+€CØ
„|�vÒÐÝ˜CÐ!M°C´LÐ!MÐ!MÐ!MÑNÔNÐNØ€C„LÝ”_Ñ&Ô&€C„NØ
�)Š)‰+Œ+ÐÐÐÐÐÐÐÝ
Ø
Ø0 c¤hÐ0Ð0ØF�”Ð$ ÐFÐF¨|Ô/DÐFÐFØØ-ðñ ô ð ð ð ð ð ð ð ð �)Š)‰+Œ+ÐÐÐÐÐÐÐØ
�*Š*�S‰/Œ/ÐÐÐÐÐÐÐÝ˜S "Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%r&   z/{doc_id}/historyc              ƒ   ó   ‡K  — t          | ‰¦  «        ƒ d {V —† ‰                     t          t          ¦  «                             t
          t
          j        t          j        k    ¦  «                             t
          j	        | k    ¦  «         
                    t          j                             ¦   «         ¦  «        ¦  «        ƒ d {V —†}ˆfd„|                     ¦   «                              ¦   «         D ¦   «         ƒ d {V —†S )Nc              “   ó@   •K  — g | ]}t          |‰¦  «        ƒ d {V —†‘ŒS r<   r¬   r­   s     €r$   r?   z(get_document_history.<locals>.<listcomp>	  s9   øè è € ÐIÐIÐI¨Q•/ ! RÑ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(ÐIÐIÐIr&   )r%   rC   r   r   rZ   r   rE   rF   rD   r4   rŠ   r¯   r°   rG   rH   )r   r   r†   r‹   s    `  r$   Úget_document_historyrù   ü  sú   øè è € õ ˜& "Ñ
%Ô
%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø—:’:Ý�}ÑÔß	ŠÕÕ!2Ô!DÍÔHXÒ!XÑ	YÔ	Yß	ŠÕ Ô,°Ò6Ñ	7Ô	7ß	Š•-Ô*×/Ò/Ñ1Ô1Ñ	2Ô	2ñ	ô ð ð ð ð ð ð €Fð JÐIÐIÐI°&·.².Ñ2BÔ2B×2FÒ2FÑ2HÔ2HÐIÑIÔIÐIÐIÐIÐIÐIÐIÐIr&   )@rR   rW   r   Úfastapir   r   r   r   r   r	   Úsqlalchemy.ext.asyncior
   Ú
sqlalchemyr   rt   r   Úapp.models.documentr   r   r   Úapp.models.userr   Úapp.schemas.documentr   r   r   r   r   Úapp.depsr   Úapp.services.notifierr   r   Úrouterr[   rv   r%   Údictr-   r8   rK   Ústrra   rh   r�   rÄ   r„   r"   rŒ   Úpostr—   Úpatchr£   r§   r©   r²   rÇ   rÊ   rß   rè   rí   rô   rö   rù   r·   r&   r$   ú<module>r     s	  ðØ 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ /Ð /Ð /Ð /Ð /Ð /Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ  Ð  Ð  Ð  Ð  Ð  ðð ð ð ð ð ð ð ð ð ð ð ð ð ð &Ð %Ð %Ð %Ð %Ð %Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ Fà	ˆ˜,¨k¨]Ð	;Ñ	;Ô	;€à$Ð ð
 #ð ¨<ð ¸Hð ð ð ð ð˜8ð ¨ð ¸$ð ð ð ð ðÐ.ð °Lð ÀTð ð ð ð ð
˜}ð 
°,ð 
À4ð 
ð 
ð 
ð 
ð˜Zð ¨Cð ð ð ð ð
.¨Sð 
.°lð 
.Àsð 
.ð 
.ð 
.ð 
.ð@°sð @Àcð @ÐTWð @Ð\`ð @ð @ð @ð @ð*¨Ð.?Ô)@ð ÈÈSÐRZÈ]ÔH[ð Ð`cÐfjÑ`jð ð ð ð ð ‡‚ˆB˜t KÔ0€Ñ1Ô1à�w˜v‘”ØˆgÐ&Ñ'Ô'ðFð FØðFàðFð Fð Fñ 2Ô1ðFð ‡‚ˆR €Ñ,Ô,ð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ð&ð &Øð&àð&ð ð&ð &ð &ñ -Ô,ð&ð& ‡‚ˆk¨+€Ñ6Ô6ð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ð	&ð &Øð&àð&ð 	ð&ð ð	&ð &ð &ñ 7Ô6ð&ð& ‡‚ˆ{¨€Ñ,Ô,ð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ðð Øðàðð ðð ð ñ -Ô,ðð  ‡‚Ð¨tÐ4DÔ/E€ÑFÔFà�w˜v‘”Ø ˜Ð!1Ñ2Ô2ð8ð 8Øð8àð8ð 8ð 8ñ GÔFð8ð ‡‚ÐÐ0@€ÑAÔAð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ð=*ð =*Ø ð=*àð=*ð ð=*ð =*ð =*ñ BÔAð=*ð@ ‡‚Ð'Ð8H€ÑIÔIð �w˜v‘”ØˆgÐ&Ñ'Ô'ð*ð *Øð*àð*ð ð*ð *ð *ñ JÔIð*ð ‡‚Ð1ÐBR€ÑSÔSð �T˜#‘Y”YØ�T˜#‘Y”YØ˜˜c™œØ˜˜S™	œ	Ø�w˜v‘”ØˆgÐ&Ñ'Ô'ð6*ð 6*Øð6*àð6*ð ð6*ð ð	6*ð
 ð6*ð 	ð6*ð ð6*ð 6*ð 6*ñ TÔSð6*ðr ‡‚Ð5ÐFV€ÑWÔWð �T˜#‘Y”YØ�T˜#‘Y”YØ�t˜C‘y”yØ˜˜S™	œ	Ø�w˜v‘”ØˆgÐ&Ñ'Ô'ð;*ð ;*Øð;*àð;*ð ð;*ð ð	;*ð
 ð;*ð 	ð;*ð ð;*ð ;*ð ;*ñ XÔWð;*ð| ‡‚Ð0ÐAQ€ÑRÔRð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ð3*ð 3*Øð3*àð3*ð ð3*ð 3*ð 3*ñ SÔRð3*ðp ‡‚Ð&°{€ÑCÔCð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ð&ð &Øð&àð&ð ð&ð &ð &ñ DÔCð&ð4 ‡‚Ð,¸[€ÑIÔIð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ð&ð &Øð&àð&ð ð&ð &ð &ñ JÔIð&ð4 ‡‚Ð°Ð5EÔ0F€ÑGÔGð �w˜v‘”ØˆgÐ&Ñ'Ô'ðJð JØðJàðJð ðJð Jð Jñ HÔGðJð Jð Jr&   