+
    <T�j™> ã                   óà  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RIHt ^ RIHtHtHtHtHtHtHtHt R tR.R ltRR.R	R
.RR./t ]! 4       t!]"! ]	PF                  ! RR4      4      t$]t%]t&]	PF                  ! RR4      PO                  R4       U u0 uF+  p V PQ                  4       '       g   K  V PQ                  4       kK-  	  up t)]	PF                  ! RR4      t*]! RR4      t+]! RR4      t,]	PZ                  P]                  ]	PZ                  P_                  ]04      4      t1]! 4       t2]Pf                  Ph                  ! R/R^R^
/]2B t5RRRR/t6Rt7R t8 ! R R ]Pr                  Pt                  4      t; ! R! R"]Px                  ]Pr                  Pz                  4      t>]?R#8X  d‚   ]! R$R%4       ]	P€                  ! ]14       ]>! R]$3];4      ;_uu_ 4       tA]B! R&]$ 24       ]B! R'4       ]B! R(4       ]B! R)] R*24       ]B! R+4       ]B! R,4        ]AP‡                  4        RRR4       R# R# u up i   ]D d    ]B! R-4        L"i ; i  + '       g   i     R# ; i)0uø   
Servidor proxy local para Dashboard Talento Humano.
Sirve el HTML y enruta /proxy/* hacia la API real (evita CORS).
TambiÃ©n expone /proxy/historico/* consultando PostgreSQL local.

Uso:
    python3 servidor.py
Luego abrir:  http://localhost:8081
N©ÚurlparseÚparse_qs)Údate)ÚAPI_BASEÚNOMINA_API_KEYÚPYG_API_KEYÚPYG_URLÚ	db_configÚenv_boolÚrequire_secretsÚssl_contextc                óà   € \         P                  ! RT ;'       g    R4      pRP                  R V 4       4      pRP                  \        VP	                  4       P                  4       4      4      # )u¨   Normaliza nombre: quita tildes, uppercase, ordena palabras alfabÃ©ticamente.
El orden permite comparar nombres con apellido-primero (API) vs nombre-primero (historico).ÚNFKDÚ c              3   ób   "  € T F%  p\         P                  ! V4      '       d   K!  Vx € K'  	  R # 5i©N)ÚunicodedataÚ	combining)Ú.0Úcs   & Úh/Users/ricardomartinez/BIA CLAUDE PROYECTOS/Proyectos Claude IA/Talento Humano Api Dashboard/servidor.pyÚ	<genexpr>Únorm_name.<locals>.<genexpr>(   s   é € ÐF¡˜A¬[×-BÒ-BÀ1×-E—a’a£ùs   ‚/¥
/Ú )r   Ú	normalizeÚjoinÚsortedÚupperÚsplit)ÚsÚnfkdÚascii_ss   &  r   Ú	norm_namer#   $   sS   € ô × Ò  ¨¯¨¨bÓ1€DØ�g‰gÑF¡ÓFÓF€GØ�8‰8”F˜7Ÿ=™=›?×0Ñ0Ó2Ó3Ó4Ð4ó    c                óZ  € V '       dG   V P                  R4       Uu. uF*  q"P                  4       '       g   K  VP                  4       NK,  	  upM. pV'       g   R. 3# \        V4      ^8X  d   V R2V^ ,          .3# RP                  R.\        V4      ,          4      pV RV R2V3# u upi )z…Devuelve (fragmento_sql, params) para filtrar por razon_social,
admitiendo valores separados por coma (p.ej. 'SERV,SERVMYS,SERVMAN').Ú,r   z = %sú%sz IN (Ú))r   ÚstripÚlenr   )ÚrazonÚcolÚrÚrazonesÚplaceholderss   &&   r   Úrazon_wherer0   +   s�   € ÷ EJ %§+¡+¨cÔ"2Ó@Ñ"2˜Q·g±g·iŒyˆq�w‰wŽyÑ"2Ò@Èr€GßØ�2ˆvˆÜ
ˆ7ƒ|�qÔØ��eˆ}˜w q�z˜lÐ*Ð*Ø—8‘8˜T˜F¤S¨£\Õ1Ó2€LØˆU�%˜�~ QÐ'¨Ð0Ð0ùò As
   œB(¸B(ÚMANÚMANTILLAÚCDONÚCDLÚCCARúFARANDA COLLECTION CARTAGENAÚPORTÚ8080ÚCORS_ALLOWED_ORIGINSz+http://localhost:8080,http://localhost:8081r&   ÚADMIN_API_KEYr   ÚAPP_REQUIRE_ADMIN_AUTHTÚAPP_DEBUG_ERRORSFÚminconnÚmaxconnÚvalueÚtsç        i,  c                 ó4  € \         P                   ! 4       p \        R,          '       d+   V \        R,          ,
          \        8  d   \        R,          # \        P	                  4       p VP                  4       pVP                  R4       VP                  4       pV'       d   V^ ,          '       d
   V^ ,          MRp\        P                  V4       R VP                  R4       4       w  rVWV3\        R&   V \        R&   WV3#   \        P                  T4       i ; i)uT   (ano, mes) del Ãºltimo perÃ­odo con datos en historico_nomina_pyg (fuente='nomina').r?   r@   zCSELECT MAX(periodo) FROM historico_nomina_pyg WHERE fuente='nomina'z2024-01c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir   )Úint©r   Úps   & r   r   Ú*_get_max_periodo_nomina.<locals>.<genexpr>r   s   é € Ð3Ñ 2˜1”�A—�Ó 2ùs   ‚Ú-)
ÚtimeÚ_PERIODO_NOMINA_CACHEÚ_PERIODO_NOMINA_TTLÚDB_POOLÚgetconnÚcursorÚexecuteÚfetchoneÚputconnr   )ÚnowÚconnÚcurÚrowÚperiodoÚanoÚmess          r   Ú_get_max_periodo_nominarY   e   sÐ   € ä
�)Š)‹+€CÜ˜W×%Ô%¨3Ô1FÀtÕ1LÕ+LÔObÔ+bÜ$ WÕ-Ð-Ü�?‰?Ó€DðØ�k‰k‹mˆØ�‰ÐYÔZØ�l‰l‹nˆß C¨§F¤F�#�a–&°	ˆä�‰˜ÔÙ3 §¡¨cÔ 2Ó3�H€CØ&) ZÔ˜'Ñ"Ø%(Ô˜$ÑØˆ:Ðøô	 	�‰˜Õús   Á(8D  Â!D  Â0D  Ä Dc                   ó"  a a€ ] tR t^xt oV 3R ltR tR tR tV 3R ltR t	R t
R tR	 tR
 tR tR tRR/R ltR tR t]R 4       tR tR tR tR tR tR tR tR tR t]R 4       t]R 4       t]R 4       t R t!R  t"V 3R! lt#R"t$Vt%V ;t&# )#ÚProxyHandlerc                ó4   <€ \         SV `  ! VR \        /VB  R# )Ú	directoryN)ÚsuperÚ__init__ÚDIR)ÚselfÚargsÚkwargsÚ	__class__s   &*,€r   r_   ÚProxyHandler.__init__z   s   ø€ Ü‰Ò˜$Ð8¬#Ð8°Ô8r$   c                óð   € V P                   P                  R 4      pR\        9   d   V P                  RR4       R# V'       d4   V\        9   d'   V P                  RV4       V P                  RR 4       R# R# R# )ÚOriginÚ*zAccess-Control-Allow-OriginÚVaryN)ÚheadersÚgetr9   Úsend_header)ra   Úorigins   & r   Ú
_send_corsÚProxyHandler._send_cors}   sc   € Ø—‘×!Ñ! (Ó+ˆØÔ&Ô&Ø×ÑÐ:¸CÖ@ß˜Ô"6Ô6Ø×ÑÐ:¸FÔCØ×Ñ˜V XÖ.ñ 7‰Vr$   c                óf   € V P                   P                  R 4      ;'       g    V P                   R8H  # )z/proxy/admin/ú/proxy/historico/cecos-sync)ÚpathÚ
startswith©ra   s   &r   Ú_is_admin_pathÚProxyHandler._is_admin_path…   s0   € à�I‰I× Ñ  Ó1÷ :ð :Ø�y‰yÐ9Ñ9ð	
r$   c                ó@  € V P                  4       '       d   \        '       g   R # \        '       g   V P                  RRRRR/4       R# V P                  P                  RR4      p\        P                  ! V\        4      '       g   V P                  RRRRR	/4       R# R # )
Ti÷  ÚokFÚerrorz;ADMIN_API_KEY no configurado para endpoints administrativoszX-Admin-Keyr   i“  zNo autorizado)ru   ÚREQUIRE_ADMIN_AUTHr:   Ú
_send_jsonrj   rk   ÚhmacÚcompare_digest)ra   Úsupplieds   & r   Ú_require_admin_authÚ ProxyHandler._require_admin_auth‹   sˆ   € Ø×"Ñ"×$Ò$×,>Ó,>Ùß‹}Ø�O‰O˜CØ�eØÐVð"ô ñ Ø—<‘<×#Ñ# M°2Ó6ˆÜ×"Ò" 8¬]×;Ò;Ø�O‰O˜C $¨¨w¸Ð!HÔIÙÙr$   c                óâ  <€ V P                   R 8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   P                  R4      '       d   V P	                  4        R# V P                   P                  R4      '       d   V P                  4        R# V P                   P                  R4      '       d   V P                  4        R# \        SV `!  4        R# )z/proxy/nomina/hoteles-nitNz/proxy/nomina/conceptos-mapú/proxy/stats/ú/proxy/historico/ú/proxy/)	rr   Ú_nomina_hoteles_nitÚ_nomina_conceptos_maprs   Ú_statsÚ
_historicoÚ_proxyr^   Údo_GET)ra   rd   s   &€r   rŠ   ÚProxyHandler.do_GETš   s¤   ø€ Ø�9‰9Ð3Ô3Ø×$Ñ$Ô&ÙØ�Y‰YÐ7Ô7Ø×&Ñ&Ô(ÙØ�Y‰Y×!Ñ! /×2Ò2Ø�K‰KŒMÙØ�Y‰Y×!Ñ!Ð"5×6Ò6Ø�O‰OÖØ�Y‰Y×!Ñ! )×,Ò,Ø�K‰KŽMä‰G‰NÖr$   c                óî  € V P                  4       '       g   R # V P                  R8X  d   V P                  4        R # V P                  R8X  d   V P                  4        R # V P                  R8X  d   V P	                  4        R # V P                  R8X  d   V P                  4        R # V P                  R8X  d   V P                  4        R # V P                  R8X  d   V P                  4        R # V P                  R8X  d   V P                  4        R # V P                  R8X  d   V P                  4        R # V P                  R	8X  d   V P                  4        R # V P                  R
4       V P                  4        R # )Nrq   z/proxy/admin/sync-hotelesz/proxy/admin/sync-cargosz/proxy/admin/sync-cecosz/proxy/admin/sync-irz/proxy/rrhh/ingresos-retirosz/proxy/nomina/reportez/proxy/pyg/reportez/proxy/admin/sync-conceptosé”  )r   rr   Ú_cecos_syncÚ_sync_hotelesÚ_sync_cargosÚ_sync_cecos_xlsxÚ_sync_irÚ_proxy_postÚ_nomina_reporteÚ_pyg_reporteÚ_sync_conceptos_xlsxÚsend_responseÚend_headersrt   s   &r   Údo_POSTÚProxyHandler.do_POST«   s  € Ø×'Ñ'×)Ò)ÙØ�9‰9Ð5Ô5Ø×ÑÖØ�Y‰YÐ5Ô5Ø×ÑÖ Ø�Y‰YÐ4Ô4Ø×ÑÖØ�Y‰YÐ3Ô3Ø×!Ñ!Ö#Ø�Y‰YÐ0Ô0Ø�M‰MŽOØ�Y‰YÐ8Ô8Ø×ÑÖØ�Y‰YÐ1Ô1Ø× Ñ Ö"Ø�Y‰YÐ.Ô.Ø×ÑÖØ�Y‰YÐ7Ô7Ø×%Ñ%Ö'à×Ñ˜sÔ#Ø×ÑÖr$   c                ó°   € V P                  ^Ì4       V P                  4        V P                  RR4       V P                  RR4       V P                  4        R# )éÌ   zAccess-Control-Allow-MethodszPOST, GET, OPTIONSzAccess-Control-Allow-HeaderszContent-Type, X-Admin-KeyN)r—   rn   rl   r˜   rt   s   &r   Ú
do_OPTIONSÚProxyHandler.do_OPTIONSÄ   sJ   € Ø×Ñ˜3ÔØ�‰ÔØ×ÑÐ7Ð9MÔNØ×ÑÐ7Ð9TÔUØ×ÑÖr$   c                óZ	  €  ^ RI p\        P                  P                  \        R4      p\        P                  P                  V4      '       g   \        RV 24      hVP                  V4      p. ROVn        VP                  R,          P                  RR7      p\        P                  4       pVP                  4       p^ pVP                  4        EFb  w  rxVP                  VR,          4      '       g!   \!        VR,          4      P#                  4       MRp	V	'       g   KP  VR,          p
VP                  V
4      '       g!   \!        V
4      P%                  R4      '       d   RM\!        V
4      P#                  4       pVP                  VR,          4      '       g!   \!        VR,          4      P#                  4       MRpVP                  VR,          4      '       g!   \!        VR,          4      P#                  4       MRpVP                  VR,          4      '       g   \'        VR,          4      MRpVP                  VR	,          4      '       g   \'        VR	,          4      MRpVP                  VR
,          4      '       g   \'        VR
,          4      M^ pVP                  VR,          4      '       g!   \!        VR,          4      P#                  4       MRpVP                  VR,          4      '       g!   \!        VR,          4      P#                  4       MRpVP)                  RW›WÍWïVVV3	4       V^,          pEKe  	  VP+                  4        VP-                  4        \        P/                  V4       \1        RV R24       \2        P4                  ! RRRV/4      P7                  4       pV P9                  ^È4       V P;                  RR4       V P=                  4        V P?                  4        V P@                  PC                  V4       R#   \D         d�   pT P9                  R4       T P;                  RR4       T P=                  4        T P?                  4        T P@                  PC                  \2        P4                  ! T PG                  TRR7      4      P7                  4       4        Rp?R# Rp?ii ; i)é    NzUnificacion_Hoteles.xlsxõ   No se encontrÃ³ Úrazon_socialÚhotel_name_apiÚ	bu_codigoÚ	bu_nombreÚregistros_historicoÚmeses_historicoÚactivos_apiÚnombre_personalizadoÚnotas:é   NNT©Údropu   â€”a  
                    INSERT INTO hotel_unificacion
                        (razon_social, hotel_name_api, bu_codigo, bu_nombre,
                         registros_historico, meses_historico, activos_api,
                         nombre_personalizado, notas, actualizado_en)
                    VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,NOW())
                    ON CONFLICT (razon_social) DO UPDATE SET
                        hotel_name_api       = EXCLUDED.hotel_name_api,
                        bu_codigo            = EXCLUDED.bu_codigo,
                        bu_nombre            = EXCLUDED.bu_nombre,
                        registros_historico  = EXCLUDED.registros_historico,
                        meses_historico      = EXCLUDED.meses_historico,
                        activos_api          = EXCLUDED.activos_api,
                        nombre_personalizado = EXCLUDED.nombre_personalizado,
                        notas                = EXCLUDED.notas,
                        actualizado_en       = NOW()
                u%     âœ… hotel_unificacion actualizada: ú filasrx   ÚactualizadasúContent-Typeúapplication/json; charset=utf-8éô  úapplication/jsonF©rx   )	r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   )$ÚpandasÚosrr   r   r`   ÚexistsÚFileNotFoundErrorÚ
read_excelÚcolumnsÚilocÚreset_indexrL   rM   rN   ÚiterrowsÚisnaÚstrr)   rs   rD   rO   ÚcommitÚcloserQ   ÚprintÚjsonÚdumpsÚencoder—   rl   rn   r˜   ÚwfileÚwriteÚ	ExceptionÚ_error_payload)ra   ÚpdÚxlsxÚdfrS   rT   ÚupdatedÚ_r-   ÚrsÚhan_rawÚhanÚbucÚbunÚrhÚmhÚaaÚnp_ÚntÚrespÚes   &                    r   r�   ÚProxyHandler._sync_hotelesÌ   s�  € ðE	TÛÜ—7‘7—<‘<¤Ð%?Ó@ˆDÜ—7‘7—>‘> $×'Ò'Ü'Ð*:¸4¸&Ð(AÓBÐBà—‘˜tÓ$ˆBòˆBŒJð —‘˜•×(Ñ(¨dÐ(Ó3ˆBä—?‘?Ó$ˆDØ—;‘;“=ˆCØˆGàŸ™Ÿ‘�Ø;=¿7¹7À1À^ÕCT×;UÒ;U”S˜˜>Õ*Ó+×1Ñ1Ô3Ð[_�ßÙØÐ,Õ-�Ø!Ÿw™w w×/Ò/´3°w³<×3JÑ3JÈ5×3QÒ3Q‘dÔX[Ð\cÓXd×XjÑXjÓXl�ØDFÇGÁGÈAÈkÍN×D[ÒD[”c˜!˜K�.Ó)×/Ñ/Ô1Ðlp�ØDFÇGÁGÈAÈkÍN×D[ÒD[”c˜!˜K�.Ó)×/Ñ/Ô1Ðlp�ØDFÇGÁGÈAÐNcÕLd×DeÒDe”c˜!Ð1Õ2Ô3Ðlp�ØDFÇGÁGÈAÐN_ÕL`×DaÒDa”c˜!Ð-Õ.Ô/Ðlp�ØDFÇGÁGÈAÈmÕL\×D]ÒD]”c˜!˜MÕ*Ô+Ðlm�ØDFÇGÁGÈAÐNdÕLe×DfÒDf”c˜!Ð2Õ3Ó4×:Ñ:Ô<Ðlp�ØDFÇGÁGÈAÈgÍJ×DWÒDW”c˜!˜G�*“o×+Ñ+Ô-Ðlp�à—‘ð ð  ˜s¨°°S¸"Ð=ô!?ð" ˜1•“ñ? &ðB �K‰KŒMØ�I‰IŒKÜ�O‰O˜DÔ!ÜÐ9¸'¸À&ÐIÔJä—:’:˜t T¨>¸7ÐCÓD×KÑKÓMˆDØ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ�O‰OÔØ×ÑÔØ�J‰J×Ñ˜TÖ"øäô 	TØ×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨×(;Ñ(;¸AÀ%Ð(;Ó(HÓI×PÑPÓR×SÒSûð	TúsX   ‚AP ÁCP Ä!P Å AP Æ?P Ç?P È1P É1P É=1P Ê/?P Ë/DP ÐR*ÐBR%Ò%R*c           
     ó\  €  ^ RI p\        P                  P                  \        R4      p\        P                  P                  V4      '       g   \        RV 24      hVP                  V^R7      p. ROVn        VP                  R.R7      P                  RR7      p\        P                  4       pVP                  4       p^ pVP                  4        EFa  w  rx\        VR,          4      P!                  4       p	VP#                  VR,          4      '       g!   \        VR,          4      P!                  4       MRp
VP#                  VR,          4      '       g   \%        VR,          4      MRpVP#                  VR,          4      '       g   \%        VR,          4      MRpVP#                  VR	,          4      '       g   \        VR	,          4      R,          MRpVP#                  VR
,          4      '       g!   \        VR
,          4      P!                  4       MRpVP'                  RWšW¼WÞ34       V^,          pEKd  	  VP)                  4        VP+                  4        \        P-                  V4       \/        RV R24       \0        P2                  ! RRRV/4      P5                  4       pV P7                  ^È4       V P9                  RR4       V P;                  4        V P=                  4        V P>                  PA                  V4       R#   \B         d�   pT P7                  R4       T P9                  RR4       T P;                  4        T P=                  4        T P>                  PA                  \0        P2                  ! T PE                  TRR7      4      P5                  4       4        Rp?R# Rp?ii ; i)r    NzUnificacion_Cargos.xlsxr¡   ©ÚheaderÚcargo_originalÚcargo_unificadoÚnum_hotelesÚregistros_pgÚultima_fechaÚhoteles©ÚsubsetTr¬   :Né
   Na¾  
                    INSERT INTO cargo_unificacion
                        (cargo_original, cargo_unificado, num_hoteles,
                         registros_pg, ultima_fecha, hoteles, actualizado_en)
                    VALUES (%s,%s,%s,%s,%s,%s,NOW())
                    ON CONFLICT (cargo_original) DO UPDATE SET
                        cargo_unificado = EXCLUDED.cargo_unificado,
                        num_hoteles     = EXCLUDED.num_hoteles,
                        registros_pg    = EXCLUDED.registros_pg,
                        ultima_fecha    = EXCLUDED.ultima_fecha,
                        hoteles         = EXCLUDED.hoteles,
                        actualizado_en  = NOW()
                u%     âœ… cargo_unificacion actualizada: r®   rx   r¯   r°   r±   r²   r³   Fr´   )rß   rà   rá   râ   rã   rä   )#rµ   r¶   rr   r   r`   r·   r¸   r¹   rº   Údropnar¼   rL   rM   rN   r½   r¿   r)   r¾   rD   rO   rÀ   rÁ   rQ   rÂ   rÃ   rÄ   rÅ   r—   rl   rn   r˜   rÆ   rÇ   rÈ   rÉ   )ra   rÊ   rË   rÌ   rS   rT   rÍ   rÎ   r-   ÚcoÚcuÚnhÚrpgÚufÚhotrÙ   rÚ   s   &                r   r�   ÚProxyHandler._sync_cargos  sÙ  € ð6	TÛÜ—7‘7—<‘<¤Ð%>Ó?ˆDÜ—7‘7—>‘> $×'Ò'Ü'Ð*:¸4¸&Ð(AÓBÐBà—‘˜t¨A�Ó.ˆBòCˆBŒJà—‘Ð#3Ð"4�Ó5×AÑAÀtÐAÓLˆBä—?‘?Ó$ˆDØ—;‘;“=ˆCØˆGàŸ™Ÿ‘�Ü˜!Ð,Õ-Ó.×4Ñ4Ó6�Ø?A¿w¹wÀqÐIZÕG[×?\Ò?\”c˜!Ð-Õ.Ó/×5Ñ5Ô7Ðbf�Ø46·G±G¸A¸mÕ<L×4MÒ4M”c˜!˜MÕ*Ô+ÐTX�Ø46·G±G¸A¸nÕ<M×4NÒ4N”c˜!˜NÕ+Ô,ÐTX�Ø9;¿¹ÀÀ>ÕAR×9SÒ9S”c˜!˜NÕ+Ó,¨SÖ1ÐY]�Ø79·w±w¸qÀ½|×7LÒ7L”c˜!˜I�,Ó'×-Ñ-Ô/ÐRV�à—‘ð ð ˜b rÐ/ô1ð ˜1•“ñ+ &ð. �K‰KŒMØ�I‰IŒKœŸ™¨Ô.ÜÐ9¸'¸À&ÐIÔJä—:’:˜t T¨>¸7ÐCÓD×KÑKÓMˆDØ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ�O‰OÔØ×ÑÔØ�J‰J×Ñ˜TÖ"øäô 	TØ×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨×(;Ñ(;¸AÀ%Ð(;Ó(HÓI×PÑPÓR×SÒSûð	Tús9   ‚AL ÁDL Å1L Æ1L Æ:8L Ç3DL ÌN+ÌBN&Î&N+c           
     óî  €  ^ RI p\        P                  P                  \        R4      p\        P                  P                  V4      '       g   \        RV 24      hVP                  V^ R7      p. ROVn        W3R,          P                  4       ,          pW3R,          P                  \        4      P                  P                  4       P                  P                  4       R8g  ,          pVP                  RR	7      p\        P!                  4       pVP#                  4       p^ p^ pVP%                  4        FÃ  w  r‰\        V	R,          4      P                  4       p
VP                  V	R,          4      '       dF   \        V	R,          4      P                  4       R9  d!   \        V	R,          4      P                  4       MRpV
'       g   K”  VP'                  R
W«34       V'       d   V^,          pKº  V^,          pKÅ  	  VP)                  4        VP+                  4        \        P-                  V4       \/        RV RV R24       \0        P2                  ! RRRVRV/4      P5                  4       pV P7                  ^È4       V P9                  RR4       V P;                  4        V P=                  4        V P>                  PA                  V4       R#   \B         d�   pT P7                  R4       T P9                  RR4       T P;                  4        T P=                  4        T P>                  PA                  \0        P2                  ! T PE                  TRR7      4      P5                  4       4        Rp?R# Rp?ii ; i)zJLee Unificacion_CECOs.xlsx y actualiza ceco_unificado en ceco_unificacion.NzUnificacion_CECOs.xlsxr¡   rÝ   Úceco_originalÚceco_unificadozLEYENDA:Tr¬   ad  
                    INSERT INTO ceco_unificacion
                        (ceco_original, ceco_unificado, actualizado_en)
                    VALUES (%s, %s, NOW())
                    ON CONFLICT (ceco_original) DO UPDATE SET
                        ceco_unificado = EXCLUDED.ceco_unificado,
                        actualizado_en = NOW()
                u     âœ… ceco_unificacion: z mappings aplicados, z sin unificadorx   ÚmapeadosÚsin_unificador°   r±   r²   r³   Fr´   )rñ   ÚfuenteÚempleados_apirâ   rò   rª   )r   Únan)#rµ   r¶   rr   r   r`   r·   r¸   r¹   rº   ÚnotnaÚastyper¿   r)   r   r¼   rL   rM   rN   r½   rO   rÀ   rÁ   rQ   rÂ   rÃ   rÄ   rÅ   r—   rl   rn   r˜   rÆ   rÇ   rÈ   rÉ   )ra   rÊ   rË   rÌ   rS   rT   rÍ   ÚskippedrÎ   r-   ré   rê   rÙ   rÚ   s   &             r   r‘   ÚProxyHandler._sync_cecos_xlsxO  s¾  € ð:	TÛÜ—7‘7—<‘<¤Ð%=Ó>ˆDÜ—7‘7—>‘> $×'Ò'Ü'Ð*:¸4¸&Ð(AÓBÐBð —‘˜t¨A�Ó.ˆBòEˆBŒJð �Õ'×-Ñ-Ó/Õ0ˆBØ�Õ'×.Ñ.¬sÓ3×7Ñ7×=Ñ=Ó?×CÑC×IÑIÓKÈzÑYÕZˆBØ—‘ T�Ó*ˆBä—?‘?Ó$ˆDØ—;‘;“=ˆCØˆGØˆGàŸ™ž‘�Ü˜˜?Õ+Ó,×2Ñ2Ó4�àŸ™ Ð#3Õ!4×5Ò5¼#¸aÐ@PÕ>QÓ:R×:XÑ:XÓ:ZÐbmÔ:mô ˜Ð+Õ,Ó-×3Ñ3Ô5àð ÷ Ùà—‘ð ð �Xô÷ Ø˜q•L’Gà˜q•L’Gñ' &ð* �K‰KŒMØ�I‰IŒKœŸ™¨Ô.ÜÐ,¨W¨IÐ5JÈ7È)ÐSaÐbÔcä—:’:˜t T¨:°wÀÐQXÐYÓZ×aÑaÓcˆDØ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ�O‰OÔØ×ÑÔØ�J‰J×Ñ˜TÖ"øäô 	TØ×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨×(;Ñ(;¸AÀ%Ð(;Ó(HÓI×PÑPÓR×SÒSûð	Tús'   ‚AK ÁE7K ÇDK ËM4ËBM/Í/M4c                ó�  €  \        V P                  P                  R ^ 4      4      p\        P                  ! V P
                  P                  V4      P                  R4      4      pVP                  R. 4      p\        P                  4       pVP                  4       p. pV F¡  pVP                  RR4      P                  4       pVP                  RR4      p	VP                  R^ 4      p
V'       g   KQ  VP                  RWˆWš34       VP                  4       pV'       g   K  V^ ,          '       g   K�  VP                  V4       K£  	  VP                  4        VP!                  4        \        P#                  V4       V'       d   \%        R	V 24       \        P&                  ! R
\)        V4      RV/4      P+                  4       pV P-                  ^È4       V P/                  RR4       V P1                  4        V P3                  4        V P4                  P7                  V4       R#   \8         d›   pT P-                  R4       T P/                  RR4       T P1                  4        T P3                  4        T P4                  P7                  \        P&                  ! T P;                  T4      4      P+                  4       4        Rp?R# Rp?ii ; i)úContent-Lengthúutf-8ÚcecosÚkeyr   rõ   ÚAPIrö   a½  
                    INSERT INTO ceco_unificacion
                        (ceco_original, ceco_unificado, fuente, empleados_api, notas)
                    VALUES (%s, %s, %s, %s, 'Auto-detectado')
                    ON CONFLICT (ceco_original) DO UPDATE
                        SET empleados_api  = EXCLUDED.empleados_api,
                            actualizado_en = NOW()
                    RETURNING (xmax = 0) AS es_nuevo
                u      âœ… CECOs nuevos registrados: Ú
insertadosÚnuevosr°   r±   r²   r³   N)rD   rj   rk   rÃ   ÚloadsÚrfileÚreadÚdecoderL   rM   rN   r)   rO   rP   ÚappendrÀ   rÁ   rQ   rÂ   rÄ   r*   rÅ   r—   rl   rn   r˜   rÆ   rÇ   rÈ   rÉ   )ra   ÚlengthÚbodyrÿ   rS   rT   ÚinsertedÚitemr   rõ   ÚcountrU   rÙ   rÚ   s   &             r   rŽ   ÚProxyHandler._cecos_syncŽ  s  € ð/	JÜ˜Ÿ™×)Ñ)Ð*:¸AÓ>Ó?ˆFÜ—Z’Z §
¡
§¡°Ó 7× >Ñ >¸wÓ GÓHˆDØ—X‘X˜g rÓ*ˆEä—?‘?Ó$ˆDØ—;‘;“=ˆCàˆHÛ�ØŸ™ %¨Ó,×2Ñ2Ó4�ØŸ™ (¨EÓ2�ØŸ™ /°1Ó5�ßÙØ—‘ð ð  Ð.ô0ð —l‘l“n�ß‘3˜3˜qŸ6ž6Ø—O‘O CÖ(ñ# ð& �K‰KŒMØ�I‰IŒKÜ�O‰O˜DÔ!çÜÐ8¸¸
ÐCÔDä—:’:˜|¬S°«]¸HÀhÐOÓP×WÑWÓYˆDØ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ�O‰OÔØ×ÑÔØ�J‰J×Ñ˜TÖ"øäô 	JØ×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨×(;Ñ(;¸AÓ(>Ó?×FÑFÓH×IÒIûð	Jús-   ‚DH  ÄH  Ä/AH  ÆBH  È KÈ+BK Ë Kc                óÜ  aa€ R p ^ RI o^ RIo\        P                  P	                  V4      '       g   \        RV 24      hSP                  VRR7      p. R#OVn        V3R lpV3R lpV3R lpV3R lp\        P                  4       pVP                  4       pVP                  R4       VP                  R4       VP                  4        VP                  R4       VP                  4        U	U
u. uF±  w  ršV! V
R,          4      V! V
R,          4      V! V
R,          4      V! V
R,          4      V! V
R	,          4      V! V
R
,          4      V! V
R,          4      V! V
R,          4      V! V
R,          4      V! V
R,          4      V! V
R	,          V
R,          V
R,          4      3NK³  	  pp	p
\        P                  P!                  VRV4       VP                  4        VP                  R4       VP#                  4       ^ ,          pVP%                  4        \        P'                  V4       \)        RV R24       \*        P,                  ! RRRV/4      P/                  4       pV P1                  ^È4       V P3                  RR4       V P5                  4        V P7                  4        V P8                  P;                  V4       R# u up
p	i   \<         d�   pT P1                  R4       T P3                  RR 4       T P5                  4        T P7                  4        T P8                  P;                  \*        P,                  ! T P?                  TR!R"7      4      P/                  4       4        Rp?R# Rp?ii ; i)$z±/Users/ricardomartinez/Library/CloudStorage/OneDrive-farandahotels.com/Business Intelligence/Talento Humano/Base de Datos Historicos/Ingresos y Retiros Empleados Historicos.xlsxNu   No se encontrÃ³: ÚHoja1)Ú
sheet_namer¢   Únombre_completoÚingresoÚcargoÚtipo_movimientoÚsueldo_baseÚtipo_contratoÚterminoÚ	operacionÚcausa_retiroc                 ó°   <€ V e.   \        V \        4      '       d   SP                  V 4      '       d   R # \        V 4      P	                  4       ;'       g    R # r   )Ú
isinstanceÚfloatÚisnanr¿   r)   )ÚvÚnps   &€r   ÚclÚ!ProxyHandler._sync_ir.<locals>.clÒ  s:   ø€ Ø’9¤¨A¬u×!5Ò!5¸"¿(¹(À1¿+º+ÉtÜ˜1“v—|‘|“~×-Ð-¨Ð-r$   c                 óŠ   <€  SP                  V 4      pSP                  V4      '       d   R # VP                  4       #     R # ; ir   )Ú	Timestampr¾   r   )r  r@   rÊ   s   & €r   ÚcdÚ!ProxyHandler._sync_ir.<locals>.cdÕ  s9   ø€ ð$ØŸ™ a›�BØ#%§7¡7¨2§;¢;˜4Ð=°B·G±G³IÐ=øØ#štús   ƒ'= «= ­= ½Ac                 ób   <€  \        V 4      pSP                  V4      '       d   R # T#     R # ; ir   )r  r  )r  Úfr   s   & €r   ÚcnÚ!ProxyHandler._sync_ir.<locals>.cnÚ  s/   ø€ ð$Ü˜a›�AØ#%§8¡8¨A§;¢;˜4Ð5°AÐ5øØ#štús   ƒ!) ¥) §) ©.c                 ó  <€  \        V 4      P                  4       R 8X  d   SP                  V4      pMSP                  V4      pSP                  V4      '       d   R# VP                   RVP
                  R 2#     R# ; i)ÚRNrH   Ú02d)r¿   r   r$  r¾   ÚyearÚmonth)ÚtipoÚingreso_valÚtermino_valr@   rÊ   s   &&& €r   ÚcpÚ!ProxyHandler._sync_ir.<locals>.cpá  sh   ø€ ð$Ü˜4“y—‘Ó(¨CÔ/ØŸ\™\¨+Ó6™àŸ\™\¨+Ó6˜Ø—w‘w˜r—{’{©4Ø Ÿg™g˜Y a¨¯©° ~Ð6Ð6øØ#štús   ƒAA9 ÁA9 Á9A>am  
                CREATE TABLE IF NOT EXISTS historico_ir (
                    id              SERIAL PRIMARY KEY,
                    razon_social    TEXT,
                    nombre_completo TEXT,
                    ingreso         DATE,
                    cargo           TEXT,
                    tipo_movimiento TEXT,
                    sueldo_base     NUMERIC(14,2),
                    tipo_contrato   TEXT,
                    termino         DATE,
                    operacion       TEXT,
                    causa_retiro    TEXT,
                    periodo         VARCHAR(7)
                )
            zb
                ALTER TABLE historico_ir ADD COLUMN IF NOT EXISTS periodo VARCHAR(7)
            z,TRUNCATE TABLE historico_ir RESTART IDENTITYa  
                INSERT INTO historico_ir
                    (razon_social,nombre_completo,ingreso,cargo,tipo_movimiento,
                     sueldo_base,tipo_contrato,termino,operacion,causa_retiro,periodo)
                VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
            z!SELECT COUNT(*) FROM historico_iru      âœ… historico_ir actualizado: r®   rx   TÚtotalr°   r±   r²   r³   Fr´   )
r¢   r  r  r  r  r  r  r  r  r  ) rµ   Únumpyr¶   rr   r·   r¸   r¹   rº   rL   rM   rN   rO   rÀ   r½   Úpsycopg2ÚextrasÚexecute_batchrP   rÁ   rQ   rÂ   rÃ   rÄ   rÅ   r—   rl   rn   r˜   rÆ   rÇ   rÈ   rÉ   )ra   ÚXLSX_IRrÌ   r!  r%  r)  r3  rS   rT   rÎ   r-   Úrowsr5  rÙ   rÚ   r   rÊ   s   &              @@r   r’   ÚProxyHandler._sync_irÁ  sà  ù€ ð;ð 	ð[	Tß,Ü—7‘7—>‘> '×*Ò*Ü'Ð*;¸G¸9Ð(EÓFÐFà—‘˜w°7�Ó;ˆBò@ˆBŒJõ.õ$õ
$õ$ô —?‘?Ó$ˆDØ—;‘;“=ˆCØ�K‰Kð ô ð" �K‰Kð ô ð �K‰KŒMØ�K‰KÐFÔGð ŸK™KœMôñ *‘D�Añ �A�nÕ%Ó&©¨1Ð->Õ+?Ó(@Á"ÀQÀyÅ\ÓBRÙ�A�g•J“¡ AÐ&7Õ$8Ó!9¹2¸aÀÕ>NÓ;OÙ�A�oÕ&Ó'©¨A¨i­LÓ)9Ù�A�k•NÓ#¡R¨¨.Õ(9Ó%:Ù�AÐ'Õ(¨!¨I­,¸¸)½ÓEó	Gñ
 *ð ñ ô �O‰O×)Ñ)¨#ð 0ð
 ôð �K‰KŒMØ�K‰KÐ;Ô<Ø—L‘L“N 1Õ%ˆEØ�I‰IŒKœŸ™¨Ô.ÜÐ4°U°G¸6ÐBÔCä—:’:˜t T¨7°EÐ:Ó;×BÑBÓDˆDØ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ�O‰OÔØ×ÑÔØ�J‰J×Ñ˜TÖ"ùó3øô4 ô 	TØ×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨×(;Ñ(;¸AÀ%Ð(;Ó(HÓI×PÑPÓR×SÒSûð	Tús2   †,K ³B<K Ã/B7J>Æ&DK Ê>K ËM+ËBM&Í&M+rx   Nc               ó˜   € / pVe   W#R&   \         '       d   \        V4      MRVR&   \         '       d   ^ R IpVP                  4       VR&   V# )Nrx   zError internory   Útrace)ÚDEBUG_ERRORSr¿   Ú	tracebackÚ
format_exc)ra   Úexcrx   Úpayloadr@  s   &&$  r   rÉ   ÚProxyHandler._error_payload&  sG   € ØˆØŠ>Ø�D‰Mß'3£|œ3˜sœ8¸ˆ�Ñß‹<ÛØ(×3Ñ3Ó5ˆG�GÑØˆr$   c                ó  € \         P                  ! V\        R R7      P                  R4      pV P	                  V4       V P                  RR4       V P                  4        V P                  4        V P                  P                  V4       R# )F©ÚdefaultÚensure_asciirþ   r°   r±   N)
rÃ   rÄ   r¿   rÅ   r—   rl   rn   r˜   rÆ   rÇ   )ra   ÚcodeÚobjr
  s   &&& r   r{   ÚProxyHandler._send_json0  sf   € Ü�zŠz˜#¤s¸Ô?×FÑFÀwÓOˆØ×Ñ˜4Ô Ø×Ñ˜Ð)JÔKØ�‰ÔØ×ÑÔØ�
‰
×Ñ˜Ör$   c                óÚ   € \        V P                  P                  R ^ 4      4      pV'       d   V P                  P	                  V4      MRp\
        P                  ! T;'       g    R4      V3# )rý   s   {})rD   rj   rk   r  r  rÃ   r  )ra   r	  Úraws   &  r   Ú_read_json_bodyÚProxyHandler._read_json_body8  sN   € Ü�T—\‘\×%Ñ%Ð&6¸Ó:Ó;ˆß)/ˆd�j‰j�o‰o˜fÔ%°UˆÜ�zŠz˜#Ÿ,˜, Ó'¨Ð,Ð,r$   c                óD   € \        V 4      \        V4      3\        4       8*  # )uj   Retorna True si (ano, mes) <= Ãºltimo perÃ­odo cargado en historico_nomina_pyg â†’ usar cachÃ© PostgreSQL.)rD   rY   )rW   rX   s   &&r   Ú_is_periodo_historicoÚ"ProxyHandler._is_periodo_historico=  s    € ô �C“œ#˜c›(Ð#Ô'>Ó'@Ñ@Ð@r$   c           	     ó¨  € \         V,           p \        P                  P                  W2R\        RR/RR7      p\        P                  P                  V^<\        R7      ;_uu_ 4       pVP                  4       pRRR4       V P                  ^È4       V P                  RR4       V P                  4        V P                  4        V P                  P                  X4       R#   + '       g   i     Lp; i  \        P                  P                   d¡   pT P                  TP                   4       T P                  RR4       T P                  4        T P                  4        T P                  P                  \"        P$                  ! R\'        T4      /4      P)                  4       4        Rp?R# Rp?i\*         d—   pT P                  R	4       T P                  RR4       T P                  4        T P                  4        T P                  P                  \"        P$                  ! R\'        T4      /4      P)                  4       4        Rp?R# Rp?ii ; i)
u/   Proxy POST a la API externa con body ya leÃ­do.ú	X-API-Keyr°   r³   ÚPOST©Údatarj   Úmethod©ÚtimeoutÚcontextNry   éö  )r   ÚurllibÚrequestÚRequestÚAPI_KEYÚurlopenÚSSL_CTXr  r—   rl   rn   r˜   rÆ   rÇ   ry   Ú	HTTPErrorrI  rÃ   rÄ   r¿   rÅ   rÈ   )ra   Úapi_pathr
  ÚurlÚreqrÙ   rW  rÚ   s   &&&     r   Ú_proxy_post_bodyÚProxyHandler._proxy_post_bodyB  sµ  € ä˜Õ!ˆð	EÜ—.‘.×(Ñ(ØØ$¤g¨~Ð?QÐRØð )ó ˆCô
 —‘×'Ñ'¨°RÄÐ'×IÔIÈTØ—y‘y“{�÷ Jà×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×Ñ˜TÖ"÷ J×Iûô �|‰|×%Ñ%ô 	EØ×Ñ˜qŸv™vÔ&Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨´#°a³&Ð(9Ó:×AÑAÓC×DÒDûÜô 	EØ×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨´#°a³&Ð(9Ó:×AÑAÓC×DÒDûð	EúsE   �AC3 Á'C Á8A&C3 Ã C0	Ã+C3 Ã3IÄBF-Æ-IÆ:IÆ;BIÉIc                ó"  €  V P                  4       w  r\        VP                  RR4      4      P                  4       p\	        VP                  R^ 4      4      p\	        VP                  R^ 4      4      pV'       dÐ   V'       dÈ   V'       dÀ   V P                  WE4      '       d©   \        P                  4       pVP                  \        P                  P                  R7      pVP                  RWEV34       VP                  4       pVP                  4        \        P                  V4       V'       d   V P!                  ^ÈVR,          4      # V P#                  RV4      #   \$         d(   p	T P!                  R	R
\        T	4      /4      u Rp	?	# Rp	?	ii ; i)uJ   POST /proxy/nomina/reporte con cachÃ© histÃ³rica PostgreSQL hasta 2026-05.Ú	hotel_nitr   rW   rX   ©Úcursor_factoryam  
                    SELECT raw_data
                    FROM historico_nomina_pyg
                    WHERE fuente='nomina'
                      AND registro_tipo='respuesta'
                      AND ano=%s
                      AND mes=%s
                      AND nit=%s
                    ORDER BY cargado_en DESC
                    LIMIT 1
                Úraw_dataú/nomina/reporter\  ry   N)rN  r¿   rk   r)   rD   rQ  rL   rM   rN   r7  r8  ÚRealDictCursorrO   rP   rÁ   rQ   r{   rg  rÈ   )
ra   rC  Úraw_bodyÚnitrW   rX   rS   rT   rU   rÚ   s
   &         r   r”   ÚProxyHandler._nomina_reporte`  s.  € ð	;Ø $× 4Ñ 4Ó 6ÑˆGÜ�g—k‘k +¨rÓ2Ó3×9Ñ9Ó;ˆCÜ�g—k‘k %¨Ó+Ó,ˆCÜ�g—k‘k %¨Ó+Ó,ˆCß—sŸs t×'AÑ'AÀ#×'KÒ'KÜ—‘Ó(�Ø—{‘{´(·/±/×2PÑ2P�{ÓQ�Ø—‘ð 
ð  �_ô
&ð —l‘l“n�Ø—	‘	”œWŸ_™_¨TÔ2ßØŸ?™?¨3°°JµÓ@Ð@Ø×(Ñ(Ð):¸HÓEÐEøÜô 	;Ø—?‘? 3¨´#°a³&Ð(9Ó:Õ:ûð	;ús1   ‚B E ÂE ÂB>E Å
E ÅFÅ'F	ÆFÆ	Fc                ó®  €  ^ RI p^ RIp\        P                  4       pVP	                  VP
                  P                  R7      pVP                  R4       VP                  4       pVP                  4        \        P                  V4       RV Uu. uF  p\        V4      NK  	  up/p\        P                  ! V4      P!                  4       pV P#                  ^È4       V P%                  RR4       V P'                  4        V P)                  4        V P*                  P-                  V4       R# u upi   \         d   pR. R\        T4      /p Rp?L¨Rp?ii ; i)zÑ
Lee hotel_unificacion JOIN empresas para devolver la lista de hoteles
con NIT configurado, uno por fila (separados por BU cuando aplica).
Responde: { hotels: [{label, nit, hotel_api, bu_codigo, bu_nombre}] }
Nrk  aï  
                SELECT DISTINCT ON (h.nombre_personalizado, e.nit, h.bu_codigo)
                    h.nombre_personalizado  AS label,
                    e.nit,
                    h.hotel_name_api        AS hotel_api,
                    h.bu_codigo,
                    h.bu_nombre,
                    e.pyg_company_id
                FROM hotel_unificacion h
                JOIN empresas          e ON h.razon_social = e.codigo
                WHERE e.nit IS NOT NULL
                  AND e.nit <> ''
                  AND h.hotel_name_api IS NOT NULL
                  AND h.hotel_name_api <> ''
                  AND h.nombre_personalizado NOT IN ('No mostrar')
                ORDER BY h.nombre_personalizado, e.nit, h.bu_codigo
            Úhotelsry   r°   r±   ©r7  Úpsycopg2.extrasrL   rM   rN   r8  ro  rO   ÚfetchallrÁ   rQ   ÚdictrÈ   r¿   rÃ   rÄ   rÅ   r—   rl   rn   r˜   rÆ   rÇ   ©	ra   r7  rS   rT   r;  r-   rW  ÚexrÙ   s	   &        r   r…   Ú ProxyHandler._nomina_hoteles_nit  s  € ð	4ß,Ü—?‘?Ó$ˆDØ—;‘;¨h¯o©o×.LÑ.L�;ÓMˆCØ�K‰Kð ô ð" —<‘<“>ˆDØ�I‰IŒKœŸ™¨Ô.Ø±Ó5±¨1œt Ažw±Ñ5Ð6ˆDô �zŠz˜$Ó×&Ñ&Ó(ˆØ×Ñ˜3ÔØ×Ñ˜Ð)JÔKØ�‰ÔØ×ÑÔØ�
‰
×Ñ˜Öùò 6øÜô 	4Ø˜b '¬3¨r«7Ð3�Dûð	4ús*   ‚BD0 ÂD+Â#D0 Ä+D0 Ä0EÄ;EÅEc                óº  €  ^ RI p^ RIp\        P                  4       pVP	                  VP
                  P                  R7      pVP                  R4       VP                  4       pVP                  4        \        P                  V4       RV Uu. uF  p\        V4      NK  	  up/p\        P                  ! V\        R7      P!                  4       pV P#                  ^È4       V P%                  RR4       V P'                  4        V P)                  4        V P*                  P-                  V4       R# u upi   \         d   pR. R\        T4      /p Rp?L®Rp?ii ; i)	uN   GET /proxy/nomina/conceptos-map â€” devuelve tabla nomina_conceptos como JSON.Nrk  a;  
                SELECT codigo,
                       regexp_replace(codigo, '_v[0-9]+$', '') AS codigo_api,
                       nombre, tipo, grupo, subgrupo, nombre_display, incluir
                FROM nomina_conceptos
                ORDER BY tipo, grupo NULLS LAST, subgrupo NULLS LAST, codigo
            Ú	conceptosry   )rG  r°   r±   ru  ry  s	   &        r   r†   Ú"ProxyHandler._nomina_conceptos_map§  s  € ð	7ß,Ü—?‘?Ó$ˆDØ—;‘;¨h¯o©o×.LÑ.L�;ÓMˆCØ�K‰Kð ô ð —<‘<“>ˆDØ�I‰IŒKœŸ™¨Ô.Ø±4Ó!8±4¨a¤$ q¦'±4Ñ!8Ð9ˆDô �zŠz˜$¬Ô,×3Ñ3Ó5ˆØ×Ñ˜3ÔØ×Ñ˜Ð)JÔKØ�‰ÔØ×ÑÔØ�
‰
×Ñ˜Öùò "9øÜô 	7Ø  W¬c°"«gÐ6�Dûð	7ús*   ‚BD6 ÂD1Â#D6 Ä1D6 Ä6EÅEÅEc                óþ  €  ^ RI p^ RIp\        P                  P	                  \
        R4      p\        P                  P                  V4      '       gC   \        P                  P                  \        P                  P	                  \
        RR4      4      pVP                  VR^ R7      p\        VP                  4      p\        V4      ^8¼  d   ^ R^R^R^R	^R
^R^R/pM^ R^R^R^R	^R
^R^R/pVP                  4        UUu/ uF   w  rxV\        V4      8  g   K  WW,          VbK"  	  p	ppVP                  V	R7      pVP                  R.R7      p\        P!                  4       p
V
P#                  4       p^ pVP%                  4        EFÞ  w  rÞ\'        VP)                  R	R4      ;'       g    R4      P+                  4       P-                  4       R8X  d   RMRpTP/                  R\'        VR,          4      P+                  4       VP1                  VR,          4      '       d!   \'        VR,          4      P+                  4       MRVP1                  VR,          4      '       d!   \'        VR,          4      P+                  4       MRVP1                  VP)                  R
4      4      '       d!   \'        VR
,          4      P+                  4       MRVP1                  VP)                  R4      4      '       d!   \'        VR,          4      P+                  4       MRVP1                  VP)                  R4      4      '       d!   \'        VR,          4      P+                  4       MRV34       V^,          pEKá  	  V
P3                  4        VP/                  R4       VP5                  4       ^ ,          pVP7                  4        \        P9                  V
4       RRRVRV/p\<        P>                  ! V4      PA                  4       pV PC                  ^È4       V PE                  RR4       V PG                  4        V PI                  4        V PJ                  PM                  V4       R# u uppi   \:         d   pRRR\'        T4      /p Rp?L©Rp?ii ; i)uQ   POST /proxy/admin/sync-conceptos â€” lee Conceptos_Nomina_Mapeo.xlsx y upsert BD.NzConceptos_Nomina_Mapeo.xlsxz../../..u   Mapeo AgrupaciÃ³n)r  rÞ   ÚcodigoÚnombrer0  ÚincluirÚgrupoÚsubgrupoÚnombre_display)rº   rå   ÚSÚNFTa  
                    INSERT INTO nomina_conceptos (codigo, nombre, tipo, grupo, subgrupo, nombre_display, incluir)
                    VALUES (%s,%s,%s,%s,%s,%s,%s)
                    ON CONFLICT (codigo) DO UPDATE SET
                        nombre         = EXCLUDED.nombre,
                        tipo           = EXCLUDED.tipo,
                        grupo          = COALESCE(NULLIF(EXCLUDED.grupo,''),   nomina_conceptos.grupo),
                        subgrupo       = COALESCE(NULLIF(EXCLUDED.subgrupo,''), nomina_conceptos.subgrupo),
                        nombre_display = COALESCE(NULLIF(EXCLUDED.nombre_display,''), nomina_conceptos.nombre_display),
                        incluir        = EXCLUDED.incluir,
                        actualizado_en = NOW()
                r   ÚDevengoz=SELECT COUNT(*) FROM nomina_conceptos WHERE grupo IS NOT NULLrx   Ú
procesadosÚ	con_grupory   r°   r±   )'rµ   r7  r¶   rr   r   r`   r·   Úabspathr¹   Úlistrº   r*   ÚitemsÚrenamerè   rL   rM   rN   r½   r¿   rk   r)   r   rO   rø   rÀ   rP   rÁ   rQ   rÈ   rÃ   rÄ   rÅ   r—   rl   rn   r˜   rÆ   rÇ   )ra   rÊ   r7  rË   rÌ   ÚcolsÚcol_mapÚiÚnamerŽ  rS   rT   rÍ   rÎ   rU   r‚  ró   Úmsgrz  rÙ   s   &                   r   r–   Ú!ProxyHandler._sync_conceptos_xlsxÁ  s€  € ð3	2ß)Ü—7‘7—<‘<¤Ð%BÓCˆDÜ—7‘7—>‘> $×'Ò'ä—w‘w—‘¤r§w¡w§|¡|´C¸ÐEbÓ'cÓd�Ø—‘˜tÐ0CÈA�ÓNˆBä˜Ÿ
™
Ó#ˆDÜ�4‹y˜AŒ~à˜X q¨°1°V¸Q¸yÈ!ÈGÐUVÐWaÐcdÐeuÐv‘ð ˜X q¨°1°V¸Q¸yÈ!ÈGÐUVÐWaÐcdÐeuÐv�Ø3:·=±=´?ÔT±?©¨ÀaÌ#ÈdË)Ám”m�d•g˜t’m±?ˆFÑTØ—‘ 6�Ó*ˆBØ—‘ 8 *�Ó-ˆBä—?‘?Ó$ˆDØ—;‘;“=ˆCØˆGØŸ+™+Ÿ-‘�Ü#& s§w¡w¨y¸Ó'=×'DÐ'DÀÓ#E×#KÑ#KÓ#M×#SÑ#SÓ#UÐY\Ô#\™%Ðbf�Ø—‘ð ô ˜˜H�Ó&×,Ñ,Ó.Ø24·(±(¸3¸x½=×2IÒ2I”C˜˜H�Ó&×,Ñ,Ô.ÈrØ24·(±(¸3¸v½;×2GÒ2G”C˜˜F�Ó$×*Ñ*Ô,ÈyØ24·(±(¸3¿7¹7À7Ó;K×2LÒ2L”C˜˜G�Ó%×+Ñ+Ô-ÐRVØ46·H±H¸S¿W¹WÀZÓ=P×4QÒ4Q”C˜˜J�Ó(×.Ñ.Ô0ÐW[Ø:<¿(¹(À3Ç7Á7ÐK[ÓC\×:]Ò:]”C˜Ð,Õ-Ó.×4Ñ4Ô6ÐcgØðôð( ˜1•“ñ- (ð. �K‰KŒMØ�K‰KÐWÔXØ—|‘|“~ aÕ(ˆHØ�I‰IŒKœŸ™¨Ô.Ø˜˜|¨W°kÀ8ÐLˆCô �zŠz˜#‹×%Ñ%Ó'ˆØ×Ñ˜3ÔØ×Ñ˜Ð)JÔKØ�‰ÔØ×ÑÔØ�
‰
×Ñ˜ÖùóU UøôF ô 	2Ø˜ ¬¨R«Ð1�Cûð	2úsT   ‚AQ ÁB/Q ÄQÄQÄ(D5Q ÉAQ Ê%AQ Ë,AQ Ì3BQ ÑQ ÑQ<Ñ#Q7Ñ7Q<c                ó–  a#€  V P                  4       w  r\        VP                  R^ 4      4      p\        VP                  R^ 4      4      pVP                  R4      pVP                  RR.4      ;'       g    R.pV Uu. uF=  p\        V4      P	                  4       '       g   K$  \        V4      P                  4       NK?  	  ppV'       Ed®   V'       Ed¥   V'       Edœ   V P                  W44      '       Ed„   \        P                  4       pVP                  \        P                  P                  R7      p	V	P                  RW4\        V4      V34       V	P                  4       p
V
'       dÝ   V	P                  4        \        P!                  V4       \        VP                  RR	4      4      P	                  4       pV
 Uu. uFZ  pR
VR,          RVR,          RVR,          RVR,          RVR,          ;'       g    ^ RVR,          ;'       g    ^ RRRVR,          /NK\  	  ppV P#                  ^ÈRVR\        V4      RV VR 2RV/4      # V	P                  RW4\        V4      34       V	P                  4       pV	P                  4        \        P!                  V4       V'       EdÙ   V#3R lo#/ pV F¾  pVP                  R4      ;'       g    RP                  4       pVV9  d   V'       d   K=  VR,          ;'       g    / P                  R/ 4      pV.\%        VP'                  4       4      ,            F9  pVP                  V/ 4      P                  R. 4      pV'       g   K/  S#! VV4        K¼  	  KÀ  	  V'       gƒ   V F|  pVR,          ;'       g    / P                  R/ 4      p\%        VP'                  4       4       F9  pVP                  V/ 4      P                  R. 4      pV'       g   K/  S#! VV4        Kz  	  K~  	  . R+Op/ pVP)                  4        F,  w  ppVP+                  R4      R,,          pVV9  g   K'  VVV&   K.  	  \-        4       . ppV FÓ  w  ppppp VV9   d   K  VP                  V4      ;'       g    VP                  V4      p!V!f   KB  VP/                  V4       VP/                  VP1                  R!R"4      P1                  R#R$4      P1                  R%R&4      P1                  R'R(4      4       VP3                  R
VRVRVRVRV!R,          RV!R,          RRRV /4       KÕ  	  V'       dP   V P#                  ^ÈR\        VP                  RR	4      4      P	                  4       R\        V4      RV VR 2RV/4      # V P5                  WWSV4      # u upi u upi   \6         d(   p"T P#                  R)R*\        T"4      /4      u R p"?"# R p"?"ii ; i)-ux   POST /proxy/pyg/reporte con cachÃ© histÃ³rica PostgreSQL hasta 2026-03.
Body: { nit, ano, mes, company_id, bu_codigos }
rW   rX   Ú
company_idÚ
bu_codigosÚLocalrk  aÿ  
                    SELECT concepto_codigo, concepto_nombre, grupo, subgrupo,
                           SUM(valor)::float      AS val,
                           SUM(valor_ly)::float   AS ly,
                           BOOL_OR(COALESCE((raw_data->>'nomina_backed')::boolean, false)) AS nomina_backed
                    FROM historico_nomina_pyg
                    WHERE fuente='pyg'
                      AND registro_tipo='concepto'
                      AND ano=%s
                      AND mes=%s
                      AND company_id=%s
                      AND LOWER(COALESCE(bu_codigo,'')) = ANY(%s)
                    GROUP BY concepto_codigo, concepto_nombre, grupo, subgrupo
                    ORDER BY grupo, subgrupo, concepto_nombre
                rq  r   ÚidÚconcepto_codigor�  Úconcepto_nombrerƒ  r„  ÚvalÚlyrõ   ÚpygÚnomina_backedÚperiodr-  r}  a  
                    SELECT raw_data, bu_codigo
                    FROM historico_nomina_pyg
                    WHERE fuente='pyg' AND registro_tipo='respuesta'
                      AND ano=%s AND mes=%s AND company_id=%s
                    ORDER BY cargado_en DESC
                c           
      ól  <€ V  EF«  pVP                  R R4      pVP                  R/ 4      pVP                  R/ 4      pRp\        V\        4      '       dt   VP                  4        F_  w  rx\        V\        \
        34      '       d   Tp M>\        V\        4      '       g   K=  VP                  RVP                  RR4      4      p M	  VP                  R/ 4      p	Rp
\        V	\        4      '       dt   V	P                  4        F_  w  rx\        V\        \
        34      '       d   Tp
 M>\        V\        4      '       g   K=  VP                  RVP                  RR4      4      p
 M	  R TRVP                  RR4      R	T;'       g    RR
T
;'       g    R/W&   S! VP                  R. 4      V4       EK®  	  R# ©r™  r   ÚmonthlyÚrealrA   rX   r?   Ú	last_yearÚlabelrœ  r�  ÚchildrenN©rk   r  rx  r�  rD   r  )ÚnodesÚoutÚnÚnidr£  r¤  rœ  Úkr  Úly_dataÚly_valÚ_flattens   &&         €r   r°  Ú+ProxyHandler._pyg_reporte.<locals>._flatten?  sk  ø€ Ü!&˜AØ&'§e¡e¨D°"£o˜CØ&'§e¡e¨I°rÓ&:˜GØ&-§k¡k°&¸"Ó&=˜DØ&)˜CÜ)¨$´×5Ò5Ø,0¯J©J®L¡D AÜ'1°!´c¼5°\×'BÒ'BØ./¨±Ü)3°A´t×)<Ô)<Ø./¯e©e°E¸1¿5¹5ÀÈ#Ó;NÓ.O¨ÑQVñ	 -9ð
 '.§k¡k°+¸rÓ&B˜GØ&)˜FÜ)¨'´4×8Ò8Ø,3¯M©M®O¡D AÜ'1°!´c¼5°\×'BÒ'BØ12¨±EÜ)3°A´t×)<Ô)<Ø12·±°u¸a¿e¹eÀGÈSÓ>QÓ1R¨ÑTYñ	 -<ð
 )-¨c°7¸A¿E¹EÀ'È"Ó<MÈuÐVY×V`ÐV`Ð]`ÐbfÐhn×huÐhuÐruÐ'v˜C™HÙ$ Q§U¡U¨:°rÓ%:¸C×@ó) "'r$   r¤   Úlocalrm  ÚpnlÚtreeÚ/Nô   Ã³Úoô   Ã¡Úaô   Ã©rÚ   ô   ÃºÚur\  ry   ©)Úsueldos_y_salarios_del_personalzSueldos y SalariosÚSalarioszSalario MesT)Úhoras_extras_y_festivoszHoras Extras y Festivosr¿  zHoras Extras y RecargosT)Úauxilio_de_transportezAuxilio de Transporter¿  zSubsidio de TransporteT)ÚauxiliosÚAuxiliosr¿  rÃ  T)ÚincapacidadesÚIncapacidadesr¿  rÅ  T)Ú"prestaciones_sociales_y_vacacionesú"Prestaciones Sociales y VacacionesÚProvisionesrÇ  T)Úprimas_extralegalesúPrimas ExtralegalesrÈ  rÊ  T)ÚbonificacionesÚBonificacionesr¿  rÌ  T)Úindemnizaciones_laboralesúIndemnizaciones LaboralesÚIndemnizacionesrÎ  T)Ú
temporalesÚ
TemporalesúPersonal ExternorÑ  F)Úhonorarios_laboraleszHonorarios LaboralesrÒ  Ú
HonorariosF)Ú
comisioneszComisiones PersonalrÒ  rÔ  F)u%   dotaciÃ³n_y_suministro_a_trabajadoresõ   DotaciÃ³n y SuministroúOtros Gastos Personalõ	   DotaciÃ³nF)Ú$dotacion_y_suministro_a_trabajadoresrÖ  r×  rØ  F)Úcomida_empleadoszComida Empleadosr×  Ú	BienestarF)Útransporte_de_personalzTransporte de Personalr×  rÛ  F)u   capacitaciÃ³n_al_personalõ   CapacitaciÃ³n al Personalr×  rÛ  F)Úcapacitacion_al_personalrÝ  r×  rÛ  F)Úgastos_medicos_y_medicamentosu   Gastos MÃ©dicos y Medicamentosr×  õ   Gastos MÃ©dicosF)Úsalud_ocupacional_y_examenes_du   Salud Ocupacional y ExÃ¡menesr×  rà  Féÿÿÿÿ)rN  rD   rk   r¿   r)   ÚlowerrQ  rL   rM   rN   r7  r8  ro  rO   rw  rÁ   rQ   r{   rŒ  Úkeysr�  r   ÚsetÚaddÚreplacer  Ú_pyg_reporte_apirÈ   )$ra   rC  rp  rW   rX   r–  r—  ÚbrS   rT   r;  rq  r-   r}  Ú	resp_rowsÚflatÚrrowÚbu_kr³  Úbkr´  Ú	CONCEPTOSÚ
flat_shortr­  r  ÚshortÚseenÚconceptos_outÚnode_idr�  rƒ  r„  rŸ  ÚentryrÚ   r°  s$   &                                  @r   r•   ÚProxyHandler._pyg_reporteÿ  s2  ø€ ð\	;Ø $× 4Ñ 4Ó 6ÑˆGÜ˜WŸ[™[¨°Ó2Ó3ˆCÜ˜WŸ[™[¨°Ó2Ó3ˆCØ Ÿ™ \Ó2ˆJØ Ÿ™ \°G°9Ó=×JÐJÀ'ÀˆJÙ2<ÓO±*¨QÄÀAÃÇÁÇœ.œ#˜a›&Ÿ,™,ž.±*ˆJÐO÷ ˆs—s�sŸz˜z¨d×.HÑ.HÈ×.RÓ.RÜ—‘Ó(�Ø—{‘{´(·/±/×2PÑ2P�{ÓQ�Ø—‘ð ð ¤ J£°Ð<ô>ð —|‘|“~�ßØ—I‘I”K¤§¡°Ô!6Ü˜gŸk™k¨%°Ó4Ó5×;Ñ;Ó=�Cñ  $ó	!%ñ  $˜!ð ¨Ð+<Õ)=Ø ¨Ð+<Õ)=Ø¨¨7­Ø"¨¨:­Ø¨¨5­¯¨°QØ¨¨4­¯¨°QØ ¨Ø'¨¨?Õ);ó	"ñ  $ð ð 	!%ð  Ÿ?™?¨3Ø cØ$¤c¨*£oØ ¨¨¨c°#¨YÐ&7Ø# ið	1ó ð ð —‘ð ð ¤ J£Ð0ô2ð  ŸL™L›N�	Ø—	‘	”œWŸ_™_¨TÔ2ç�9õAð. �DÛ )˜Ø $§¡¨Ó 5× @Ð @¸×GÑGÓI˜Ø zÔ1·jÙ$Ø# JÕ/×5Ð5°2×:Ñ:¸5À"ÓE˜Ø#' &¬4°·±³
Ó+;×";Ð";˜BØ#&§7¡7¨2¨r£?×#6Ñ#6°v¸rÓ#B˜Dß#™tÙ (¨¨tÔ 4Ú %ó	 #<ñ !*÷  Û$-˜DØ#'¨
Õ#3×#9Ð#9°r×">Ñ">¸uÀbÓ"I˜CÜ&*¨3¯8©8«:Ö&6 Ø'*§w¡w¨r°2£×':Ñ':¸6À2Ó'F ß#'¡4Ù$,¨T°4Ô$8Ú$)ó	 '7ñ %.ò!�Ið. "$�JØ $§
¡
¦™˜˜1Ø !§¡¨£¨RÕ 0˜Ø ¨
Ö2Ø01˜J uÓ-ñ !-ô
 +.«%°˜-�DÛMVÑI˜ &¨%°¸=Ø" dœ?©HØ $§¡¨Ó 1× LÐ L°Z·^±^ÀGÓ5L˜Ø š=©(ØŸ™ Ô)ØŸ™ §¡°°cÓ!:×!BÑ!BÀ4ÈÓ!L×!TÑ!TÐUYÐZ]Ó!^×!fÑ!fÐgkÐloÓ!pÔqØ%×,Ñ,Ø  '¨8°V¸WÀeÈZÐYaØ! 5¨¥<°°u¸Tµ{Ø$ e¨_¸mð.ö ñ NW÷ %Ø#Ÿ™¨sØ!¬#¨g¯k©k¸%ÀÓ.CÓ*D×*JÑ*JÓ*LØ(¬#¨j«/Ø$¨S¨E°#°c°Ð*;Ø'¨-ð	5ó  ð ð ×(Ñ(¨¸jÈsÓSÐSùòg Pùò2	!%øôx ô 	;Ø—?‘? 3¨´#°a³&Ð(9Ó:Õ:ûð	;ús°   ƒA2V Á6V Á>!VÂ$VÃV ÃV ÃCV Æ<9VÇ6VÈ	VÈ)V ÉA?V ËV Ë&V Ë8AV ÍV Í5V Î
AV Ï%A
V Ð4A V Ñ5B4V Ô*AV Õ9V Ö
V ÖWÖ!WÖ=W×Wc                óH  aaa€ \        VP                  RR4      4      P                  4       pS'       g±   V'       g   V P                  RRR/4      # \        P                  4       pVP                  4       pVP                  RV34       VP                  4       p	VP                  4        \        P                  V4       V	'       g   V P                  RRRV 2/4      # V	^ ,          oV'       d	   V'       g   V P                  RRR	/4      # V VR
 2o\        P                  ! RSRSRRRVRR/4      P                  4       p
VV3R lpV! V4      pV3R loVP                  R/ 4      p/ pV FÉ  pVP                  V/ 4      pVP                  R. 4      pV'       g   K1  / pS! VV4       VP                  4        Fy  w  ppVV9  d   RVRVR,          RRRR/VV&   VV,          R;;,          VP                  RR4      ,          uu&   VV,          R;;,          VP                  RR4      ,          uu&   K{  	  KË  	  V'       g(   RV9   d!   S! VR,          P                  R. 4      V4       V'       gL   RV9  dE   V! R.4      pVP                  R/ 4      pS! VP                  R/ 4      P                  R. 4      V4       . R+Op\        4       p. pV F¼  w  pppppVV9   d   K  VP                  V4      pVf   K)  VP!                  V4       VP#                  RR4      P#                  RR4      P#                  R R!4      P#                  R"R#4      pVP!                  V4       VP%                  RVR$VR%VR&VRVR,          RVR,          R'R(R)V/4       K¾  	  V P                  ^ÈRVRSRSR*V/4      # ),z?Llama a la API P&G real y devuelve conceptos de gasto personal.rq  r   i�  ry   u$   Faltan parÃ¡metros: company_id o nitz`SELECT DISTINCT pyg_company_id FROM empresas WHERE nit=%s AND pyg_company_id IS NOT NULL LIMIT 1r�   zNo hay pyg_company_id para NIT u   Faltan parÃ¡metros: ano, mesr-  r–  r   Úscenario_idNÚbusiness_unitsÚinclude_kpisFc                 ó   <€ \         P                  ! R SRSRRRV RR/4      P                  4       p\        P                  P                  \        VR\        RR	/R
R7      p\        P                  P                  V^\        R7      ;_uu_ 4       p\         P                  ! VP                  4       4      uuRRR4       #   + '       g   i     R# ; i©r–  r   rø  Nrù  rú  FrT  r°   r³   rU  rV  rY  ©rÃ   rÄ   rÅ   r]  r^  r_  r	   ÚPYG_KEYra  rb  r  r  )Úbu_listr
  rf  rÙ   r–  r   s   &   €€r   Ú_request_pygÚ3ProxyHandler._pyg_reporte_api.<locals>._request_pyg½  s­   ø€ Ü—:’:Ø *Ø &Ø $Ø  'Ø %ðó ÷ ‰v‹xð ô —.‘.×(Ñ(Ü˜dØ$¤g¨~Ð?QÐRØð )ó ˆCô
 —‘×'Ñ'¨°RÄÐ'×IÔIÈTÜ—z’z $§)¡)£+Ó.÷ J×I×IÓIús   Â$B<Â<C	c           
      ól  <€ V  EF«  pVP                  R R4      pVP                  R/ 4      pVP                  R/ 4      pRp\        V\        4      '       dt   VP                  4        F_  w  rx\        V\        \
        34      '       d   Tp M>\        V\        4      '       g   K=  VP                  RVP                  RR4      4      p M	  VP                  R/ 4      p	Rp
\        V	\        4      '       dt   V	P                  4        F_  w  rx\        V\        \
        34      '       d   Tp
 M>\        V\        4      '       g   K=  VP                  RVP                  RR4      4      p
 M	  R TRVP                  RR4      R	T;'       g    RR
T
;'       g    R/W&   S! VP                  R. 4      V4       EK®  	  R# r¢  r¨  )r©  rª  r«  r¬  r£  r¤  rœ  r­  r  r®  r¯  Úflatten_trees   &&         €r   r  Ú3ProxyHandler._pyg_reporte_api.<locals>.flatten_treeÏ  sf  ø€ Ü�ØŸ%™%  b›/�ØŸ%™% 	¨2Ó.�Ø!Ÿ+™+ f¨bÓ1�Ø�Ü˜d¤D×)Ò)Ø $§
¡
¦™˜Ü% a¬#¬u¨×6Ò6Ø"#˜C¡UÜ'¨¬4×0Ô0Ø"#§%¡%¨¨q¯u©u°W¸cÓ/BÓ"C˜CÁUñ	 !-ð
 "Ÿ+™+ k°2Ó6�Ø�Ü˜g¤t×,Ò,Ø '§¡¦™˜Ü% a¬#¬u¨×6Ò6Ø%&˜F©Ü'¨¬4×0Ô0Ø%&§U¡U¨5°!·%±%¸ÀÓ2EÓ%F˜FÉñ	 !0ð
 ! # w°·±°g¸rÓ0BÀEÈ3Ï:È:ÐRUÐW[Ð]c×]jÐ]jÐgjÐk�‘Ù˜QŸU™U :¨rÓ2°C×8ó) r$   r³  r´  r™  r¦  rœ  rA   r�  r²  r¶  r·  r¸  r¹  rº  rÚ   r»  r¼  r�  rƒ  r„  rõ   rž  rŸ  r}  r½  )r¿   rk   r)   r{   rL   rM   rN   rO   rP   rÁ   rQ   rÃ   rÄ   rÅ   r�  rå  ræ  rç  r  ) ra   rC  r—  r–  rW   rX   rq  ÚconrT   rU   Úpyg_bodyr   rM  r³  rë  Úbu_keyÚ
bu_sectionr´  Úbu_flatr¬  rõ  rï  rò  ró  rô  r�  rƒ  r„  rŸ  Úaltr  r   s    &&&f&&                        @@r   rè  ÚProxyHandler._pyg_reporte_api¡  s€  ú€ ä�'—+‘+˜e RÓ(Ó)×/Ñ/Ó1ˆçßØ—‘ s¨WÐ6\Ð,]Ó^Ð^Ü—/‘/Ó#ˆCØ—*‘*“,ˆCØ�K‰KÐzð  ~Að  }Cô  DØ—,‘,“.ˆCØ�I‰IŒKœŸ™¨Ô-ßØ—‘ s¨WÐ8WÐX[ÐW\Ð6]Ð,^Ó_Ð_Ø˜Q�ˆJçŸ#Ø—?‘? 3¨Ð2PÐ(QÓRÐRà�U˜3˜s˜)Ð$ˆÜ—:’:Ø˜jØ˜fØ˜dØ˜jØ˜eð
ó ÷ ‰6‹8ð 	ö	/ñ  ˜:Ó&ˆõ	9ð. �w‰w�u˜bÓ!ˆØˆÛ ˆFØŸ™ ¨Ó,ˆJØ#Ÿ™¨°Ó3ˆDßÙØˆGÙ˜˜wÔ'Ø%Ÿm™mžo‘
��UØ˜d”?Ø!% s¨G°U¸7µ^ÀUÈCÐQUÐWZÐ [�D˜‘IØ�S•	˜%×  E§I¡I¨e°SÓ$9Õ9Ó Ø�S•	˜$— E§I¡I¨d°SÓ$9Õ9•ó	 .ñ !÷ ˜ 3œÙ˜˜W�×)Ñ)¨&°"Ó5°tÔ<ß˜ zÔ1Ù ˜yÓ)ˆCØ—'‘'˜% Ó$ˆCÙ˜Ÿ™ ¨"Ó-×1Ñ1°&¸"Ó=¸tÔDò
ˆ	ô2 ‹uˆØˆÛAJÑ=ˆW�f˜e X¨}Ø˜$ŒÙØ—H‘H˜WÓ%ˆEØŠ}ÙØ�H‰H�WÔØ—/‘/ $ sÓ+×3Ñ3°D¸Ó=×EÑEÀdÈ3ÓO×WÑWÐX\Ð]`ÓaˆCØ�H‰H�SŒMØ× Ñ Ø Ø Ø Ø Ø  u¥Ø  t¥Ø Ø ð	"ö 	ñ BKð( �‰˜sØ˜#Ø˜*Ø˜&Ø˜-ð	%
ó ð 	r$   c           	     óX  € V P                   \        R 4      R p\        V,           p \        V P                  P                  R^ 4      4      pV P                  P                  V4      p\        P                  P                  W$R\        RR/RR7      p\        P                  P                  V^<\        R7      ;_uu_ 4       pVP                  4       pRRR4       V P                  ^È4       V P                  RR4       V P!                  4        V P#                  4        V P$                  P'                  X4       R#   + '       g   i     Lp; i  \        P(                  P*                   d¡   pT P                  TP,                  4       T P                  RR4       T P!                  4        T P#                  4        T P$                  P'                  \.        P0                  ! R	\3        T4      /4      P5                  4       4        Rp?R# Rp?i\6         d—   pT P                  R
4       T P                  RR4       T P!                  4        T P#                  4        T P$                  P'                  \.        P0                  ! R	\3        T4      /4      P5                  4       4        Rp?R# Rp?ii ; i)ú/proxyNrý   rT  r°   r³   rU  rV  rY  ry   r\  )rr   r*   r   rD   rj   rk   r  r  r]  r^  r_  r`  ra  rb  r—   rl   rn   r˜   rÆ   rÇ   ry   rc  rI  rÃ   rÄ   r¿   rÅ   rÈ   )	ra   rd  re  r	  r
  rf  rÙ   rW  rÚ   s	   &        r   r“   ÚProxyHandler._proxy_post1  s÷  € Ø—9‘9œS ›]˜^Ð,ˆÜ˜hÕ&ˆð	EÜ˜Ÿ™×)Ñ)Ð*:¸AÓ>Ó?ˆFØ—Z‘Z—_‘_ VÓ,ˆDÜ—.‘.×(Ñ(ØØ$¤g¨~Ð?QÐRØð )ó ˆCô
 —‘×'Ñ'¨°RÄÐ'×IÔIÈTØ—y‘y“{�÷ Jà×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×Ñ˜TÖ"÷ J×Iûô �|‰|×%Ñ%ô 	EØ×Ñ˜qŸv™vÔ&Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨´#°a³&Ð(9Ó:×AÑAÓC×DÒDûÜô 	EØ×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨´#°a³&Ð(9Ó:×AÑAÓC×DÒDûð	EúsE   §BE Â?D8ÃA&E Ä8E	ÅE ÅJ)Å*BHÈJ)ÈJ)ÈBJ$Ê$J)c           	     ó’  € V P                   \        R 4      R p\        V,           p\        P                  P                  VR\        /R7      p \        P                  P                  V^\        R7      ;_uu_ 4       pVP                  4       pRRR4       V P                  ^È4       V P                  RR4       V P                  4        V P                  4        V P                  P                  X4       R#   + '       g   i     Lp; i  \        P                   P"                   d‘   pT P                  TP$                  4       T P                  RR4       T P                  4        T P                  P                  \&        P(                  ! R\+        T4      /4      P-                  4       4        Rp?R# Rp?i\.         d‡   pT P                  R4       T P                  RR4       T P                  4        T P                  P                  \&        P(                  ! R\+        T4      /4      P-                  4       4        Rp?R# Rp?ii ; i)	r  NrT  )rj   rY  r°   r³   ry   r\  )rr   r*   r   r]  r^  r_  r`  ra  rb  r  r—   rl   rn   r˜   rÆ   rÇ   ry   rc  rI  rÃ   rÄ   r¿   rÅ   rÈ   )ra   rd  re  rf  rÙ   r
  rÚ   s   &      r   r‰   ÚProxyHandler._proxyQ  s¥  € Ø—9‘9œS ›]˜^Ð,ˆÜ˜hÕ&ˆÜ�n‰n×$Ñ$ S°;ÄÐ2HÐ$ÓIˆð	EÜ—‘×'Ñ'¨°RÄÐ'×IÔIÈTØ—y‘y“{�÷ Jà×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×Ñ˜TÖ"÷ J×Iûô �|‰|×%Ñ%ô 	EØ×Ñ˜qŸv™vÔ&Ø×Ñ˜^Ð-?Ô@Ø×ÑÔØ�J‰J×ÑœTŸZšZ¨´#°a³&Ð(9Ó:×AÑAÓC×DÒDûÜô 	EØ×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø×ÑÔØ�J‰J×ÑœTŸZšZ¨´#°a³&Ð(9Ó:×AÑAÓC×DÒDûð		EúsE   Á.D Á<C5ÂA&D Ã5D	Ä D ÄIÄ'BF2Æ2IÆ?IÇ A;IÉIc                ó  € V P                  VR.4      ^ ,          P                  4       P                  4       pV'       dG   VP                  R4       Uu. uF*  q3P                  4       '       g   K  VP                  4       NK,  	  up# . # u upi )uA   Devuelve lista de valores en mayÃºsculas; acepta comma-separated.r   r&   )rk   r)   r   r   )Úqsr   rM  r  s   &&  r   Ú_parse_listÚProxyHandler._parse_listi  sb   € ð �f‰f�S˜2˜$Ó Õ"×(Ñ(Ó*×0Ñ0Ó2ˆßCF 3§9¡9¨S¤>Ó?¡>˜a·W±W·Y”	�—‘–	¡>Ñ?ÐNÈBÐNùÒ?s   ÁBÁ.Bc                óÖ   € \        V4      ^8X  d   VP                  V^ ,          4       RV  R2# RP                  R.\        V4      ,          4      pVP                  V4       RV  RV R2# )u3   Agrega clÃ¡usula = o IN segÃºn cantidad de valores.zUPPER(z) = %sr&   r'   ú) IN (r(   )r*   r  r   Úextend)r,   Úvalsr¹  r/   s   &&& r   Ú	_where_inÚProxyHandler._where_ino  sg   € ô ˆt‹9˜Œ>Ø�H‰H�T˜!•WÔØ˜C˜5 Ð'Ð'Ø—x‘x  ¬¨T«Õ 2Ó3ˆØ	�‰�ŒØ˜�u˜F < .°Ð2Ð2r$   c           	     ó  € \        V4      ^8X  d+   VP                  V^ ,          V^ ,          .4       RV  RV  R2# RP                  R.\        V4      ,          4      pVP                  W,           4       RV  RV RV  RV R	2	# )
u•   ClÃ¡usula cargo con lookup en cargo_unificacion; soporta mÃºltiples valores.
Usa UPPER() en ambos lados para manejar datos con capitalizaciÃ³n mixta.z(UPPER(z) = %s OR UPPER(zŽ) IN (
                        SELECT UPPER(cargo_original) FROM cargo_unificacion
                        WHERE UPPER(cargo_unificado) = %s))r&   r'   r  z) OR UPPER(z„) IN (
                    SELECT UPPER(cargo_original) FROM cargo_unificacion
                    WHERE UPPER(cargo_unificado) IN (ú))))r*   r  r   )r,   r  r¹  Úphs   &&& r   Ú_where_cargoÚProxyHandler._where_cargoy  s™   € ô ˆt‹9˜Œ>Ø�H‰H�d˜1•g˜t A�wÐ'Ô(Ø˜s˜eÐ#3°C°5ð 9<ð ?ð ?ð �X‰X�t�fœs 4›yÕ(Ó)ˆØ	�‰�•ÔØ˜3˜%˜v b T¨°S°Eð :6à68°T¸ð@ð 	@r$   c           !     ó7  a aFaGaHaIaJaK€ \        S P                  4      p\        VP                  4      pVP                  P	                  R 4      Rš,          p\
        P                  4       p VP                  \        P                  P                  R7      oH/ pVR8X  dƒ   SHP                  R4       SHP                  4       R,          pSHP                  R4       SHP                  4       R,          pSHP                  R4       SHP                  4       R,          pRVRVR	V/pEM„VR
8X  Ed   VP                  RR.4      ^ ,          p	VP                  RR.4      ^ ,          oKVP                  RR.4      ^ ,          P                  4       oJS P                  VR4      oGS P                  VR4      oFVP                  RR.4      ^ ,          P                  4       oI\         P"                  ! V	4      p
\!        V
P$                  ^,
          V
P&                  ^4      P)                  4       pVFVGVHVIVJVKV 3R lpV! V	4      pV! V4      pSHP                  R4       SHP+                  4        Uu. uF  qÿR,          NK  	  ppRT	RTRTRVP-                  4        UUu. uF�  w  ppRVRVR,          RVR,          RVR,          RVR,          RVR,          RVP                  V/ 4      P                  R^ 4      RVP                  V/ 4      P                  R^ 4      RVP                  V/ 4      P                  R^ 4      /	NKŸ  	  upp/pEMrVR 8X  Ed9   VP                  RR.4      ^ ,          p	VP                  RR.4      ^ ,          oKVP                  RR.4      ^ ,          P                  4       oJS P                  VR4      oGS P                  VR4      oFVP                  RR.4      ^ ,          P                  4       oIR!R".V	.pp\/        SK4      w  ppV'       d#   VP1                  V4       VP3                  V4       SJ'       d#   VP1                  R#4       VP1                  SJ4       SG'       d#   VP1                  S P5                  R$SGV4      4       SF'       d#   VP1                  S P7                  RSFV4      4       SI'       d'   VP1                  R%4       VP1                  R&SI R&24       SHP                  R'R(P9                  V4       R)2V4       ^ R*IHp / pSHP+                  4        F†  pVR,          VR,          VR+,          \?        VR,,          ;'       g    ^ 4      3w  ppppVV9  d   / VV&   VVV,          9  d   . VV,          V&   VV,          V,          P1                  RVR-V/4       Kˆ  	  . p\A        V4       FÅ  p. ^ ^ ppp\A        VV,          4       Fz  p \A        VV,          V ,          R. R/7      p!\C        R0 V! 4       4      p"\E        V!4      p#VV",          pVV#,          pTP1                  RT RT"RV#'       d
   V"V#,          M^ RV#R1V!/4       K|  	  TP1                  RTRTRV'       d
   VV,          M^ RVR2V/4       KÇ  	  RV	RV/pEM2VR38X  dL   SHP                  R44       SHP+                  4       p$R5\E        V$4      R6V$ Uu. uF  p\G        V4      NK  	  up/pEMàVR78X  dL   SHP                  R84       SHP+                  4       p$R5\E        V$4      R6V$ Uu. uF  p\G        V4      NK  	  up/pEMŽVR98X  dI   SHP                  R:4       SHP+                  4       p$R5\E        V$4      R;V$ Uu. uF  qÿR<,          NK  	  up/pEM?VR=8X  dL   SHP                  R>4       SHP+                  4       p$R5\E        V$4      R6V$ Uu. uF  p\G        V4      NK  	  up/pEMíVR?8X  dL   SHP                  R@4       SHP+                  4       p$R5\E        V$4      R6V$ Uu. uF  p\G        V4      NK  	  up/pEM›VR8X  Ed(   VP                  RR.4      ^ ,          p	VP                  RR.4      ^ ,          oKVP                  RR.4      ^ ,          P                  4       oJRA.V	.pp\/        SKRBRC7      w  ppV'       d#   VP1                  V4       VP3                  V4       SJ'       d#   VP1                  RD4       VP1                  SJ4       SHP                  RER(P9                  V4       RF2V4       SHP+                  4       p$RT	R5\E        V$4      RV$ Uu. uF  p\G        V4      NK  	  up/pEMlVRG8X  d„   VP                  RR.4      ^ ,          PI                  4       oISI'       g   RH. /pEM/\K        SI4      p%SHP                  RIV%34       SHP+                  4       p$RHV$ Uu. uF  p\G        V4      NK  	  up/pEMâVRJ8X  Edš   VP                  RKR.4      ^ ,          PI                  4       p&V&'       g   RL. /pEM¤SHP                  RMV&34       SHP+                  4       p$. p'V$ EF$  pVRN,          ;'       g    / p(T'P1                  ROVRO,          RPVRP,          RV(P                  R4      R$V(P                  R$4      RQV(P                  RQ4      R,V(P                  RR4      RSV(P                  RS4      RTV(P                  RT4      RUV(P                  RU4      RVV(P                  RV4      RWV(P                  RW4      RXV(P                  RX4      ;'       g    . RYV(P                  RY4      ;'       g    . RZV(P                  RZ4      ;'       g    . /4       EK'  	  RKV&R5\E        V'4      RLV'/pEMAVR8X  EdN   VP                  R[R\.4      ^ ,          p)VP                  R]R^.4      ^ ,          p*VP                  RR.4      ^ ,          oKVP                  RR.4      ^ ,          P                  4       oJS P                  VR4      oFVP                  RR.4      ^ ,          P                  4       oIVP                  R_R.4      ^ ,          P                  4       p+R`p,RaV, 2.p. p\/        SKRBRC7      w  ppV'       d#   VP1                  V4       VP3                  V4       SJ'       d#   VP1                  RD4       VP1                  SJ4       SF'       d#   VP1                  S P7                  RbSFV4      4       SI'       d'   VP1                  Rc4       VP1                  R&SI R&24       V+'       d#   VP1                  Rd4       VP1                  V+4       V'       d   R(R(P9                  V4      ,           MRp-SHP                  ReV- RF2V)V*V)V*V)V*V)V*.V,           4       SHP+                  4       p.R[T)R]T*R5\E        V.4      RfV. Uu. uF  p\G        V4      NK  	  up/pEMìVRg8X  Ed¨   VP                  RR\.4      ^ ,          p	VP                  RR.4      ^ ,          oKVP                  RR.4      ^ ,          P                  4       oJS P                  VR4      oGS P                  VR4      oFVP                  RR.4      ^ ,          P                  4       oIVP                  R_R.4      ^ ,          P                  4       p+R!.V	.pp\/        SK4      w  ppSKP	                  Rh4       Uu. uF*  qÿPI                  4       '       g   K  VPI                  4       NK,  	  p/pV/ U0U1u. uF"  p0\L        P                  V0. 4       F  p1V1NK  	  K$  	  p2p0p1\L        PO                  4        U3U1u. uF  p3V3 F  p1V1NK  	  K  	  p4p3p1V'       dÍ   V4'       dÅ   RiP9                  Rj.\E        V44      ,          4      p5RkV RlV5 Rm2p6\Q        V4      V4 U1u. uF	  p1R&V1 R&2NK  	  up1,           p7V2'       dI   RiP9                  Rj.\E        V24      ,          4      p8RnV6 RoV8 Rm2p6T7V2 U1u. uF	  p1R&V1 R&2NK  	  up1,          p7VP1                  V64       VP3                  V74       M*V'       d#   VP1                  V4       VP3                  V4       SJ'       d#   VP1                  R#4       VP1                  SJ4       SG'       d#   VP1                  S P5                  R$SGV4      4       SF'       d#   VP1                  S P7                  RSFV4      4       SI'       d'   VP1                  R%4       VP1                  R&SI R&24       V+'       d#   VP1                  Rp4       VP1                  V+4       SHP                  RqR(P9                  V4       Rr2V4       SHP                  4       p9RsV9'       d
   V9Rs,          M^ /pEM=VRt8X  Ed§   VP                  RR.4      ^ ,          p	VP                  RR.4      ^ ,          oKVP                  RR.4      ^ ,          P                  4       oJS P                  VR4      oGS P                  VR4      oFVP                  RR.4      ^ ,          P                  4       oIR!.V	.pp\/        SK4      w  ppV'       d#   VP1                  V4       VP3                  V4       SJ'       d#   VP1                  R#4       VP1                  SJ4       SG'       d#   VP1                  S P5                  R$SGV4      4       SF'       d#   VP1                  S P7                  RSFV4      4       SI'       d'   VP1                  R%4       VP1                  R&SI R&24       SHP                  RuR(P9                  V4       Rv2VW™.,           4       . R›Op:SHP+                  4       p;/ p<V: Uu/ uF	  qÿRw^ Rx^ /bK  	  p=pV; Fu  pV<P                  VRy,          ^ 4      VR5,          ,           V<VRy,          &   VR_,          Rœ9   g   KD  V=VRy,          ,          VR_,          ;;,          VR5,          ,          uu&   Kw  	  RzT:R{V: Uu. uF  pV<P                  V^ 4      NK  	  upR|V: Uu. uF  pV=V,          NK  	  up/pEM�VR}8X  EdÊ   VP                  RR.4      ^ ,          oKVP                  RR.4      ^ ,          P                  4       oJS P                  VR4      oFR`p,RaV, 2R~R.. p?p>RaV, 2R€R�.. pAp@\/        SKRBRC7      w  ppV'       dE   V>P1                  V4       V?P3                  V4       X@P1                  V4       XAP3                  V4       SJ'       dE   V>P1                  RD4       V?P1                  SJ4       X@P1                  RD4       XAP1                  SJ4       SF'       dE   V>P1                  S P7                  RbSFV?4      4       X@P1                  S P7                  RbSFXA4      4       SHP                  R‚R(P9                  V>4       RƒR(P9                  X@4       R„2V?XA,           4       RfSHP+                  4        Uu. uF  p\G        V4      NK  	  up/pEM¾VR…8X  Ed   VP                  RR.4      ^ ,          oKVP                  RR.4      ^ ,          P                  4       oJR`p,R†V, 2R‡.. pp\/        SK4      w  ppV'       d#   VP1                  V4       VP3                  V4       SJ'       d#   VP1                  R#4       VP1                  SJ4       R(P9                  V4      pBSHP                  RˆVB R‰V, RŠVB R‹2VV,           4       RfSHP+                  4        Uu. uF  p\G        V4      NK  	  up/pEM¦VRŒ8X  d°   VP                  RR.4      ^ ,          oKR`pCR†VC 2R‡.. pp\/        SK4      w  ppV'       d#   VP1                  V4       VP3                  V4       SHP                  R�R(P9                  V4       RŽ2V4       RfSHP+                  4        Uu. uF  p\G        V4      NK  	  up/pEMðVR�8X  Edé   VP                  RR\.4      ^ ,          p	VP                  RR.4      ^ ,          oKVP                  RR.4      ^ ,          P                  4       oJS P                  VR4      oGS P                  VR4      oFVP                  RR.4      ^ ,          P                  4       oIR`pCR!R†VC 2.V	.pp\/        SK4      w  ppV'       d#   VP1                  V4       VP3                  V4       SJ'       d#   VP1                  R#4       VP1                  SJ4       SG'       d#   VP1                  S P5                  R$SGV4      4       SF'       d#   VP1                  S P7                  RSFV4      4       SI'       d'   VP1                  R%4       VP1                  R&SI R&24       SHP                  R�R(P9                  V4       R‘2V4       RfSHP+                  4        Uu. uF  p\G        V4      NK  	  up/pSHPS                  4        \T        PV                  ! V\X        R’R“7      P[                  R”4      pDS P]                  ^È4       S P_                  R•R–4       S Pa                  4        S Pc                  4        S Pd                  Pg                  VD4       \
        Pm                  V4       R™# u upi u uppi u upi u upi u upi u upi u upi u upi u upi u upi u upi u up1p0i u up1p3i u up1i u up1i u upi u upi u upi u upi u upi u upi u upi   \h         d›   pES P]                  R—4       S P_                  R•R˜4       S Pa                  4        S Pc                  4        S Pd                  Pg                  \T        PV                  ! S Pk                  TE4      4      P[                  4       4        R™pE?EEL(R™pE?Eii ; i  \
        Pm                  T4       i ; i)�rƒ   rk  zmax-periodoz5SELECT MAX(fecha)::text AS m FROM historico_empleadosÚmz*SELECT MAX(periodo) AS m FROM historico_irzHSELECT MAX(periodo) AS m FROM historico_nomina_pyg WHERE fuente='nomina'Ú	empleadosÚirÚ
nomina_pygÚsalariosÚfechaz
2026-03-01r¢   r   r  Úcentror  r�  c                 óŠ  <€ R .V .r!\        S4      w  r4V'       d#   VP                  V4       VP                  V4       S'       d#   VP                  R4       VP                  S4       S'       d#   VP                  SP                  RSV4      4       S'       d#   VP                  SP	                  RSV4      4       S
'       d'   VP                  R4       VP                  RS
 R24       RRP                  V4       R2pS	P                  WR4       S	P                  4        Uu/ uF  qfR	,          \        V4      bK  	  up# u upi )
ú
fecha = %súUPPER(operacion) = %sÚcentro_costor  úUPPER(nombre_completo) LIKE %sÚ%aN  
                        SELECT
                            TRIM(centro_costo)         AS ceco,
                            SUM(sueldo_base)::bigint   AS salario_base,
                            ROUND(AVG(sueldo_base))::int AS salario_promedio,
                            COUNT(*)::int              AS empleados,
                            COUNT(*) FILTER (WHERE INITCAP(sexo) = 'Masculino')::int AS masculino,
                            COUNT(*) FILTER (WHERE INITCAP(sexo) = 'Femenino')::int  AS femenino
                        FROM historico_empleados
                        WHERE ú AND zÔ
                          AND centro_costo IS NOT NULL
                        GROUP BY TRIM(centro_costo)
                        ORDER BY salario_base DESC
                        LIMIT 20
                    Úceco)	r0   r  r  r  r  r   rO   rw  rx  )r(  Úwr¹  ÚrwÚraÚsqlr-   ÚcargosÚcentrosrT   r�  Úoperacr+   ra   s   &      €€€€€€€r   Úq_cecosÚ(ProxyHandler._historico.<locals>.q_cecos®  s  ø€ Ø(˜>¨A¨3�qÜ(¨Ó/‘F�Bß˜1Ÿ8™8 Bœ<¨¯©°"¬ß §¡Ð*AÔ!BÀAÇHÁHÈVÔDTß §¡¨$¯.©.¸ÈÐRSÓ*TÔ!Uß §¡¨$×*;Ñ*;¸GÀVÈQÓ*OÔ!Pß §¡Ð*JÔ!KÈQÏXÉXÐXYÐZ`ÐYaÐabÐVcÔMdð	ð  'Ÿ|™|¨A›Ð/ð 0ð�Cð —K‘K Ô'Ø8;¿¹¼ÓG¹°1˜f�I¤t¨A£wÒ.¹ÑGÐGùÒGs   Ä"E z¼SELECT DISTINCT razon_social
                               FROM historico_empleados
                               WHERE razon_social IS NOT NULL
                               ORDER BY 1Úfecha_lyr.   rÿ   r/  Úsalario_baseÚsalario_promedioÚ	masculinoÚfemeninoÚsalario_base_lyÚsalario_promedio_lyÚempleados_lyÚmatrizr)  zcentro_costo IS NOT NULLr*  r+  r,  r-  zù
                    SELECT TRIM(centro_costo) AS ceco,
                           COALESCE(cargo, 'Sin Cargo') AS cargo,
                           nombre_completo, sueldo_base
                    FROM historico_empleados
                    WHERE r.  zY
                    ORDER BY TRIM(centro_costo), cargo, nombre_completo
                )Údefaultdictr  r  Úsueldoc                 ó   € V R ,          # )r�  © )Úxs   &r   Ú<lambda>Ú)ProxyHandler._historico.<locals>.<lambda>  s   € È1ÈXÎ;r$   )r   c              3   ó2   "  € T F  qR ,          x € K  	  R# 5i)rC  NrE  rE   s   & r   r   Ú*ProxyHandler._historico.<locals>.<genexpr>  s   é € Ð ?±h° 8§¢³hùó   ‚Úpersonasr4  z
cargos-mapz£
                    SELECT cargo_original, cargo_unificado
                    FROM cargo_unificacion
                    ORDER BY cargo_original
                r5  Úmapz	cecos-mapzæ
                    SELECT ceco_original, ceco_unificado, fuente,
                           empleados_api, registros_pg, notas
                    FROM ceco_unificacion
                    ORDER BY ceco_original
                Úsociosz\
                    SELECT codigo_empleado FROM socios WHERE activo = true
                ÚcodigosÚcodigo_empleadozhoteles-mapzò
                    SELECT razon_social, hotel_name_api, bu_codigo, bu_nombre,
                           nombre_personalizado, activos_api
                    FROM hotel_unificacion
                    ORDER BY razon_social
                zingreso-real-mapus	  
                    WITH base AS (
                        SELECT codigo_empleado, fecha, razon_social, fecha_ingreso,
                               centro_costo,
                               LAG(razon_social) OVER (
                                   PARTITION BY codigo_empleado ORDER BY fecha
                               ) AS prev_razon,
                               LAG(fecha) OVER (
                                   PARTITION BY codigo_empleado ORDER BY fecha
                               ) AS prev_fecha
                        FROM historico_empleados
                    ),
                    grp AS (
                        SELECT *,
                               SUM(CASE WHEN razon_social IS DISTINCT FROM prev_razon
                                        -- Hueco real de empleo (saliÃ³ y fue recontratado
                                        -- despuÃ©s) â€” no es un simple cierre mensual con
                                        -- 1 mes de retraso, asÃ­ que no debe sumarse como
                                        -- antigÃ¼edad continua aunque sea la misma empresa.
                                        OR (prev_fecha IS NOT NULL AND fecha - prev_fecha > 62)
                                        THEN 1 ELSE 0 END)
                                 OVER (PARTITION BY codigo_empleado ORDER BY fecha) AS grupo
                        FROM base
                    ),
                    block_start AS (
                        SELECT codigo_empleado, grupo,
                               (array_agg(fecha_ingreso ORDER BY fecha ASC))[1] AS ingreso_real
                        FROM grp
                        GROUP BY codigo_empleado, grupo
                    ),
                    latest AS (
                        SELECT DISTINCT ON (codigo_empleado)
                               codigo_empleado, fecha AS ultima_fecha, razon_social, grupo,
                               TRIM(centro_costo) AS centro_costo
                        FROM grp
                        ORDER BY codigo_empleado, fecha DESC
                    )
                    SELECT l.codigo_empleado, l.razon_social, l.ultima_fecha, l.centro_costo,
                           bs.ingreso_real AS fecha_ingreso_real
                    FROM latest l
                    JOIN block_start bs
                      ON bs.codigo_empleado = l.codigo_empleado AND bs.grupo = l.grupo
                zh.fecha = %szh.razon_social)r,   zUPPER(h.operacion) = %sa  
                    SELECT h.codigo_empleado,
                           h.nombre_completo,
                           COALESCE(h.fecha_nacimiento, fn.fecha_nacimiento) AS fecha_nacimiento,
                           INITCAP(h.sexo)            AS sexo,
                           h.fecha_ingreso,
                           h.fecha_vencimiento_contrato,
                           TRIM(h.centro_costo)       AS centro_costo,
                           h.cargo,
                           h.sueldo_base::float       AS sueldo_base,
                           h.operacion, h.tipo_contrato, h.razon_social
                    FROM historico_empleados h
                    LEFT JOIN (
                        SELECT codigo_empleado,
                               MAX(fecha_nacimiento) AS fecha_nacimiento
                        FROM historico_empleados
                        WHERE fecha_nacimiento IS NOT NULL
                        GROUP BY codigo_empleado
                    ) fn ON h.codigo_empleado = fn.codigo_empleado
                    WHERE z@
                    ORDER BY h.nombre_completo
                ÚtrayectoriaÚ	snapshotsuò  
                        SELECT DISTINCT ON (fecha)
                               fecha,
                               cargo,
                               sueldo_base::float AS sueldo_base,
                               TRIM(centro_costo) AS centro_costo,
                               tipo_contrato,
                               fecha_ingreso,
                               razon_social
                        FROM historico_empleados
                        WHERE (
                            SELECT string_agg(w, ' ' ORDER BY w)
                            FROM unnest(string_to_array(
                                upper(translate(nombre_completo,
                                    'Ã�Ã‰Ã�Ã“ÃšÃœÃ‘Ã¡Ã©Ã­Ã³ÃºÃ¼Ã±Ã€ÃˆÃŒÃ’Ã™Ã Ã¨Ã¬Ã²Ã¹Ã‚ÃŠÃŽÃ”Ã›Ã¢ÃªÃ®Ã´Ã»ÃƒÃ•Ã£ÃµÃ„Ã–Ã¤Ã¶',
                                    'AEIOUUNaeiouunAEIOUaeiouAEIOUaeiouAOaoAOao')),
                                ' ')) AS w
                        ) = %s
                        ORDER BY fecha, id
                    znomina-empleadoÚidentificacionÚperiodosa-  
                        SELECT ano, mes, raw_data
                        FROM historico_nomina_pyg
                        WHERE fuente='nomina' AND registro_tipo='empleado'
                          AND raw_data->>'identificacion' = %s
                        ORDER BY ano, mes
                    rm  rW   rX   r¥   Ús_basicoÚdiasÚtotal_devengosÚtotal_deduccionesÚaportes_patronalesÚnetor}  ÚprovisionesÚseguridad_socialÚ	fecha_iniz
2026-01-01Ú	fecha_finz
2026-01-31Úsexoz('ELMA','FNS','FCZN')zh.razon_social NOT IN zh.cargoz UPPER(h.nombre_completo) LIKE %szUPPER(emp_sexo.sexo) = %saÁ  
                    SELECT
                        h.nombre_completo          AS nombres,
                        COALESCE(u.hotel_name_api, h.razon_social) AS hotel_name,
                        h.razon_social,
                        h.cargo,
                        h.tipo_contrato,
                        h.sueldo_base::float       AS sueldo,
                        h.ingreso::text,
                        h.termino::text            AS vencimiento,
                        h.causa_retiro,
                        h.operacion,
                        h.tipo_movimiento          AS tipo
                    FROM historico_ir h
                    LEFT JOIN hotel_unificacion u ON u.razon_social = h.razon_social
                    LEFT JOIN (
                        SELECT DISTINCT ON (codigo_empleado) codigo_empleado, sexo
                        FROM historico_empleados
                        WHERE sexo IS NOT NULL
                        ORDER BY codigo_empleado, fecha DESC
                    ) emp_sexo ON emp_sexo.codigo_empleado = h.codigo_empleado
                    WHERE (
                        (h.tipo_movimiento = 'I'  AND h.ingreso BETWEEN %s AND %s)
                     OR (h.tipo_movimiento = 'R'  AND h.termino BETWEEN %s AND %s)
                     OR (h.tipo_movimiento = 'IR' AND (h.ingreso BETWEEN %s AND %s
                                                    OR h.termino BETWEEN %s AND %s))
                    )
                    r;  zactivos-countr&   z OR zUPPER(centro_costo) LIKE %sz((z&) AND NOT (razon_social = 'SERV' AND (r  Ú(z  OR (razon_social = 'SERV' AND (zUPPER(sexo) = %sz|
                    SELECT COUNT(*)::int AS activos
                    FROM historico_empleados
                    WHERE z
                ÚactivosÚ
antiguedadzÅ
                    WITH activos AS (
                        SELECT DISTINCT codigo_empleado, INITCAP(sexo) AS sexo
                        FROM historico_empleados
                        WHERE u  
                    ),
                    primera AS (
                        SELECT h.codigo_empleado,
                               MIN(h.fecha) AS primera_fecha
                        FROM historico_empleados h
                        INNER JOIN activos a ON h.codigo_empleado = a.codigo_empleado
                        GROUP BY h.codigo_empleado
                    ),
                    bins AS (
                        SELECT p.codigo_empleado, act.sexo,
                               EXTRACT(YEAR  FROM AGE(%s::date, p.primera_fecha)) * 12 +
                               EXTRACT(MONTH FROM AGE(%s::date, p.primera_fecha)) AS meses
                        FROM primera p
                        JOIN activos act ON act.codigo_empleado = p.codigo_empleado
                    )
                    SELECT
                        CASE
                            WHEN meses < 6   THEN '0â€“6 meses'
                            WHEN meses < 12  THEN '6â€“12 meses'
                            WHEN meses < 24  THEN '1â€“2 aÃ±os'
                            WHEN meses < 36  THEN '2â€“3 aÃ±os'
                            WHEN meses < 48  THEN '3â€“4 aÃ±os'
                            ELSE '4+ aÃ±os'
                        END AS rango,
                        CASE
                            WHEN meses < 6   THEN 0
                            WHEN meses < 12  THEN 1
                            WHEN meses < 24  THEN 2
                            WHEN meses < 36  THEN 3
                            WHEN meses < 48  THEN 4
                            ELSE 5
                        END AS orden,
                        sexo,
                        COUNT(*)::int AS total
                    FROM bins
                    GROUP BY rango, orden, sexo
                    ORDER BY orden
                Ú	MasculinoÚFemeninoÚrangoÚrangosÚcountsÚgeneroz
ir-mensualzh.tipo_movimiento IN ('I','IR')zh.ingreso IS NOT NULLzh.tipo_movimiento IN ('R','IR')zh.termino IS NOT NULLzë
                    WITH ing AS (
                        SELECT DATE_TRUNC('month', h.ingreso)::date AS mes,
                               COUNT(*)::int AS n
                        FROM historico_ir h
                        WHERE a   
                        GROUP BY 1
                    ),
                    ret AS (
                        SELECT DATE_TRUNC('month', h.termino)::date AS mes,
                               COUNT(*)::int AS n
                        FROM historico_ir h
                        WHERE au  
                        GROUP BY 1
                    ),
                    meses AS (
                        SELECT mes FROM ing
                        UNION
                        SELECT mes FROM ret
                    )
                    SELECT
                        TO_CHAR(m.mes, 'YYYY-MM') AS mes,
                        COALESCE(i.n, 0)          AS ingresos,
                        COALESCE(r.n, 0)          AS retiros
                    FROM meses m
                    LEFT JOIN ing i ON i.mes = m.mes
                    LEFT JOIN ret r ON r.mes = m.mes
                    ORDER BY m.mes
                zcohorte-retencionzrazon_social NOT IN zfecha >= '2024-01-01'zÞ
                    WITH nuevos AS (
                        SELECT e.codigo_empleado,
                               e.fecha AS mes_cohort
                        FROM historico_empleados e
                        WHERE aE  
                          AND NOT EXISTS (
                              SELECT 1 FROM historico_empleados p
                              WHERE p.codigo_empleado = e.codigo_empleado
                                AND p.fecha = (e.fecha - INTERVAL '1 month')::date
                                AND p.razon_social NOT IN zá
                          )
                    ),
                    snaps AS (
                        SELECT DISTINCT codigo_empleado, fecha
                        FROM historico_empleados
                        WHERE a›
  
                    ),
                    cohortes AS (
                        SELECT
                            n.mes_cohort,
                            COUNT(DISTINCT n.codigo_empleado) AS total,
                            COUNT(DISTINCT n.codigo_empleado) FILTER (WHERE s1.codigo_empleado  IS NOT NULL) AS m1,
                            COUNT(DISTINCT n.codigo_empleado) FILTER (WHERE s2.codigo_empleado  IS NOT NULL) AS m2,
                            COUNT(DISTINCT n.codigo_empleado) FILTER (WHERE s3.codigo_empleado  IS NOT NULL) AS m3,
                            COUNT(DISTINCT n.codigo_empleado) FILTER (WHERE s6.codigo_empleado  IS NOT NULL) AS m6,
                            COUNT(DISTINCT n.codigo_empleado) FILTER (WHERE s9.codigo_empleado  IS NOT NULL) AS m9,
                            COUNT(DISTINCT n.codigo_empleado) FILTER (WHERE s12.codigo_empleado IS NOT NULL) AS m12
                        FROM nuevos n
                        LEFT JOIN snaps s1  ON s1.codigo_empleado = n.codigo_empleado AND s1.fecha  = (n.mes_cohort + INTERVAL '1 month')::date
                        LEFT JOIN snaps s2  ON s2.codigo_empleado = n.codigo_empleado AND s2.fecha  = (n.mes_cohort + INTERVAL '2 months')::date
                        LEFT JOIN snaps s3  ON s3.codigo_empleado = n.codigo_empleado AND s3.fecha  = (n.mes_cohort + INTERVAL '3 months')::date
                        LEFT JOIN snaps s6  ON s6.codigo_empleado = n.codigo_empleado AND s6.fecha  = (n.mes_cohort + INTERVAL '6 months')::date
                        LEFT JOIN snaps s9  ON s9.codigo_empleado = n.codigo_empleado AND s9.fecha  = (n.mes_cohort + INTERVAL '9 months')::date
                        LEFT JOIN snaps s12 ON s12.codigo_empleado = n.codigo_empleado AND s12.fecha = (n.mes_cohort + INTERVAL '12 months')::date
                        GROUP BY n.mes_cohort
                    )
                    SELECT
                        TO_CHAR(mes_cohort, 'YYYY-MM')                              AS cohorte,
                        total,
                        ROUND(m1  * 100.0 / NULLIF(total,0), 1)::float             AS pct_1,
                        ROUND(m2  * 100.0 / NULLIF(total,0), 1)::float             AS pct_2,
                        ROUND(m3  * 100.0 / NULLIF(total,0), 1)::float             AS pct_3,
                        ROUND(m6  * 100.0 / NULLIF(total,0), 1)::float             AS pct_6,
                        ROUND(m9  * 100.0 / NULLIF(total,0), 1)::float             AS pct_9,
                        ROUND(m12 * 100.0 / NULLIF(total,0), 1)::float             AS pct_12
                    FROM cohortes
                    WHERE total >= 8
                    ORDER BY mes_cohort
                zrotacion-heatmapaü  
                    WITH base AS (
                        SELECT razon_social,
                               fecha,
                               COUNT(DISTINCT codigo_empleado) FILTER
                                   (WHERE operacion ILIKE '%%retiro%%') AS retiros,
                               COUNT(DISTINCT codigo_empleado) FILTER
                                   (WHERE operacion ILIKE '%%operacion%%') AS activos
                        FROM historico_empleados
                        WHERE a”  
                        GROUP BY razon_social, fecha
                    )
                    SELECT
                        razon_social,
                        TO_CHAR(fecha, 'YYYY-MM')                          AS mes,
                        ROUND(retiros * 100.0 / NULLIF(activos, 0), 1)::float AS pct
                    FROM base
                    ORDER BY razon_social, fecha
                zactivos-hotelz¼
                    SELECT razon_social,
                           COUNT(DISTINCT codigo_empleado)::int AS activos
                    FROM historico_empleados
                    WHERE ze
                    GROUP BY razon_social
                    ORDER BY activos DESC
                FrF  rþ   r°   r±   r²   r³   Nrâ  )u   0â€“6 mesesu   6â€“12 mesesu   1â€“2 aÃ±osu   2â€“3 aÃ±osu   3â€“4 aÃ±osu   4+ aÃ±os)rc  rd  )7r   rr   r   Úqueryr   rL   rM   rN   r7  r8  ro  rO   rP   rk   r   r  Ú	date_typeÚfromisoformatr.  r/  Ú	isoformatrw  r�  r0   r  r  r  r  r   ÚcollectionsrB  rD   r   Úsumr*   rx  r)   r#   ÚSERV_HOTEL_PATTERNSÚvaluesrŒ  rÁ   rÃ   rÄ   r¿   rÅ   r—   rl   rn   r˜   rÆ   rÇ   rÈ   rÉ   rQ   )Lra   Úparsedr  ÚendpointrS   rW  Úmax_empleadosÚmax_irÚ
max_nominar&  Údr9  r7  Úcurrr�  r-   r.   r/  r0  r¹  r1  r2  rB  r´  r   Úgr«  r    ÚresultÚcargos_listÚctÚcer  rL  ÚstÚemr;  Únombre_normrS  rT  ÚrdÚfiÚffr_  ÚEXCLÚwhere_extraÚrows_irÚrazones_listrI  rF   Úserv_patterns_hereÚpatsÚall_serv_patternsÚexcl_orsÚclauseÚparamsÚcc_orsrU   ÚRANGOSÚrows_antÚlookupÚgender_lookupÚwiÚaiÚwrÚarÚ
where_baseÚEXCL_Hr
  rÚ   r4  r5  rT   r�  r6  r+   sL   f                                                                     @@@@@@r   rˆ   ÚProxyHandler._historicoˆ  sÙ  þ€ Ü˜DŸI™IÓ&ˆÜ˜FŸL™LÓ)ˆØ—;‘;×$Ñ$Ð%8Ó9¸"Õ=ˆä�‰Ó ˆðJ	"Ø—;‘;¬h¯o©o×.LÑ.L�;ÓMˆCØˆDð
 ˜=Ô(Ø—‘ÐSÔTØ #§¡£¨sÕ 3�Ø—‘ÐHÔIØŸ™›¨Õ,�Ø—‘ÐfÔgØ Ÿ\™\›^¨CÕ0�
à -Ø &Ø  *ð’ð ˜ZÕ'ØŸ™ °°Ó?ÀÕB�ØŸ™ °"°Ó6°qÕ9�ØŸ™ °"°Ó6°qÕ9×?Ñ?ÓA�Ø×*Ñ*¨2¨xÓ8�Ø×*Ñ*¨2¨wÓ7�ØŸ™ °"°Ó6°qÕ9×?Ñ?ÓA�ä#×1Ò1°%Ó8�Ü$ Q§V¡V¨a¥Z°·±¸!Ó<×FÑFÓH�÷Hó Hñ4 ˜u“~�Ù˜xÓ(�ð —‘ð -ô .ð 7:·l±l´nÓE±n°˜^×,Ð,±n�ÐEð  Ø Ø Øð (,§z¡z¤|ôñ (4™G˜D !ð #°Ø*°°>Õ1BØ.°Ð3EÕ1FØ'°°;µØ'°°;µØ&°°:µØ-°·±¸¸bÓ1A×1EÑ1EÀnÐZ[Ó1\Ø1°2·6±6¸$ÀÓ3C×3GÑ3GÐHZÐ\]Ó3^Ø*°·±¸¸bÓ1A×1EÑ1EÀkÐ[\Ó1]ó
ñ (4òð	’ð* ˜XÕ%ØŸ™ °°Ó?ÀÕB�ØŸ™ °"°Ó6°qÕ9�ØŸ™ °"°Ó6°qÕ9×?Ñ?ÓA�Ø×*Ñ*¨2¨xÓ8�Ø×*Ñ*¨2¨wÓ7�ØŸ™ °"°Ó6°qÕ9×?Ñ?ÓA�à$Ð&@ÐAÀEÀ7�1�Ü$ UÓ+‘��Bß˜1Ÿ8™8 Bœ<¨¯©°"¬ß˜1Ÿ8™8Ð$;Ô<¸a¿h¹hÀvÔ>Nß˜AŸH™H T§^¡^°NÀGÈQÓ%OÔPß˜AŸH™H T×%6Ñ%6°wÀÈÓ%JÔKß˜1Ÿ8™8Ð$DÔEÀqÇxÁxÐRSÐTZÐS[Ð[\ÐP]ÔG^à—‘ð !ð
 #Ÿ<™<¨›?Ð+ð ,ðð ôõ 4Ø�ØŸ™ž�AØ!" 6¥¨A¨g­J¸Ð:KÕ8LÌcÐRSÐTaÕRb×RgÐRgÐfgÓNhÐ!h‘J�A�q˜!˜QØ ”}° d¨1¡gØ  Q¥Ô'°b¨¨a­°©Ø˜•G˜A•J×%Ñ% x°°H¸aÐ&@ÖAñ	 (ð �Ü" 4žL�DØ*,¨a° R �KÜ!'¨¨T­
Ö!3˜Ü#)¨$¨t­*°UÕ*;ÑAVÔ#W˜Ü Ñ ?±hÓ ?Ó?˜Ü  ›]˜Ø˜b�˜ "¨¥( "Ø#×*Ñ*Ø# UØ*¨BØ.¿B°°b¶ÀAØ'¨Ø&¨ð,ö ñ "4ð —M‘MØ Ø&¨Ø*¿¨B°"®HÀØ# RØ  +ð#ö ñ )ð,   ¨°Ð8’ð ˜\Ô)Ø—‘ð ô ð
 —|‘|“~�àœS ›YØ©TÓ2©T¨œD žG©TÑ2ð’ð ˜[Ô(Ø—‘ð ô ð —|‘|“~�àœS ›YØ©TÓ2©T¨œD žG©TÑ2ð’ð ˜XÔ%Ø—‘ð ô ð —|‘|“~�àœS ›YØ¹dÓC¹d¸Ð"3× 4Ð 4¹dÑCð’ð ˜]Ô*Ø—‘ð ô ð —|‘|“~�àœS ›YØ©TÓ2©T¨œD žG©TÑ2ð’ð Ð/Ô/Ø—‘ð *ô *ðV —|‘|“~�àœS ›YØ©TÓ2©T¨œD žG©TÑ2ð’ð ˜[Õ(ØŸ™ °°Ó?ÀÕB�ØŸ™ °"°Ó6°qÕ9�ØŸ™ °"°Ó6°qÕ9×?Ñ?ÓA�à&Ð'¨%¨�1�Ü$ UÐ0@ÔA‘��Bß�q—x‘x ”| Q§X¡X¨b¤\ß˜1Ÿ8™8Ð$=Ô>ÀÇÁÈÔ@Pà—‘ð !ð& #Ÿ<™<¨›?Ð+ð ,ð'ð* ô+ð, —|‘|“~�à Ø¤ D£	Ø±4Ó!8±4¨a¤$ q¦'±4Ñ!8ð’ð ˜]Ô*ØŸ™ ¨2¨$Ó/°Õ2×8Ñ8Ó:�ßØ'¨Ð,’Dä"+¨FÓ"3�Kð —K‘Kð !ð& &˜ô')ð( Ÿ<™<›>�DØ'¹4Ó)@¹4°a¬$¨q®'¹4Ñ)@ÐA’Dð Ð.Õ.Ø!#§¡Ð(8¸2¸$Ó!?ÀÕ!B×!HÑ!HÓ!J�ß%Ø&¨Ð+’Dà—K‘Kð !ð )Ð*ô,ð Ÿ<™<›>�DØ!�HÜ!˜Ø˜z�]×0Ð0¨b˜Ø Ÿ™Ø! 1 U¥8¨U°A°eµHØ# R§V¡V¨G£_Ø*¨B¯F©F°>Ó,BØ'¨¯©°Ó)<Ø)¨2¯6©6°*Ó+=Ø" B§F¡F¨6£NØ,¨b¯f©fÐ5EÓ.FØ/°·±Ð8KÓ1LØ0°"·&±&Ð9MÓ2NØ" B§F¡F¨6£NØ'¨¯©°Ó)<×)BÐ)BÀØ)¨2¯6©6°-Ó+@×+FÐ+FÀBØ.°·±Ð7IÓ0J×0PÐ0PÈbð)÷ ñ "ð$ )¨.Ø¤ X£Ø" Hð’Dð ˜TÕ!ØŸ™ °°Ó?ÀÕB�ØŸ™ °°Ó?ÀÕB�ØŸ™ °°Ó5°aÕ8�ØŸ™ °°Ó5°aÕ8×>Ñ>Ó@�Ø×*Ñ*¨2¨wÓ7�ØŸ™ °°Ó5°aÕ8×>Ñ>Ó@�ØŸ™ °°Ó5°aÕ8×>Ñ>Ó@�à.�à-¨d¨VÐ4Ð5�Ø�Ü$ UÐ0@ÔA‘��Bß�q—x‘x ”| Q§X¡X¨b¤\ß˜1Ÿ8™8Ð$=Ô>ÀÇÁÈÔ@Pß˜1Ÿ8™8 D×$5Ñ$5°iÀÈÓ$KÔLßØ—H‘HÐ?Ô@Ø—H‘H˜q  ¨˜]Ô+ß˜Ÿ™Ð"=Ô>ÀÇÁÈÄç=>˜w¨¯©°a«Ö8ÀB�à—‘ð !ð6 !�Mð "ð7ð: ˜"˜b " b¨"¨b°"Ð5¸Õ9ô;;ð> Ÿ,™,›.�à  [°"ØœS ›\Ø©gÓ6©g¨œT !žW©gÑ6ð’ð ˜_Õ,ØŸ™ °,°Ó@ÀÕC�ØŸ™ °"°Ó6°qÕ9�ØŸ™ °"°Ó6°qÕ9×?Ñ?ÓA�Ø×*Ñ*¨2¨xÓ8�Ø×*Ñ*¨2¨wÓ7�ØŸ™ °"°Ó6°qÕ9×?Ñ?ÓA�ØŸ™ °"°Ó6°qÕ9×?Ñ?ÓA�à$�~¨ w�1�Ü$ UÓ+‘��BØ9>¿¹ÀSÔ9IÓ%WÑ9I°AÏWÉWÏY¤i a§g¡g¦iÑ9I�Ð%WÙ4@Ô%l±L¨DÔJ]×JaÑJaÐbfÐhjÖJkÀQ£aÑJk¡a±LÐ"Ñ%lÜ4G×4NÑ4NÔ4PÔ%_Ñ4P¨DÓZ^ÐUV£aÑZ^¡aÑ4PÐ!Ñ%_ß×+ð  &Ÿ{™{Ð,IÐ+JÌSÐQbÓMcÕ+cÓd�HØ! " Ð%KÈHÈ:ÐUXÐY�FÜ! "›XÑ;LÓ(MÑ;L°a¨1¨Q¨C¨q«Ñ;LÑ(MÕM�Fß)Ø!'§¡Ð.KÐ-LÌsÐSeÓOfÕ-fÓ!g˜Ø#$ V HÐ,LÈVÈHÐTWÐ!X˜ØÑ5GÓ"HÑ5G° Q q c¨£8Ñ5GÑ"HÕH˜Ø—H‘H˜VÔ$Ø—H‘H˜VÕ$ßØ—H‘H˜R”L !§(¡(¨2¤,ß˜1Ÿ8™8Ð$;Ô<¸a¿h¹hÀvÔ>Nß˜AŸH™H T§^¡^°NÀGÈQÓ%OÔPß˜AŸH™H T×%6Ñ%6°wÀÈÓ%JÔKß˜AŸH™HÐ%EÔFÈÏÉÐSTÐU[ÐT\Ð\]ÐQ^ÔH_ß˜AŸH™HÐ%7Ô8¸!¿(¹(À4¼.à—‘ð !ð #Ÿ<™<¨›?Ð+ð ,ðð ô	ð
 —l‘l“n�Ø!·S 3 y¦>¸aÐ@’ð ˜\Õ)ØŸ&™& °,°Ó@ÀÕC�ØŸ&™& °"°Ó6°qÕ9�ØŸ&™& °"°Ó6°qÕ9×?Ñ?ÓA�Ø×*Ñ*¨2¨xÓ8�Ø×*Ñ*¨2¨wÓ7�ØŸ&™& °"°Ó6°qÕ9×?Ñ?ÓA�à$�~¨ w�1�Ü$ UÓ+‘��Bß˜1Ÿ8™8 Bœ<¨¯©°"¬ß˜1Ÿ8™8Ð$;Ô<¸a¿h¹hÀvÔ>Nß˜AŸH™H T§^¡^°NÀGÈQÓ%OÔPß˜AŸH™H T×%6Ñ%6°wÀÈÓ%JÔKß˜AŸH™HÐ%EÔFÈÏÉÐSTÐU[ÐT\Ð\]ÐQ^ÔH_à—‘ð !ð  'Ÿ|™|¨A›Ð/ð &0ð	*ðT ˜%˜Õ'ôU*)òX r�ØŸ<™<›>�Ø�ÙMSÓ TÉVÈ [°!°ZÀÐ$CÒ!CÉV�Ð TÛ!�AØ)/¯©°A°gµJÀÓ)BÀQÀwÅZÕ)O�F˜1˜W�:Ñ&Ø˜•yÐ$=Ö=Ø% a¨¥jÕ1°!°Fµ)×<ÀÀ'Å
ÕJÕ<ñ "ð
 ˜fØ¹Ó@¹°A˜vŸz™z¨!¨QÖ/¹Ñ@Ø¹Ó@¹°A˜}¨Q×/Ð/¹Ñ@ð’ð ˜\Õ)ØŸ™ °°Ó5°aÕ8�ØŸ™ °°Ó5°aÕ8×>Ñ>Ó@�Ø×)Ñ)¨"¨gÓ6�à.�à2°4°&Ð9Ø;Ø1ð3à46ð �ð 3°4°&Ð9Ø;Ø1ð3à46ð �ô % UÐ0@ÔA‘��BßØ—I‘I˜b”M 2§9¡9¨R¤=Ø—I‘I˜b”M 2§9¡9¨R¤=ßØ—I‘IÐ7Ô8¸"¿)¹)ÀFÔ:KØ—I‘IÐ7Ô8¸"¿)¹)ÀFÔ:KßØ—I‘I˜d×/Ñ/°	¸6À2ÓFÔGØ—I‘I˜d×/Ñ/°	¸6À2ÓFÔGà—‘ð !ð
  'Ÿ|™|¨BÓ/Ð0ð 1ð  'Ÿ|™|¨BÓ/Ð0ð 1ðð8 ˜"•Wô9ð< °#·,±,´.Ó A±.¨Q¤ a¦±.Ñ AÐB’ð Ð0Õ0ØŸ™ °°Ó5°aÕ8�ØŸ™ °°Ó5°aÕ8×>Ñ>Ó@�à.�Ø.¨t¨fÐ5Ø/ð1Ø24ð �ä$ UÓ+‘��Bß�q—x‘x ”| Q§X¡X¨b¤\ß˜1Ÿ8™8Ð$;Ô<¸a¿h¹hÀvÔ>NØ$Ÿ\™\¨!›_�
ð —‘ð !ð
  *˜lð +;ð
 <@¸&ð Að  *˜lð !+ð!1ðb ˜•Uôc1ðf °#·,±,´.Ó A±.¨Q¤ a¦±.Ñ AÐB’ð Ð/Ô/ØŸ™ °°Ó5°aÕ8�à0�Ø.¨v¨hÐ7Ø/ð1Ø24ð �ä$ UÓ+‘��Bß�q—x‘x ”| Q§X¡X¨b¤\à—‘ð 	!ð  'Ÿ|™|¨A›Ð/ð 	0ðð$ ô%ð( °#·,±,´.Ó A±.¨Q¤ a¦±.Ñ AÐB’ð ˜_Õ,ØŸ™ °°Ó?ÀÕB�ØŸ™ °°Ó5°aÕ8�ØŸ™ °°Ó5°aÕ8×>Ñ>Ó@�Ø×*Ñ*¨2¨xÓ8�Ø×*Ñ*¨2¨wÓ7�ØŸ&™& °"°Ó6°qÕ9×?Ñ?ÓA�à0�Ø$Ð(<¸V¸HÐ&EÐFÈÈ�1�Ü$ UÓ+‘��Bß�q—x‘x ”| Q§X¡X¨b¤\ß˜1Ÿ8™8Ð$;Ô<¸a¿h¹hÀvÔ>Nß˜AŸH™H T§^¡^°NÀGÈQÓ%OÔPß˜AŸH™H T×%6Ñ%6°wÀÈÓ%JÔKß˜AŸH™HÐ%EÔFÈÏÉÐSTÐU[ÐT\Ð\]ÐQ^ÔH_à—‘ð !ð #Ÿ<™<¨›?Ð+ð ,ð	ð ôð °#·,±,´.Ó A±.¨Q¤ a¦±.Ñ AÐB�à�I‰IŒKä—:’:˜d¬C¸eÔD×KÑKÈGÓTˆDØ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ�O‰OÔØ×ÑÔØ�J‰J×Ñ˜TÔ"ô �O‰O˜DÖ!ùòQ Fùóùòj 3ùò 3ùò   Dùò 3ùòt 3ùòP "9ùòH *AùòX 7ùò &XùÛ%lùÛ%_ùò )Nùò #Iùò| !Uùò AùÚ@ùòv !BùòF !Bùò@ !Bùò: !Bøô ô 	JØ×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨×(;Ñ(;¸AÓ(>Ó?×FÑFÓH×IÒIûð	Jûô �O‰O˜DÕ!úsÈ  Á)G0Ak ÉAiÉ*Ak ÊB#AiÌ)C=Ak Ð')Ak Ñ)Ak Ñ;)Ak Ò%BAk Ô8DAk ÙAAk Ú(Ai
Ú<>Ak Û:Ai#
Ü>Ak ÝAi(
Ý>Ak ÞAi-
Þ/>Ak ß-Ai2
àB1Ak â3A)Ak äAi7ä0<Ak å-9Ak æ&Ai<æ:=Ak ç8A Ak è9CAk ìAk ì&Ak íEAk ò)Ak ò7)Ak ó!-Ak ô)Ak ô9A#Ak öAjö0DAk ú5AjûAjû%Ak û,(AjüAk ü.AjýAk ý9Ak þAjþAk þ.0Ak ÿAjÿ-3Ak Á@!)Ak ÁA)Ak ÁA5)Ak ÁB)Ak ÁC	-Ak ÁC7AAk ÁEDAk ÁI)Ak ÁJ)Ak ÁJ/)Ak ÁKA-Ak ÁMAj!ÁMAAk ÁN<Ak ÁOAj&
ÁO4Ak ÁO;Aj+ÁPCAk ÁS)AAk ÁT5BAk ÁW
Aj0ÁWBAk ÁY9A)Ak Á["Aj5Á[6B"Ak Á^Aj:Á^,DAk Áb.)Ak Ác)Ak Ád)Ak Ád,AAk Áf
Aj?ÁfBAk ÁiA1Ak ÁkAm)ÁkBAm$ÁmAm, Ám$Am)Ám)Am, Ám,Anc                 ó,/  atauavawaxayaza{a|a}a~aa€a�a‚aƒa„€ ^ RI HpHp V! V P                  4      pV! VP                  4      pVP                  P                  R4      RŸ,          p\        P                  4       pRp VP                  \        P                  P                  R7      p/ p	VR8X  Ed—   \        VP                  RR.4      ^ ,          4      o|\        VP                  RR	.4      ^ ,          4      o€VP                  R
R.4      ^ ,          P                  4       p
\        S|S€^4      P!                  4       pRp. pV
'       d   RpV
.pVP#                  RV R2V4       VP%                  4        Uu/ uF  qîR
,          \'        V4      bK  	  pp/ pVP)                  4        F-  pVP                  VR,          ^ 4      ^,           VVR,          &   K/  	  VP#                  R4       VP%                  4        Uu. uF  p\'        V4      NK  	  ppV Uu/ uF  p\+        VR,          4      VbK  	  upo/ o~V F˜  p\+        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      P-                  4       p\+        VP                  R4      ;'       g    R4      P-                  4       P                  4       pVS~V RV 2&   Kš  	  V~V3R lozVz3R loyVz3R loxVz3R lo{R ouR VuVxVyV{3R llpR pVP#                  RS|S€34       VP%                  4        Uu/ uF  qîR,          VR,          bK  	  ppV|V€3R lpV P/                  S|S€4      '       gT   VP)                  4        Uu0 uF%  pVP                  R4      '       g   K  VR,          kK'  	  up F  o� V! S�4      VS�&   K  	  VP#                  R%S|S€34       VP%                  4        Uu/ uF  qîR,          VR&,          3\'        V4      bK   	  upo‚VP#                  R'S|S€34       VP%                  4        Uu/ uF&  qîR(,          VR&,          3VR),          ;'       g    ^ bK(  	  ppVP#                  R*S|S€34       / pVP%                  4        F~  pTP5                  VR(,          VR&,          ;'       g    R+3. 4      P7                  R,VR,,          RVR,          R-VR-,          R.VR.,          R/VR/,          ;'       g    ^ R0VR0,          /4       K€  	  V|V€3R1 lpV P/                  S|S€4      '       gn   / p/ pVP)                  4        FT  pVP                  R24      pVP                  R34      ;'       g    R+pV'       g   K9   V! VV4      w  pp VVVV3&   V VVV3&   KV  	  M´VP)                  4        F   pVP                  R24      pVP                  R34      ;'       g    R+pV'       d   VR+8X  d   K@  VP                  VV3^ 4      ^ 8”  g   VP                  VV34      '       d   Kt   V! VR+4      w  pp V^ 8”  g	   V '       d   VVVV3&   V VVV3&   K   K¢  	  V P/                  S|S€4      '       Ed<   VP)                  4        Uu. uF{  pVP                  R24      '       g   K  TP                  VR2,          VP                  R34      ;'       g    R+34      '       d   KW  VR2,          VP                  R34      ;'       g    R+3NK}  	  p!pV!'       Edž   \9        V! UU"u0 uF  w  pp"VkK
  	  up"p4      p#VP#                  R7S|S€V#34       / p$VP%                  4        FB  p%V%R(,          V%R8,          ;'       g    R+P;                  4       3p&V&V$9  g   K6  V%R,          V$V&&   KD  	  R9 owVvVw3R: lov. R¡Op'V! EFû  w  ppV$P                  VV34      ;'       g    V$P                  VR+34      p(V('       g   K?  V(P                  R</ 4      p)V)P                  V4      ;'       g=    V)P                  R+4      ;'       g$    \=        \?        V)P)                  4       4      / 4      P                  R=. 4      p*/ p+Sv! V*V+4       / p,V+PA                  4        F,  w  p&p-V&P                  R>4      RŸ,          p.V.V,9  g   K'  V-V,V.&   K.  	  \C        4       . p0p/V' FÔ  w  p1p2p3p4p5V1V/9   d   K  V+P                  V14      ;'       g    V,P                  V14      p6V6f   KB  V/PE                  V14       V/PE                  V1PG                  R?R@4      PG                  RARB4      PG                  RCRD4      PG                  RERF4      4       T0P7                  R,T1RT2R-T3R.T4R/\I        V64      ;'       g    ^ R0V5/4       KÖ  	  V0'       g   EKô  V0VVV3&   EKþ  	  RGotRH. R¢ORIRJ.RKRL.RMRN.RORP./p7VP#                  RQStS|S€34       / p8VP%                  4        Fë  pVRR,          ;'       g    RP-                  4       o}V7PA                  4        F³  w  p9p:\J        ;QJ d    V}3RS lV: 4       F  '       g   K   R;M	  RM! V}3RS lV: 4       4      '       g   KH  V9V89  d
   RT^ RURV/V8V9&   V8V9,          RT;;,          ^,          uu&   V8V9,          RU;;,          \I        VP                  RU4      ;'       g    ^ 4      ,          uu&    Ké  	  Kí  	  \M        Vt3RW lS‚PA                  4        4       4      p;\O        ^ V;\M        RX V8P)                  4        4       4      ,
          4      p<VPQ                  4        \        PS                  V4       R;pS€^8  d8   \        S|S€^,          ^,           ^4      \        S|S€^4      ,
          PT                  M/\        S|^,           ^^4      \        S|^^4      ,
          PT                  p=. p>VPA                  4        EF¾  w  p9pVR,          o�VP                  R24      pVP                  R34      ;'       g    R+pS‚P                  S�V3S‚P                  S�R+3/ 4      4      p?VP                  RY4      ;'       g    V.p@\9        \&        PW                  RZ V@ 4       4      4      pAS�St8X  d
   T<pB^ pC^ pDRVpEM›\Y        XA4      ^8”  d.   \M        V�V‚3R[ lXA 4       4      pB\M        V�V‚3R\ lVA 4       4      pDM6V?P                  R]4      ;'       g    ^ pBV?P                  R^4      ;'       g    ^ pDV8P                  V9RT^ RURV/4      pFVFRT,          pCVFRU,          pEXBXC,           ^ 8”  d
   XBXC,           MR$pGVG'       d   \        XBXC,           V=,          4      M^ pHXDXE,           pIXBXC,           ^ 8”  d   \[        XIXBXC,           ,          4      MR$pJV! VP                  S�4      VVP                  S�^ 4      ^8H  R_7      pKV'       d   VP                  VV3. 4      M. pLV! XKR`,          VL4      pMVKRa,          ;'       g    V?P                  Ra4      ;'       g    ^ pNV'       d   VP                  VV3^ 4      ;'       g    ^ M^ pT>P7                  R
T9RS�R2TR8VR8,          RbXGRcXBRdXCReXHRfXJRgXMRaXNRhTRiV^ 8”  d   \[        XMV,          ^d,          ^4      MR$/4       EKÁ  	  V>P]                  Rj R;Rk7       \M        Rl V> 4       4      pO\M        Rm V> 4       4      pP\M        Rn V> 4       4      pQ\M        Ro V> 4       4      pR\M        Rp V> 4       4      pS\M        Rq V> 4       4      pTVR^ 8”  d   \[        XTXR,          4      MR$pURS|RS€RrT>RsRbXRReXSRfTURgXORaXPRhXQRiVQ^ 8”  d   \[        XOXQ,          ^d,          ^4      MR$//p	EM›VRt8X  Ed   ^ R$I/pV^ R$I0pW\        VP                  RR.4      ^ ,          4      pX\        VP                  RR	.4      ^ ,          4      pYVP#                  Ru4       VP%                  4       pZVPQ                  4        \        PS                  V4       R;pVX VYR" 2p[Rv^ Rw^ Rx^ Ry^ RzVWPc                  VXVY4      ^,          /p\^ p]VZ EFç  pVR2,          pVR8,          ;'       g    R+P;                  4       p^ \d        Pf                  ! R2\        V4      R{X[R|R$R}V^.R~R;/4      Pi                  4       p_\j        Pl                  Po                  \p        V_R\r        R€R�/R‚Rƒ7      p`\j        Pl                  Pu                  V`^\v        R„7      ;_uu_ 4       pa\d        Px                  ! VaP{                  4       4      pbR$R$R$4       XbP                  R…/ 4      pcVcP                  X^VcP                  R+/ 4      4      pdVdP                  R†/ 4      P                  X[/ 4      o„V„3R‡ lpeX\Rv;;,          Ve! Rv4      ,          uu&   V\Rw;;,          Ve! Rw4      ,          uu&   V\Ry;;,          Ve! Rˆ4      ,          uu&   T\Rx;;,          VbP                  R‰^ 4      ;'       g    ^ ,          uu&   X]^,          p]XVP}                  RŠ4       EKê  	  X\Rv,          ^ 8”  d)   \[        X\Rw,          V\Rv,          ,          ^d,          ^4      MR$pfR�X]RzX\Rz,          R‰V\Rx,          RvV\Rv,          RwV\Rw,          RŽVfRˆV\Ry,          /p	EMvVR�8X  Edo   VP                  R2R.4      ^ ,          pg\        VP                  RR.4      ^ ,          4      pX\        VP                  RR	.4      ^ ,          4      pYVP                  R8R+.4      ^ ,          P;                  4       ;'       g    R+phXg'       g   R�R‘/p	EMÎXX XYR" 2p[\d        Pf                  ! R2\        Xg4      R{V[R|R$R}Xh.R~R;/4      Pi                  4       piVPQ                  4        \        PS                  V4       R;p\j        Pl                  Po                  \p        ViR\r        R€R�/R‚Rƒ7      pj\j        Pl                  Pu                  Vj^\v        R„7      ;_uu_ 4       pk\d        Px                  ! VkP{                  4       4      plR$R$R$4       XlP                  R…/ 4      pmVmP                  XhVmP                  R+/ 4      4      pnVnP                  R†/ 4      P                  X[/ 4      oƒVlP                  R‰^ 4      poVƒ3R’ lpp^ R$I0pqVqPc                  XXXY4      ^,          prR2\        Xg4      R{V[R‰VoRzVrRvVp! Rv4      RwVp! Rw4      RŽVp! RŽ4      RˆVp! Rˆ4      R“Vp! R”4      R•Vp! R–4      R—Vp! R˜4      R™Vp! Rš4      /p	\d        Pf                  ! V	\*        RR›7      Pi                  Rœ4      psV P                  ^È4       V P�                  R€R�4       V Pƒ                  4        V P…                  4        V P†                  P‰                  Vs4       V'       g   \        PS                  V4       R$# R$# u upi u upi u upi u upi u upi   \0         d%   p\3        RS� R S| R!S€R" R#T 24        R$p?EK7  R$p?ii ; iu upi u upi   \0         d(   p\3        R4T R5T R S| R!S€R" R#T 2
4        R$p?EKç  R$p?ii ; i  \0         d(   p\3        R6T R5T R S| R!S€R" R#T 2
4        R$p?EK³  R$p?ii ; iu upi u up"pi   + '       g   i     ELd; i  \0         dE   p\3        R‹TP                  R
4       R XX R!XYR" R#T 24       XVP}                  RŒ4        R$p?EK¢  R$p?ii ; i  + '       g   i     ELÊ; i  \0         d›   pT P                  Rž4       T P�                  R€R�4       T Pƒ                  4        T P…                  4        T P†                  P‰                  \d        Pf                  ! T P‹                  T4      4      Pi                  4       4        R$p?ELR$p?ii ; i  T'       g   \        PS                  T4       i i ; i)£uÇ   GET /proxy/stats/resumen-hoteles?ano=2025&mes=1
Devuelve un resumen por hotel: empleados, costo nÃ³mina, ingresos P&G.
Usa nÃ³mina viva cuando estÃ¡ disponible y cae a la cachÃ© local como respaldo.
r   r‚   Frk  zresumen-hotelesrW   Ú2025rX   Ú1r¦  r   z-AND LOWER(h.nombre_personalizado) = LOWER(%s)a  
                    WITH hotel_bus AS (
                        SELECT h2.nombre_personalizado,
                               ARRAY_AGG(LOWER(COALESCE(h2.bu_codigo, 'local'))
                                         ORDER BY h2.bu_codigo ASC NULLS LAST) AS all_bus
                        FROM hotel_unificacion h2
                        JOIN empresas e2 ON h2.razon_social = e2.codigo
                        WHERE e2.nit IS NOT NULL AND e2.nit <> ''
                          AND h2.hotel_name_api IS NOT NULL
                          AND h2.nombre_personalizado NOT IN ('No mostrar')
                        GROUP BY h2.nombre_personalizado
                    )
                    SELECT DISTINCT ON (h.nombre_personalizado)
                        h.nombre_personalizado  AS label,
                        e.nit,
                        e.codigo                AS razon_social,
                        h.bu_codigo,
                        LOWER(h.bu_codigo)      AS bu_lower,
                        h.bu_nombre,
                        e.pyg_company_id        AS company_id,
                        hb.all_bus
                    FROM hotel_unificacion h
                    JOIN empresas          e  ON h.razon_social = e.codigo
                    JOIN hotel_bus         hb ON h.nombre_personalizado = hb.nombre_personalizado
                    WHERE e.nit IS NOT NULL AND e.nit <> ''
                      AND h.hotel_name_api IS NOT NULL
                      AND h.nombre_personalizado NOT IN ('No mostrar')
                      za
                    ORDER BY h.nombre_personalizado, h.bu_codigo ASC NULLS LAST
                rq  zì
                    SELECT codigo,
                           regexp_replace(codigo, '_v[0-9]+$', '') AS codigo_api,
                           nombre, grupo, subgrupo, incluir
                    FROM nomina_conceptos
                r€  Ú
codigo_apir�  Ú|c                 ó  <€ \        T ;'       g    R 4      pVP                  4       p\        T;'       g    R 4      P                  4       P                  4       pSP                  V RV 24      ;'       g    SP                  V4      # )r   r�  )r¿   r   r)   rk   )r€  r�  rI  Úapi_keyÚnom_keyÚconceptos_by_api_nameÚconceptos_by_codes   &&   €€r   Ú_nom_lookupÚ(ProxyHandler._stats.<locals>._nom_lookupì  sq   ø€ Ü˜vŸ|˜|¨Ó,�DØ"Ÿj™j›l�GÜ! &§, ,¨BÓ/×5Ñ5Ó7×=Ñ=Ó?�GØ0×4Ñ4¸°yÀÀ'ÀÐ5KÓL×kÐkÐPa×PeÑPeÐfjÓPkÐkr$   c                 ó`   <€ S! W4      p\        T;'       d    VP                  R 4      RJ4      # )r‚  F)Úboolrk   ©r€  r�  r!  r£  s   && €r   Ú_nom_incluirÚ)ProxyHandler._stats.<locals>._nom_incluirò  s.   ø€ Ù# FÓ3�AÜ × CÐ C a§e¡e¨IÓ&6¸eÐ&CÓDÐDr$   c                 ó^   <€ S! W4      pT;'       g    / P                  R 4      ;'       g    R# )rƒ  r   ©rk   r§  s   && €r   Ú
_nom_grupoÚ'ProxyHandler._stats.<locals>._nom_grupoö  s*   ø€ Ù# FÓ3�AØŸG˜G Ÿ=™=¨Ó1×7Ð7°RÐ7r$   c                 ó^   <€ S! W4      pT;'       g    / P                  R 4      ;'       g    R# )r„  r   r«  r§  s   && €r   Ú_nom_subgrupoÚ*ProxyHandler._stats.<locals>._nom_subgrupoú  s*   ø€ Ù# FÓ3�AØŸG˜G Ÿ=™=¨Ó4×:Ð:¸Ð:r$   c                 óÆ  € / pV  FÁ  pVP                  R 4      ;'       g    .  FŸ  p\        VP                  R4      ;'       g    ^ 4      pV^ 8:  d   K0  R\        VP                  R4      ;'       g    R4      ,           pWQ9  d$   RTRVP                  R4      ;'       g    RRR/W&   W,          R;;,          V,          uu&   K¡  	  KÃ  	  \        VP	                  4       4      # )r\  Úaporte_empleadorÚSS_r€  r   r�  ÚvalorrA   )rk   r  r¿   rŒ  rp  )ÚempsÚss_mapÚempÚssÚaprI  s   &     r   Ú_build_ss_patronalÚ/ProxyHandler._stats.<locals>._build_ss_patronalþ  sË   € Ø�FÛ#˜Ø"%§'¡'Ð*<Ó"=×"CÐ"CÀÒ"C˜BÜ!& r§v¡vÐ.@Ó'A×'FÐ'FÀQÓ!G˜BØ! QœwÙ (Ø#(¬3¨r¯v©v°hÓ/?×/EÐ/EÀ2Ó+FÕ#F˜DØ#Ô1Ø08¸$ÀÈ"Ï&É&ÐQYÓJZ×J`ÐJ`Ð^`ÐbiÐknÐ/o ¡Ø"�L¨×1°RÕ7Õ1ó #Dñ  $ô   §¡£Ó0Ð0r$   c                 ó  <€ T ;'       g    / p \        T;'       g    R 4      P                  4       pV P                  R4      ;'       g    .  Uu. uF>  p\        VP                  R4      ;'       g    R4      P                  4       V8X  g   K<  VNK@  	  ppV'       gk   VR 8X  dd   V P                  R4      ;'       g    .  Uu. uF>  p\        VP                  R4      ;'       g    R 4      P                  4       R9   g   K<  VNK@  	  pp\        R V 4       4      p\	        V P                  R4      ;'       g    / P                  R4      ;'       g    ^ 4      pV^ 8”  d	   Wg,          M^ p/ p	/ p
V'       dÒ   V P                  R4      ;'       g    .  F°  p\        VP                  R4      ;'       g    R4      pVP                  R	4      ;'       g    RpVR
,           VP                  4       ,           pRTR	TR\	        VP                  R4      ;'       g    ^ 4      R\	        VP                  R4      ;'       g    ^ 4      /W®&   K²  	  EM1V EF*  pVP                  R4      ;'       g    .  EF  p\        VP                  R4      ;'       g    R4      pVP                  R	4      ;'       g    RpVR
,           VP                  4       ,           pWê9  d   RVR	VRRRR/W®&   VP                  R4      '       d@   W®,          R;;,          \	        VP                  R4      ;'       g    ^ 4      ,          uu&   KÉ  W®,          R;;,          \	        VP                  R4      ;'       g    ^ 4      ,          uu&   EK	  	  EK-  	  V
P                  4        F½  pS! VR,          VR	,          4      '       g   K"  VR,          ^ 8”  d
   VR,          MVR,          pV^ 8:  d   KK  VR,          R
,           VR	,          P                  4       ,           pRVR,          R	VR	,          RVRS! VR,          VR	,          4      RS! VR,          VR	,          4      /Wž&   K¿  	  V'       d   ^MTpV P                  R4      ;'       g    .  FÇ  p\        VP                  R4      ;'       g    R4      pVP                  R	4      ;'       g    RpS! WÍ4      '       g   KR  \        \	        VP                  R4      ;'       g    ^ 4      V,          4      pV^ 8:  d   K�  VR
,           VP                  4       ,           pRVR	VRVRS! WÍ4      RS! WÍ4      /Wž&   KÉ  	  S! V4      pV FŠ  pVR,          pVR	,          pS! WÍ4      '       g   K%  \	        VP                  R4      ;'       g    ^ 4      pV^ 8:  d   KR  VR
,           VP                  4       ,           pRVR	VRVRS! WÍ4      RS! WÍ4      /Wž&   KŒ  	  RV	R\        V4      R\        R V 4       4      RVR\        R V 4       4      /# u upi u upi )r²  r"  r¤   r   c              3   ój   "  € T F)  p\        VP                  R 4      ;'       g    ^ 4      x € K+  	  R# 5i)rW  N©r  rk   ©r   rÚ   s   & r   r   ÚEProxyHandler._stats.<locals>._nomina_pool_from_raw.<locals>.<genexpr>  s-   é € Ð([ÑVZÐQR¬¨q¯u©uÐ5EÓ/F×/KÐ/KÈ!×)LÐ)LÓVZùó   ‚!3¤3ÚresumenrW  r}  r€  r�  r�  ÚdevengosÚdeduccionesrA   ÚDXr´  rœ  rƒ  r„  r[  ÚpoolÚnum_empleadosÚdias_nominac              3   ój   "  € T F)  p\        VP                  R 4      ;'       g    ^ 4      x € K+  	  R# 5i)rV  Nr¾  r¿  s   & r   r   rÀ  f  s(   é € Ð*SÉdÈ¬5°·±°v³×1CÐ1CÀ!×+DÐ+DËdùrÁ  Úss_patronalc              3   ój   "  € T F)  p\        VP                  R 4      ;'       g    ^ 4      x € K+  	  R# 5i)r´  Nr¾  ©r   rF  s   & r   r   rÀ  h  s(   é € Ð*[É{È!¬5°·±°w³×1DÐ1DÀ1×+EÐ+EË{ùrÁ  )r   r²  )
r¿   rã  rk   rn  r  r   rs   rp  Úroundr*   )rM  ÚbuÚuse_raw_aggregatesÚbu_lowerrÚ   rµ  rW  Úraw_devÚratiorÆ  Úc_mapr   rI  r’  r   r·  r  rœ  Úprovision_ratiorF   rÊ  r¸  rº  r¬  r¨  r¯  s   &&&                   €€€€r   Ú_nomina_pool_from_rawÚ2ProxyHandler._stats.<locals>._nomina_pool_from_raw  sT  ø€ ØŸ)˜) �CÜ" 2§= =¨Ó1×7Ñ7Ó9�Hà$'§G¡G¨KÓ$8×$>Ð$>¸BÐ$>óÙ$>˜aÜ˜qŸu™u [Ó1×7Ð7°RÓ8×>Ñ>Ó@ÀHÑL÷ ˜Ñ$>ð ð ÷   H°Ô$7à(+¯©°Ó(<×(BÐ(BÀÐ(Bó Ù(B !Ü" 1§5¡5¨Ó#5×#@Ð#@¸ÓA×GÑGÓIÈ]ÑZ÷ ˜AÑ(Bð ð  ô
 &)Ñ([ÑVZÓ([Ó%[�NÜ# S§W¡W¨YÓ%7×%=Ð%=¸2×$BÑ$BÐCSÓ$T×$YÐ$YÐXYÓZ�GØ8?À!¼˜NÖ4È�Eà�DØ�Eß)Ø!$§¡¨Ó!5×!;Ð!;¸Ò!;˜AÜ#& q§u¡u¨X£×'<Ð'<¸"Ó#=˜DØ#$§5¡5¨£?×#8Ð#8°b˜DØ"&¨¥*¨t¯z©z«|Õ";˜Cà (¨$Ø (¨$Ø *¬E°!·%±%¸
Ó2C×2HÐ2HÀqÓ,IØ -¬u°Q·U±U¸=Ó5I×5NÐ5NÈQÓ/Oð	*˜E›Jó	 "<ô $(˜CØ%(§W¡W¨[Ó%9×%?Ð%?¸RÓ%? Ü'*¨1¯5©5°«?×+@Ð+@¸bÓ'A Ø'(§u¡u¨X£×'<Ð'<¸" Ø&*¨S¥j°4·:±:³<Õ&? Ø#&Ô#3Ø2:¸DÀ(ÈDÐR\Ð^aÐcpÐruÐ1v E¡JØ#'§?¡?°4×#8Ò#8Ø$)¥J¨}×$=ÄÀqÇuÁuÈWÃ~×GZÐGZÐYZÓA[Õ$[Õ$=à$)¥J¨z×$:¼eÀAÇEÁEÈ'ÃN×DWÐDWÐVWÓ>XÕ$XÖ$:ô &@ñ $(ð !&§¡¦˜Ù+¨D°­N¸DÀ½N×KÒKÙ$Ø26°zÕ2BÀQÔ2F˜d :Ö.ÈDÐQ^ÕL_˜Ø !œ8Ù$Ø" 8�n¨sÕ2°T¸(µ^×5IÑ5IÓ5KÕK˜à$ d¨8¥n°hÀÀXÅÐPUÐWZØ#¡Z°°XµÀÀXÅÓ%OØ&©°d¸8µnÀdÈ8ÅnÓ(Uð%˜›	ñ !/÷ ,>¡aÀ5�OØ ŸW™W ]Ó3×9Ð9°rÒ9˜Ü" 1§5¡5¨£?×#8Ð#8°bÓ9˜Ø Ÿu™u X›×4Ð4°"˜Ù+¨D×7Ò7Ù$Ü#¤E¨!¯%©%°«.×*=Ð*=¸AÓ$>ÀÕ$PÓQ˜Ø !œ8Ù$Ø" S�j¨4¯:©:«<Õ7˜à$ d¨H°d¸EÀ3Ø#¡Z°Ó%;Ø&©°dÓ(Að%˜›	ñ :ñ #5°TÓ":�KÛ)˜Ø! (�|˜Ø! (�|˜Ù+¨D×7Ò7Ù$Ü# B§F¡F¨7£O×$8Ð$8°qÓ9˜Ø !œ8Ù$Ø" S�j¨4¯:©:«<Õ7˜à$ d¨H°d¸EÀ3Ø#¡Z°Ó%;Ø&©°dÓ(Að%˜›	ñ *ð   Ø'¬¨T«Ø%¤sÑ*SÉdÓ*SÓ'SØ" NØ%¤sÑ*[É{Ó*[Ó'[ðð ùòkùò
 s$   Á!XÁ0XÂXÃ !X	Ã"X	Ã>X	c                 óž  € T ;'       g    / P                  4        UUu/ uF  w  r#V\        V4      bK  	  p ppT;'       g    .  Fá  pVP                  R 4      '       d   K  \        VP                  R4      ;'       g    ^ 4      pV^ 8:  d   KI  RR\	        VP                  R4      4      ,           RVP                  R4      ;'       g    RRTRVP                  R4      ;'       g    RRVP                  R4      ;'       g    R/V R\	        VP                  R4      4      ,           &   Kã  	  \        R	 V P                  4        4       4      # u uppi )
rŸ  rœ  r€  ÚPYG_r™  r�  r   rƒ  r„  c              3   ój   "  € T F)  p\        VP                  R 4      ;'       g    ^ 4      x € K+  	  R# 5i)rœ  Nr¾  rÌ  s   & r   r   Ú>ProxyHandler._stats.<locals>._payroll_total.<locals>.<genexpr>{  s(   é € ÐOÁ¸Aœu Q§U¡U¨5£\×%6Ð%6°Q×7Ð7ÃùrÁ  )r�  rx  rk   r  r¿   rn  rp  )rÆ  Ú	pyg_itemsr­  r  rF  rœ  s   &&    r   Ú_payroll_totalÚ+ProxyHandler._stats.<locals>._payroll_totalk  s  € Ø48·J°J¸B×3EÑ3EÔ3GÔHÑ3G©4¨1˜Aœt A›wšJÑ3G�DÑHØ&Ÿ_˜_¨"š_˜ØŸ5™5 ×1Ò1Ù$Ü# A§E¡E¨%£L×$5Ð$5°AÓ6˜Ø !œ8Ù$à$ f¬s°1·5±5¸³;Ó/?Õ&?Ø$ a§e¡e¨H£o×&;Ð&;¸Ø! 3Ø# Q§U¡U¨7£^×%9Ð%9°rØ&¨¯©¨jÓ(9×(?Ð(?¸Rð;˜˜V¤c¨!¯%©%°«+Ó&6Õ6Ó7ñ -ô ÑOÀÇÁÄÓOÓOÐOùó Is   žE	a   
                    SELECT DISTINCT ON (nit) nit, raw_data
                    FROM historico_nomina_pyg
                    WHERE fuente='nomina' AND registro_tipo='respuesta'
                      AND ano=%s AND mes=%s
                    ORDER BY nit, cargado_en DESC
                rm  c                 ó®  <€ \         P                  ! R V RSRSRRRR/4      P                  4       p\        P                  P                  \        R,           VR\        R	R
/RR7      p\        P                  P                  V^\        R7      ;_uu_ 4       p\         P                  ! VP                  4       4      uuRRR4       #   + '       g   i     R# ; i)rj  rW   rX   Úincluir_empleadosTÚss_vistaÚambosrn  rT  r°   r³   rU  rV  rY  N)rÃ   rÄ   rÅ   r]  r^  r_  r   r`  ra  rb  r  r  )rq  r
  rf  rÙ   rW   rX   s   &   €€r   Ú_fetch_nomina_liveÚ/ProxyHandler._stats.<locals>._fetch_nomina_live‡  s´   ø€ ÜŸ:š:Ø# SØ˜sØ˜sØ+¨TØ" Gð'ó ÷ ‘v“xð ô !Ÿ.™.×0Ñ0Ü Ð#4Õ4¸4Ø!,¬g°~ÐGYÐ ZØ%ð 1ó �Cô
  Ÿ™×/Ñ/°¸RÌÐ/×QÔQÐUYÜ#Ÿzšz¨$¯)©)«+Ó6÷ R×Q×QÓQús   Â$CÃC	u*     âš ï¸�  nÃ³mina en vivo fallÃ³ para NIT z (rH   r-  z): Na€  
                    WITH latest_nomina AS (
                        SELECT DISTINCT ON (nit) nit, raw_data
                        FROM historico_nomina_pyg
                        WHERE fuente='nomina' AND registro_tipo='respuesta'
                          AND ano=%s AND mes=%s
                        ORDER BY nit, cargado_en DESC
                    )
                    SELECT nit,
                        LOWER(COALESCE(emp->>'bu_codigo', 'local'))  AS bu,
                        COUNT(*)::int                                 AS num_empleados,
                        COALESCE(SUM((emp->>'dias')::float), 0)      AS dias_nomina,
                        COALESCE(SUM((emp->>'total_devengos')::float), 0) AS devengos,
                        COALESCE(SUM(
                            (SELECT COALESCE(SUM((ss->>'aporte_empleador')::float), 0)
                             FROM jsonb_array_elements(emp->'seguridad_social') AS ss)
                        ), 0) AS ss_patronal
                    FROM latest_nomina,
                         jsonb_array_elements(raw_data->'empleados') AS emp
                    GROUP BY nit, bu
                rÎ  aj  
                    SELECT company_id::int AS cid,
                        LOWER(bu_kv.key) AS bu,
                        MAX(CASE WHEN t->>'id' = '1-ingresos'
                            THEN (t->'monthly'->'real'->>'value')::float END) AS ingresos_mes
                    FROM historico_nomina_pyg,
                         jsonb_each(raw_data->'pnl') AS bu_kv,
                         jsonb_array_elements(bu_kv.value->'tree') AS t
                    WHERE fuente='pyg' AND registro_tipo='respuesta'
                      AND ano=%s AND mes=%s
                    GROUP BY company_id, bu_kv.key
                ÚcidÚingresos_mesa	  
                    SELECT company_id::int AS cid,
                           LOWER(COALESCE(bu_codigo,'')) AS bu,
                           concepto_codigo AS id,
                           concepto_nombre AS nombre,
                           grupo,
                           subgrupo,
                           SUM(valor)::float AS val,
                           BOOL_OR(COALESCE((raw_data->>'nomina_backed')::boolean, false)) AS nomina_backed
                    FROM historico_nomina_pyg
                    WHERE fuente='pyg' AND registro_tipo='concepto'
                      AND ano=%s AND mes=%s
                    GROUP BY company_id, LOWER(COALESCE(bu_codigo,'')),
                             concepto_codigo, concepto_nombre, grupo, subgrupo
                r²  r™  rƒ  r„  rœ  rŸ  c                 óš  <a aaa€ T;'       g    R P                  4       pS SR 2oV V3R lpV! V4      pR oVV3R lo/ pVP                  R/ 4      pVP                  V4      ;'       g    VP                  R 4      ;'       g    / P                  R. 4      pV'       gD   VR 8w  d=   V! R 4      pVP                  R/ 4      pVP                  R / 4      P                  R. 4      pS! Wd4       . ROp\        4       p. p	V F®  w  r«rÍpW¨9   g   W¤9  d   K  VP                  V
4       VP                  V
P	                  RR4      P	                  R	R
4      P	                  RR4      P	                  RR4      4       T	P                  RT
RTRTRTRVP                  V
^ 4      ;'       g    ^ RV/4       K°  	  VP                  R^ 4      ;'       g    ^ V	3# )r²  r-  c                 ó¢  <€ \         P                  ! R SRSRRRV .RR/4      P                  4       p\        P                  P                  \        VR\        RR	/R
R7      p\        P                  P                  V^\        R7      ;_uu_ 4       p\         P                  ! VP                  4       4      uuRRR4       #   + '       g   i     R# ; irü  rý  )Úbu_coder
  rf  rÙ   rä  r   s   &   €€r   Ú_request_liveÚCProxyHandler._stats.<locals>._fetch_pyg_live.<locals>._request_liveä  s°   ø€ Ü#ŸzšzØ(¨#Ø$ fØ)¨4Ø,¨w¨iØ*¨Eð+ó  ÷ "™6›8ð ô %Ÿn™n×4Ñ4Ü#¨$Ø%0´'¸>ÐK]Ð$^Ø#)ð 5ó ˜ô
 $Ÿ^™^×3Ñ3°CÀÌWÐ3×UÔUÐY]Ü#'§:¢:¨d¯i©i«kÓ#:÷ V×U×UÓUús   Â$B=Â=C	c           
      ó�  € V P                  R / 4      P                  R/ 4      p\        V\        4      '       dŽ   VP                  4        Fy  p\        V\        \
        34      '       d   \        V4      u # \        V\        4      '       g   KD  \        VP                  RVP                  R^ 4      4      ;'       g    ^ 4      u # 	  R# ©r£  r¤  rX   r?   rA   ©rk   r  rx  rp  rD   r  ©Únoder¤  r  s   &  r   Ú	_flat_valÚ?ProxyHandler._stats.<locals>._fetch_pyg_live.<locals>._flat_valö  s’   € Ø#Ÿx™x¨	°2Ó6×:Ñ:¸6À2ÓF˜Ü% d¬D×1Ò1Ø%)§[¡[¦] Ü#-¨a´#´u°×#>Ò#>Ü+0°«8¢OÜ#-¨a´×#6Ô#6Ü+0°·±°u¸a¿e¹eÀGÈQÓ>OÓ1P×1UÐ1UÐTUÓ+VÒ$Vñ	 &3ñ
  #r$   c                 ó€   <€ V  F6  pS! V4      WP                  R R4      &   S! VP                  R. 4      V4       K8  	  R# ©r™  r   r§  Nr«  )r©  rª  r«  rð  r°  s   && €€r   r°  Ú>ProxyHandler._stats.<locals>._fetch_pyg_live.<locals>._flatten 	  s8   ø€ Û!&˜AÙ3<¸Q³<˜C§¡ d¨B£Ñ0Ù$ Q§U¡U¨:°rÓ%:¸CÖ@ó "'r$   r³  r´  r¶  r·  r¸  r¹  rº  rÚ   r»  r¼  r™  r�  rƒ  r„  rœ  rŸ  z
1-ingresosr½  )rã  rk   rå  ræ  rç  r  )rä  rÎ  ré  rM  rë  r³  r´  Úconceptos_defrò  r}  rô  r�  rƒ  r„  rŸ  rð  r°  r   rW   rX   s   f&             @@@€€r   Ú_fetch_pyg_liveÚ,ProxyHandler._stats.<locals>._fetch_pyg_liveá  s¼  ü€ ØŸ-˜- ×.Ñ.Ó0�BØ #˜u S¨ IÐ.�Fö;ñ  (¨Ó+�Cò#öAð
 �DØŸ'™' %¨Ó,�CØŸG™G B›K×AÐA¨3¯7©7°7Ó+;×AÐA¸r×FÑFÀvÈrÓR�Dß B¨'¤MÙ+¨GÓ4˜Ø!Ÿg™g e¨RÓ0˜Ø"Ÿw™w w°Ó3×7Ñ7¸ÀÓC˜Ù˜TÔ(ò%�Mô, ›5�DØ "�IÛKXÑG˜¨¸-Ø"œ?¨gÔ.AÙ$ØŸ™ Ô)ØŸ™ §¡°°sÓ!;×!CÑ!CÀDÈ#Ó!N×!VÑ!VÐW[Ð]`Ó!a×!iÑ!iÐjnÐpsÓ!tÔuØ!×(Ñ(Ø  'Ø$ fØ# UØ&¨Ø! 4§8¡8¨G°QÓ#7×#<Ð#<¸1Ø+¨]ð*ö ñ LYð  Ÿ8™8 L°!Ó4×9Ð9¸¸9ÐDÐDr$   r–  rÐ  u-     âš ï¸�  P&G en vivo fallÃ³ para company_id=z bu=u>     âš ï¸�  P&G en vivo (fallback local) fallÃ³ para company_id=ay  
                            SELECT company_id::int AS cid, bu_codigo, raw_data
                            FROM historico_nomina_pyg
                            WHERE fuente='pyg' AND registro_tipo='respuesta'
                              AND ano=%s AND mes=%s AND company_id = ANY(%s)
                            ORDER BY company_id, cargado_en DESC
                        r¤   c           
      ó�  € V P                  R / 4      P                  R/ 4      p\        V\        4      '       dŽ   VP                  4        Fy  p\        V\        \
        34      '       d   \        V4      u # \        V\        4      '       g   KD  \        VP                  RVP                  R^ 4      4      ;'       g    ^ 4      u # 	  R# rì  rí  rî  s   &  r   Ú_fvÚ ProxyHandler._stats.<locals>._fvh	  s–   € Ø#'§8¡8¨I°rÓ#:×#>Ñ#>¸vÀrÓ#J˜DÜ)¨$´×5Ò5Ø)-¯©® AÜ'1°!´c¼5°\×'BÒ'BÌ5ÐQRË8ÂOÜ'1°!´T×':Ô':Ä5ÈÏÉÈuÐVW×V[ÑV[Ð\cÐefÓVgÓIh×ImÐImÐlmÓCnÒ<nñ *7ñ $'r$   c                 ó€   <€ V  F6  pS! V4      WP                  R R4      &   S! VP                  R. 4      V4       K8  	  R# ró  r«  )r©  rª  r«  Ú_flrù  s   && €€r   rü  Ú ProxyHandler._stats.<locals>._flp	  s8   ø€ Û%* Ù7:¸1³v §E¡E¨$°£OÑ 4Ù # A§E¡E¨*°bÓ$9¸3Ö ?ó &+r$   Tr³  r´  rµ  r¶  r·  r¸  r¹  rº  rÚ   r»  r¼  Ú	901418135zHotel CaribezThe ClubzTHE CLUB CTGzLa Mantillar2   zCasa Don Luisr4   zFC Cartagenar6   a  
                    SELECT emp->>'centro_costo'   AS cc,
                           (emp->>'dias')::float  AS dias
                    FROM (
                        SELECT raw_data FROM historico_nomina_pyg
                        WHERE fuente='nomina' AND registro_tipo='respuesta'
                          AND nit=%s AND ano=%s AND mes=%s
                        ORDER BY cargado_en DESC LIMIT 1
                    ) latest,
                    jsonb_array_elements(latest.raw_data->'empleados') AS emp
                Úccc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir   rE  )r   rF   rÿ  s   & €r   r   Ú&ProxyHandler._stats.<locals>.<genexpr>»	  s   øé € Ð5±¨1 Bžw³ùs   ƒrµ  rV  rA   c              3   óP   <"  € T F  w  w  rq1S8X  g   K  VR ,          x € K  	  R# 5i©rÇ  NrE  )r   r«  ré  r  ÚSERV_NITs   &   €r   r   r  Â	  s,   øé € ð %Ù8M©9©6¨A°1ÐV^ÑQ^Ô&�A�o×&Ò&Ó8Mùs   ƒ&•&c              3   ó2   "  € T F  qR ,          x € K  	  R# 5i)rµ  NrE  )r   r  s   & r   r   r  Å	  s   é € Ð8cÑLbÀq¸6¿ºÓLbùrK  Úall_busc              3   ó8   "  € T F  q;'       g    R x € K  	  R# 5i)r²  NrE  )r   ré  s   & r   r   r  Ö	  s   é € Ð1PÉÀ1·,°,°w´,Ëùs   ‚�c              3   ó~   <"  € T F2  pSP                  SV3/ 4      P                  R 4      ;'       g    ^ x € K4  	  R# 5ir  r«  ©r   ré  rq  Únomina_bu_maps   & €€r   r   r  à	  s=   øé € Ð-yÑqxÐlm¨m×.?Ñ.?ÀÀaÀÈ"Ó.M×.QÑ.QÐRaÓ.b×.gÐ.gÐfgÔ.gÓqxùó   ƒ.=²=c              3   ó~   <"  € T F2  pSP                  SV3/ 4      P                  R 4      ;'       g    ^ x € K4  	  R# 5i)rÈ  Nr«  r	  s   & €€r   r   r  á	  s=   øé € Ð-wÑovÐjk¨m×.?Ñ.?ÀÀaÀÈ"Ó.M×.QÑ.QÐR_Ó.`×.eÐ.eÐdeÔ.eÓovùr  rÇ  rÈ  )rÏ  rÆ  rÃ  r"  Úemps_directÚemps_outsourcÚdias_laboradosÚdias_promedioÚcosto_totalÚingresosÚ
pct_nominac                 ó(   € V R ,          ;'       g    ^ # )r  rE  )r-   s   &r   rG  Ú%ProxyHandler._stats.<locals>.<lambda>
  s   € ¨¨-Õ(8×(=Ð(=¸AÐ(=r$   )r   Úreversec              3   ó2   "  € T F  qR ,          x € K  	  R# 5i)r  NrE  ©r   r-   s   & r   r   r  
  s   é € Ð"EÁ¸1 ]×#3Ò#3ÃùrK  c              3   ó2   "  € T F  qR ,          x € K  	  R# 5i)rÃ  NrE  r  s   & r   r   r  
  ó   é € Ð"EÁ¸1 Z§=¢=ÃùrK  c              3   ó2   "  € T F  qR ,          x € K  	  R# 5i)r  NrE  r  s   & r   r   r  
  r  rK  c              3   óF   "  € T F  qR ,          ;'       g    ^ x € K  	  R# 5i)r"  NrE  r  s   & r   r   r  
  s   é € Ð"EÁ¸1 [¥>×#6Ð#6°QÔ#6Ãùó   ‚!–!c              3   óF   "  € T F  qR ,          ;'       g    ^ x € K  	  R# 5i)r  NrE  r  s   & r   r   r  
  s   é € Ð"JÁTÀÐ%5Õ#6×#;Ð#;¸!Ô#;ÃTùr  c              3   óv   "  € T F/  qR ,          ;'       g    ^ VR,          ;'       g    ^ ,          x € K1  	  R# 5i)r  r"  NrE  r  s   & r   r   r  
  s2   é € ð #ÙOSÈ!�Õ'×,Ð,¨1°°;µ×1DÐ1DÀ1×EÒEËtùs   ‚9–9¨9r;  Útotaleszkpis-agregadoa#  
                    SELECT DISTINCT h.nombre_personalizado AS label,
                           e.pyg_company_id AS company_id,
                           LOWER(h.bu_codigo) AS bu_codigo
                    FROM hotel_unificacion h
                    JOIN empresas e ON h.razon_social = e.codigo
                    WHERE e.pyg_company_id IS NOT NULL
                      AND h.nombre_personalizado NOT IN ('No mostrar')
                      AND h.hotel_name_api IS NOT NULL
                    ORDER BY h.nombre_personalizado
                Úrooms_totalÚrooms_occupiedÚhab_fisÚguestsÚdays_in_monthr   rø  rù  rú  rT  r°   r³   rU  rV  rY  Úkpi_snapshots_by_bur¤  c                 ón   <€ SP                  V 4      ;'       g    / P                  R ^ 4      ;'       g    ^ # ©rX   r«  )r­  Úsnap2s   &€r   Úkv2Ú ProxyHandler._stats.<locals>.kv2U
  s.   ø€ ¨E¯I©I°a«L×,>Ð,>¸B×+CÑ+CÀEÈ1Ó+M×+RÐ+RÐQRÐ$Rr$   Úguests_totalÚhabitaciones_fisicasg333333Ã?u%     âš ï¸�  KPI ocupaciÃ³n fallÃ³ para g333333Ó?rä   Úoccupancy_pctz
kpis-hotelry   zFalta company_idc                 ón   <€ SP                  V 4      ;'       g    / P                  R ^ 4      ;'       g    ^ # r(  r«  )r   Úsnaps   &€r   ÚkvÚProxyHandler._stats.<locals>.kv�
  s-   ø€ ¨¯©°#«×)<Ð)<¸"×(AÑ(AÀ%ÈÓ(K×(PÐ(PÈqÐ!Pr$   Úrrhh_empleadosÚrrhh_empleados_activosÚ
rrhh_costoÚrrhh_costo_totalÚrrhh_ausentismoÚrrhh_ausentismo_mesÚrrhh_rotacionÚrrhh_tasa_rotacionrF  rþ   r±   r²   râ  )Fr½  )ÚHCARIBEzH CARIBEzH CARIBE VENTAS)FÚurllib.parser   r   rr   ri  r   rL   rM   rN   r7  r8  ro  rD   rk   r)   rj  rl  rO   rw  rx  rp  r¿   r   rQ  rÈ   rÂ   Ú
setdefaultr  rŒ  rã  ÚnextÚiterr�  rå  ræ  rç  r  Úanyrn  ÚmaxrÁ   rQ   ÚdaysÚfromkeysr*   rÍ  ÚsortrI   ÚcalendarÚ
monthrangerÃ   rÄ   rÅ   r]  r^  r_  r	   rþ  ra  rb  r  r  Úsleepr—   rl   rn   r˜   rÆ   rÇ   rÉ   )…ra   r   r   rq  r  rr  rS   Ú_conn_returnedrT   rW  r¦  r&  Úhotel_whereÚ
hotel_argsr-   rä   Ú
nit_countsÚhÚconceptos_rowsrŸ  r   rÕ  rÜ  Únomina_raw_maprâ  rÚ   Úingresos_mapÚpyg_conceptos_maprö  rä  rÎ  r  r}  Ú
need_pairsrÎ   Ú	need_cidsÚresp_by_cidÚrrr­  ÚCDEFr€  r³  r´  rë  Úflat_sr  r    rò  Úcsr¬  r�  rƒ  r„  Únbrœ  ÚSERV_PATTERNSÚserv_by_labelÚlblrˆ  Úserv_total_nomÚ
serv_otrosÚdias_mesr;  Únom_buÚraw_busr  r  Ú	emps_servÚdias_dirÚdias_serv_nomÚ	serv_inforµ  r  Údias_nom_totalr  Únom_calcrÛ  ÚcostorÃ  Ú	tot_costoÚtot_devengosÚtot_ingresosÚtot_empsÚtot_diasÚtot_dias_nomÚtot_dias_promÚ_timeÚ_calÚano_kÚmes_kÚhoteles_kpir   ÚaggÚvalid_countrè  Úbody_pÚreq2Úresp2Úraw2Úsnaps2Úsnap_bu2r*  Úoccr–  r¤   r  rf  rÙ   rM  ÚsnapsÚsnap_bur#  r1  rE  r%  r
  r  rº  rü  rù  r¬  r¨  r£  r¯  rW   rÿ  r¡  r¢  rX   rq  r
  r0  r)  s…   &                                                                                                                   @@@@@@@@@@@@@@@@@r   r‡   ÚProxyHandler._stats›  si  ÿÿø€ ÷
 	4Ù˜$Ÿ)™)Ó$ˆÙ˜&Ÿ,™,Ó'ˆØ—;‘;×$Ñ$ _Ó5°bÕ9ˆä�‰Ó ˆØˆðK	&Ø—;‘;¬h¯o©o×.LÑ.L�;ÓMˆCØˆDàÐ,Õ,Ü˜BŸF™F 5¨V¨HÓ5°aÕ8Ó9�Ü˜BŸF™F 5¨S¨EÓ2°1Õ5Ó6�ØŸ™˜w¨¨Ó-¨aÕ0×6Ñ6Ó8�Ü! # s¨AÓ.×8Ñ8Ó:�ð
 !�Ø �
ßØ"Q�KØ#( '�Jà—‘ð !ð6 #�mð $ð7ð:  ô;!ð< 9<¿¹¼ÓG¹°1˜W�:¤t¨A£wÒ.¹�ÐGØ�
Ø Ÿ™Ö)�AØ+5¯>©>¸!¸E½(ÀAÓ+FÈÕ+J�J˜q �xÓ(ñ *ð —‘ð ô ð 47·<±<´>Ó!B±>¨a¤$ q¦'±>�Ð!BÙBPÓ$QÁ.¸Q¤S¨¨8­Ó%5°qÒ%8Á.Ñ$QÐ!Ø(*Ð%Û'�AÜ! !§%¡%¨Ó"5×"NÐ"N¸¿¹¸x»×"NÐ"NÈBÓO×UÑUÓW�GÜ! !§%¡%¨£/×"7Ð"7°RÓ8×>Ñ>Ó@×FÑFÓH�GØDEÐ)¨W¨I°Q°w°iÐ*@ÓAñ (ö
lõEõ8õ;ò1÷^ò ^ò@Pð& —‘ð ð ˜3�Zô!ð DGÇ<Á<Ä>Ó!RÁ>¸a E¥(¨A¨j­MÒ"9Á>�Ð!Rö7ð  ×1Ñ1°#°s×;Ò;Ø29·.±.Ô2BÓSÑ2B¨QÀaÇeÁeÈEÇl¤  %§ Ñ2BÔS˜ðmÙ2DÀSÓ2I˜N¨3Ó/ñ  Tð —‘ð ð( ˜3�Zô)!ð* HKÇ|Á|Ä~Ó VÁ~À! E¥(¨A¨d­GÐ!4´d¸1³gÒ!=Á~Ñ V�ð —‘ð ð ˜3�Zô!ð VY×UaÑUaÔUcÓdÑUcÐPQ 5¥¨1¨T­7Ð 3°Q°~Õ5F×5KÐ5KÈ!Ò KÑUc�Ðdð —‘ð ð ˜3�Zô!ð %'Ð!ØŸ™ž�AØ%×0Ñ0°!°Eµ(¸A¸d½G×<NÐ<NÀwÐ1OÐQSÓT×[Ñ[Ø˜a �gØ  ! H¥+Ø  7¥Ø" A j¥MØ˜q �xŸ}˜}¨1Ø'¨¨?Õ);ð]ö ñ (öQEðf ×1Ñ1°#°s×;Ò;Ø#%�LØ(*Ð%Ø$Ÿ^™^Ö-˜ØŸe™e LÓ1˜ØŸU™U :Ó.×9Ð9°'˜ß"Ù$ðxÙ2AÀ#ÀrÓ2JÑ/˜H iØ6>˜L¨#¨r¨Ñ3Ø;DÐ-¨s°B¨iÓ8ò .ð %Ÿ^™^Ö-˜ØŸe™e LÓ1˜ØŸU™U :Ó.×9Ð9°'˜ß" b¨G¤mÙ$Ø'×+Ñ+¨S°"¨I°qÓ9¸AÔ=ÐAR×AVÑAVÐX[Ð]_ÐW`×AaÒAaÙ$ðIÙ2AÀ#ÀwÓ2OÑ/˜H iØ'¨!œ|¯yØ:B ¨c°2¨YÑ 7Ø?HÐ 1°3¸°)Ó <ñ 09ñ .ð  ×-Ñ-¨c°3×7Ó7ð ")§¡Ô!1ó"á!1˜AØŸ5™5 ×.ô Hà7H×7LÑ7LÈaÐP\ÍoÐ_`×_dÑ_dÐeoÓ_p×_{Ð_{Ðt{ÐM|×7}ô H˜˜<�¨!¯%©%°
Ó*;×*FÐ*F¸wÓGÙ!1ð ð "÷
 "�zÜ$(¹JÔ)G¹J±&°#°q«#¹JÒ)GÓ$H˜	ØŸ™ð %ð " 3¨	Ð2ô4ð ')˜Ø"%§,¡,¦.˜BØ!# E¥¨R°­_×-GÐ-GÀ×,NÑ,NÓ,PÐ Q˜AØ ¨Ö3Ø13°Jµ ¨A£ñ #1ò
'ö@ò
 ˜ô, *4™I˜S "Ø!,§¡°#°r°Ó!;×!^Ð!^¸{¿¹ÐPSÐU\È~Ó?^˜Bß#%¡xØ"$§&¡&¨°Ó"3˜CØ$'§G¡G¨B£K×$cÐ$c°3·7±7¸7Ó3C×$cÐ$cÄtÌDÐQT×Q[ÑQ[ÓQ]ÓL^Ð`bÓGc×#hÑ#hÐioÐqsÓ#t˜DØ#%˜DÙ  dœOØ%'˜FØ(,¯
©
®¡  1Ø$%§G¡G¨C£L°Õ$4 Ø#$¨F¦?À°F¸1³Iñ )5ô (+£u¨b "˜DÛDHÑ @  V¨U°H¸bØ#&¨$¤;±Ø&*§h¡h¨s£m×&FÐ&F°v·z±zÀ#³ Ø#&¢;±Ø $§¡¨¤Ø $§¡¨¯©°T¸#Ó)>×)FÑ)FÀtÈCÓ)P×)XÑ)XÐY]Ð^aÓ)b×)jÑ)jÐkoÐpsÓ)tÔ uØ "§	¡	¨4°°hÀÈÐQVØ+5°xÀÌÈcË
ÏÈÐVWÐYhÐjlð+nö !oñ EI÷  "šrØ?AÐ 1°3¸°)Ô <ñ+ *4ð2 '�à"Ò%OØ nÐ%5Ø! j \Ø# e WØ"Ð&DÐ%Eð!�ð —‘ð 
ð   SÐ)ô
+ð !#�ØŸ™ž�AØ˜D�'Ÿ-˜- R×.Ñ.Ó0�BØ%2×%8Ñ%8Ö%:™	˜˜Tß›3Ô5±Ó5Ÿ3Ÿ3š3Ô5±Ó5×5Ô5Ø"¨-Ô7Ø6<¸aÀÈÐ5M ¨cÑ 2Ø)¨#Õ.¨v×6¸!Õ;Ó6Ø)¨#Õ.¨v×6¼%ÀÇÁÀfÃ×@RÐ@RÐQRÓ:SÕSÓ6Ú!ó &;ñ (ô "%ô %Ø8E×8KÑ8KÔ8Mó%ó "�ô !  N´SÑ8cÈM×L`ÑL`ÔLbÓ8cÓ5cÕ$cÓd�
à—	‘	”œWŸ_™_¨TÔ2ÀT°Nð _bÐdfÔ^fœI c¨3°­8°a­<¸Ó;¼iÈÈSÐRSÓ>TÕT×ZÒZÜ!*¨3°­7°A°qÓ!9¼IÀcÈ2ÈqÓ<QÕ!Q× WÑ Wð à�Ø%Ÿm™mŸo‘F�C˜Ø˜E�(�CØŸ%™% Ó-�CØŸ%™% 
Ó+×6Ð6¨w�Bà*×.Ñ.°°R¨y¸-×:KÑ:KÈSÐRYÈNÐ\^Ó:_Ó`�Fð  !Ÿu™u YÓ/×7Ð7°B°4�GÜ#¤D§M¡MÑ1PÉÓ1PÓ$PÓQ�Gà˜h”Ø(2˜Ø()˜	Ø()˜Ø(+™ä˜w›<¨!Ô+ä*-Õ-yÑqxÓ-yÓ*y˜KÜ*-Õ-wÑovÓ-wÓ*w™Hà*0¯*©*°_Ó*E×*JÐ*JÈ˜KØ*0¯*©*°]Ó*C×*HÐ*HÀq˜HØ(5×(9Ñ(9¸#ÀÈÈ6ÐSVÐ?WÓ(X˜	Ø(1°&Õ(9˜	Ø(1°&Õ(9˜àCNÐQZÕCZÐ^_ÔB_ k°IÖ&=Ðei�DçRV¤S¨+¸	Õ*AÀXÕ)MÔ%NÐ\]�Nà%-°Õ%=�Nà)4°yÕ)@ÀAÔ(Eô &+¨>¸[È9Õ=TÕ+UÔ%VØKOð "ñ  5Ø&×*Ñ*¨3Ó/ØØ,6¯N©N¸3ÀÓ,BÀaÑ,Gô �H÷
 JMÐ!2×!6Ñ!6¸¸R°yÀ"Ô!EÐRT�IÙ*¨8°FÕ+;¸YÓG�EØ'¨
Õ3×RÐR°v·z±zÀ*Ó7M×RÐRÐQR�HßHK × 0Ñ 0°#°r°¸AÓ >× CÐ CÀ!øÐQR�Hà—K‘KØ¨#Ø¨#Ø$¨#Ø#¨!¨K­.Ø#¨$Ø%¨+Ø'¨)Ø(¨.Ø'¨-Ø%¨%Ø"¨(Ø"¨(Ø$ÈhÐYZÌl¬%°¸Õ0@À3Õ0FÈÔ*JÐ`dð!÷ ñ] .ð~ —	‘	Ñ=Àt�	ÔLô  #Ñ"EÁÓ"EÓE�	Ü"Ñ"EÁÓ"EÓE�Ü"Ñ"EÁÓ"EÓE�Ü"Ñ"EÁÓ"EÓE�Ü"Ñ"JÁTÓ"JÓJ�ä"ñ #ÙOSó#ó  �ð CKÈQÄ,¤ l°XÕ&=Ô >ÐTX�ð ˜3  sØ˜DØØ#¨(Ø(¨(Ø'¨-Ø%¨)Ø"¨,Ø"¨,Ø$ÐVbÐefÔVf¬%°	¸LÕ0HÈ3Õ0NÐPQÔ*RÐlpð ð’ð ˜_Õ,÷ 7Ü˜BŸF™F 5¨6¨(Ó3°AÕ6Ó7�Ü˜BŸF™F 5¨C¨5Ó1°!Õ4Ó5�Ø—‘ð 
ô 
ð "Ÿl™l›n�Ø—	‘	”œWŸ_™_¨TÔ2ÀT°Nà"˜G E¨# ;Ð/�à$ aÐ)9¸1¸iÈØ  O°T·_±_ÀUÈEÓ5RÐSTÕ5UðW�à�ä$�AØ �o�CØ  �~×8Ð8°×?Ñ?ÓA�Gð!Ü!%§¢Ø(¬#¨c«(°H¸fØ)¨4Ð1AÀGÀ9Ø*¨Dð-ó "÷ "™6›8ð	 ô
  &Ÿ~™~×5Ñ5Ü#¨&Ø%0´'¸>ÐK]Ð$^Ø#)ð  6ó  ˜ô
 $Ÿ^™^×3Ñ3°DÀ"ÌgÐ3×VÔVÐZ_Ü#'§:¢:¨e¯j©j«lÓ#;˜D÷ Wà"&§(¡(Ð+@À"Ó"E˜Ø#)§:¡:¨g°v·z±zÀ'È2Ó7NÓ#O˜Ø"*§,¡,¨v°rÓ":×">Ñ">¸vÀrÓ"J˜ÝRØ˜M×*±°]Ó1CÕCÓ*ØÐ,×-±Ð5EÓ1FÕFÓ-Ø˜HŸ±°^Ó1DÕD›Ø˜IŸ°·±Ð:PÐRSÓ1T×1YÐ1YÐXYÕY›Ø# qÕ(˜ØŸ™ D×)ñ3 %ð@ ˜]Õ+¨aÔ/ô ˜CÐ 0Õ1°C¸Õ4FÕFÈÕLÈaÔPØ59ð ð ˜{Ø#¨C°Õ,@Ø*¨C°	­NØ!¨C°Õ,>Ø$¨CÐ0@Õ,AØ#¨CØ"¨C°­Mð’ð ˜\Õ)ð  ŸV™V L°2°$Ó7¸Õ:�
Ü  §¡¨°¨xÓ!8¸Õ!;Ó<�Ü  §¡¨°°Ó!6°qÕ!9Ó:�ØŸV™V K°'°Ó;¸AÕ>×DÑDÓF×QÐQÈ'�	ç!Ø#Ð%7Ð8’Dà!& ¨¨c {Ð3�FÜ#ŸzšzØ$¬#¨j«/Ø ¨&Ø%¨$Ø(¨9¨+Ø&¨$ð+ó  ÷ ‘v“xð ð —I‘I”K¤§¡°Ô!6È¸Ü Ÿ.™.×0Ñ0Ü hØ!,¬g°~ÐGYÐ ZØ%ð 1ó �Cô
  Ÿ™×/Ñ/°¸RÌÐ/×QÔQÐUYÜ"Ÿjšj¨¯©«Ó5˜÷ Rð "Ÿg™gÐ&;¸RÓ@�EØ#Ÿi™i¨	°5·9±9¸WÀbÓ3IÓJ�GØ%Ÿk™k¨&°"Ó5×9Ñ9¸&À"ÓE�DØ!Ÿg™gÐ&<¸aÓ@�GåPã#Ø$,×$7Ñ$7¸¸uÓ$EÀaÕ$H�Mð %¬#¨j«/Ø ¨&Ø.°Ø'¨-Ø%©"¨]Ó*;Ø(©"Ð-=Ó*>Ø'©"¨_Ó*=Ø&©"¨^Ó*<Ø(©"Ð-EÓ*FØ$©"Ð-?Ó*@Ø)©"Ð-BÓ*CØ'©"Ð-AÓ*Bð�Dô —:’:˜d¬C¸eÔD×KÑKÈGÓTˆDØ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ�O‰OÔØ×ÑÔØ�J‰J×Ñ˜TÔ"÷ "Ü—‘ Ö%ñ "ùòs Hùò "CùÚ$Qùò@ "Sùò&  Tøô  )ô mÜ!Ð$NÈsÈeÐSUÐVYÐUZÐZ[Ð\_Ð`cÐ[dÐdgÐhiÐgjÐ"k×lÓlûðmüò4 !Wùò  eøôx  )ô xÜ!Ð$QÐRUÐQVÐVZÐ[]ÐZ^Ð^`ÐadÐ`eÐefÐgjÐknÐfoÐorÐstÐruÐ"v×wÓwûðxûô  )ô IÜ!Ð$bÐcfÐbgÐgkÐlnÐkoÐoqÐruÐqvÐvwÐx{Ð|ð  xAð  ADð  EFð  DGð  #H÷  Ió  IûðIüò
"ùó *H÷l W×VÐVûô %ô !ÜÐ EÀaÇeÁeÈGÃnÐEUÐUWÐX]ÐW^Ð^_Ð`eÐfiÐ_jÐjmÐnoÐmpÐqÔrØŸ™ CÔ(Þ ûð!ú÷T R×QÐQûôH ô 	JØ×Ñ˜sÔ#Ø×Ñ˜^Ð-?Ô@Ø�O‰OÔØ×ÑÔØ�J‰J×ÑœTŸZšZ¨×(;Ñ(;¸AÓ(>Ó?×FÑFÓH×IÒIûð	Jû÷ "Ü—‘ Õ%ð "ús>  Á7C6A[ Å-AVÆA(A[ Ç0AVÈA[ È
AVÈ&&A[ ÉA[ É&1A[ ÊBA[ ÌAVÌ23A[ Í%AVÎAVÎA[ ÎAV Î"*A[ Ï$AWÏ0)A[ Ð$AWÐ>AWÑAA[ ÒAA[ Ó3A[ Ô?A[ Õ
A[ ÕA[ ÕAWÕ6A A[ Ö7
A[ ×:A[ ×=A[ Ø AXØAXØ)A[ ÙA[ ÙAYÙ8*AYÚ#AYÚ3AYÛAYÛA[ Û0AY
Û>A	A[ ÝA[ Ý#A A[ Þ$A[ ß +A[ ß,A[ àA3A[ á=A A[ â>BA[ åA[ å7AA[ çAA[ èA[ è:AA[ êEA[ ï!A A[ ð"BA[ ò0A[ óAA[ ôBA[ ö5A[ ÷A[ ÷(
A[ ÷3A[ øHA[ Á@*A[ Á@<BAY%ÁC%AYÁC6CAY%ÁG&AY%ÁG4DA[ ÁK=
A[ ÁLC	A[ ÁO%AZ7ÁO6E0A[ ÁVA[ ÁV AWÁV+AW
ÁWA[ ÁW
AWÁWA[ ÁWAXÁW'AX	ÁXA[ ÁX	AXÁXA[ ÁXAYÁXAX>ÁX7A[ ÁX>AYÁYA[ ÁYAY"ÁY	AY%ÁY%AZ4ÁY08AZ/ÁZ(A[ ÁZ/AZ4ÁZ4A[ ÁZ7A[	Á[	A[ Á[A]0Á[BA]+Á]%A]3 Á]+A]0Á]0A]3 Á]3 A^c                ó¬   <€ R V^ ,          9   g/   \        V4      ^8”  d5   V^,          P                  R4      '       d   \        SV `  ! V.VO5!   R# R# R# )r„   Ú4N)r*   rs   r^   Úlog_message)ra   Úfmtrb   rd   s   &&*€r   r‚  ÚProxyHandler.log_message´
  sG   ø€ Ø˜˜Q�Ô¤C¨£I°¤M°d¸1µg×6HÑ6HÈ×6MÒ6MÜ‰GÒ Ð+ dÖ+ñ 7N¡Mr$   rE  )'Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r_   rn   ru   r   rŠ   r™   r�   r�   r�   r‘   rŽ   r’   rÉ   r{   rN  ÚstaticmethodrQ  rg  r”   r…   r†   r–   r•   rè  r“   r‰   r  r  r  rˆ   r‡   r‚  Ú__static_attributes__Ú__classdictcell__Ú__classcell__)rd   Ú__classdict__s   @@r   r[   r[   x   s  ù‡ € õ9ò/ò
òõò"ò2òFTòR7Tòt<Tò~0JòfbTðJ¨ô òò-ð
 ñAó ðAòEò<;ò>%òPò4;ò|`;òDNò`Eò@Eð0 ñOó ðOð
 ñ3ó ð3ð ñ@ó ð@òP"òfW&÷r,õ ,r$   r[   c                   ó"   € ] tR tRtRtRtRtRtR# )ÚThreadingHTTPServeri¹
  zIServidor HTTP con soporte multi-hilo para atender peticiones en paralelo.TrE  N)r…  r†  r‡  rˆ  Ú__doc__Údaemon_threadsÚallow_reuse_addressrŠ  rE  r$   r   r�  r�  ¹
  s   † ÙSØ€NØÔr$   r�  Ú__main__r   r   u,   âœ…  Servidor corriendo en http://localhost:z1    Dashboard activos:  /dashboard-empleados.htmlz0    Dashboard salarios: /dashboard-salarios.htmlu,       Proxy API:          /proxy/rrhh/... â†’ z	/rrhh/...u2       Proxy histÃ³ricos:   /proxy/historico/salariosz    Ctrl+C para detener.
u   
ðŸ›‘  Servidor detenido.)r¢   rE  )Er�  Úhttp.serverÚhttpÚsocketserverÚurllib.requestr]  Úurllib.errorrÃ   r|   r¶   rI   r7  rv  Úpsycopg2.poolr   r<  r   r   Údatetimer   rj  Ú
app_configr   r   r   r	   r
   r   r   r   r#   r0   ro  rb  rD   Úgetenvr7   r`  rþ  r   r)   r9   r:   rz   r?  rr   Údirnamer‹  Ú__file__r`   Ú	DB_CONFIGrÆ  ÚThreadedConnectionPoolrL   rJ   rK   rY   ÚserverÚSimpleHTTPRequestHandlerr[   ÚThreadingMixInÚ
HTTPServerr�  r…  ÚchdirÚhttpdrÂ   Úserve_foreverÚKeyboardInterrupt)rm   s   0r   Ú<module>r©     s€  ðñó Û Û Û Û Û Û 	Û Û Û Û Û ß +Ý &÷	÷ 	ó 	ò5ô	1ð( 
ˆZˆLØ
ˆUˆGØ
Ð+Ð,ðÐ ñ ‹-€á
ˆ2�9Š9�V˜VÓ$Ó%€Ø
€Ø
€ð —)’)ØØ5ó÷ �eˆCƒjðóñˆð ‡|�|‡~ô €F‡L�L†NññÐ ð —	’	˜/¨2Ó.€ÙÐ6¸Ó=Ð ÙÐ*¨EÓ2€ð
 �G‰G�O‰O˜BŸG™GŸO™O¨HÓ5Ó6€á‹K€	ð �-‰-×
.Ò
.Ñ
R°qÐ
RÀ"Ð
RÈ	Ñ
R€ð ! $¨¨cÐ2Ð ØÐ òô&~(,�4—;‘;×7Ñ7ô ~(,ôBR˜,×5Ñ5°t·{±{×7MÑ7Mô ð
 ˆzÔÙÐ$ mÔ4Ø‡H‚HˆS„MÙ	˜b $˜Z¨×	6Ô	6¸%ÙÐ<¸T¸FÐCÔDÙÐAÔCÙÐ@ÔBÙÐ<¸X¸JÀiÐPÔQÙÐBÔDÙÐ*Ô,ð	0Ø×ÑÔ!÷ 
7Ñ	6ñ ùòkSøðBT !ô 	0ÙÐ.Ö/ð	0ú÷ 
7×	6Ð	6ús6   Â0IÃIÇ-8IÈ&IÉIÉIÉIÉIÉI-	