
    }ii                       S SK rS SKrS SKrS SKJr  S SK	J
r
  S SKJr  S SKrS SKJrJrJrJrJrJrJrJrJr  S SKrS SKJrJrJrJr  S SK J!r!  S SK"r"S SK#r#SSSS	S
SSSSSSSS.r$SSSSSSSS.r%S\&S\'4S jr(S\RR                  S\'4S jr*S\RR                  S\'4S  jr+S! r,S"\RZ                  S\RZ                  4S# jr.S)S$ jr/S%\RZ                  S&\RR                  4S' jr0S( r1g)*    N)MonthEnd)	COLORSPICTON_BLUErender_metricfmt_currencyapply_cabanna_theme_render_var_cardst_card
_fmt_range	_safe_pct)load_comensalesload_foliosFOLDER_ID_FOLIOSFILE_ID)api_getEneFebMarAbrMayJunJulAgoSepOctNovDic)                        	   
         LunesMartes
   MiércolesJuevesViernes   SábadoDomingo)r   r   r   r    r!   r"   r#   xreturnc                    U b0  [        U [        5      (       a  [        R                  " U 5      (       a  g[	        U 5      nU S:  a  SOSnUS:  a  U SUS-  S S3$ US:  a  U SUS-  S S	3$ US
:  a  U SUS
-  S S3$ U SUS 3$ )u   
Formatea una cantidad monetaria en notación de negocio:
- 25,000 -> $25.0K
- 2,500,000 -> $2.5M
- 1,200,000,000 -> $1.2B

Objetivo UX:
- Evitar ejes ilegibles con números largos y acelerar lectura ejecutiva.
 r   - ʚ;$.1fB@B M  Kz.0f)
isinstancefloatnpisnanabs)r1   axsigns      mC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\Proyectos\Cabanna\modules\render_analisis_general.pyfmt_money_abbrevrF      s     	yZ5))bhhqkk	QBa%3RD	]qM)#.a00	YqIc*!,,	U{qE#a((V1RH    tsc                 ^    [         U R                      S[        U R                  5      SS  3$ )u   
Convierte un Timestamp de inicio de mes a etiqueta ejecutiva:
- 2025-01-01 -> "Ene '25"

Objetivo UX:
- Evitar formatos técnicos en eje X y mantener consistencia visual.
z 'N)MES_MAPmonthstryearrH   s    rE   fmt_month_labelrP   /   s/     bhh 3rww<#4"566rG   c                     [         R                  " U 5      n [        U R                  5           SU R                  S S[
        U R                      SU R                   3$ )N 02dz, )pdto_datetimeDOW_MAPweekdaydayrK   rL   rN   rO   s    rE   fmt_fecha_esrY   9   sM    		Bbjjl#$AbffS\GBHH4E3FayQQrG   c                 x    Ub!  [         R                  " U5      (       d  US:X  a  [        R                  $ X-  S-
  $ )Nr   r   )rT   isnar@   nan)currprevs     rE   safe_pctr_   =   s/    |rwwt}}	vvK1rG   	df_foliosc                    U R                  5       n[        R                  " US   SS9US'   US   US'   US   R                  [        5      R                  R                  5       S-   US   R                  [        5      R                  R                  5       -   US	'   UR                  S	S
S9R                  SSS9n[        R                  " US   SS9US'   US   R                  R                  S5      R                  R                  5       US'   U$ )u   
Convierte ventas a nivel línea (df_folios) a nivel ticket (df_tickets).
ticket_id robusto = NombreSucursal|Estacion|Folio
Devuelve un DF con 1 fila por ticket: fecha_ticket, ingreso_ticket, productos_ticket.
Fechacoerceerrorsventas_subtotalIngreso_lineaNombreSucursal|Folio	ticket_idFas_index)rb   min)rg   sum)fecha_ticketingreso_ticketrp   r;   Mes)copyrT   rU   astyperM   stripgroupbyaggdt	to_periodto_timestamp)r`   df
df_ticketss      rE   build_df_ticketsr}   B   s    
	B..GX>BwK./B
 	##C(,,224s:
73##))+	, {O 	

;
/	)3 
 

  "$
>0JS[!\J~">255??DGGTTVJurG   c                     Ub  [         R                  " U5      (       a  g[        X5      n[         R                  " U5      (       d  US:  a  SOSnU US-  S S3$ X-
  nUS:  a  SOSnUS:X  a	  U S	US
 S3$ U US
 S3$ )zPDelta para st.metric: prefiere %; si no hay base, usa abs; si no hay nada, None.Nr   +r4   d   z,.1fz% vs anteriorcurrencyr7   ,.0fz vs anterior)rT   r[   r_   )r]   r^   kindpctrD   absds         rE   fmt_delta_pct_or_absr   b   s    |rwwt}}
4
C773<<QhsBC~]33 ;D!)3Dzqd<00VD;l++rG   r|   mes_selc                    [         R                  " U5      R                  5       R                  SS9nUR                  nX S   U:H     R                  5       nU[         R                  R                  S5      -
  R                  5       R                  SS9nX S   U:H     R                  5       n[        U5      (       a  [        US   R                  5       5      O[        R                  n[        U5      (       a  [        US   R                  5       5      O[        R                  n[        U5      (       a  [        US   R                  5       5      OSn[        U5      (       a  [        US   R                  5       5      OSn	[        U5      (       a<  [        US   R                  5       5      n
[        US   U
:H  R!                  5       5      nO[        R                  Sp[        U5      (       aJ  US   R#                  5       n[        UR$                  US4   5      nUR$                  US4   n['        U5      nO[        R                  Sp[         R(                  " USSS	9nU[         R                  R                  S5      -   nX S   U:  U S   U:  -     n[        U5      (       a  [        US   R                  5       5      O[        R                  n[         R(                  " US-
  SSS	9n[         R(                  " US-
  UR*                  SS	9[         R                  R                  S5      -   nX S   U:  U S   U:  -     n[        U5      (       a  [        US   R                  5       5      O[        R                  nUUUUUU	U
UUUS
.
$ )u]  
Calcula KPIs de tickets:
- Ticket promedio anual (YTD del año de mes_sel) y delta vs año anterior (YTD)
- Ticket promedio del mes_sel y delta vs mes anterior
- Tickets totales del mes_sel y delta vs mes anterior
- Ticket mínimo del mes_sel y cuántos tickets tienen ese mínimo
- Ticket máximo del mes_sel y fecha exacta (Lunes 05, marzo 2025)
r   rX   rr   rq   rk   r   rp   z	Sin datos)rN   rL   rX   )
ticket_avg_ytdticket_avg_ytd_prevticket_avg_mesticket_avg_prevn_tickets_mesn_tickets_prev
ticket_minn_ticket_min
ticket_maxticket_max_fecha)rT   rU   	normalizereplacerN   rs   offsets
MonthBeginlenr?   meanr@   r\   intnuniquern   ro   idxmaxlocrY   	TimestamprL   )r|   r   rN   df_mmes_prevdf_prevr   r   r   r   r   r   idx_maxr   	fecha_maxfecha_max_str	ytd_startytd_enddf_ytdr   ytd_start_prevytd_end_prevdf_ytd_prevr   s                           rE   ticket_metricsr   s   s    nnW%//199a9@G<<D '72388:D"**//22==?GGAGNHE*h67<<>G >AYYU4 016689BFFNADWeG$45::<=SUSYSYO 9<D		C[)1134qM<?LLS-5578aN 4yy4 015578
D!12j@EEGH#%661L 4yy'(//1488G-=$=>?
HHWn45	$Y/$&FFKM $aQ7I..q11GN3y@ZP^E_biEijkF?B6{{U6"2388:;PRPVPVN \\tAvQA>N<<T!V7==aH2::K`K`abKccL8NJzZhOilxOxyzKIL[IYIY%,< = B B DE_a_e_e
 )2(*&( $ ) rG   c                    G^4 [        S5      n [        R                  " U S   5      n[        R                  " U S   5      n[        R                  " U5      (       d  [        R                  " U5      (       a+  [        R
                  " S5        [        R                  " 5         [        [        SUR                  S-   5      5      n[        R                  R                  5       R                  n[        R                  " SS/SS	9u  pVU   [        R                  " S
5        [        R                  " SUR                   SUR                   S35        S S S 5        U   [        R                   " SUXC;   a  UR#                  U5      OSSS9nS S S 5        UR                  nUR                  n	WS-
  U:  a  US-
  OS n
[%        US-
  U5      n[        R                  " USS5      n[        R                  " US-   SS5      n['        X5      nUb  UR(                  (       a2  [        R
                  " SU SU S35        [        R                  " 5         / SQnUR*                  S S 2U4   nUS   nUR-                  5       UR/                  [0        5      R0                  R3                  5       S:g  -  nUR*                  U   n[        R                  " US   SS9US'   [        R4                  " US   SS9R7                  S5      US'   Sn[        R                  " USS5      nXy:X  a  [9        [        R:                  R=                  5       UR;                  5       5      n[        R                  " UR                  UR>                  UR@                  5      [        RB                  " SS9-   nSnO[        R                  " US-   SS5      nS nUS   nUS   nUU:  UU:  -  n[E        UR*                  U   RG                  5       5      nS nU
b  [        R                  " US-
  SS5      nUS:X  a|   [        R:                  " US-
  WR>                  UR@                  5      n[        R                  " UR                  UR>                  UR@                  5      [        RB                  " SS9-   nO[        R                  " USS5      nUU:  UU:  -  n[E        UR*                  U   RG                  5       5      nS n Ub  US:  a  UU-
  U-  n U c  S"OU S# n![        R                  " S$5      u  n"n#U"   [        RJ                  " S%[M        U5      U!S&S'9  S S S 5        Xy:X  Ga  [        R:                  " WR                  UR>                  S5      [        RB                  " S(S9-   RO                  SS)9[        RB                  " SS9-
  n$UU$:X  aO  [        R:                  " UR                  UR>                  S5      [        RB                  " S(S9-   RO                  SS)9n%O,[        R:                  " UR                  UR>                  S5      n%[        R                  " U%R                  U%R>                  U%R@                  5      n&O[        R                  " US-   SS5      n&URQ                  5       (       a  UR*                  U   RR                  R/                  S*5      n'[        RT                  " U'UR*                  U   RW                  S+S,9S-.5      n(U(RY                  S.S+S/9S0   RG                  5       n)[[        U)R\                  S   5      n*U*S:  a  [E        U)S0   R_                  5       5      OSn+OS n)Sn*Sn+U#   [a        S1U*S:  a  [M        U+5      OS2U*S:  a  S3U* S43OS5S69  S S S 5        UbQ  [        R                  " S7WS8 SW[        RB                  " SS9-
  S8 S9US8 SU[        RB                  " SS9-
  S8 35        O3[        R                  " S:US8 SU[        RB                  " SS9-
  S8 35        [        R                  " S;5        UR*                  USS/4   RY                  SS+S/9S   RG                  5       Rc                  SS<0S=9Re                  S5      Rg                  S>S?9n,U,R(                  (       d  U,S   R%                  5       OS n-U,Re                  S5      Rg                  S>S?9n,U,S   R9                  5       n.U,S   R%                  5       n/[        Rh                  " U.U/S@SA9n0U0 V1s/ s H&  n1U1R@                  SB SC[j        U1R>                      3PM(     n2n1[        R                  " S$S/5      u  n3n4U3   U,R(                  (       a7  [        R                  " SD5         [        Rl                  " SE5        S S S 5        GOPU,S<   Ro                  SFSSG9R_                  5       U,SH'   [p        Rr                  " 5       n5U,S    V1s/ s H3  n1U1R@                  SB SC[j        U1R>                      SCU1R                   3PM5     n6n1U5Ru                  [p        Rv                  " U,S   U,S<   SISJU6SKU,S<    Vs/ s H  n[y        U5      PM     sn[{        SL[|        SM   SN9[{        SO[|        SM   SP9SQ9	5        U5Ru                  [p        Rv                  " U,S   U,SH   SRSSU6[{        S$[|        S   STSU9SVU,SH    Vs/ s H  n[y        U5      PM     snSWSX9	5        [        U,5      S:  a  U,S<   R                  5       n7U,S<   R                  5       n8U7SY4U8SZ44 Hn  u  n9n:U5Ru                  [p        Rv                  " U,R*                  U9S4   /U,R*                  U9S<4   /S[U:U: S\[y        U,R*                  U9S<4   5       3/S]S+S^S_95        Mp     [        U,S<   5      (       a"  [E        [        R                  " U,S<   5      5      OSn;[        R                  " SU;S`-  U;Sa-  U;Sb-  U;/5      n<[        R                  " [        R                  " U<S5      5      n<U< Vs/ s H  n[y        U5      PM     n=nU5R                  U<R                  5       U=ScScSd9  U5R                  U0U2Se9  U-R@                  SB SCU-R                  Sf5       SCU-R                   3n>U5R                  SgSh[{        SiSiSjSjSk9[{        SlSSmSnSSo9[{        SpU SqU> 3SSrSsSsS+St[{        SuSv9Sw9/SxSxSySz9  [        R                  " U5S>S{9  S S S 5        U4   UR*                  S S 2SS/4   RY                  SS+S/9S   RG                  5       Rc                  SS<0S=9Re                  S5      Rg                  S>S?9n?U?n@U@R(                  (       a.  [        R                  " S|5        [        Rl                  " S}5        GO[        Rh                  " W@S   R9                  5       U@S   R%                  5       S~S9nAU@R                  S5      R                  UA5      R7                  S5      R                  S5      Rg                  5       Rc                  SS0S=9n@[        R                  " U@S   R%                  5       5      R                  5       nBUB[        R                  " SS9-
  nC[E        U@R*                  U@S   UB:H  S<4   RG                  5       5      nDU@S   UC:H  RQ                  5       (       a.  [E        W@R*                  U@S   WC:H  S<4   RG                  5       5      OSnE[        WDUE5      nF[        WB5      nGW@S   WC:H  RQ                  5       (       a  [        WC5      OSnHWB[        R                  " SOS9-
  nIUBnJUI[        R                  " SS9-
  nKUK[        R                  " SOS9-
  nLW@S   UI:  U@S   UJ:*  -  nMU@S   UL:  U@S   UK:*  -  nN[E        U@R*                  UMS<4   RG                  5       5      nO[E        U@R*                  UNS<4   RG                  5       5      nP[        UOUP5      nQUB[        S5      -   R                  5       nRUBUR:H  nSUS(       a  WBRO                  SS)9nTUBnUUT[        R                  " SS9-
  nVUVRO                  SS)9nW[        UTUU5      nX[        UWUV5      nYW@S   UT:  U@S   UU:*  -  nZU@S   UW:  U@S   UV:*  -  n[[E        U@R*                  UZS<4   RG                  5       5      n\[E        U@R*                  U[S<4   RG                  5       5      n][        U\U]5      n^S+n_GOWBRO                  SS)9n`U`[        R                  " SS9-
  naUaRO                  SS)9nbUb[        R                  " SS9-
  ncUcRO                  SS)9nd[        UbUa5      nX[        UdUc5      nYW@S   Ub:  U@S   Ua:*  -  nZU@S   Ud:  U@S   Uc:*  -  n[[E        U@R*                  UZS<4   RG                  5       5      n\[E        U@R*                  U[S<4   RG                  5       5      n][        U\U]5      n^S>n_UBR@                  neU`nfUBngU`[        R                  " SS9-
  nhUhRO                  SS)9niUi[        R                  " UeS-
  S9-   njU@S   Uf:  U@S   Ug:*  -  nkU@S   Ui:  U@S   Uj:*  -  nl[E        U@R*                  UkS<4   RG                  5       5      nm[E        U@R*                  UlS<4   RG                  5       5      nn[        UmUn5      no[        UfUg5      np[        UiUj5      nq[        S5         [        R                  " S$5      u  nrns[        R                  " S$5      u  ntnuUr   [        SWFSWHWGS9  S S S 5        Ws   [        SWQS[        WLWK5      [        WIWJ5      S9  S S S 5        Wt   [        SW^SWYWXS9  S S S 5        S[        5       ;   a  W_(       a  Wu   [        SWoSWqWpS9  S S S 5        S S S 5        S S S 5        US   U:  nvUR*                  Uv   R                  5       nwUwR(                  (       a  / nxOWwR                  UwS   R                  R                  S5      S9RY                  S.5      S   R                  5       Rg                  SS9nyUyS.   R                  S 5      UyS'   UyUyS   UyS   :     S.   R                  5       nx[        Wx5      S:  Gab  [        R                  " WwS   SS9UwS'   [        R4                  " UwS   SS9R7                  S5      UwS'   UwS   UwS0'   UwS   R                  R                  S5      UwS'   UwRY                  SS+S/9S0   RG                  5       Rc                  S0S0S=9nzUzS   R                  R                  5       UzS'   UzS   R                  R                  S5      UzS.'   UwS   R                  R                  S~5      UwS'   UwRY                  SS+S/9S0   RG                  5       Rc                  S0S0S=9Re                  S5      n{[        R                  " S$5      u  n"n|U"   UzR                  5       n}[        R                  " U}S   SS9n~U~R                  R                  U}S'   U~R                  R                  S5      R0                  R                  5       U}S'   U}S   RG                  5       n[        R                  " US:  U}S   U-  S5      U}S'   U}R                  S SS9U}S'   [        R                  " U}[        R                  " S5      SS/SSSSSS.S9nUR                  U}S   SSS9  [        R,                  " U-5      (       a0  U-R@                  SB SC[j        U-R>                      SCU-R                   3OSn>WR                  SSh[{        SiSiSSSk9[{        SSS9[{        SpU SqU> 3SSSsSsS+St[{        SuSv9Sw9/S9  [        R                  " US>S{9  S S S 5        W|   W{R(                  (       a  [        Rl                  " S5        GO[        Rh                  " W{S   R9                  5       U{S   R%                  5       S~S9nAU{R                  S5      R                  UA5      R7                  S5      R                  S5      Rg                  5       n/ SQGm4/ SQnUS   R                  R                  S5      US'   US   R                  GU44S j5      US'   US   R                  R                  US'   US   R                  [{        [        U5      5      5      US'   URY                  / SQS+S/9S   R_                  5       Rc                  SS0S=9nURe                  SS/5      nUR                  SSSSS9nUR                  US=9nUS   R                  5       nUR                  U5      nSS/S`S/SaS/SbS/SS//n[p        Rr                  " [p        R                  " URR                  UR                  R                  5       UR"                  R                  5       S[{        SS9[        R                  " [x        5      " URR                  5      S[{        SuSSP9S[        R                  " [x        5      " URR                  5      S9
S9n[        R,                  " U-5      (       a0  U-R@                  SB SC[j        U-R>                      SCU-R                   3OSn>WR                  SSh[{        SiSiSSSk9[{        SS9[{        S S+S9S [{        SpU SqU> 3SSSsSsS+St[{        SuSv9Sw9/S9  [        R                  " US>S{9  S S S 5        O,[        Rl                  " SWwS   R                  5       S S35        [        R                  " S;5        [        R                  " S5        US   R                  R                  S5      R                  R                  5       US'    [        R                  " [        R                  S5        XS   R                  R                  U:H     R                  5       nUS   R                  S 5      US'   US   R                  5       R                  5       n[        R                   " SU[        U5      S-
  SSU 3S9nUR*                  US   U:H     R                  S   n[{        [        US   US   5      5      nUS   n[        U5      n[        UU5      nU[        R                  R                  S5      -
  R                  5       RO                  SS)9n[j        UR>                      SUR                   3n[        R                  " S5      u  nnnnU   [        RJ                  " S[j        UR>                      SUR                   3[        R                  " US   5      (       d	  SWS   S 3OS[        WS   US   SS9[        R                  " US   5      (       d  SW SWS   S 3OSS9  S S S 5        W   [        RJ                  " S[j        WR>                      SUR                   3WS   S [        US   US   SS9[        R                  " US   5      (       d  SW SWS   S 3OSS9  S S S 5        W   [        RJ                  " S[j        WR>                      SUR                   3[        R                  " WS   5      (       d	  SWS   S 3OSSWS   S 3S9  S S S 5        W   [        RJ                  " S[j        WR>                      SUR                   3[        R                  " WS   5      (       d	  SWS   S 3OSSWS    3S9  S S S 5        WUS   W:H     R                  5       nUS   R                  R                  5       US'   [        R                  " S$5      u  nnU   URY                  SS+S/9R                  SSS9Re                  S5      nUS   Ro                  SFSS9R_                  5       US'   [p        Rr                  " 5       nURu                  [p        Rv                  " US   US   SISSS95        URu                  [p        Rv                  " US   US   SRS[{        S$S[|        SM   S9SGS GS95        [        U5      (       a  [E        WGS   R_                  5       5      O[        R                  n[        R                  " U5      (       d  WR                  WSGSGSUGS 3GSGS9  [        W5      (       a  WS   R                  5       nUS   R                  5       nUGS4UGS	44 Hh  u  n9n:WRu                  [p        Rv                  " WR*                  U9S4   /UR*                  U9S4   /S[U: GS
UR*                  U9S4   GS 3/S]S+S^GS95        Mj     [        W5      (       a  [%        S[        W5      GS-  5      nUS   R                  S S U2   R                  5       nU V1s/ s H&  n1U1R@                  SB SC[j        U1R>                      3PM(     nn1WR                  GSWUGS9  [        W5      (       a  WS   RR                  O[        R                  " S/5      n[        U5      (       a  [E        [        R                  " W5      5      OSn;[        R                  " [        R                  " [        R                  " SU;S`-  U;Sa-  U;Sb-  U;/5      S5      5      n<WR                  U<R                  5       U< Vs/ s H  n[y        U5      PM     snSe9  WS   R%                  5       n-[        R,                  " U-5      (       a0  U-R@                  SB SC[j        U-R>                      SCU-R                   3OSn>WR                  GSSh[{        SiSiGSSjSk9[{        SlSSmSnSSo9[{        GSU> 3SSrSsSsS+St[{        SuSv9Sw9/GS9  [        R                  " US>S{9  S S S 5        W   SGSGSGSGSGSGS[        R                  /n/ GSQnWR                  5       n[        R                  " UGS   UUS+S>GS9UGS'   URY                  GSS+S/9R                  SSGS9nUGS   RG                  5       n[        R                  " US:  UGS   U-  S5      UGS'   [        R                  " UGS   US>GS9UGS'   URe                  GS5      n[p        Rr                  " 5       nURu                  [p        R                  " UGS   R/                  [0        5      UGS   UGS    Vs/ s H  nUGS -  GS! GS"3PM     snScGS#[        R                  " WGS   R7                  S5      R/                  [Z        5      US   R7                  S5      /SS9GS$95        WR                  SS[9        S[        U5      (       a!  [E        WGS   R%                  5       GS%-  5      OS5      /GS&9  WR                  GS'Sh[{        SiSiGSSjSk9GS(9  WS   R%                  5       n-[        R,                  " U-5      (       a0  U-R@                  SB SC[j        U-R>                      SCU-R                   3OSn>WR                  GSU> 3SSrSsSsS+St[{        SuSv9Sw9  [        R                  " US>S{9  S S S 5        [        R4                  " US   SS9R7                  S5      US'   [        G[         5      nUb  WR(                  (       a.  [        R
                  " GS)5        [        R                  " 5         GOc[        R                  " S;5        [        R                  " GS*5        WS   R9                  5       nUS   R%                  5       n[        GR                  " USS5      n[        GR                  " US-   SS5      [        R                  " SS9-
  nUU:  d  UW:  a  [        GR                  " GS+U GS,35        GO[        GR                  " WS   GR	                  5       R                  5       5      Re                  5       n[        GR                  " US   GR	                  5       R                  5       5      Re                  5       nUR9                  5       UR%                  5       nnUR9                  5       UR%                  5       nn[        GR                  " USS5      n[        GR                  " US-   SS5      [        R                  " SS9-
  nUUU:  UU:*  -     nUUU:  UU:*  -     n[        U5      S:X  a1  [        GR                  " GS-U S435        [        R                  " 5         [        W5      S:X  a1  [        GR                  " GS.U S435        [        R                  " 5         WR9                  5       UR%                  5       nnWR9                  5       UR%                  5       nnUGR                  U5      n[        U5      S:X  aB  [        GR                  " GS/U GS0WS8 SWS8 GS1WS8 SWS8 3
5        [        R                  " 5         WR9                  5       UR%                  5       nn[        R                  " GS2US8 GS3US8 GS435        WGR                  W5      nUGR                  U5      n[        U5      S:  =(       d    [        W5      S:  n[        W5      S:  aO  WR9                  5       nUR%                  5       n[        GR                  " GS5[        U5       GS6US8 SUS8 GS735        [        W5      S:  aN  WR9                  5       nUR%                  5       n[        Rl                  " GS8[        U5       GS9US8 SUS8 GS735        W(       az  [        R                  " SS/5      u  nnU   [        GR                  " GS:GS;GS<9(       a6  [        GR                  GR                  5         [        GR                  " 5         S S S 5        [%        WU5      n[9        WW5      nWUS   U:  US   U:*  -     R                  5       nXS   U:  US   U:*  -     R                  5       nURY                  SS/S+S/9S   RG                  5       nUGR                  U/ GS=Q   SS/GS>GS?9nUS   UGS@   -  UGSA'   [        R                  " US   SS9R                  R                  5       US'   [        R4                  " UGS@   SS9R7                  S5      UGS@'   [        R4                  " US   SS9R7                  S5      US'   US   UGS@   -  UGSB'   [        GR                  UR*                  UGS@   S:*  GSB4'   URY                  SS+S/9R                  GSCGSDGSE9nUS<   UGSF   -  UGSG'   [        GR                  UR*                  UGSF   S:*  GSG4'   [        U5      (       a  [E        WGSF   R_                  5       5      OSn[        W5      (       a  [E        WGSG   R_                  5       5      OSn[        GR                  R=                  5       R                  5       nURO                  SS)9nU[        R                  R                  S5      -   n[%        UW5      n[9        UW[        R                  " SS9-   5      nWUS   U:  US   U:  -     R                  5       nUR                  GSH5      R                  5       n[        U5      (       a  [E        WGSF   R_                  5       5      OSn[        W5      (       a  [E        WGSG   R_                  5       5      OSn[        W5      (       Ga  WS   R                  R                  S5      R                  R                  5       US'   URY                  SS+S/9R                  GSIGSJGSKGSL9Re                  S5      nUGR	                  GSM/GSN9n[        U5      (       a  WR*                  UGSM   R                  5          n[        R                  " US   5      nUR                  GSH5      R                  5       n[E        UGSM   5      n[E        UGSO   5      n[[        UGSP   5      nOS"nSnSnSnOS"nSnSnSn[        R                  " S5      u  nnnnU   [a        GSQWU:X  a  [M        W5      OS"GSRS69  S S S 5        W   [a        GSSWGS GSTS69  S S S 5        W   [a        GSUW 3WU:X  a  [M        W5      OS"GSVS69  S S S 5        W   [a        GSWW 3WGS GSVS69  S S S 5        [        R                  " S5      u  nnnU   [a        GSXW GSYS69  S S S 5        W   [a        GSUW 3US":w  a  [M        W5      OS"GSZS69  S S S 5        W   [a        GSWW 3US":w  a  WGS OS"GS[W S43S69  S S S 5        GS\ n[        R                  " WS   SS9R                  R                  5       US'   US   R/                  [0        5      R0                  RO                  GS]SS>GS^9R0                  R3                  5       R0                  GR                  5       US'   [        R4                  " UGS@   SS9R7                  S5      UGS@'   [        R4                  " US   SS9R7                  S5      US'   UR(                  (       a  / nOWR                  US   R                  R                  S5      S9RY                  S.5      S   R                  5       Rg                  SS9nyUyS.   R                  GS_ 5      UyS'   UyUyS   UyS   :     S.   R                  5       n[        W5      S:  Ga  G[        WS   GR	                  5       R                  5       R                  5       5      nGS`/U-   n[        R                  " S$SO/SS	9u  nnU   [        R                   " GSaUSGSb9nS S S 5        W   [        R                  " GSc5        S S S 5        WR                  5       nWGS`:w  a  WUS   W:H     R                  5       nWR(                  (       a-  [        GR                  " GSd5        [        R                  " 5         WRY                  SS+S/9R                  GSCGSDGSE9nUS<   UGSF   -  UGSe'   [        R                  UR*                  UGSF   S:*  GSe4'   US   R                  R                  S5      US'   US   R                  GU44GSf j5      US'   US   R/                  [0        5      UGSg'   US   R                  R                  US'   US   R                  [{        [        W5      5      5      US'   URY                  / GShQS+S/9GSe   R_                  5       Rc                  GSeGSi0S=9nURe                  GSgS/5      R                  GSgS/SGSi[        R                  S9R                  US=9nURY                  / GShQS+S/9GSF   R_                  5       Rc                  GSFGSi0S=9nURe                  GSgS/5      R                  GSgS/SGSi[        R                  S9R                  US=9n[        R                  " S$5      u  nnUS   R                  5       nG[        UR"                  [        GR                   5      (       a*  WR"                  GR#                  S5      R                  5       n[        R,                  " U-5      (       a0  U-R@                  SB SC[j        U-R>                      SCU-R                   3OSn>W   WR(                  (       a  [        Rl                  " GSj5        GOWRR                  nUR"                  GR#                  S5      R                  5       nUR                  R                  5       n[        R                  " [x        5      " URR                  5      n[p        Rr                  " [p        R                  " UUUW[{        GSkS9US[{        SuSSP9GSlS>GSm9
S9nUR                  GSnW 3Sh[{        SiSiSSSk9[{        SS9[{        S S+S9S [{        SpU SqU> 3SSSsSsS+St[{        SuSv9Sw9/S9  UR                  S+[{        G[$        GR&                  " GSoGSp5      GSq9GSr9  UR                  S+[{        G[$        GR&                  " GSoGSp5      GSq9GSr9  [        R                  " US>S{9  [        Rl                  " GSs5        S S S 5        W   WR(                  (       a  [        Rl                  " GSt5        GOYWRR                  nUR"                  GR#                  S5      R                  5       nUR                  R                  5       n[        R                  " W5      " U5      n[p        Rr                  " [p        R                  " UUUW[{        GSuS9US[{        SuSSP9GSvS>GSm9
S9nUR                  GSwW 3Sh[{        SiSiSSSk9[{        SS9[{        S S+S9S [{        SpU SqU> 3SSSsSsS+St[{        SuSv9Sw9/S9  UR                  S+[{        G[$        GR&                  " GSoGSp5      GSq9GSr9  [        R                  " US>S{9  [        Rl                  " GSx5        S S S 5        WRY                  SS/S+S/9SGS@/   RG                  5       n[        R                  " US   SS9R                  R                  5       US'   [        R4                  " US   SS9R7                  S5      US'   [        R4                  " UGS@   SS9R7                  S5      UGS@'   US   R                  R                  S5      R/                  [0        5      UGSy'   US   R                  R                  UGSz'   US   R                  R>                  US.'   UR                  GS{ SS9US'   UGSyS/   GR)                  5       Re                  GSy5      n[{        [        US   UGSy   5      5      nGS|/US   R                  5       -   n[        R                   " GS}USGS~GS9nUGS|:X  a  WR                  5       nGS|nO!WW   nWUGSy   U:H     R                  5       nUnWR(                  (       a-  [        GR                  " GS5        [        R                  " 5         WRY                  SS+S/9R                  GSCGSDGSGSGSKGS9n[        R                  " UGS   S:  UGS   UGS   -  [        R                  5      UGS'   UGS   UGS'   URO                  [        R                  [        R                  * /[        R                  5      n[        R4                  " UGS   SS9UGS'   URe                  GSS>GS9R                  5       n}[        R                  " S$5      u  nnU   [        GSW GS35         U}R(                  (       d$  W}GS   GR	                  5       R(                  (       a  [        Rl                  " GS5        O[        GR*                  " W}GSSSlU}GS   R                  GS 5      GS9nUR                  GSGS[{        GSoGSq9[{        [|        SO   GSq9GSU}/ GSQ   RR                  GS9  UR                  [{        SiSiSiSiSk9[{        S+GSG[$        GSo   GS9[{        S+S G[$        GSo   GS9GSS+GS9  [        R                  " US>S{9  [        Rl                  " GS5        S S S 5        S S S 5        W   [        GSW GS35         WR                  5       nUUGS   S:     R                  5       nUR(                  (       a  [        Rl                  " GS5        O[        GR,                  " WGSGSGSGSGSG[/        5       ;   a  WO[|        SGSGSGSGS.SSGSS>SSGS.GS9	nUR                  WS   S][{        [{        SGS9GS9GSGS9  UR                  [{        SiSiSiSiSk9GS[{        S+G[$        GSo   GS9[{        S+G[$        GSo   GS9[{        GSS9GS9  [        R                  " US>S{9  [        Rl                  " GS5        S S S 5        S S S 5        O,[        Rl                  " SWS   R                  5       S S35        US   nUU:  UU:  -  nUR*                  USS/4   RY                  SS+S+GS9S   RG                  5       nUR(                  (       a	  SnSWGS'   O8[E        WS   R_                  5       5      nUS:  a  WS   W-
  U-  UGS'   OSWGS'   GS[0        GS[0        4GS jnWS   R                  U5      UGS'   [        R                  " S;5        [        R                  " GS5        [        R                  " S$5      u  nnU   [        GSWR                   35         UR(                  (       a  [        Rl                  " GS5        GOWRe                  SS>GSGS9nUS   RW                  5        Vs/ s H
  nSUGS 3PM     Gn nWGS   RW                  5       GnUS   RW                  5       Gn[        GR*                  " USSSlGU GS9Gn[        GR0                  " GU[        GR2                  " GUW[D        GS9GU/5      GnGUR                  GSGS[{        GSoGSq9[{        [|        SO   GSq9GSGUGS9  GUGR5                  US$ST[|        S   GS9  [        GUUS   R                  5       GU5       GVVVs/ s H:  u  Gnnn[{        [E        GU5      UStGSSOS+UGS [{        US:  a  GSOGSSuGS9GS9PM<     GnnGnnGWR                  GU[{        SiSiSiSiSk9[{        S+G[$        GSo   S GS9[{        S+G[$        GSo   S GS9GSGS9  [        R                  " GUS>S{9  S S S 5        S S S 5        W   [        R                  " GS5        WR(                  (       a  [        Rl                  " GS5        GOzWGnGUGS   RW                  5       n[        R                  " UGS:  GS[        R                  " UGS:*  GSGS5      5      GnGUR                  GUGS9GnSSS$GS.Gn	GUGS   R                  GU	5      GUGS'   GURe                  GSS/S>S+/GS9GR7                  GSS=9GnGSGSGSGS.Gn
[        R                  " S5      n[        GUGR9                  S+GS95       H  u  GnnWGUS-     GnGW
GR'                  UGR:                  GS5      GnGU   [        R                  " GSGU GSUGR<                   GSUGR<                   GSUGR>                  GS GS3	S>GS9  S S S 5        M     S S S 5        [        R                  " GS5        UR(                  (       a  [        Rl                  " GS5        [        R                  " US   R%                  5       5      GnUR                  US   R                  R                  S5      R                  R                  5       S9RY                  S.5      GRA                  5       Rg                  GSS9GnGUS.   [        R                  R                  S5      -   R                  R                  5       GUGS'   GUGUGS   GUR                  5       :*     R                  5       nxUxRe                  S.S>GS9nxUxR(                  (       a  [        Rl                  " GS5        WxUxS.   R                  R                  U:H     R                  5       GnGW[        R                  R                  S5      -   R                  5       GnGUR                  5       GU:  a  [        R                  " GS[j        GWR>                      SGUR                   GSGUS8 GS35        WxS.   Re                  S+GS9GRC                  S5      R                  5       GnSGnGS[        GR                  GS[0        4GS jGn[        R                   " GSGUGUGUGSGS9GnOeGWS.   Re                  S+GS9R                  5       GnSGnGS[        GR                  GS[0        4GS jGn[        R                   " GSGUGUGUGSGS9GnGWnbUb[        R                  R                  S5      -   R                  5       naUb[        R                  " SS9-
  R                  5       ncUcRO                  SS)9ndUS   R                  R                  S5      R                  R                  5       US.'   URY                  S.S/S+S/9S   RG                  5       Rc                  SS0S=9GnGUS.   Ub:  GUS.   Ua:*  -  GnGUS.   Ud:  GUS.   Uc:*  -  nGUR*                  GU   RY                  SS+S/9S   RG                  5       Rc                  SGS0S=9GnGUR*                  U   RY                  SS+S/9S   RG                  5       Rc                  SGS0S=9GnGUR(                  (       a,  [        Rl                  " GS5        [        R                  " 5         GWGR                  GWSGSGS?9R7                  S5      Gn[%        GUGS   S:  RG                  5       S5      Gn[%        GUGS   S:  RG                  5       S5      GnGUGS   RG                  5       GU-  GnGUGS   RG                  5       GU-  GnGUGS   GU:  RG                  5       GnGUS:  a  GWGW-
  GU-  OS n [        R                  " S5      u  nnnnU   [        RJ                  " GSSGWS 3U c  S"OU S# GS9  S S S 5        W   [        RJ                  " GSGWS 5        S S S 5        W   [        RJ                  " GSSGWGS   RG                  5       S 35        S S S 5        W   [        RJ                  " GSSGWGS   RG                  5       S 35        S S S 5        GWRe                  GSS+GS9GRC                  S5      Gn GURe                  GSS+GS9GRC                  S5      Gn![        R                  " S$5      u  n"n|U"   [        R                  " GSWbR                  GSH5      R                  5        GS735        [        GU GR9                  5       S5       HE  u  GnGn"[        R                  " GSGU GSGU"GR<                   GSGU"GRD                  GS 35        MG     S S S 5        W|   [        R                  " GSWdR                  GSH5      R                  5        GS735        [        GW!GR9                  5       S5       HE  u  GnGn"[        R                  " GSGU GSGU"GR<                   GSGU"GRF                  GS 35        MG     S S S 5        [        R                  " S$5      u  n"n|U"   [        GS5         GWRe                  GSS+GS9Gn#SiGn$[        GU#5      GU$:  al  [        RT                  " GS/GW#GS   R                  GW$S  RG                  5       /GS.5      Gn%[        GRH                  " GU#GRC                  GU$5      GU%/S>GS9Gn#[        GRJ                  " GW#SGSS[|        S S GS2   GS9Gn&GU&R                  GSGSGSGS9  GU&R                  S+GS9  GSWbR                  GSH5      R                  5        3Gn'[        R                  " G[M        GU&GU'5      S>S{9  S S S 5        S S S 5        W|   GWR                  5       Gn(GU(GS   GU(GS   -
  GU(GS'   GU(R                  GS SS9GU(GS'   GU(Rc                  GSaGSWbS 3GSWdS 3GSGS .S=9Gn)[        GRN                  " GU)GRP                  GRS                  GSUbS 3GSGSUdS 3GSGSGSGSGS05      S>S{9  S S S 5        [        R                  " GSWbR                  GSH5      R                  5        GS35        UR(                  (       a,  [        Rl                  " GS5        [        R                  " 5         / GSQnUS   nUWb:  UWa:*  -  Gn*UR*                  GU*U4   Gn+GU+R(                  (       a,  [        Rl                  " GS5        [        R                  " 5         [        R4                  " GW+S   SS9R7                  S5      GU+S'   GU+R                  GU+S   R                  R                  GS5      R                  GRT                  GS9Gn+GU+RY                  SGS	/S+S+GS9S   RG                  5       Rc                  SGS
0S=9Gn,GU,RY                  SS+S+GS9R                  GSGSGSGS9nUGS   RW                  5       Gn-UGS   RW                  5       Gn.[        GRV                  " GU.GU-[        GRX                  " GU.[D        GS9GU-S:  GS9Gn/GU/UGS'   UR7                  S5      n[        R                  " S$5      u  Gn0Gn1GU0   URe                  GSS>GSGS9Gn2[        GR*                  " GU2GSSSlGU2GS   RW                  5        Vs/ s H  nUGS PM
     snGS9Gn3GU3R                  GSGS[{        GSoGSq9[{        [|        SO   GSq9GW2GS/   RW                  5       GSGS9  GU3R                  GS[{        GSG[$        GSo   S+GSGS9[{        S G[$        GSo   S+GS9GSGS9  [        R                  " G[M        GU35      S>S{9  S S S 5        GW1   [        GR,                  " WGSGSSGSGSGS.GS9nUR                  [{        Si[|        SO   SP9S]GSGS 9  UR                  GS![{        G[$        GSo   S+GS"9[{        G[$        GSo   S+GS"9GSGS9  [        R                  " G[M        U5      S>S{9  [        Rl                  " GS#5        S S S 5        g ! , (       d  f       GRN= f! , (       d  f       GQN= f! [H         a)    [        R:                  " US-
  WR>                  S!5      n GONYf = f! , (       d  f       GNNw= f! , (       d  f       GLNF= fs  sn1f ! , (       d  f       GFN= fs  sn1f s  snf s  snf s  snf ! , (       d  f       GGN= f! , (       d  f       GAN= f! , (       d  f       G@N= f! , (       d  f       G@N= f! , (       d  f       G@N= f! , (       d  f       G@N= f! , (       d  f       G@N= f! , (       d  f       G=N= f! , (       d  f       G9N= f!    [        R                  " [        R                  S5         G9N=!     G9NC= f= f! , (       d  f       G7NV= f! , (       d  f       G6N= f! , (       d  f       G6N= f! , (       d  f       G6N,= fs  sn1f s  snf ! , (       d  f       G1N= fs  snf ! , (       d  f       G/N$= f! , (       d  f       G)N= f! , (       d  f       G%N#= f! , (       d  f       G%N= f! , (       d  f       G%N = f! , (       d  f       G$N= f! , (       d  f       G$N= f! , (       d  f       G$N= f! , (       d  f       G$N= f! , (       d  f       G"N= f! , (       d  f       G"N}= f! , (       d  f       GN= f! , (       d  f       GN = f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GNe= fs  snf s  snnGnf ! , (       d  f       GN]= f! , (       d  f       GNg= f! , (       d  f       GMJ  = f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       G
N= f! , (       d  f       G
N= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN= fs  snf ! , (       d  f       GN= f! , (       d  f       g = f($  Nz/ventas/minmax	fecha_minr   z8No se pudo interpretar fecha_min/fecha_max desde la API.i  r   r    bottom)vertical_alignmentu   ## Análisis general CabannazDatos disponibles de z a u   . El análisis principal está optimizado a partir de 2017; periodos anteriores requieren un análisis histórico especializado.u   Seleccionar Añor   	collapsed)optionsindexlabel_visibilityz3**Sin datos para el rango seleccionado**

Rango: **u    → u   **

Acción sugerida:
- Verifica que `/etl/folios` haya cargado ese periodo.
- Revisa si la API está devolviendo 0 filas para ese rango.)rb   rj   rf   rh   rh   r4   rb   rc   rd   rf   g        z#Base de datos en servidores Cabanna)daysYTDu   Año completo   NAz+.2%r   zVentas (SubTotal)u_   Suma de Cant × PU (sin deducir descuentos ni impuestos). Delta vs periodo anterior comparable.)labelvaluedeltahelp    r   zdatetime64[M]F)rs   )mesingreso_folior   rl   r   zIngreso promedio mensualzMes en cursozQPromedio del ingreso mensual considerando solo meses completos. Meses incluidos: .uS   El mes actual aún no está completo, por lo que no se calcula el promedio mensual.)	help_textzPeriodo anterior: z%d/%m/%Yz - 
Periodo actual: uA   Periodo anterior: NA (primer año disponible) - 
Periodo actual: z---
ventas_dia)columnsT)drop   )startendperiodsrS   r5   z### Ventas diarias (SubTotal)z#No hay datos diarios para graficar.r$   )windowmin_periodsma7zlines+markerszVentas diariasz=Fecha: %{customdata}<br><b>Ventas: %{text}</b><extra></extra>g      @r"   )widthcolorr#   )sizer   )	r1   ymodename
customdatahovertemplatetextlinemarkerlinesu   Media móvil 7 díasdash)r   r   r   z:Fecha: %{customdata}<br><b>MA7: %{text}</b><extra></extra>g?)	r1   r   r   r   r   r   r   r   opacityu   Máximou   Mínimozmarkers+textz: z
top centerskip)r1   r   r   r   r   textposition
showlegend	hoverinfog      ?g      ?g      ?outside)tickvalsticktextticksticklabelposition)r   r   z%bu)   Ventas diarias (con media móvil 7 días)i  r'   <   )lrtbhgRQ?right)orientationyanchorr   xanchorr1   zFuente: z
 | Corte: gɿpaperleftr)   )r   )r   r1   r   xrefyref	showarrowalignfontzrgba(0,0,0,0)z	x unified)titleheightmarginlegendannotationsplot_bgcolorpaper_bgcolor	hovermode)use_container_widthz### Variaciones de ventasz3No hay datos suficientes para calcular variaciones.D)freqr   u   —u   Día vs Día anterioru.   Incremento de ventas respecto al día anterior)titulor   leyendarango_actualrango_anteriorzSemana vs Semana anterioru'   Últimos 7 días vs los 7 días previoszMes vs Mes anteriorz%Mes completo vs mes completo anteriorshow_partial_metriczPeriodo en curso del mesu4   Del 1 al día actual vs mismo rango del mes anteriorr;   )r   dias_con_datos)r   c                 8    U R                  S5      R                  $ Nr;   rz   rX   ps    rE   <lambda>)render_analisis_general.<locals>.<lambda>  s    annS)--rG   dias_calendario
mes_periodingresomes_dtz%Y-%m	fecha_diarN   z%b %Y	mes_labelparticipacionc                 D    U S    S[        U S   5       SU S   S-  S S3$ )Nr  z<br>r  r  r   r8   %)rF   r   s    rE   r	  r
  6  s8    ~&d')56d)#-c2!5rG   )axisLabelu   Todos los añosBluesz:,.0fz:.1%)r  r  )pathvaluesr   color_continuous_scale
hover_datar   uY   <b>%{label}</b><br>Ingreso: $%{value:,.0f}<br>Participación: %{color:.1%}<extra></extra>)r   textinfor   u"   Participación de ingresos por mes   7   u   Participaciónz.0%)r   
tickformatg
ףp=
ǿ)r   r   r   coloraxis_colorbarr   z/No hay datos diarios para construir el heatmap.)EneroFebreroMarzoAbrilmayoJunioJulioAgosto
SeptiembreOctubre	Noviembre	Diciembre)r*   r+   r,   r-   r.   r/   r0   c                 b   > TU R                   S-
     R                  5        SU R                   3$ Nr   rR   )rL   
capitalizerN   r  MESES_ESs    rE   r	  r
    s5    8TUT[T[\]T]K^KiKiKkJmmnopouounvHwrG   dow_idx	dow_label)r  r  r2  r3  promedio)r   r   r  
fill_valuez#b8e3ffz#78cdffz#38b6ffz#007aceg      ?z#062b4bz
Promedio $)r   z%{text}blackzL<b>%{y}</b><br>%{x}<br>Promedio ingreso: <b>%{customdata}</b><extra></extra>)
zr1   r   
colorscalecolorbarr   texttemplatetextfontr   r   )datau4   Promedio de ingresos por día de la semana (por mes)reversed)	autorange)r   showgrid)r   r   r   yaxisxaxisyaxis_titler   u   **Análisis mensual no disponible aún**

Para construir este análisis se requiere al menos **un mes completo de información**.

**Estado actual:**
- Días con datos: **,uk   **
- Meses completos disponibles: **0**

Este panel se habilitará automáticamente cuando el mes concluya.u   ## Análisis de Ticketsrr   es_MXzSpanish_Mexico.1252c                 F    [         U R                      SU R                   3$ NrR   )rK   rL   rN   )ds    rE   r	  r
    s    '!'':J9K1QVVH7UrG   MesLabelmes_kpi_)r   r   r   keyrR   r!   zTicket promedio  r   r7   z,.2fr   r   )r   zTicket promedio mes anterior (z): $zSin datos del mes anterior.)r   r   zTickets totales  r   r   r   zMes anterior (z): u   Ticket mínimo r   u!   Tickets con el mínimo este mes: r   )r   u   Ticket máximo  r   u   Fecha del ticket máximo: r   rp   Dia)rq   r   )rk   r   )ticket_promedio	n_ticketsrL  )r   MA_7DzTicket promedio diarioz1%{x|%d-%b-%Y}<br><b>$%{y:,.0f}</b><extra></extra>)r1   r   r   r   r   zTendencia (MA 7D)dot)r   r   r   g?z:MA 7D<br>%{x|%d-%b-%Y}<br><b>$%{y:,.0f}</b><extra></extra>)r1   r   r   r   r   r   r   rq   g?zPromedio mes: $r   ztop left)r   	line_dashr   annotation_textannotation_positionu   Máxu   Mínz: $)r1   r   r   r   r   r   r   r%   array)tickmoder   r   u+   Ticket promedio por día (mes seleccionado)(   z5Fuente: Base de datos en servidores Cabanna | Corte: )r   r   r   r   r      i  r<   i  i  i'  )u   $0–199u
   $200–499u
   $500–999u   $1,000–1,999u   $2,000–4,999u   $5,000–9,999z$10,000+)binslabelsr   include_lowestrango)rM  rL  rM  r   )
categoriesorderedr   r8   r  u   <b>%{x}</b><br>Participación: %{y:.1%}<br>Tickets: %{customdata[0]:,}<br>Ticket promedio: $%{customdata[1]:,.0f}<extra></extra>)r1   r   r   r   r   r   g      ?)r  rangeu-   Participación de tickets por rangos de gasto)r   r   r   z3Datos de comensales no disponibles en este momento.z### Ingreso por comensalu   Para el año **u]   ** no contamos con comensales por sucursal.

Ajusta el filtro de año para ver esta sección.zNo hay comensales dentro de zNo hay ventas dentro de z8No hay fechas coincidentes entre comensales y ventas en z.

Comensales: z	
Ventas: u/   Esta sección solo considera las fechas del  **z al z** u8   ⚠️ **Faltan el dato de número de comensales** para u0    fechas donde sí hay ventas. Rango faltante: **z**u   ℹ️ **Faltan ventas** para u4    fechas donde sí hay comensales. Rango faltante: **u   🔄 Actualizar comensalesbtn_refresh_comensales_global)rJ  )rb   rh   
comensalesinner)onhowr_  ingrteso_comensalingreso_comensal)rf   ro   )r_  ro   )r   comensales_diare  ingreso_comensal_diaz%B %Y)rf  r   )re  r   )rb   r   )ingreso_com_promcomensales_promdiasrg  )subsetrh  ri  u   Ingreso/comensal (día)uS   Promedio diario de (Ingreso del día / Comensales del día) para el rango aplicado.u   Comensales prom./díauI   Promedio diario de comensales (suma red por día) para el rango aplicado.u   Ingreso/comensal — zMes calendario actualu   Comensales/día — zMejor mes (Ingreso/comensal)u<   Mes del año con mayor ingreso promedio diario por comensal.z=Promedio diario de ingreso por comensal dentro del mejor mes.uE   Promedio diario de comensales dentro del mejor mes. Días con datos: c                      [         R                  " U 5      (       a  g[        U 5      n [        U 5      nUS:  a	  U S-  S S3$ US:  a	  U S-  S S3$ US:  a	  U S-  S S3$ U S	 $ ! [         a     gf = f)
Nr4   r6   r8   r9   r:   r;   r<   kr   )rT   r[   r?   rB   	Exception)r1   rC   s     rE   
_fmt_short+render_analisis_general.<locals>._fmt_short  s    wwqzz!aAQB]*"#M/#!6a88Y"#I+c!2!44U{"#E'#a00X&  s(   A% $A% A% A% !A% %
A21A2z\s+)regexc                 8    U R                  S5      R                  $ r  r  r  s    rE   r	  r
  C  s    annS155rG   TODASSucursal)r   r   z;Selecciona una sucursal o 'TODAS' para ver la red completa.u'   No hay datos para la selección actual.ingreso_por_comensalc                 F   > TU R                   S-
      SU R                   3$ r.  )rL   rN   r0  s    rE   r	  r
  r  s-    S[\]\c\cde\eSfRgghijioiohpPqrG   mes_sort)r  rv  r  r2  r3  valorzANo hay suficientes datos para el heatmap de ingreso por comensal.z$ / comensalzG<b>%{y}</b><br>%{x}<br>$ por comensal: <b>$%{z:,.2f}</b><extra></extra>)
r7  r1   r   r8  r9  r   r:  r;  r   	showscaleu)   Ingreso promedio por comensal (día) — whitez#ddd)r   )r?  tickfontu   Cómo leer: cada celda muestra el **promedio diario de $ por comensal** para ese **mes** y **día de la semana**. Más oscuro = mayor ingreso por comensal.z7No hay suficientes datos para el heatmap de comensales.
ComensaleszK<b>%{y}</b><br>%{x}<br>Comensales promedio: <b>%{z:,.0f}</b><extra></extra>u,   Comensales promedio por día (por mes)  — u   Cómo leer: cada celda muestra el **promedio diario de comensales** para ese **mes** y **día de la semana**. Más oscuro = más comensales.mes_keyanioc                 *    [         U S       SU S    3$ )Nr   rR   r}  )rK   r  s    rE   r	  r
  4  s"    GAeHDUCVVWXYZ`XaWbAcrG   zTodo el periodou"   Periodo (aplica a ambas gráficas)filtro_periodo_comensales)r   r   rJ  z*No hay datos para el periodo seleccionado.)rf   r   )r_  r   )ingreso_totalcomensales_totalingreso_prom_diacomensales_prom_diari  r  r  
eficienciaingreso_x_comensal)	ascendingu*   $ promedio por comensal — por sucursal ()z2No hay datos suficientes para calcular $/comensal.c                 H    [         R                  " U 5      (       a  S$ SU S 3$ )Nr4   r7   r   )rT   r[   )vs    rE   r	  r
    s,    VXV]V]^_V`V`PRPrhijklpiqfrPrrG   )r1   r   r   r   insidemiddleu   Sucursal: %{y}<br>$/comensal (periodo): $%{x:,.2f}<br>Ingreso total: $%{customdata[0]:,.0f}<br>Comensales total: %{customdata[1]:,.0f}<br>Días: %{customdata[2]:,}<extra></extra>)r  r  ri  )r   insidetextanchorr;  r   r   r   zIngreso por comensal ($))r?  r   r   i  )r   rA  r@  r   r   u   Cómo leer: cada barra es una sucursal. La longitud representa el **$ promedio por comensal del periodo seleccionado** (Ingreso total / Comensales totales).u(   Comensales vs Ingreso — por sucursal (z3No hay datos suficientes para construir el scatter.r  r  r8  u   Comensales promedio por díau   Ingreso promedio por díazEficiencia ($/comensal))r  r  r  z:,.2f)r  r  r  ri  r  r  )r1   r   r   r   r  
hover_namerX  r  )r   )r   u   <b>%{hovertext}</b><br><br>Comensales prom/día: %{x:,.0f}<br>Ingreso prom/día: $%{y:,.0f}<br>Eficiencia ($/comensal): $%{marker.color:,.2f}<br>Ingreso total (tamaño): $%{marker.size:,.0f}<extra></extra>)r   r   r   r   )r?  r   z
$/comensal)r   r   rA  r@  r   uA  Cómo leer: cada punto es una sucursal. **Más a la derecha** = más comensales promedio por día. **Más arriba** = más ingreso promedio por día. **Tamaño** = ingreso total del periodo (sucursales más grandes venden más). **Color** = eficiencia ($ por comensal): tonos más altos indican mejor ingreso por comensal.)rm   sortpct_vs_promr1   r2   c                     U c  g[        U 5      R                  5       R                  5       nSR                  S [        R
                  " SU5       5       5      nU$ )Nr4   c              3   `   #    U  H$  n[         R                  " U5      (       a  M   Uv   M&     g 7f)N)unicodedata	combining).0cs     rE   	<genexpr>=render_analisis_general.<locals>._norm_key.<locals>.<genexpr>  s"     `?!{G\G\]^G_AA?s   .	.NFKD)rM   ru   upperjoinr  r   )r1   ss     rE   	_norm_key*render_analisis_general.<locals>._norm_key  sH    9FLLN  "GG`{44VQ?``rG   sucursal_keyu   ## Análisis de sucursalu$   Ingresos por sucursal en el año en z&No hay datos de ingresos por sucursal.	mergesort)r  r   )dtypezSucursal: %{y}<br>Ingreso: $%{customdata[0]:,.2f}<br>Promedio red: $%{customdata[1]:,.2f}<br>% vs promedio: %{customdata[2]:+.2%}<extra></extra>)r1   
line_widthrP  
line_colorz+.1%z#22c55ez#ef4444)r   r   )r1   r   r   r   xshiftr   r   r   )r?  r   r   )r   r   rA  r@  r   u@   **Semáforo de desempeño por sucursal (vs promedio de la red)**z$No hay datos mensuales por sucursal.g?VerdegRojoAmarillo)status)r  r  r  r  _ordz#eab308)r   z#cfcfcfai  
                        <div style="background:#0b0b0b;border:1px solid rgba(212,175,55,.18);
                                    border-radius:12px;padding:10px 12px;margin-bottom:10px;">
                        <div style="display:flex;align-items:center;gap:8px;">
                            <div style="width:10px;height:10px;border-radius:50%;background:a  ;"></div>
                            <div style="
                                font-weight:500;font-size:0.8rem;line-height:1.2;
                                white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;
                            " title="z#">
                                z
                            </div>
                        </div>
                        <div style="color:#cfcfcf;font-size:.9rem;margin-top:6px;">
                            % vs prom: zW
                        </div>
                        </div>
                        )unsafe_allow_htmlu0   ### KPIs del último mes completo (por sucursal)z*No hay datos de folios para calcular KPIs.n	month_endu@   Aún no hay meses cerrados completos disponibles para análisis.z**Nota:** El mes actual (**u+   **) aún no está cerrado (último dato: **uZ   **). Para mantener comparaciones consistentes, esta sección usa **solo meses completos**.rH   c                 r    [         R                  " U 5      n [        U R                      SU R                   3$ rF  rT   rU   rK   rL   rN   rO   s    rE   fmt_mes_abrev.render_analisis_general.<locals>.fmt_mes_abrev  /    #Bbhh'("''33rG   u   Mes de análisis (Cierre)mes_kpi_sucursal)r   r   format_funcrJ  c                 r    [         R                  " U 5      n [        U R                      SU R                   3$ rF  r  rO   s    rE   r  r    r  rG   ing_lasting_prevu9   No hay datos del último mes completo para calcular KPIs.outerzIngreso promedio por sucursal)r   zSucursales arriba del promediou   Total red — último mesu   Total red — mes anterioru   **Top 3 — z- **z. u   ** — $u=   Distribución del ingreso por sucursal (último mes completo)Otros)rh   r  )ignore_index)namesr  holecolor_discrete_sequencezpercent+labelz<Sucursal: %{label}<br>Ingreso: $%{value:,.2f}<extra></extra>)r   r  r   )r   u   Distribución de ingreso —    Δc                 .    U S   S:  a  U S   U S   -  $ S $ )Nr  r   r   r  s    rE   r	  r
  	  s&    a
mVWFW!D'AjM*A)a]a)arG   u   %ΔzIngreso Delta)rh   r  r  r  z${:,.2f}z{:+.2%}u3   Índice de estabilidad por sucursal (CV semanal en z6No hay datos suficientes para calcular la estabilidad.)rb   rh   rf   z.No hay datos en el rango semanal seleccionado.zW-MON)semanar  ingreso_sem)r  r   )r  std)r  count)mediar  semanasr  r  )outwherecvz.2fr  z_Sucursal: %{y}<br>CV semanal: %{x:.2f}<br>Semanas analizadas: %{customdata[0]:,}<extra></extra>)r   r  r;  r   r   r   u:   Estabilidad semanal por sucursal (menor CV = más estable)u   Coeficiente de Variación (CV))r   r   r?  r  )r   r   r?  )r   rA  r@  r   zIngreso promedio semanal)r  r  )r1   r   r   rX  z`Sucursal: %{text}<br>Ingreso promedio semanal: $%{x:,.2f}<br>CV semanal: %{y:.2f}<extra></extra>)r   r   r   z'Ingreso promedio semanal vs estabilidad)r   r?  u{  - Cada punto es una sucursal.
- Eje X: **Ingreso promedio semanal**.
- Eje Y: **CV semanal (volatilidad)**.

**Lectura por cuadrantes:**
- 🟢 Derecha–Abajo: alto ingreso y alta estabilidad (mejor desempeño).
- 🟡 Derecha–Arriba: alto ingreso pero inestable.
- 🔴 Izquierda–Arriba: bajo ingreso y alta volatilidad.
- 🔵 Izquierda–Abajo: bajo ingreso pero estable.)r   rT   rU   r[   sterrorstoplistr]  rN   rx   datetimenowr   markdowncaption	selectboxr   maxr   emptyr   notnart   rM   ru   
to_numericfillnarn   datetodayrL   rX   	timedeltar?   ro   
ValueErrormetricr   r   anyr  	DataFrameto_numpyrv   r   shaper   r   renamesort_valuesreset_index
date_rangerK   inforollinggoFigure	add_traceScatterrF   dictr   r   r   idxminr@   nanmaxrS  uniqueroundupdate_yaxestolistupdate_xaxesstrftimeupdate_layoutplotly_chart	set_indexreindexrename_axisr   	Timedeltar   r   r   r
   r	   localsrs   assignry   r   applyrz   floorr/  r  pxtreemapConstantupdate_traces	dayofweekmap	enumeratepivot_tableHeatmap	vectorizelocale	setlocaleLC_TIMEiloczipr}   r   r   r   r   rw   r\   rA   	add_hlineinfcutCategoricalBarstackadd_annotationr   r   r   warningDatetimeIndexdropnaintersection
differencebutton
cache_dataclearrerunmerger   r  sortedr>   
MultiIndexget_level_valuesr   getdrop_duplicatesbarscatterglobalscolumn_stack	full_like	add_vliner   
itertuplesr  rh   r  r   headr  r  concatpier   	dataframestyleformat
start_timedivide
zeros_like(5  mmr   r   anios_disponiblesanio_actual
col_titulocol_selectorr}  min_yearmax_year	anio_prevanio_iniini_qfin_qr`   cols_needednsmask_nsfuenteini_curfin_realfin_cur	modo_compfr  mask_curventas_totalventas_previni_prevfin_prev_dayfin_prev	mask_prevpct_vs_prev	delta_strc1c5last_day_of_monthcutoff_monthcutoff_month_dt	month_keytmpingreso_mensualmeses_incluidosingreso_prom_mensualdf_ventas_diariascortemin_datemax_date
puntos_ejerG  
textos_ejecol1col2fig_linefechas_formateadas_esr   idx_minidxtagy_maxr   r   	corte_strdf_comparacion_periodosr  full_idxlast_dayprev_day
ventas_hoyventas_ayerpct_diarango_dia_actualrango_dia_anteriorsemana_actual_inisemana_actual_finsemana_prev_finsemana_prev_inimask_sem_actmask_sem_prevventas_sem_actventas_sem_prev
pct_semanar  is_full_monthmes_act_inimes_act_finmes_prev_finmes_prev_inirango_mes_actrango_mes_prevmask_mes_actmask_mes_prevventas_mes_actventas_mes_prevpct_mesr  mes_act_ini_reallast_full_endlast_full_iniprev_full_endprev_full_inirl  partial_act_inipartial_act_finprev_month_endpartial_prev_inipartial_prev_finmask_par_actmask_par_prevventas_par_actventas_par_prevpct_parcial_mesrango_parcial_actrango_parcial_prev	row1_col1	row1_col2	row2_col1	row2_col2	mask_plotdf_plotmeses_completosdias_por_mes
df_monthlyddfc2df_bardt_mes	total_ingfig_treeddf2DIAS_ESgrppivotordered_monthsr8  fig_heatkpis_yrX  mes_label_selrowmes_label_mapr   r|   tmr   mes_prev_labelk1k2k4k5df_tickets_mesc1_1c2_1dailyfig	month_avgi_maxi_mineveryxvalsxtextr   rW  df_bdisttotalr  df_comensalescom_mincom_maxanio_fin
fechas_com
fechas_vencom_min_2025com_max_2025ven_min_2025ven_max_2025y_iniy_fin	fechas_okok_minok_maxfaltan_comensalesfaltan_ventasmostrar_btnini_ffin_fcbtn1cbtn2	rango_ini	rango_findf_com_rangodf_folios_rangodf_ventas_diarias_sucdf_mergedf_dailyr  ingreso_prom_dia_por_comhoymes_cur_inimes_cur_finmes_cur_ini_effmes_cur_fin_eff
df_mes_curmes_cur_labelcomensales_prom_dia_mesingreso_prom_dia_por_com_mesmonthlybest_rowbest_mesbest_mes_labelbest_ingreso_com_diabest_comensales_dia	best_diask3k6k7rn  meses_completos_csucsopcionescol_sel1col_sel2suc_seldf_basegrp_ing	pivot_inggrp_com	pivot_comc_comsnales_1c_comsnales_2ordered_mes_labelsr7  rowscolsr   
fig_heat_1
fig_heat_2	meses_cat	MAP_MESESopciones_ui	filtro_ui
df_daily_f
filtro_txtr|  df_succ_comsnales_3c_comsnales_4fig_bardf_scfig_sc
df_suc_totprom_redr  c3_1df_bars
text_montopct_valsventas_valsfig_sucr   r1   r   df_semr  order	color_mapir  rO  last_day_datameses_disponiblesmeses_completos_ymonth_end_datalista_opcionesdefault_idxr  mes_selemonthly_suc	mask_lastlast_by_sucprev_by_sucmerged
n_suc_last
n_suc_prevavg_lastavg_prevsuc_arriba_promtop_lasttop_prevr   pie_dfNotrosfig_pier   detshow
mask_rangedf_wweeklyr  r  r  c1sc2srankfig_cvr1  s5                                                                                                                                                                                                                                                                                                                      @rE   render_analisis_generalr@     sQ    
!	"Br+/Ir+/I 
wwyRWWY//
KL
	 U4!);<=++//#((K!zz1a&XNJ	
23


#INN#33y~~6F GS T	
 
 
||%:E:Z#))+6`a(	
 
 ~~H~~H#axH4$ID1Hh'HKK!Q'EKKq!Q'EE)IIOO
weE7 +KK	
 		 IKan-I 
#	$BhhjBIIcN..446"<=Gg&I 	'(:8LIg $&==;L1MV^#_#f#fgj#kI 2F kk$1%Grww}}	(89++hmmX^^X\\JR\\_`Maa	++dQh1-#	 	'A#$AWW-Hx,,./L K;;taxA.E!wwtaxN {{<#4#4l6H6H,JZJZ[^`^j^jpq^rrH{{4A.H(]q8|4	AEE),0023 KkAo#k1[@#+K3EI JJqMEBr	
		%|,r		
 
<  GGHMM8>>15ll#$
'a'.2<<Q/0 ((GGHMM8>>1EZ\H]]ffklfmL778==(..!DL++l&7&79K9K\M]M]^++dQh15 ||~~EE(O**11/B	 llUU8_5555A
 
 ++ee+<_MQQSo33A67Q`cdQdu__%E%J%J%LMjm"	&2AA2EL-.> #Q& ddscttuvj	
 
 


 ( 35(R\\WXEY:Y[c8d e&x0wSTAU7UW_5`b	

 	

&x0wSTAU7UW_5`b	
 KK 	h*; <<=	5	)*;	=		*L9	:	W		$	  5F4K4Kg&**,QUE *55g>JJPTJU )--/H )--/H X8RHJ
 >HHZQUU3Kq!1 23ZJH QF#JD$ 
""<==> >=
 ",/q1 e$ yy{H +73%3A 55+Qwqww/0!&&:3 " % rzz#G,#L1$%0]3D\3RS3Ra&q)3RS;q>:+a.9  " rzz#G,#E*+0QfEZ3DU3KL3Ka&q)3KL
  
 $%)+L9@@B+L9@@B")9!57K LHC&&rzz,00g>?,00l1BCD+ !$R(89J9N9NsS_O_9`(a'bcd%1#("(	( 	 !M JMM^_kMlImImE"))$5l$CDEstExxE$Jc	5:u MNHyy(A!67H5=>X(+XH>!!!*!"+	 "  !!## "  !99S/5>>$+?*@%**NI""AbB"3XwZ[\'xz)Eu7"'$!r] --%! # & OOH$?k 
n 
 MM!g'899:WWuW-.?AADV.=V>[![d[# 	  $77KK34GGIJ }}QwZ^^%5qz~~7GcRHG$"W%' 23  ~~ajnn&67AACH",,A"66HajH&<l&J K O O QRJWXY`WaemWmVrVrVtVt%ajH&<l&J K O O QRz}K
K8G!+H!5:;G*:P9U9U9W9WH!5]b !)2<<Q+? ? ( 1BLLa4H HO /",,A2F FOwZ+<<7O`A`aLwZ?:qz_?\]M#AEE,*E$F$J$J$LMN#AEE-*E$F$J$J$LMO">?CJ "HQK/::<I%2M&..1.5&*R\\q-AA+333:!+K!E!+L,!G!"7{!:qz[?X Y!"7|!;'
l@Z ["'l\.I(J(N(N(P"Q"'m\.I(J(N(N(P"Q#NOD&+# $,#3#3#3#:  02<<Q3G G - 5 5! 5 < -!0D D - 5 5! 5 <!+M=!I!+M=!I!"7}!<7}A\ ]!"7}!<7}A\ ]"'l\.I(J(N(N(P"Q"'m\.I(J(N(N(P"Q#NOD '+#LL"2"*!1BLLa4H!H#1#9#9a#9#@ #3bll!6L#L !"7!>1W:Q`C` a!"7/?!?AgJRbDb c"'l\.I(J(N(N(P"Q"'m\.I(J(N(N(P"Q"+NO"L%/%Q!%/0@BR%S" ')zz!}$	9')zz!}$	9$6# P%7'7  $:& I%/%Q'12CEV'W  $4# G%3(5  )FH49L"(#= /$Z);+< #A i 
F '"g-ImmI&++-G }} V(++55c:V;WU^G% WY[.[/ 	 +7u*=*C*C-+
&'
 ')*l;L.MM

 	 ?q  >>''*:8L%']]7;L3MV^%_%f%fgh%i!" $++<#= 
 !( 0 3 3 = =c B W\EW2?DSUV_i8V9	 	  *,7::GGI
8&x033<<WE
5
  'w/2288= W[5W1/CSUV_i8V9
+k
" 	 AB
   __&F ^^F8$4XFF#YY^^F6N"())"4"4W"="A"A"L"L"NF; y)--/I&(hhy1}fY>OR[>[]`&aF?# %ll
  + F7O zzkk"34fkJ %'.&%+
H ""G_&	 # 	 SURZRZ[`RaRa599S/75;;+?*@%**NglI"":bB"3#'*$$
 'xz)Eu7"'$!r] # ( OOH$?S ^ yyIJ ==[)9)=)=)?[AQAUAUAW^abMM+.WX&VC[ [- [] ]a &*+%6%9%9%C%CC%H\"%),%7%=%=>w%x[!%)+%6%9%9%C%CY%))_%8%8i>P9Q%R[! LL!T_dLefopTVVY
$;V<  oo|Y&?@k;Wanqrg6 "%[!1!8!8!:n5 9%9%9%9%9%
 99"**llmm**,kk((*&!5&67E!*!r9P  "||,<=ellK+ $ WYV^V^_dVeVeuyyoQwu{{/C.DAejj\Rkp	&&P"bB7", "!& !%#+F8:i[!I5wW&+"(!%2! ' 0 dCA RP 	$ %,G$4$<$<$>q#A BQQ	
" KKKK)+ !),,66s;>>KKMIe1 '**//478==?F
  ,,-UVF: J&&(//1FLL&k!m$tfM **VJ'=8
9
>
>q
ACVE]F:,>?@M %jG!),J	
G	,B"**//22==?GGAGNH/0(--AN ZZ]NBB	
		 67qG35772>N;O3P3Pa#$T*+V[&r*:';R@Q=RYcd wwr"3455 10@ A()$/1 /
	
 
 

		 67qG/"1%&r/':B?O<PW\]''"%5"677 #>"2#b9I6J15MN2	
 
 

		ggmm45Qw||nE/1wwr,7G/H/Ha< &'e4R5G4JK	
 
 

		ww}}56a~F/1wwr,7G/H/Ha< &'e-b1C.D-EF	
 
  
5 1W <=BBDN +>:==GGIN5 AJD$	""55"9S!;G_S`[ 	 0199!9KPPRgiik 	bjjEle$56 )M	
 	 	bjjEleGn$AEQ@V
 	 GJ.FYFYE.)9:??AB_a_e_e	xx	""MM"1)D1A B$.   u::+,335E+,335E#V_ufo>Sbjjyye,-yy&7!789' EUYYs3D/D%Ed$KLM!-$$  ? u::3u:q=)E%L%%gg.557E@EF1c{!GAGG$4#56EFgN 035zzE#$++rxx}'*1vvbiil#199RXXbhh5:uSy%PT*V[/\&]_`ab(//"3\d>e\dWX?OPQ?R\d>ef ~.224NPhhW\oouyyoQwu{{';&<Aejj\Jch	?"bB/CT7VWXPQZP[\5wW#6" 	 	
 	6o 
r 
3T4ubff={""$!"
W LL5L1S2 :   	 [!%%'hhuqy${*;e*CQGU tG}QUVW( iikbff7m""3'5k+/;7;aQsU3Kq/;7"" xxk!2!9!9!!<!C!CC!H$O`JaJhJhijJk lstu
 	 	c##d))uT%[__%6%=>QTUV 	 	

 	A"bB/ 	 	
 ~.224NPhhW\oouyyoQwu{{';&<Aejj\Jch	HT5wW6" 	 	
 	6C 
N $&==;L1MV^#_#f#fgj#kI #G,M 3 3
A	
 		 	E
./
  (,,.(,,. <<a+<<q!Q/",,A2FF wHw$6JJ!$ (C C ))-*@*G*G*I*P*P*RS__aJ)))G*<*C*C*E*L*L*NO[[]J *4)9:>>;K,L)3)9:>>;K,L LLq!,ELL1a02<<Q3GGE#Z5%8Z5=P$QRJ#Z5%8Z5=P$QRJ:!#

9$qAB	:!#

5dV1=>	)3)9:>>;K,L)3)9:>>;K,L
 #//
;I9~"

Ntf U##/"9|H>U V+H5U<:QS
 	&]]_immoFFJJA&ARRVW]^fVggjk !+ 5 5j A '11*=M01A5R3};MPQ;QK$%))--/)--/

NsSdOeNf g)).x(8eH=MRQ
 =!A%%))+%))+4S5G4H I)).x(8eH=MRQ
 !zz1a&1uyy!=Cbcc++-
  GX.IGX.I )-*@I*MR_`gRhluRu)vw||~L (7);y)HYW^M_clMl(mnssuO  '#34uEFWY " -22FG-. 3 H -55F,GQ]H^,^H() !#x/@ R U U _ _ aHW%']]8L3IRZ%[%b%bcd%eH\"*,--AR8S\d*e*l*lmn*oH&' ,44E+FR^I_+_H'(LNEEHLL,/146HHI 519#8    08/EQaHb/bH+,TVTYTYHLL"23q8:PPQ ORRZmm%1A(B(G(G(I"JadY\]eYfYfuX6L-M-R-R-T'Ulo$ ,,$$&002C++!+,K%

(=(=a(@@K "+v6O!+v!8L/LMO!8G#4#GHU\L]`oLo"pqvvxJ'009DDFMTWXbTcTceJ7G,H,M,M,O&Pil#_bcm_n_n5<R1S1X1X1Z+[tw( 8}}"*7"3"6"6"@"@"E"H"H"U"U"W WUUW3S)I(B1  
 !['  "..1C0D.Ew<<&{{73E+F+M+M+OPH!~~huo>H%-%6%6w%?%J%J%LN ,1:L1M+N(*/9J0K*L' #HV$4 5I%)N+.(*-' !I!%'*$&)#	  ZZ]NBB->VZr>rL!9:x|s  +*40i  +M?;B^b~B~L!=>  EI5  *=/:.t45  AJBB2%&\  +N+;<:HD:PL!56VZ]  *>*:;5Ct5K*40QU efoeppqr & !#x/@ R U U _ _ aHW)*11#6WWVSW5UUWUUW	 %& &(]]8L3IRZ%[%b%bcd%eH\"*,--AR8S\d*e*l*lmn*oH&' ~~%'" V 1 4 4 > >s CVDWU^G- WY [&6[7  3?u2E2K2K53./
 %1 !12lCT6UU%% " $%* h'78??AHHJQQST#9t+%'ZZA8%T"( ll:xqQG JJ\]  #--/g%%g.>&?7&JKPPRG==JJHIGGI WWuW5S#='<    4<L3IHUeLf3f/0XZX^X^X&671<>TTU *2'):)=)=)G)G)L&)1,)?)E)EFq)r%)1,)?)F)Fs)K$)1'):)=)=)G)G#)1))<)@)@iPWFXAY)Z% W\glWm  oEFTVV%;W$EVF	   [*i!89 [
;'?]dqsqwqw[xWWW-	  W\glWmn~@TVV%5w$?V@	   [*i!89 [
;'?]dqsqwqw[xWWW-	  02zz!},} &-[%9%@%@%B"ioor}}==)2)I)I+)V)])])_& WYV^V^_dVeVeuyyoQwu{{/C.DAejj\Rkp	 #  cd%,,(??LSSU(00779 !#-= >y?O?O P%'YY!#"#"&"&+5)-N)C%)-6)-2W)E%6
 +/"&
( #00$MgY"W#&#'"bB#?"&"<"&TE"B(, $+3F8:i[)Q&'5wW.3*0)-2!") 1 $ #//TZT^T^_fhnToIp/q"//TZT^T^_fhnToIp/q
MHo #| #  YZ%,,(??LSSU(00779  "||J7:%'YY!#"#"&"&+5)-L)A%)-6)-2W)E%6
 +/"&
( #00%QRYQZ#[#&#'"bB#?"&"<"&TE"B(, $+3F8:i[)Q&'5wW.3*0)-2!") 1 $ #//TZT^T^_fhnToIp/q
M=m #@ Wg'785WIK\^jJkmSU  %'NN8G3DX$V$Y$Y$c$c$e!.0mmHEV<W`h.i.p.pqt.u*+)+x7MV^)_)f)fgj)k&&.w&7&:&:&D&DS&I&P&PQT&U#&.w&7&:&:&?&? &.w&7&:&:&@&@(07cjk(l% i56$_& [+ 
 !Y{%;Yy=Q!RS	01Ik4J4Q4Q4SSLL8'3		  11!)J!2J'	2G!)(9*=*H!I!N!N!PJ!*J##JJKLGGI W-W>S&@)>)D,B1    (*xx-.2?+f5G.HHFF(|$ 06l/C+,"&&(9266B/1}}VDX=Ybj/k+,  ++,@D+QVVX
 02zz!},}
 # #Mj\YZ![\!<<62F+G+N+N+P+V+VGG$XY&(ff &"6"2,/%+,@%A%E%EFr%s'G $11-519)-G)<'++a.'A%O ,22_+`+g+g 2  $11'+bB"'C&*EA[cijqcr&s&*EVT[_&]'*+0 2  OOGNDK ] #^ # #KJ<WX!YZ & !&e,>&?!&C D I I K ;;GG$YZ%'ZZ %"7"4%4&2EQU\U^E^zdo+;;Y8S2K(" 6=8?29,0;B8?,"&F. #00%*+;%<-9'+A'?%6 1  #00'+bB"'C'*&*E&Q&*E&Q37l3K 1  OOFM|q [ #]H , -5W,=,E,E,G+J KYY  	'AWW-H 	h!13D EEF	!E	>?P	R	  $'
=!$56;;=>a<)34E)F)QU](]J}%(+J}%S S  ",,<!=!A!A)!LJ~ KKKK*+ AJD$ 
;GLL>JK@A$001BdYd0e 5<<M4N4W4W4YZ4Yq!Dl4Y
Z"=1::<%&78AAC&&'+; ##	  __LLheD. 
 %%!)%-!0k!n5N
  * &  !!HfYdefYg!h $'{G<L4M4T4T4VX`#a $b1a ( & ( "' !$x!a1f)SUV	 $b   %% +"bB7VG_DQVG_DQ &  TBA L 
J 

VWGG:;F}%..0AXXa4i"((1:vz2Z[F]]&]1F  Q:E#H-11%8F6N''1B(CPTV[}']bbkqbrF!*iyQI::a=D#F$5$5E$5$BC3QKmmCJJ	:KK] ^a\a b& '*&8&8%9 :!!$!3!3 4 5( ),'= >" +/% Q	 D) 
f KKBC
 
<= NN9W#5#9#9#;<M 		Ig&))33C8;;HHJ	K			#	  	% 2::#6#6q#99b k" (+&-*A*A*CC
df 
 &11%41HO
RS (!!&&$.
df  $bjj&9&9!&<<GGIN >1


)'-2E2E*F)GqI[I[H\ ]66CH5M Ndd	
 E"[5[)T!WVX	 	 	4bll 	4s 	4 <<'"%"
 e$[5[)VX 	 	4bll 	4s 	4 <<'"%"
 M"RZZ%8%8%;;FFHM"R\\q%99DDFM!))a)0M
 !),,66s;>>KKMIe 		%)*U	;<M	O		*I6	7	  U#}4U9K}9\]IU#}4U9K}9\]I 		"	!E	29	>		J/	0	  		"	!E	29	>		J/	0	  
KL
	 		{/W	=	  fZ(1,113Q7JfZ(1,113Q7Jj!%%'*4Hj!%%'*4Hj)H499;O6>l8h&(2KZZ]NBB	
		+&.4{46H	
 
 

		,q!	
 

 

		'z"&&(./	
 

 

		(z"&&(./	
 
 !!*!>CCAFH!!*!>CCAFHZZ]FB	
l=#9#9'#B#M#M#O"PPRSTh113Q7DAqKK$qcA$4$4#5Xajj=NOP 8 

 

l=#9#9'#B#M#M#O"PPRSTh113Q7DAqKK$qcA$4$4#5Xajj=NOP 8 
 ZZ]FB	TU ,,Z5,IFA6{Q'.i!'
!3!8!8!<!@!@!B C&  FKKNE#:Nff&!(3DbD(9G !!%(\ " 
 !!U!34]5K5KG5T5_5_5a4bcFOO/@VZ[9 V 
D 
kkm
Oc*o5D	YYahiYjE
zz("="78"="78	#
z  	JJ=/0*=/0*y	  !%	
 
6 KK
=m>T>TU\>]>h>h>j=kklm 
HI
	 :D 	'A}$m);<J==T)*Dzz
@A
	 !mmD1B,CHU\\]`aD	 ;;G}))'255@@  D
 	&1ENO`aSUV.>V?  	'%eDS-*0    L!!#E
e*


C	32==E#B5ST9	VBCI
**S/Czz!}HC
 
tt+F&*4j&9&9&;<&;QsG*&;<
 	!%(k!n-YK(113" 	 	
 	N=VG__dqvwT5I	 	 	
 	+F3NA 
J 
!7?_`
 	R{1~6%"	 	 		
 	;VG_u=VG_u=	 	 	
 	+F3N 	C		
= 
MJ 
 
`  E!wwtaxDE. 
H 
h I >=%  T  M8 ?Y 
^ Y Y Y #A i 
Z R^ RL	V^^-BC	L 
 
 
 
Z G ?fI 
t 8C 
n Ux       L XXj #]| #]b ]\ #]` [Z #]N [FU LK 
z Q1 
v 
 

 

 
  

 
 VU 
D 
L = 
J 
s  AEM.EM /EM2 !EN()EN:-EO(EO75EOA
EO7:EO#0EO7 EO(A(EO7=EO-EEO7EO2*B<EO70WEQ#K
5EQK?EP	L
EQL"EPL9
EQMEP-MEQM0EP?M>EQNEQ#WF-EQ5]?MERm"%ER s(BESvA7ES"xA&ES4y<A%ET|=IET"F-ETF/C'ET"JETJ+B?ET"M4D5ET9R)ET4R?EET9l#AEU@"EUAEU/A&"EVBEVC
EV%C#"EV7D EW	L<EWMEW-Z&GEW?a4FEXt%EX5t7D0EX#y'EX5y9EYzD;EYEYDEZ
D'AEY8E:EY+FC3EY8I>AEY0J?A#EY8L"EZ
L4E#EZ/RAEZS$EZ/j,%E[kE[l0E[%l;0E[7oB E\	r B E\uE\?uD+E\-y;E\?zB,E]FAE](GE]#GB+E](JB4E]:M
EMM 
EM/M2/EN%N$EN%N(
EN7N:
EO	O
EO 	OEO7O7
EPP	
EPPEQP
EP*P%EQP-
EP<P7EQP?
EQQ	EQQ
EQ 	QEQ#Q#
EQ2Q5
ERR
ERRESR%ESSES
SESS
ESS
ESS"
ES1S4
ETT
ETT
ET"T"
ET1T4ET9T9
EUU
EUU
EU,U/
EU>V
EVV
EV"V%
EV4V7
EWW	
EWW
EW*W-
EW<W?
EXX
EX X#
EX2	X-EX5X5
EYY
EY	YEYY
EY(Y+EY8Y8
EZ	ZEZ
Z

EZZ
EZ,Z&	EZ/Z/
EZ>[
E[[
E["[%
E[4[7
E\\	
E\\
E\*\-
E\<	\7E\?\?
E]]
E] ]#E](](
E]7]:
E^)r   )2pandasrT   	streamlitr  r  rx   plotly.graph_objectsgraph_objectsr  pandas.tseries.offsetsr   plotly.expressexpressr  numpyr@   modules.Funcionesr   r   r   r   r   r	   r
   r   r   iomodules.driver   r   r   r   modules.api_clientr   r  r  rK   rV   r?   rM   rF   r   rP   rY   r_   r  r}   r   r   r@  r  rG   rE   <module>rM     s      ! +   O  O  O 	 O O &  
 UUUUUUUUV[_dhm
nx,I	T]
^ # 27 7 7RR\\ Rc R
  @,"Kr|| Kbll K\@&
rG   