
    fi)                       S SK Jr  S SKJrJr  S SKJr  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Jr  S SKJrJr  \" S	5      r\(       d  \" S
5      eSS jrSS jrSS jr\ " S S5      5       rSSS.         SS jjrg)    )annotations)	dataclassasdict)PathN)
get_engine)QUERY_LINEAS_SUCURSAL)
LINEAS_DIRensure_dirs)upload_or_replace_in_driveget_settingFOLDER_ID_LINEASz6Falta FOLDER_ID_LINEAS en .env o variables de entorno.c                <    U R                  5       R                  SS9$ )N   )day)	normalizereplacedts    dC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\Proyectos\cabanna-api\app\dwh\etl_lineas.pymonth_startr      s    <<>!!a!((    c                b    U [         R                  R                  S5      -   R                  5       $ )Nr   )pdoffsets
MonthBeginr   r   s    r   
next_monthr      s%    &&q))4466r   c              #     #    [        U 5      n[        R                  " U5      nX!:  a'  [        U5      nUn[	        X15      nXE4v   UnX!:  a  M&  g g 7f)N)r   r   to_datetimer   min)start_dtend_dtcurnxtinifins         r   month_rangesr&      sM     
h
C^^F#F
,o#h ,s   AAAc                      \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S\S	'   S\S
'   S\S'   S\S'   S\S'   S\S'   Srg)EtlLineasResult*   strstatusstartendintfiles_writtenrows_writtenmonths_totalmonths_emptyz	list[str]empty_monthsz
str | Nonelast_nonempty_end	last_filewarnings N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r7   r   r   r(   r(   *   sA    KJ	H!!r   r(      r   )stop_on_consecutive_emptymin_rows_to_writec                  [        5         [        5       n[        R                  " U 5      n[        R                  " U5      nSnSnSn	Sn
/ n/ nSnSnSn[	        XV5       GH  u  nnU	S-  n	UR                  S5      n[        SUR                  S5       S3-  nUR                  5        n[        R                  " [        UUU4S9nSSS5        WR                  (       d+  S	UR                  ;   a  [        R                  " US	   S
S9US	'   Ub  [        U5      U:  af  U
S-  n
UR                  U5        US-  nU(       aA  X:  a<  UR                  SU SU SUR                  5        SUR                  5        S3	5          OGM"  Sn[        R                   " SSS9n UR#                  UR$                  SS9  UR'                  5         [)        [*        UR$                  UR$                  S9   [,        R.                  " UR$                  5        US-  nU[        U5      -  nUnUnGM     [3        SU UUUU	U
USS Ub  UR5                  5       OSUb  [7        U5      OSUS9nUS:X  a"  SUl        UR:                  R                  S5        [=        U5      $ ! , (       d  f       GN= f! [0         a     Nf = f!  [,        R.                  " UR$                  5        f ! [0         a     f f = f= f)u   
Construye parquets mensuales lineas_YYYY_MM.parquet y los sube a Drive.
- NO sube archivos vacíos.
- Se puede detener tras N meses consecutivos vacíos.
- Regresa un resumen para logging / endpoints.
r   Nr   z%Y-%mlineas_z%Y_%mz.parquet)paramsFechacoerce)errorszSe detuvo por u6    meses consecutivos sin datos. Último mes procesado: z (rango u   →z).F)deletesuffix)index)	folder_idfilename
local_pathoki)r+   r,   r-   r/   r0   r1   r2   r3   r4   r5   r6   no_datauU   No se escribió ningún parquet con datos. Revisa QUERY_LINEAS_SUCURSAL y/o el rango.)r
   r   r   r   r&   strftimer	   connectread_sqlr   emptycolumnslenappenddatetempfileNamedTemporaryFile
to_parquetnamecloser   r   osunlink	Exceptionr(   	isoformatr*   r+   r6   r   )r,   r-   r?   r@   enginer    r!   r/   r0   r1   r2   r3   r6   r4   r5   consecutive_emptyr$   r%   ymoutconndftmpress                           r   build_lineas_parquetrh   9   s    M\F~~e$H^^C FMLLL LH-1!I 2S\\'"WS\\'%:$;8DD^^2D#sLB  xxGrzz1..GXFBwK :R#44AL#"(->-[$%6$7 8..0T#((*STVX  ))zJ	MM#((%M0IIK&*88		#((# 	B	c 3f #!!!!#$';L;X+557^b$-$9#i.tC 
st#;A L  		#((# sO   'JAJ.& J
J	
J+*J+.K!0 KK!
K	K!K	K!)r   pd.Timestampreturnri   )r    ri   r!   ri   )
r,   r*   r-   r*   r?   r.   r@   r.   rj   dict)
__future__r   dataclassesr   r   pathlibr   r\   pandasr   rW   app.dbr   app.queriesr   app.dwh.pathsr	   r
   app.dwh.etl_foliosr   r   r   RuntimeErrorr   r   r&   r(   rh   r7   r   r   <module>ru      s    " )  	    - 1 G 12 
O
PP)7   $ &'ee	e  #	e
 e 
er   