Ë
    :F´j "  ã                   óÌ  — 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
Z
d dlZd dlmZ  ee«      Zej                   d„ «       Z ej$                  «       a e j(                  dd«      j+                  «       dv a e e j(                  dd	«      «      adat,        r( et&        t0        ¬
«      at        j3                  d¬«       ej5                  d«      d„ «       Zej5                  d«      d„ «       Zej5                  d«      d„ «       Zej5                  d«      d„ «       Zej5                  d«      d„ «       Zej5                  d«      d„ «       Z ej5                  d«      d„ «       Z!ej5                  ddg¬«      d„ «       Z"ej5                  ddg¬«      d „ «       Z#ej5                  d!d"dg¬«      d#„ «       Z$ed$k(  r. e e j(                  d%d&«      «      Z%ejM                  d'e%d(¬)«       yy)*é    N)ÚFlaskÚrequestÚjsonifyÚrender_templateÚ	send_fileÚabort)ÚStorageWatcherc                 óœ   — d| j                   d<   d| j                   d<   d| j                   d<   d| j                   d<   d| j                   d	<   | S )
NÚ*zAccess-Control-Allow-OriginzGET, POST, OPTIONS, PUT, DELETEzAccess-Control-Allow-MethodszAccess-Control-Allow-HeadersÚALLOWALLzX-Frame-Optionszframe-ancestors *zContent-Security-Policy)Úheaders)Úresponses    ú//var/www/html/ioplay-suite/ioplay-dcm/server.pyÚadd_security_headersr      s\   € à69€H×ÑÐ2Ñ3Ø7X€H×ÑÐ3Ñ4Ø7:€H×ÑÐ3Ñ4Ø*4€H×ÑÐ&Ñ'Ø2E€H×ÑÐ.Ñ/Ø€Oó    ÚENABLE_WATCHERÚtrue©r   Ú1ÚyesÚWATCHER_INTERVALÚ10©Ústorage_pathsÚinterval_secondsT©Úrun_initial_scanú/c                  óô  — t         j                  j                  d«      xsD t         j                  j                  d«      xs# t         j                  j                  d«      xs d} t         j                  j                  dd«      }t         j                  j                  dd«      }t         j                  j                  d«      xs# t         j                  j                  d«      xs d}t        d	| |||¬
«      S )u>   PÃ¡gina principal del visor integrada como iframe o standaloneÚowner_idÚcustomer_idÚidÚ ÚyearÚmonthÚtypeÚdocument_typezviewer.html©r    Úselected_yearÚselected_monthÚselected_type)r   ÚargsÚgetr   r(   s       r   Úindexr.      sÀ   € ô �|‰|×Ñ 
Ó+Òn¬w¯|©|×/?Ñ/?ÀÓ/NÒnÔRY×R^ÑR^×RbÑRbÐcgÓRhÒnÐln€HÜ—L‘L×$Ñ$ V¨RÓ0€MÜ—\‘\×%Ñ% g¨rÓ2€NÜ—L‘L×$Ñ$ VÓ,ÒW´·±×0@Ñ0@ÀÓ0QÒWÐUW€MäØØØ#Ø%Ø#ôð r   z/api/documentsc                  óŽ  — t         j                  j                  d«      xs@ t         j                  j                  d«      xs t         j                  j                  d«      } | st        ddg ddœ«      S t         j                  j                  dt        ¬	«      }t         j                  j                  d
t        ¬	«      }t         j                  j                  d«      xs t         j                  j                  d«      }t        j                  t        | «      j                  «       |||¬«      }t        d| t        |«      |dœ«      S )uK   Retorna los documentos (facturas, contratos, Ã³rdenes, etc.) del suscriptorr    r!   r"   Úsuccessr   u   No se proporcionÃ³ owner_id)ÚstatusÚcountÚdataÚmessager$   )r&   r%   r&   r'   )r$   r%   r'   )r1   r!   r2   r3   )
r   r,   r-   r   ÚintÚdbÚget_invoices_by_customerÚstrÚstripÚlen)r    r$   r%   r'   Ú	documentss        r   Úapi_documentsr<   .   s  € ô �|‰|×Ñ 
Ó+Òh¬w¯|©|×/?Ñ/?ÀÓ/NÒhÔRY×R^ÑR^×RbÑRbÐcgÓRh€HÙÜØØØØ4ñ	
ó ð 	ô �<‰<×Ñ˜F¬ÐÓ-€DÜ�L‰L×Ñ˜W¬3ÐÓ/€EÜ—L‘L×$Ñ$ VÓ,ÒQ´·±×0@Ñ0@ÀÓ0Q€Mä×+Ñ+ÜˆH‹×ÑÓØØØ#ô	€Iô ØØÜ�Y“Øñ	ó ð r   z!/api/customer/<customer_id>/yearsc                 óÎ   — t         j                  j                  d«      xs t         j                  j                  d«      }t        j                  | |¬«      }t        d| |dœ«      S )u?   Retorna los aÃ±os con documentos disponibles para el suscriptorr&   r'   )r'   r0   )r1   r!   Úyears)r   r,   r-   r6   Úget_customer_yearsr   )r!   r'   r>   s      r   Úapi_customer_yearsr@   K   sY   € ô —L‘L×$Ñ$ VÓ,ÒQ´·±×0@Ñ0@ÀÓ0Q€MÜ×!Ñ! +¸]ÔK€EÜØØ"Øñó ð r   z!/api/customer/<customer_id>/typesc                 óJ   — t        j                  | «      }t        d| |dœ«      S )uI   Retorna los tipos documentales disponibles para un suscriptor especÃ­ficor0   )r1   r!   Útypes)r6   Úget_customer_document_typesr   )r!   rB   s     r   Úapi_customer_typesrD   V   s/   € ô ×*Ñ*¨;Ó7€EÜØØ"Øñó ð r   z
/api/typesc                  óF   — t        j                  «       } t        d| dœ«      S )z<Retorna todos los tipos documentales indexados en el sistemar0   )r1   rB   )r6   Úget_all_document_typesr   )rB   s    r   Úapi_all_typesrG   `   s*   € ô ×%Ñ%Ó'€EÜØØñó ð r   z /api/documents/<int:doc_id>/filec                 óþ  — t         j                  j                  dd«      dv }	 t        j                  «       5 }|j                  d| f«      }|j                  «       }ddd«       st        dd¬
«       |d   }t        j                  j                  |«      sõd}t        rt        nt        j                  «       }t!        j"                  dd|d   «      }	|D ]‹  }
t        j                  j%                  |
|	«      }t        j                  j                  |«      r|} nHt        j                  j%                  |
|d   «      }t        j                  j                  |«      sŒ‰|} n |r|}n$t        d|› d|› �«       t        dd|d   › �¬
«       t'        j(                  |«      \  }}|sd}t+        ||||d   ¬«      S # 1 sw Y   �Œ`xY w# t        $ r,}t        d| › d|› �«       t        dd	|› �¬
«       Y d}~�Œ“d}~ww xY w)uM   Sirve de forma segura el archivo del documento para visualizaciÃ³n o descargaÚdownloadÚ0©r   r   z)SELECT * FROM invoices_index WHERE id = ?Nz+[SERVER-ERROR] Error consultando documento z en BD: iô  z!Error consultando base de datos: )Údescriptioni”  u%   Documento no encontrado en el Ã­ndiceÚfile_full_pathz^\[dir_\d+\]/r#   Úfile_relative_pathÚ	file_namez.[SERVER-WARN] Archivo no encontrado en disco: z ni en uB   El archivo fÃ­sico no existe en los volÃºmenes de almacenamiento: zapplication/octet-stream)ÚmimetypeÚas_attachmentÚdownload_name)r   r,   r-   r6   Úget_connectionÚexecuteÚfetchoneÚ	ExceptionÚprintr   ÚosÚpathÚexistsÚSTORAGE_PATHSÚindexerÚget_configured_storage_pathsÚreÚsubÚjoinÚ	mimetypesÚ
guess_typer   )Údoc_idrI   ÚconnÚcursorÚdocÚeÚ	file_pathÚresolvedÚstorage_listÚ	clean_relÚbase_pÚalt_pathÚdirect_filerP   Ú_s                  r   Úapi_document_filerp   i   sæ  € ô �|‰|×Ñ 
¨CÓ0°MÐA€HðHÜ×ÑÓ ð 	$ DØ—\‘\Ð"MÐPVÈyÓYˆFØ—/‘/Ó#ˆC÷	$ñ ÜˆcÐFÕGàÐ$Ñ%€Iô �7‰7�>‰>˜)Ô$ØˆÝ(5•}¼7×;_Ñ;_Ó;aˆÜ—F‘FÐ+¨R°Ð5IÑ1JÓKˆ	à"ò 	ˆFÜ—w‘w—|‘| F¨IÓ6ˆHÜ�w‰w�~‰~˜hÔ'Ø#�ÙÜŸ'™'Ÿ,™, v¨s°;Ñ/?Ó@ˆKÜ�w‰w�~‰~˜kÕ*Ø&�Ùð	ñ Ø ‰IäÐBÀ9À+ÈWÐUaÐTbÐcÔdÜ�#Ð%gÐhkÐlwÑhxÐgyÐ#zÕ{ä×&Ñ& yÓ1�K€HˆaÙØ-ˆäØØØØ˜+Ñ&ô	ð ÷M	$ñ 	$ûô ò HÜÐ;¸F¸8À8ÈAÈ3ÐOÔPÜˆcÐ!BÀ1À#ÐF×GÓGûðHús.   ¤G ¸$F:ÁG Æ:GÆ?G Ç	G<Ç!G7Ç7G<z/api/indexer/statusc                  óX   — t        j                  «       } t        | d<   t        d| dœ«      S )uE   Estado y estadÃ­sticas del indexador con desglose por tipo documentalr   r0   )r1   Ústats)r6   Ú	get_statsr[   r   )rr   s    r   Úapi_indexer_statusrt   œ   s1   € ô �L‰L‹N€EÜ*€Eˆ/ÑÜØØñó ð r   z/api/indexer/scanÚPOST)Úmethodsc                  ó†   — t         rt         j                  «       } nt        j                  t        «      } t        d| dœ«      S )z:Fuerza un escaneo manual de almacenamiento multi-documentor0   )r1   Úresult)ÚwatcherÚtrigger_scan_nowr\   Úscan_storage_directoryr[   r   )Úress    r   Úapi_indexer_scanr}   ¦   s=   € õ Ü×&Ñ&Ó(‰ä×,Ñ,¬]Ó;ˆÜØØñó ð r   z/api/indexer/resetc                  óš  — t         j                  j                  dd«      dv } t         j                  j                  dd«      dv }|rt        j                  «        nt        j
                  «        d}| r4t        rt        j                  «       }nt        j                  t        «      }t        j                  «       }t        dd| ||dœ«      S )	zFLimpia o recrea la base de datos y opcionalmente reindexa (?reindex=1)ÚreindexrJ   rK   ÚschemaNr0   z&Base de datos reiniciada correctamente)r1   r4   Ú	reindexedÚscan_resultrr   )r   r,   r-   r6   Úreset_db_schemaÚclear_dbry   rz   r\   r{   r[   rs   r   )r   r€   Úscan_resÚ	new_statss       r   Úapi_indexer_resetr‡   ²   s§   € ô �l‰l×Ñ˜y¨#Ó.°-Ð?€GÜ�\‰\×Ñ˜h¨Ó,°Ð=€FáÜ
×ÑÕä
�‰Œà€HÙÝÜ×/Ñ/Ó1‰Hä×5Ñ5´mÓDˆHä—‘“€IÜØØ;ØØØñó ð r   z/api/indexer/configÚGETc            	      ó  — t         j                  dk(  �r&t        j                  d¬«      xs t         j                  xs i } | j	                  d«      xs t         j
                  j	                  d«      }|�	 t        |«      a| j	                  d«      xs t         j
                  j	                  d«      }|�t        |«      j                  «       dv at        j                  «       at        r t        j!                  t        t        ¬«      }n1t        r+t#        t        t        ¬«      at        j%                  d	¬
«       t'        dt        t        t)        t        xr t        j*                  «      t        dœdœ«      S # t        $ r Y �Œw xY w)uM   Consulta o actualiza en caliente la configuraciÃ³n del observador e indexadorru   T)ÚsilentÚwatcher_intervalÚenable_watcherr   )r   Úenabledr   Fr   r0   )rŒ   r‹   Úwatcher_runningr   )r1   Úconfig)r   ÚmethodÚget_jsonÚformr-   r,   r5   r   Ú
ValueErrorr8   Úlowerr   r\   r]   r[   ry   Úupdate_configr	   Ústartr   ÚboolÚrunning)r3   Únew_intervalÚnew_enabledÚcfgs       r   Úapi_indexer_configrœ   Í   sA  € ô
 ‡~�~˜ÓÜ×Ñ tÔ,ÒB´·±ÒBÀˆð —x‘xÐ 2Ó3Ò[´w·|±|×7GÑ7GÐHZÓ7[ˆØÐ#ðÜ#& |Ó#4Ð ð
 —h‘hÐ/Ó0ÒV´G·L±L×4DÑ4DÐEUÓ4VˆØÐ"Ü  Ó-×3Ñ3Ó5Ð9MÐMˆNô  ×<Ñ<Ó>ˆõ Ü×'Ñ'Ô9IÔSaÐ'Ób‰CÝÜ$´=ÔScÔdˆGÜ�M‰M¨5ˆMÔ1äØä,Ü 0Ü#¤GÒ$?´·±Ó@Ü*ñ	
ñó ð øô% ò Úðús   Á6E9 Å9	FÆFÚ__main__ÚPORTi¥  z0.0.0.0F)ÚhostÚportÚdebug)'rX   r^   ra   Úflaskr   r   r   r   r   r   r6   r\   ry   r	   Ú__name__ÚappÚafter_requestr   r]   r[   Úgetenvr”   r   r5   r   r–   Úrouter.   r<   r@   rD   rG   rp   rt   r}   r‡   rœ   r    Úrun© r   r   ú<module>rª      s#  ðÛ 	Û 	Û ß L× LÛ 	Û Ý "áˆHƒo€à×Ññó ðð 5�×4Ñ4Ó6€Ø�—‘Ð+¨VÓ4×:Ñ:Ó<Ð@TÐT€Ù�y�r—y‘yÐ!3°TÓ:Ó;Ð à
€ÝÙ¬=ÔK[Ô\€GÜ‡M�M 4€MÔ(à‡�ˆ3ƒñó ðð ‡�ÐÓñó ðð8 ‡�Ð.Ó/ñó 0ðð ‡�Ð.Ó/ñó 0ðð ‡�ˆ<Óñó ðð ‡�Ð-Ó.ñ0ó /ð0ðd ‡�Ð Ó!ñó "ðð ‡�Ð¨¨€Ó1ñ	ó 2ð	ð ‡�Ð¨&¨€Ó2ñó 3ðð4 ‡�Ð ¨5°&¨/€Ó:ñ&ó ;ð&ðP ˆzÒÙˆyˆr�y‰y˜ Ó&Ó'€DØ‡G�G� ¨U€GÕ3ð r   