Ë
     ´j�&  ã                   óî  — d dl Z d dlZd dlmZmZmZmZ  ej                  dej                  j                  ej                  j                  e«      dd«      «      Zde j                  fd„Zd„ Zd	„ Zd
„ Zdeeef   fd„Zdeeeef      defd„Z	 	 	 ddedee   dee   dee   deeeef      f
d„Zddedee   dee   fd„Zdedee   fd„Zdee   fd„Zdedefd„Zddededefd„Zdeeef   fd„Zy)é    N)ÚListÚDictÚOptionalÚAnyÚDB_PATHÚdatazfacturas_index.dbÚreturnc                  ó  — t        j                  t         j                  j                  t        «      d¬«       t        j                  t        dd¬«      } t
        j                  | _        	 | j                  d«       | S # t        $ r Y | S w xY w)NT)Úexist_okg      >@F)ÚtimeoutÚcheck_same_threadzPRAGMA busy_timeout = 30000;)ÚosÚmakedirsÚpathÚdirnamer   Úsqlite3ÚconnectÚRowÚrow_factoryÚexecuteÚ	Exception©Úconns    ú+/var/www/html/ioplay-suite/ioplay-dcm/db.pyÚget_connectionr      sm   € Ü‡K�K”—‘—‘¤Ó(°4Õ8Ü�?‰?œ7¨DÀEÔJ€DÜ—{‘{€DÔðØ�‰Ð3Ô4ð €Køô ò ØØ€Kðús   Á+A> Á>	BÂ
Bc                  ó  — 	 t        «       5 } 	 | j                  d«       	 | j                  d«       | j                  d«       | j                  d«       | j                  d«       | j                  d«       | j                  d«       | j                  d«       | j                  d	«       | j                  «        d d d «       y # t        $ r Y Œ­w xY w# t        $ r Y Œªw xY w# 1 sw Y   y xY w# t        $ r}t	        d
|› �«       Y d }~y d }~ww xY w)NzPRAGMA journal_mode = WAL;zPRAGMA synchronous = NORMAL;a¼  
            CREATE TABLE IF NOT EXISTS invoices_index (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                customer_id TEXT NOT NULL,
                document_date TEXT NOT NULL,
                year INTEGER NOT NULL,
                month INTEGER NOT NULL,
                document_type TEXT DEFAULT 'Facturas',
                cableoperador TEXT,
                agencia TEXT,
                file_name TEXT NOT NULL,
                file_relative_path TEXT UNIQUE NOT NULL,
                file_full_path TEXT NOT NULL,
                file_size INTEGER,
                file_mtime REAL,
                indexed_at DATETIME DEFAULT CURRENT_TIMESTAMP
            );
            z`CREATE INDEX IF NOT EXISTS idx_customer_date ON invoices_index(customer_id, document_date DESC);zWCREATE INDEX IF NOT EXISTS idx_customer_ym ON invoices_index(customer_id, year, month);ztCREATE INDEX IF NOT EXISTS idx_customer_type_date ON invoices_index(customer_id, document_type, document_date DESC);zICREATE INDEX IF NOT EXISTS idx_doc_type ON invoices_index(document_type);zNCREATE INDEX IF NOT EXISTS idx_rel_path ON invoices_index(file_relative_path);zÒ
            CREATE TABLE IF NOT EXISTS indexer_meta (
                key TEXT PRIMARY KEY,
                value TEXT,
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
            );
            z[DB] init_db warning/error: )r   r   r   ÚcommitÚprint)r   Úes     r   Úinit_dbr       s  € ð,2ÜÓð )	 ðØ—‘Ð9Ô:ðØ—‘Ð;Ô<ð �L‰Lð ô ð$ �L‰LÐ{Ô|Ø�L‰LÐrÔsØ�L‰Lð  Pô  QØ�L‰LÐdÔeØ�L‰LÐiÔjà�L‰Lð ô ð �K‰KŒM÷S)	ð )	øô ò Ùðûô ò Ùðú÷)	ð )	ûôT ò 2ÜÐ,¨Q¨CÐ0×1Ñ1ûð2úst   ‚
C+ ŒCŽC C±BCÂ8C+ Ã	CÃ
CÃCÃCÃ	CÃCÃCÃCÃC(Ã$C+ Ã(C+ Ã+	DÃ4DÄDc                  ó¨  — t        «        t        «       5 } | j                  d«       | j                  d«       	 | j                  d«       | j                  «        ddd«       	 t        j                  t        d¬«      }|j                  d«       |j                  «        y# t        j                  $ r Y Œkw xY w# 1 sw Y   Œ`xY w# t        $ r Y yw xY w)zDLimpia todos los registros de la base de datos sin borrar las tablaszDELETE FROM invoices_index;zDELETE FROM indexer_meta;z=DELETE FROM sqlite_sequence WHERE name IN ('invoices_index');N)Úisolation_levelzVACUUM;)
r    r   r   r   ÚOperationalErrorr   r   r   Úcloser   )r   Úraw_conns     r   Úclear_dbr&   @   sµ   € ä„IÜ	Ó	ð ˜TØ�‰Ð2Ô3Ø�‰Ð0Ô1ð	Ø�L‰LÐXÔYð 	�‰Œ÷ðÜ—?‘?¤7¸DÔAˆØ×Ñ˜Ô#Ø�‰Õøô ×'Ñ'ò 	Ùð	ú÷ð ûô ò Ùðús@   •#B9¹B Á
B9Á#<C Â B6Â3B9Â5B6Â6B9Â9CÃ	CÃCc                  óÎ   — t        «       5 } | j                  d«       | j                  d«       | j                  «        ddd«       t        «        y# 1 sw Y   t        «        yxY w)z*Elimina las tablas y las recrea desde ceroz$DROP TABLE IF EXISTS invoices_index;z"DROP TABLE IF EXISTS indexer_meta;N)r   r   r   r    r   s    r   Úreset_db_schemar(   T   sK   € ä	Ó	ð ˜TØ�‰Ð;Ô<Ø�‰Ð9Ô:Ø�‰Œ÷ô …I÷	ô …Iús   ‹3AÁA$c            	      óÞ   — t        «        t        «       5 } | j                  d«      }|j                  «       D �ci c]  }|d   t	        |d   «      “Œ c}cddd«       S c c}w # 1 sw Y   yxY w)u^   Retorna un diccionario de {file_relative_path: file_mtime} para verificar cambios rÃ¡pidamentez9SELECT file_relative_path, file_mtime FROM invoices_indexÚfile_relative_pathÚ
file_mtimeN)r    r   r   ÚfetchallÚfloat©r   ÚcursorÚrows      r   Úget_indexed_mtimesr1   \   sj   € ä„IÜ	Ó	ð b˜TØ—‘ÐYÓZˆØOUÏÉÓO`ÖaÈ�Ð(Ñ)¬5°°\Ñ1BÓ+CÑCÒa÷bñ bùâa÷bð bús   •$A#¹AÁA#ÁA#Á#A,Úrecordsc                 óÌ   — | syt        «        d}t        «       5 }|j                  || «       |j                  «        ddd«       t	        | «      S # 1 sw Y   t	        | «      S xY w)z3Inserta o actualiza un lote de documentos indexadosr   aä  
    INSERT INTO invoices_index (
        customer_id, document_date, year, month, document_type,
        cableoperador, agencia, file_name, file_relative_path,
        file_full_path, file_size, file_mtime, indexed_at
    ) VALUES (
        :customer_id, :document_date, :year, :month, :document_type,
        :cableoperador, :agencia, :file_name, :file_relative_path,
        :file_full_path, :file_size, :file_mtime, CURRENT_TIMESTAMP
    )
    ON CONFLICT(file_relative_path) DO UPDATE SET
        customer_id = excluded.customer_id,
        document_date = excluded.document_date,
        year = excluded.year,
        month = excluded.month,
        document_type = excluded.document_type,
        cableoperador = excluded.cableoperador,
        agencia = excluded.agencia,
        file_name = excluded.file_name,
        file_full_path = excluded.file_full_path,
        file_size = excluded.file_size,
        file_mtime = excluded.file_mtime,
        indexed_at = CURRENT_TIMESTAMP;
    N)r    r   Úexecutemanyr   Úlen)r2   Úsqlr   s      r   Úupsert_invoices_batchr7   c   s_   € áØÜ„Ið€Cô0 
Ó	ð ˜TØ×Ñ˜˜gÔ&Ø�‰Œ÷ô ˆw‹<Ð÷ô ˆw‹<Ðús   š#AÁA#Úcustomer_idÚyearÚmonthÚdocument_typec                 ó€  — t        «        d}t        | «      j                  «       g}|�-t        |«      dkD  r|dz  }|j	                  t        |«      «       |�-t        |«      dkD  r|dz  }|j	                  t        |«      «       |rVt        |«      j                  «       j                  «       dvr-|dz  }|j	                  t        |«      j                  «       «       |dz  }t        «       5 }|j                  ||«      }|j                  «       D �cg c]  }t        |«      ‘Œ c}cddd«       S c c}w # 1 sw Y   yxY w)	um   Consulta los documentos indexados de un cliente especÃ­fico con filtros opcionales de fecha y tipo documentalz2SELECT * FROM invoices_index WHERE customer_id = ?Nr   z AND year = ?z AND month = ?©Ú ÚtodosÚallú$ AND LOWER(document_type) = LOWER(?)z% ORDER BY document_date DESC, id DESC)
r    ÚstrÚstripÚintÚappendÚlowerr   r   r,   Údict)	r8   r9   r:   r;   ÚqueryÚparamsr   r/   r0   s	            r   Úget_invoices_by_customerrJ   …   s  € ô „IØ@€EÜ˜[Ó)×/Ñ/Ó1Ð2€FàÐœC ›I¨šMØ�Ñ ˆØ�‰”c˜$“iÔ àÐœS ›Z¨!š^ØÐ!Ñ!ˆØ�‰”c˜%“jÔ!áœ˜]Ó+×1Ñ1Ó3×9Ñ9Ó;ÐCWÑWØÐ7Ñ7ˆØ�‰”c˜-Ó(×.Ñ.Ó0Ô1à	Ð4Ñ4€Eä	Ó	ð 8˜TØ—‘˜e VÓ,ˆØ%+§_¡_Ó%6Ö7˜c”�S•	Ò7÷8ñ 8ùâ7÷8ð 8ús   Ã,%D4ÄD/Ä#D4Ä/D4Ä4D=c                 ó¸  — t        «        d}t        | «      j                  «       g}|rVt        |«      j                  «       j                  «       dvr-|dz  }|j	                  t        |«      j                  «       «       |dz  }t        «       5 }|j                  ||«      }|j                  «       D �cg c]  }|d   ‘Œ	 c}cddd«       S c c}w # 1 sw Y   yxY w)uG   Retorna los aÃ±os en los que el suscriptor tiene documentos registradosz>SELECT DISTINCT year FROM invoices_index WHERE customer_id = ?r=   rA   z ORDER BY year DESCr9   N)r    rB   rC   rF   rE   r   r   r,   )r8   r;   rH   rI   r   r/   r0   s          r   Úget_customer_yearsrL   ¢   sÂ   € ä„IØL€EÜ˜[Ó)×/Ñ/Ó1Ð2€Fáœ˜]Ó+×1Ñ1Ó3×9Ñ9Ó;ÐCWÑWØÐ7Ñ7ˆØ�‰”c˜-Ó(×.Ñ.Ó0Ô1à	Ð"Ñ"€Eä	Ó	ð :˜TØ—‘˜e VÓ,ˆØ'-§¡Ó'8Ö9 ��F“Ò9÷:ñ :ùâ9÷:ð :ús   Â%CÂ3CÂ?CÃCÃCc                 ó  — t        «        t        «       5 }|j                  dt        | «      j	                  «       g«      }|j                  «       D �cg c]  }|d   sŒ	|d   ‘Œ c}cddd«       S c c}w # 1 sw Y   yxY w)uI   Retorna los tipos documentales disponibles para un suscriptor especÃ­ficozbSELECT DISTINCT document_type FROM invoices_index WHERE customer_id = ? ORDER BY document_type ASCr;   N)r    r   r   rB   rC   r,   )r8   r   r/   r0   s       r   Úget_customer_document_typesrN   ²   s|   € ä„IÜ	Ó	ð [˜TØ—‘ØpÜ�Ó×#Ñ#Ó%Ð&ó
ˆð 17·±Ó0AÖZ¨ÀSÈÓEY��OÓ$ÒZ÷[ñ [ùò
 [÷[ð [ús#   •=A5Á
A0ÁA0Á$A5Á0A5Á5A>c                  óÄ   — t        «        t        «       5 } | j                  d«      }|j                  «       D �cg c]  }|d   ‘Œ	 c}cddd«       S c c}w # 1 sw Y   yxY w)zJRetorna todos los tipos documentales registrados globalmente en el sistemaz„SELECT DISTINCT document_type FROM invoices_index WHERE document_type IS NOT NULL AND document_type != '' ORDER BY document_type ASCr;   N)r    r   r   r,   r.   s      r   Úget_all_document_typesrP   ¼   sd   € ä„IÜ	Ó	ð C˜TØ—‘ð Só
ˆð 17·±Ó0AÖB¨��OÓ$ÒB÷	Cñ Cùò C÷	Cð Cús   •$A¹AÁAÁAÁAÚkeyÚvaluec                 ó°   — t        «        t        «       5 }|j                  d| t        |«      f«       |j	                  «        d d d «       y # 1 sw Y   y xY w)Nz¨INSERT INTO indexer_meta (key, value, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP) ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP)r    r   r   rB   r   )rQ   rR   r   s      r   Úset_metarT   Å   sM   € Ü„IÜ	Ó	ð ˜TØ�‰ðdà”#�e“*Ðô	
ð
 	�‰Œ÷÷ ñ ús   •.AÁAÚdefaultc                 ó®   — t        «        t        «       5 }|j                  d| f«      }|j                  «       }|r|d   n|cd d d «       S # 1 sw Y   y xY w)Nz,SELECT value FROM indexer_meta WHERE key = ?rR   )r    r   r   Úfetchone)rQ   rU   r   r/   r0   s        r   Úget_metarX   Ï   sN   € Ü„IÜ	Ó	ð 0˜TØ—‘ÐLÈsÈfÓUˆØ�o‰oÓˆÙ"ˆs�7Š|¨÷0÷ 0ò 0ús   •,AÁAc            	      ó.  — t        «        t        «       5 } | j                  d«      j                  «       d   }| j                  d«      j                  «       d   }t	        dd«      }t	        dd«      }t	        dd«      }| j                  d	«      }|j                  «       D �ci c]  }|d
   sŒ	|d
   |d   “Œ }}| j                  d«      }	|	j                  «       D �ci c]  }|d   |d   “Œ }
}||||
|||dœcd d d «       S c c}w c c}w # 1 sw Y   y xY w)Nz,SELECT COUNT(*) as count FROM invoices_indexÚcountz?SELECT COUNT(DISTINCT customer_id) as count FROM invoices_indexÚlast_scan_timeÚNuncaÚlast_scan_countÚ0Útotal_dir_size_byteszfSELECT document_type, COUNT(*) as count FROM invoices_index GROUP BY document_type ORDER BY count DESCr;   zžSELECT cableoperador, COUNT(*) as count FROM invoices_index WHERE cableoperador IS NOT NULL AND cableoperador != '' GROUP BY cableoperador ORDER BY count DESCÚcableoperador)Útotal_invoicesÚunique_customersÚby_typeÚ
by_companyr[   Úlast_scan_addedr_   )r    r   r   rW   rX   r,   )r   Útotalrb   Ú	last_scanÚ
last_countÚtotal_dir_sizeÚcursor_typesr0   rc   Úcursor_companiesrd   s              r   Ú	get_statsrl   Ö   sA  € Ü„IÜ	Ó	ð 
˜TØ—‘ÐKÓL×UÑUÓWÐX_Ñ`ˆØŸ<™<Ð(iÓj×sÑsÓuÐv}Ñ~ÐÜÐ-¨wÓ7ˆ	ÜÐ/°Ó5ˆ
Ü!Ð"8¸#Ó>ˆð —|‘|ð  %Mó  NˆØAM×AVÑAVÓAXÖq¸#Ð\_Ð`oÓ\p�3�Ñ'¨¨W©Ñ5ÐqˆÐqð  Ÿ<™<ð  )Ió  JÐØDT×D]ÑD]ÓD_Ö`¸S�c˜/Ñ*¨C°©LÑ8Ð`ˆ
Ð`ð $Ø 0ØØ$Ø'Ø)Ø$2ñ
÷
ñ 
ùò rùò a÷
ð 
ús0   •BDÂ!
DÂ,DÂ7%DÃDÃ,DÄ
DÄD)NNN)N)r>   )r   r   Útypingr   r   r   r   Úgetenvr   Újoinr   Ú__file__r   Ú
Connectionr   r    r&   r(   rB   r-   r1   rD   r7   rJ   rL   rN   rP   rT   rX   rl   © ó    r   ú<module>rt      s…  ðÛ Û 	ß ,Ó ,à
ˆ"�)‰)�I˜rŸw™wŸ|™|¨B¯G©G¯O©O¸HÓ,EÀvÐObÓcÓ
d€ð˜×*Ñ*ó ò-2ò^ò(ðb˜D  e Ñ,ó bð  4¨¨S°#¨X©Ñ#7ð  ¸Có  ðH ØØ#'ñ	8Øð8à
�3‰-ð8ð �C‰=ð8ð ˜C‘=ð	8ð
 
ˆ$ˆs�Cˆx‰.Ñó8ñ:: Cð :¸À¹ð :ÐQUÐVYÑQZó :ð [¨Sð [°T¸#±Yó [ðC  S¡	ó Cð�#ð ˜có ñ0�#ð 0 ð 0¨Só 0ð
�4˜˜S˜‘>ô 
rs   