Ë
     ´j´)  ã            	       óê   — d dl Z 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	 d dl
Z
h d£Zdedee   fd„Zdedefd	„Zd
ededeee	f   fd„Zdee   fd„Zddee	   dedeee	f   fd„Zedk(  r e«        yy)é    N)Údatetime)ÚDictÚListÚOptionalÚTupleÚAny>   ú.jpgú.pdfú.pngú.tifú.jpegú.tiffÚtextÚreturnc                 ó@  — t        j                  d| «      }|r7|j                  d«      › d|j                  d«      › d|j                  d«      › �S t        j                  d| «      }|r7|j                  d«      › d|j                  d«      › d|j                  d«      › �S y)zWExtrae una fecha en formato YYYY-MM-DD de una cadena (YYYYMMDD, YYYY-MM-DD, YYYY_MM_DD)z1\b(20\d{2})(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\bé   ú-é   é   z9\b(20\d{2})[-_](0[1-9]|1[0-2])[-_](0[1-9]|[12]\d|3[01])\bN)ÚreÚsearchÚgroup)r   Úms     ú0/var/www/html/ioplay-suite/ioplay-dcm/indexer.pyÚparse_date_from_stringr   
   s�   € ô 	�	‰	ÐFÈÓM€AÙØ—'‘'˜!“*�˜Q˜qŸw™w q›z˜l¨!¨A¯G©G°A«J¨<Ð8Ð8ô 	�	‰	ÐNÐPTÓU€AÙØ—'‘'˜!“*�˜Q˜qŸw™w q›z˜l¨!¨A¯G©G°A«J¨<Ð8Ð8àó    Útype_rawc                 ó¶   — | j                  «       j                  «       }|dv ry|dv ry|dv ry|dv ry|d	v ry
|dv ry| j                  «       j                  «       S )zGNormaliza el nombre del tipo documental en formato legible Capitalizado)ÚfacturaÚfacturasÚFacturas)ÚcontratoÚ	contratosÚ	Contratos)ÚordenÚordenesu   Ã³rdenesÚOrdenes)ÚcertificadoÚcertificadosÚCertificados)Ú	solicitudÚsolicitudesÚSolicitudes)ÚpagareÚpagaresu   pagarÃ©su   PagarÃ©s)ÚstripÚlowerÚtitle)r   Úts     r   Únormalize_doc_typer4      sw   € à�‰Ó×ÑÓ €AØÐ#Ñ#ØØÐ%Ñ%ØØÐ,Ñ,ØØÐ+Ñ+ØØÐ(Ñ(ØØÐ-Ñ-Øð �>‰>Ó×!Ñ!Ó#Ð#r   Úrel_pathÚ	full_pathc                 ó~  — | j                  dd«      }|j                  d«      D �cg c]  }|sŒ|‘Œ	 }}|r|d   nt        j                  j	                  |«      }t        j                  j                  |«      \  }}|}t        j                  d|«      }	|	r|	j                  d«      }d}
|j                  dd«      }|j                  d«      D �cg c]  }|sŒ|‘Œ	 }}d}d|v r.|j                  d«      }|dz   t        |«      dz
  k  r:||dz      }n1d|v r-|j                  d«      }|dz   t        |«      dz
  k  r||dz      }|sKt        |«      dkD  r=|dd D ]5  }t        |«      rŒ|j                  «       rŒ |j                  «       d	vsŒ3|} n |rt        |«      }
d}t        |dd «      D ]  }t        |«      }|sŒ n |st        |«      }t        j                   |«      }|j"                  }|j$                  }|s$t'        j(                  |«      j+                  d
«      }t'        j,                  |d
«      }|j.                  }|j0                  }d}d}|D ]d  }|j                  «       }|dv rd} nL|dv rd} nD|dvsŒ(d|v sŒ-|j                  |«      |j                  d«      dz
  k(  sŒT|j3                  «       } n |s6t        |«      dk\  r(|d   j                  «       dvr|d   j3                  «       }t5        |«      j7                  «       ||||
||||t        j                  j9                  |«      ||dœS c c}w c c}w )aq  
    Extrae metadatos a partir de la ruta relativa y las propiedades del archivo.
    Soporta estructuras:
    - {documentosdigitales}/{tipo_documento}/{YYYYMMDD}/{cliente_id}.jpg
    - {tipo_documento}/{YYYYMMDD}/{cliente_id}.jpg
    - {tipo_documento}/{cliente_id}.jpg
    - {cableoperador}/{agencia}/{YYYYMMDD}/{cliente_id}.jpg
    - {YYYYMMDD}/{cliente_id}.jpg
    ú\ú/éÿÿÿÿz(\d+)r   r!   NÚdocumentosdigitales)
ÚstorageÚ
facturas_1Ú
facturas_2Ú
facturas_3Ú
facturas_4Ú
facturas_5Ú
facturas_6Ú
facturas_7Ú
facturas_8Ú
facturas_9z%Y-%m-%dÚ )Ú
cableexitou   cableÃ©xitou   CableÃ©xitoÚinfoboxÚInfobox)
ÚvarÚwwwÚhtmlÚdevsÚdocumentosarchivor;   r<   Úappzc:zd:r   r   )r#   r    r&   r)   r;   )Úcustomer_idÚdocument_dateÚyearÚmonthÚdocument_typeÚcableoperadorÚagenciaÚ	file_nameÚfile_relative_pathÚfile_full_pathÚ	file_sizeÚ
file_mtime)ÚreplaceÚsplitÚosÚpathÚbasenameÚsplitextr   r   r   ÚindexÚlenr   Úisdigitr1   r4   ÚreversedÚstatÚst_mtimeÚst_sizer   ÚfromtimestampÚstrftimeÚstrptimerR   rS   r2   Ústrr0   Úabspath)r5   r6   Únormalized_relÚpÚpartsÚfilenameÚstemÚextrP   Ú	num_matchÚdoc_typeÚnormalized_fullÚ
full_partsÚ
found_typeÚidxÚdoc_dateÚpartÚ	file_statr[   rZ   Údate_objrR   rS   rU   rV   Úlows                             r   Úextract_metadata_from_pathr   +   sj  € ð ×%Ñ% d¨CÓ0€NØ&×,Ñ,¨SÓ1Ö7�1²QŠQÐ7€EÐ7Ù!ˆu�RŠy¤r§w¡w×'7Ñ'7¸	Ó'B€HÜ—‘× Ñ  Ó*�I€Dˆ#ð €KÜ—	‘	˜( DÓ)€IÙØ—o‘o aÓ(ˆð €HØ×'Ñ'¨¨cÓ2€OØ,×2Ñ2°3Ó7Ö=˜º1’!Ð=€JÐ=à€JØ Ñ%Ø�k‰kÐ/Ó0ˆØ�‰7”S˜“Z !‘^Ò#Ø˜s Q™w™‰JØ	 *Ñ	,Ø×ÑÐ4Ó5ˆØ�‰7”S˜“_ qÑ(Ò(Ø# C¨!¡GÑ,ˆJñ œ#˜e›* qš.Ø�s˜�ò 	ˆAÜ)¨!Õ,°Q·Y±Yµ[ÀQÇWÁWÃYð  W`ò  F`Ø�
Ùð	ñ
 Ü% jÓ1ˆð €HÜ˜˜s ˜Ó$ò ˆÜ)¨$Ó/ˆÚÙðñ
 Ü)¨$Ó/ˆô —‘˜	Ó"€IØ×#Ñ#€JØ×!Ñ!€IáÜ×)Ñ)¨*Ó5×>Ñ>¸zÓJˆô × Ñ  ¨:Ó6€HØ�=‰=€DØ�N‰N€Eð €MØ€Gð ò ˆØ�g‰g‹iˆØÐ/Ñ/Ø)ˆMÙØ�YÑØ%ˆMÙØð  Aò  AØ$¨
Ò2°z×7GÑ7GÈÓ7JÈj×N^ÑN^Ð_tÓNuÐxyÑNyÓ7yØ !§¡£	�Ùðñ œS ›Z¨1š_Ø�‰8�>‰>ÓÐ#nÑnØ! !™HŸN™NÓ,ˆMô ˜;Ó'×-Ñ-Ó/Ø!ØØØ!Ø&ØØØ,ÜŸ'™'Ÿ/™/¨)Ó4ØØ ñð ùòc 8ùò >s   ¦L5®L5ÃL:ÃL:c                  ót  — g } t        j                  dd«      }|rDt        j                  d|«      D ]+  }|j	                  «       }|sŒ|| vsŒ| j                  |«       Œ- t        dd«      D ]b  }d|› �}t        j                  |«      }|sŒ |j	                  «       sŒ1|j	                  «       | vsŒD| j                  |j	                  «       «       Œd t        dd«      D ]�  }d|› �}t        j                  |«      }|sŒ |j	                  «       sŒ1|j	                  «       | vsŒDt         j                  j                  |j	                  «       «      sŒr| j                  |j	                  «       «       Œ’ | s]t        j                  d«      xs t        j                  d	«      }|r/|j	                  «       r| j                  |j	                  «       «       | sRt         j                  j                  t         j                  j                  t        «      d
«      }| j                  |«       | D �cg c]  }|sŒ|‘Œ	 c}S c c}w )z[Obtiene la lista de hasta 9 rutas de almacenamiento configuradas desde variables de entornoÚSTORAGE_PATHSrF   ú[,;]r   é
   ÚSTORAGE_PATH_ÚHOST_INVOICES_PATH_ÚSTORAGE_PATHÚHOST_INVOICES_PATHÚtest_facturas)r^   Úgetenvr   r]   r0   ÚappendÚranger_   ÚexistsÚjoinÚdirnameÚ__file__)ÚpathsÚ	raw_pathsro   ÚiÚvar_nameÚvalÚlegacyÚdefault_tests           r   Úget_configured_storage_pathsr—   –   s§  € à€Eô —	‘	˜/¨2Ó.€IÙÜ—‘˜' 9Ó-ò 	 ˆAØ—‘“	ˆAÚ�Q˜e’^Ø—‘˜Q•ð	 ô �1�b‹\ò &ˆØ" 1 #Ð&ˆÜ�i‰i˜Ó!ˆÚ�3—9‘9•; 3§9¡9£;°eÒ#;Ø�L‰L˜Ÿ™›Õ%ð	&ô �1�b‹\ò &ˆØ(¨¨Ð,ˆÜ�i‰i˜Ó!ˆÚ�3—9‘9•; 3§9¡9£;°eÒ#;ÄÇÁÇÁÈsÏyÉyË{Õ@[Ø�L‰L˜Ÿ™›Õ%ð	&ñ Ü—‘˜>Ó*ÒM¬b¯i©iÐ8LÓ.MˆÙ�f—l‘l”nØ�L‰L˜Ÿ™›Ô(áÜ—w‘w—|‘|¤B§G¡G§O¡O´HÓ$=¸ÓOˆØ�‰�\Ô"ð Ö"�!¢ŠAÒ"Ð"ùÒ"s   È&H5È.H5Ústorage_pathsÚ
batch_sizec                 óØ  — | €t        «       }nt        | t        «      rCt        j                  d| «      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}n,t        | t        t        f«      rt        | «      }n
t        «       }t        j                  «       }t        j                  «        t        j                  «       }d}d}d}g }	g }
t        |d¬«      D �]¦  \  }}|rt        j                  j                  |«      sŒ)|
j!                  |«       d|› �}t        j"                  |«      D �]O  \  }}}|D �]B  }t        j                  j%                  |«      d   j'                  «       }|t(        vrŒ=|dz  }t        j                  j+                  ||«      }t        j                  j-                  ||«      j/                  dd«      }t1        |«      dkD  rd	|› d
|› �n|}	 t        j                  j3                  |«      }||v rt7        ||   |z
  «      dk  r|dz  }Œè	 t9        ||«      }||d<   |	j!                  |«       t1        |	«      |k\  s�Œ|t        j>                  |	«      z  }|	jA                  «        �ŒE �ŒR �Œ© |	r(|t        j>                  |	«      z  }|	jA                  «        tC        t        j                  «       |z
  d«      }t        jD                  dtG        jH                  «       jK                  d«      «       t        jD                  dt        |«      «       t        jD                  dt        |«      «       t        jD                  ddj+                  |
«      «       t=        d|› dt1        |
«      › d|› d|› d|› d�«       |||||
t        jL                  «       ddœS c c}w # t4        $ r Y �Œ‚w xY w# t:        $ r}t=        d|› d|› �«       Y d}~�Œ¦d}~ww xY w)zƒ
    Realiza un escaneo incremental de hasta 9 carpetas de almacenamiento multi-documento y actualiza la base de datos SQLite.
    Nr‚   r   r   )ÚstartÚdir_r8   r9   ú[z]/gü©ñÒMbP?rX   z$[INDEXER] Error al procesar archivo z: r   Úlast_scan_timez%Y-%m-%d %H:%M:%SÚlast_scan_countÚtotal_scanned_filesÚstorage_paths_activeú,z [INDEXER] Escaneo completado en zs sobre z directorio(s): z archivos escaneados, z indexados/actualizados, z sin cambios.Úsuccess)ÚscannedÚadded_or_updatedÚskippedÚelapsed_secondsÚdirectories_scannedÚstatsÚstatus)'r—   Ú
isinstancerl   r   r]   r0   ÚlistÚtupleÚtimeÚdbÚinit_dbÚget_indexed_mtimesÚ	enumerater^   r_   rŒ   rŠ   Úwalkra   r1   ÚSUPPORTED_EXTENSIONSr�   Úrelpathr\   rc   ÚgetmtimeÚOSErrorÚabsr   Ú	ExceptionÚprintÚupsert_invoices_batchÚclearÚroundÚset_metar   Únowrj   Ú	get_stats)r˜   r™   r�   ro   Ú
start_timeÚindexed_mtimesÚscanned_countÚupdated_countÚskipped_countÚbatchÚscanned_dirsry   Ústorage_pathÚ
dir_prefixÚrootÚ_ÚfilesÚfrs   r6   r5   Úunique_rel_keyÚmtimeÚmetadataÚeÚelapseds                             r   Úscan_storage_directoryrÓ   ½   s¬  € ð ÐÜ,Ó.‰Ü	�M¤3Ô	'Ü$&§H¡H¨W°mÓ$DÖR˜qÈÏÉÍ	�—‘•ÐRˆÑRÜ	�M¤D¬% =Ô	1Ü�]Ó#‰ä,Ó.ˆä—‘“€JÜ‡J�J„LÜ×*Ñ*Ó,€Nà€MØ€MØ€MØ"$€EØ €Lä& u°AÔ6ó )"Ñˆˆ\Ù¤2§7¡7§>¡>°,Ô#?Øà×Ñ˜LÔ)Ø˜C˜5�\ˆ
ä Ÿg™g lÓ3ó "	"‰NˆD�!�UØó !"�Ü—g‘g×&Ñ& qÓ)¨!Ñ,×2Ñ2Ó4�ØÔ2Ñ2Øà Ñ"�ÜŸG™GŸL™L¨¨qÓ1�	ÜŸ7™7Ÿ?™?¨9°lÓC×KÑKÈDÐRUÓV�ô BEÀUÃÈaÂ 1 Z L°°8°*Ñ!=ÐU]�ðÜŸG™G×,Ñ,¨YÓ7�Eð
 " ^Ñ3¼¸NÈ>Ñ<ZÐ]bÑ<bÓ8cÐfkÒ8kØ! QÑ&�MØðÜ9¸(ÀIÓN�HØ5C�HÐ1Ñ2Ø—L‘L Ô*ô
 �u“: Ô+Ø!¤R×%=Ñ%=¸eÓ%DÑD�MØ—K‘K–MòC!"ò"	"ð)"ñX Øœ×1Ñ1°%Ó8Ñ8ˆØ�‰Œä”D—I‘I“K *Ñ,¨aÓ0€GÜ‡K�KÐ ¤(§,¡,£.×"9Ñ"9Ð:MÓ"NÔOÜ‡K�KÐ!¤3 }Ó#5Ô6Ü‡K�KÐ%¤s¨=Ó'9Ô:Ü‡K�KÐ&¨¯©°Ó(>Ô?ä	Ð,¨W¨I°X¼cÀ,Ó>OÐ=PÐP`ÐanÐ`oð  pFð  GTð  FUð  Unð  o|ð  n}ð  }Jð  Kô  Lð !Ø)Ø Ø"Ø+Ü—‘“Øñð ùòQ SøôL ò Úðûô !ò ÜÐ@ÀÀÈ2ÈaÈSÐQÔRÝûðús5   ¶N/ÁN/Ç)N4È'"OÎ4	O	Ï O	Ï	O)	ÏO$	Ï$O)	Ú__main__)Niô  )r^   r   r®   r   Útypingr   r   r   r   r   r¯   r´   rl   r   r4   r   r—   ÚintrÓ   Ú__name__© r   r   ú<module>rÙ      sÇ   ðÛ 	Û 	Û Ý ß 3Õ 3Û 	âIÐ ð ð ¨°#©ó ð$ ð $¨ó $ð&i¨ð i¸ð iÀÀcÈ3ÀhÁó iðV%# d¨3¡ió %#ñNW¨(°3©-ð WÈCð WÐZ^Ð_bÐdgÐ_gÑZhó Wðr ˆzÒÙÕð r   