U
    ^¨jU¬  ã                   @   s*  U d Z ddgZddlmZ ddlZddlZddlZddlZddlZ	ddl
m
Z
mZ ddlmZ ddlmZmZmZ dd	lmZ ddlZdd
lmZ ddlmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z$ ddl%m&Z' ddlmZ ddlmZ ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 dddddddddg	Z2dZ3e4e5d< dZ6e4e5d< dZ7e8e5d < d!d"„ d#d"„ d$d"„ d%d"„ d&d"„ d'd"„ d(d"„ d)d"„ d*d"„ d+œ	Z9d,d-iZ:dd.gdd/d0gdd1d2gd3dd4gd5d6gd7d8dgd9d:dgdd;gd<d=dgd>œ	Z;e<ed?d@ƒ�r"ee<edAƒƒZ=nee>ƒ ?¡ j@Z=edBœdCdD„ZAeAƒ ZBe=dE dF ZCeBZDdndLdM„ZEdNd„ ZFdodOdP„ZGe8e8e4e8dQœdRdS„ZHdTdU„ ZIe
jJe8e8e8dVœdWdX„ZKdYdZ„ ZLe4e4e4e4d[œd\d]„ZMeNeNdd^œd_d`„ZOe4dBœdadb„ZPdpeNeNeQe8ddœdedf„ZRdqeNeQe8dgœdhdi„ZSeNdjœdkdl„ZTeUdmk�r&eFƒ  dS )ruO  
===============================================================================
 Archivo:        NOMBRE_DEL_ARCHIVO.py
 Autor:          TU_NOMBRE (TU_EMPRESA)
 Fecha creaciÃ³n: AAAA-MM-DD
 VersiÃ³n:        VERSIÃ“N_INICIAL
===============================================================================
 DescripciÃ³n:
    Breve descripciÃ³n del propÃ³sito del archivo y su funcionalidad

===============================================================================
 Copyright:
    Â© AÃ‘O TU_EMPRESA. Todos los derechos reservados.
    Este archivo forma parte de NOMBRE_PROYECTO y se distribuye bajo
    los tÃ©rminos de la licencia TIPO_LICENCIA.

===============================================================================
 Interface Change List:
    VersiÃ³n     Fecha        Autor                DescripciÃ³n del cambio
    ---------   ----------   ------------------   ---------------------------
    vX.X.X    AAAA-MM-DD TU_NOMBRE   DescripciÃ³n breve
    vX.X.X    AAAA-MM-DD TU_NOMBRE   DescripciÃ³n breve
===============================================================================
ÚExampleClassÚmainé    )ÚPathN)ÚdatetimeÚ	timedelta)Úpprint)ÚOptionalÚListÚDict)ÚMongoClient)Úget_column_letter)ÚBorderÚSideÚPatternFillÚFontÚ	Alignment)r   Úcolumn_index_from_string)ÚImage)ÚBytesIO)r   é   )	ÚloggerÚ!obtener_datos_por_fecha_por_aliasÚget_escritorio_pathÚadd_markwater_imagesÚ
get_stylesÚ$asegurar_indices_sensores_timeseriesÚget_historial_control_as_dictÚinsert_matplot_graphsÚapply_cell_stylesÚTimeÚSP_ONÚSP_OFFõ	   Oâ‚‚ mg/LúSaturation %õ   Temperature Â°CúPressure barÚAlarmsÚVoltageé   ÚVERTICAL_OFFSETé   ÚHORIZONTAL_OFFSETÚitg123chileÚSHEET_PASSWORDc                 C   s   |   d¡r|   d¡ d¡S d S )NÚ	timestampú%H:%M:%S)ÚgetÚstrftime©Úrec© r4   ú8/var/www/itgmanager/itgmanager/nanoox/generate_report.pyÚ<lambda>i   s    r6   c                 C   s
   |   d¡S )NÚSetPoint©r0   r2   r4   r4   r5   r6   l   ó    c                 C   s
   |   d¡S )NÚSetPointOFFr8   r2   r4   r4   r5   r6   m   r9   c                 C   s
   |   d¡S )NÚO2r8   r2   r4   r4   r5   r6   n   r9   c                 C   s
   |   d¡S )NÚSO2r8   r2   r4   r4   r5   r6   o   r9   c                 C   s
   |   d¡S )NÚTEMPr8   r2   r4   r4   r5   r6   p   r9   c                 C   s
   |   d¡S )NÚPresionr8   r2   r4   r4   r5   r6   q   r9   c                 C   s    |   d¡rd |   dg ¡¡S dS )NÚalarmsÚ,Ú-)r0   Újoinr2   r4   r4   r5   r6   r   s    c                 C   s
   |   d¡S )NÚVor8   r2   r4   r4   r5   r6   u   r9   )	r   r    r!   r"   r#   r$   r%   r&   r'   Úvoltage_highç     ðy@ÚHorar7   ZSPONr:   ZSPOFFr;   u   OxÃ­geno mg/Lr<   õ   SaturaciÃ³n %r=   u   Temperatura Â°Cr>   u   PresiÃ³n barÚAlarmasrC   ZVoltaje)	r   r    r!   r;   r<   r=   r>   r&   rC   ÚfrozenFZ_MEIPASS)Úreturnc                  C   s  t  ¡ } g }tj d¡}|rFt |ƒ ¡ rFt dt |ƒ› d�¡ t |ƒS tjdkrœtj d¡}|r²| 	t |ƒd t |ƒd t |ƒd d t |ƒd d g¡ n| 	| d | d g¡ t
ƒ  |D ]6}| ¡ rât d|› d�¡ |  S t d	|› �¡ q¼t  ¡ }t d
|› d�¡ |S )a  
    Retorna la ruta al escritorio del usuario independientemente del sistema operativo.
    Para Windows, prueba 'Desktop' y 'Escritorio' bajo USERPROFILE.
    Para Linux/mac, prueba 'Desktop' y 'Escritorio' bajo home.
    Si no encuentra ninguno, retorna el directorio actual.
    ZDESKTOP_PATHzEscritorio identificado: Ú
ÚntÚUSERPROFILEZDesktopZ
EscritoriozOneDrive - ITG Chileu   Ruta Escritorio errÃ³nea: zANo fue posible identificar escritorio. Usando directorio actual: )r   ÚhomeÚosÚenvironr0   Úexistsr   ÚinfoÚnameÚextendÚprintÚcwdÚwarning)rN   Ú
candidatesÚenvZuserprofileZdeskrV   r4   r4   r5   Úget_desktop_path™   s8    


üþrZ   ÚimageszLogo_Reportes.pngÚ	localhostÚ	NANOOX_TSÚsensores_timeseriesé‰i  ú/c	              
      sÖ  t   ¡ }	|dkr.| ¡ }
|
› d�}|
› d�}nd}d}�zHtd|›�ƒ t||||ƒ}t|ƒ tƒ \}}t | d d¡‰ t | d	 d¡}|ˆ  jd
 }‡ fdd„t	|ƒD ƒ}t
 d|› dt|ƒ› d�¡ g }t|ƒ |D ]P}t||||||ƒ\}}|�r| |¡ n
t
 |¡ t|ƒ\}}|sØt
 |¡ qØ|�s6W dS t||ddidddd�\}}|�sbd|fW S t|||||	|ƒ\}}||fW S  tk
�rÐ } z0d|› d|jj› d�}t
 |¡ d|f W Y ¢S d}~X Y nX dS )uz   
    Genera un reporte Excel con datos de sensores y estado de inyecciÃ³n de O2, 
    en el rango de fechas indicado.
    NÚ	_sensoresÚ	_metadata)r^   )Zcan_timeserieszsensors_coll_name=Ú	startDatez%d/%m/%YÚendDater   c                    s   g | ]}ˆ t |d �  ¡ ‘qS ))Údays)r   Údate)Ú.0Úi©Ústartr4   r5   Ú
<listcomp>
  s     z#gen_data_report.<locals>.<listcomp>zGenerando reporte de tipo z para u    dÃ­as)Fz(No data available in the selected range.rD   rE   Ú Tr,   )Ú
thresholdsÚwatermark_img_pathÚprotectÚsheet_passwordFzGeneral error: ú (line ú))ÚtimeÚ
capitalizerU   Ú_prepare_databaser   Ú_prepare_workbookr   Ústrptimere   Úranger   rR   ÚlenÚ_process_day_dataÚappendrW   Ú"insert_matplot_graphs_from_contextÚstyle_all_days_modernÚ_save_workbookÚ	ExceptionÚ__traceback__Ú	tb_linenoÚerror)Úrango_fechasÚcontrol_typeÚdb_hostÚdb_nameÚ	coll_nameÚcentro_nameÚfileobjÚdb_portÚexcel_save_pathÚ
time_totalÚcapitalized_center_nameÚsensors_coll_nameÚmetadata_coll_nameÚdbÚworkbookÚstylesÚendÚdays_betweenÚdatesÚday_contextsrf   Zis_successfulÚresultZok_chartZ	msg_chartÚokÚmsgÚeÚ	error_msgr4   ri   r5   Úgen_data_reportÙ   sf    

û
ú



rœ   c                  C   sD   t dƒ d} d}d}d}d}||dœ}t |ƒ t|||| dd� dS )	z&Punto de entrada principal del script.zEjecutando script principal...z	10.0.0.56ZNANOOX_TS_ANECz
07/10/2025ÚPS)rc   rd   N)rƒ   r„   r†   r…   rˆ   )rU   rœ   )ZDB_HOSTZDB_NAMEÚ
start_dateÚend_dateÚCONTROLrƒ   r4   r4   r5   r   H  s    
üc                 C   s<   d| › d|› �}t  d|› d|› d�¡ t|ƒ}|| }|S )Nz
mongodb://ú:u   Buscando datos en colecciÃ³n z de Ú.)r   rR   r   )r…   r†   rŠ   Z	mongo_uriÚclientr�   r4   r4   r5   Úget_dbr  s
    r¤   )r…   r†   rŠ   r‡   c              
   C   sÜ   z˜t   ¡ }t| ||d�}zt||ƒ t d¡ W n< tk
rl } zt d|› d|jj› �¡ W 5 d}~X Y nX t 	d|› dt   ¡ | d d	›d
�¡ |W S  tk
rÖ } z t 
d|› d|jj› �¡ ‚ W 5 d}~X Y nX dS )u  
    Conecta a la base de datos MongoDB y asegura los Ã­ndices necesarios
    para consultas de sensores.

    ParÃ¡metros:
        - db_host: direcciÃ³n IP o hostname del servidor de BD.
        - db_name: nombre de la base de datos.
        - db_port: puerto TCP de conexiÃ³n (por defecto 10200).
        - coll_name: nombre de la colecciÃ³n donde se almacenan los datos de sensores.

    Retorna:
        - Objeto de base de datos (db) listo para consultas.

    Lanza excepciÃ³n si ocurre un error de conexiÃ³n o configuraciÃ³n.
    )rŠ   u"   Ã�ndices asegurados correctamente.u   Error al asegurar Ã­ndices: Ú NzBase de datos 'z' conectada en ç     @�@ú.2fú mszError al conectar con la BD: )rs   r¤   r   r   Údebugr   rW   r€   r�   rR   r‚   )r…   r†   rŠ   r‡   Út0r�   rš   r4   r4   r5   ru   |  s    
,&ru   c            	      C   sD   t  ¡ } |  | j¡ tƒ \}}}}}}}|||||||dœ}| |fS )N©ÚfontÚfillÚfill_inyÚfill_iny_manÚfill_vdfÚborderÚ
fill_alarm)ÚopenpyxlÚWorkbookÚremoveÚactiver   )	r‘   r¬   r­   r®   r¯   r°   r±   r²   r’   r4   r4   r5   rv   �  s    ù
rv   )Úcurrent_dater„   rŽ   r�   c           K         sî  �z�|  ¡ }t d|› �¡ t| |||d�‰ˆsPt d|› �¡ dd|› �fW S |j|d�}tˆ ¡ ƒ}td|›�ƒ t	|t
dd	t|ƒd
d� t‰t}	ttƒ}
tdt›�ƒ t|
ƒ}|d }||	 d }dg||  }dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}d}d}d}tˆƒD ]}| g ¡ �qLg }|D ].}|dg|	 d|› �g dg|  | 7 }�qf| |¡ dg|	 |
 }t|ƒdk�rÞ|dg|	d  |
 t|ƒd  7 }| |¡ i ‰ ‡fdd„|D ƒ}|�rt| ¡ ƒnd}t|ƒD ]�\}} t|| |	 d ƒ}!t|| |	 | ƒ}"ˆd }#||  dk�rr|#||   d n|#}$|!|"t|| |	 d ƒ|!› |#› �|"› |$› �dœˆ | < �q|}%t|%ƒD �]}&dg|	d  }'t|ƒD �]Ø\}} ˆ|  }(|&t|(ƒk �rþ|(|& ni })|) d¡}*|*�r|* d¡nd}+|) d¡},|) d ¡}-|,dk�rR|-dk�rR|d7 }nTz<t|,tƒ�rpt |,¡�rpd},t|-tƒ�rŒt |-¡�rŒd}-W n tk
�r¤   Y nX |) d!¡}.|) d"¡}/|/dk	�rÌt|/ƒnd}0|) d#¡}1|1dk	�rðtt|1ƒƒnd}2|) d$¡}3|) d%¡}4|) d&g ¡}5|) d'¡}6|) d(¡}7|) d)¡}8||)�r>dnd7 }|2�r\||  }9||  }:n||  }9||  }:|:�rz|:d* nd};|&dk�rº|&t|(ƒk �rº|(|&d   d¡�rº|(|&d  d nd}<|&d+k�rú|&t|(ƒk �rú|(|&d+   d¡�rú|(|&d+  d nd}=|6d,k}>t|>�p|d-k�o|.d.kƒ}?t|>�pH|d/k�oH|.dk	�oHtt|.ƒƒƒ}@|?�sX|@�o\|5 }A|;�rr|<�rr|;|<knd}B|;�rŠ|=�rŠ|;|=knd}C|C�rÈ|B�sÈ|A�rÈ|<�rÈ|: |<¡ |9 |< d¡¡ |d7 }|A�rî|+�rî|*�rî|9 |+¡ |: |*¡ |2�r(|0�r(|A�r(|+�r(|*�r(||   |+¡ ||   |*¡ |' d¡ |' |+|7|8|) d¡|) d ¡|) d0¡g¡ |) d1¡}D|Ddk	�r¸z&t |Dd+ƒ}E|' |Ed2k�rŒ|End¡ W n  tk
�r´   |' d¡ Y nX n
|' d¡ |' |5�rÖd3 !|5¡nd4¡ |' |4¡ z°|*dk	�r”t|) d¡ttfƒ�r”t |)d ¡�s”||  d5  |*¡ ||  d  t|)d ƒ¡ |) d ¡}Ft|Fttfƒ�r‚t |F¡�s‚||  d   t|Fƒ¡ n||  d   d6¡ W n tk
�r¬   Y nX �qÖ| |'¡ �qº|�sÌ|�rLzh|› d7|› �}G|�r|Gd8|› d9|| d: d;›d<�7 }G|�r(|Gd=|› d9|| d: d;›d<�7 }Gt |G¡ W n tk
�rJ   Y nX |||‡ ‡fd>d„|D ƒˆ|	|
|||||||||||d?œd@œ}HdA|HfW S  tk
�rè }I z6dB|› dC|I› dD|Ij"j#› dE�}Jt $|J¡ d|Jf W Y ¢S d}I~IX Y nX dS )Fu°   
    Genera la hoja del dÃ­a (YYYY-MM-DD) replicando exactamente el patrÃ³n original y,
    ADICIONALMENTE, recolecta datos para grÃ¡ficos por bomba sin alterar el layout.
    zProcessing data for date: )rŽ   r�   zNo data found for date FzNo data found for )Útitlezbomb_names=ÚCé   é   ©Ústart_columnÚ	start_rowÚrepeatsÚstepzBASE_COLUMNS=r   rl   c                 S   s   i | ]
}|g “qS r4   r4   ©rg   Úbr4   r4   r5   Ú
<dictcomp>ß  s      z%_process_day_data.<locals>.<dictcomp>c                 S   s   i | ]
}|g “qS r4   r4   rÁ   r4   r4   r5   rÃ   à  s      c                 S   s   i | ]
}|g “qS r4   r4   rÁ   r4   r4   r5   rÃ   á  s      c                 S   s   i | ]
}|g “qS r4   r4   rÁ   r4   r4   r5   rÃ   ã  s      c                 S   s   i | ]
}|g “qS r4   r4   rÁ   r4   r4   r5   rÃ   ä  s      c                 S   s   i | ]
}|g “qS r4   r4   rÁ   r4   r4   r5   rÃ   å  s      c                 S   s   i | ]}|g g g d œ“qS )©Útsr;   r<   r4   rÁ   r4   r4   r5   rÃ   è  s      r   úBomba c                    s   i | ]}|t ˆ | ƒ“qS r4   )ry   rÁ   )Úsensor_datar4   r5   rÃ     s      é   )Ú	L_InicialÚL_FinalÚL_GraphÚceldaInicialÚ
celdaFinalr.   r/   Nr;   r<   ÚInStartÚRLYZInSelZIorC   r?   ZStatusr7   r:   éÿÿÿÿr*   é	   ÚVDFÚ01r�   r=   r>   g      à¿r@   rA   rÅ   g        z: Total=z	 | Nulls=z (éd   r§   z%)z | Sandwich=c                    s8   i | ]0}|ˆ | d  ˆ | d ˆd ˆ | d dœ“qS )rÉ   rÊ   rÈ   rË   )Ú	col_startÚcol_endÚ	row_startÚ	graph_colr4   rÁ   )ÚRangosÚv_offsetr4   r5   rÃ   £  s   û


ü)ÚtotalZnullsZsandwich)Ú	worksheetrf   Ú
pump_namesÚrangesrÚ   Úh_offsetÚcolumnsr„   Úrangos_bomba_onÚrangos_bomba_on_tsÚrangos_iny_onÚrangos_iny_on_tsÚrangos_iny_on_manualÚrangos_iny_on_manual_tsÚ
chart_dataÚstatsTzError processing date ú: rq   rr   )%Ú	isoformatr   r©   r   rR   Úcreate_sheetÚsortedÚkeysrU   r   Úimg_pathry   r)   r+   ÚlistÚBASE_COLUMNSrx   r{   ÚmaxÚvaluesÚ	enumerater   r0   r1   Ú
isinstanceÚfloatÚmathÚisnanr   ÚboolÚintrT   ÚroundrB   r€   r�   r‚   )Kr�   r·   r„   r‘   rŽ   r�   Údate_strÚwsZ
bomb_namesrß   Zbase_columnsÚcant_keys_tablaÚtablas_distÚspace_titlesÚtablas_spacerã   rá   rå   rä   râ   ræ   Úvalues_for_chartsZ	null_dataZsandwich_caseZ
total_dataÚ_Zfila_titulosZalias_bombaÚ
estructuraZmax_rows_by_pumpZmax_rows_globalÚidxÚchannelZ	L_inicialZL_finalr×   Zrow_endÚ
max_columnrh   Ú
nueva_filaÚrowsZ	data_filaZts_objrÅ   Zdato_o2Zdato_so2rÎ   rÏ   Zinyection_o2Zin_selZtcb_autoÚ	corrienteÚvoltajeZalarmasÚstatusÚsp_onÚsp_offZ
data_arrayZgraph_arrayZprev_graph_tsÚlast_tsZlast_last_tsZcorrect_this_cellZinyecting_vdfZinyecting_psZpump_runningZprev_is_fillZprev_prev_is_fillZpresion_valZrounded_pressZso2_valrR   Úcontextrš   r›   r4   )rÙ   rÇ   rÚ   r5   rz   ´  sf     þ,
"
"

û	þ












@@*



  ü




	0

  ú
è

rz   c              
   C   sv  �z.d| j kr|  | d ¡ |d  ¡ }|d  ¡ }||krJ|› d|› �n|}|r`|› d|› �}|dk	r˜|  |¡ t|dƒr†| d¡ dd|› d	�fW S tj |d|› d
�¡}	t	 
d|	› d�¡ ttj tj t¡¡ƒ}
|  |	¡ t| dƒrô|  ¡  t	 
d|	› �¡ t	 
dt ¡ | d d›d�¡ dt|	ƒfW S  tk
�rp } z dd|› d|jj› �f W Y ¢S d}~X Y nX dS )z,Save workbook to disk or a file-like object.ÚSheetr   rÐ   r  NÚseekTZReporte_z.xlsxz_.xlsxzGuardado archivo Excel  en: z...ÚclosezExcel saved at: zTotal time: r¦   r§   r¨   FzError saving workbook: r¥   )Ú
sheetnamesrµ   rê   ÚsaveÚhasattrr  rO   ÚpathrB   r   rR   r   ÚdirnameÚabspathÚ__file__r  rs   Ústrr   r€   r�   )r‘   r•   rˆ   r‰   rŒ   r‹   ÚfirstÚlastÚ
identifierÚ	dest_pathÚcurrent_dirrš   r4   r4   r5   r~   Â  s0    	





 r~   )r¾   Úend_rowÚ	start_colÚend_colc                 C   s<   t ||d ƒD ](}t ||d ƒD ]}|| j||d�_q qdS )u?   Aplica 'border' a todas las celdas del rectÃ¡ngulo (inclusive).r   ©ÚrowÚcolumnN)rx   Úcellr±   )rü   r¾   r   r!  r"  r±   ÚrÚcr4   r4   r5   Ú_apply_border_rectõ  s    r)  )Úctxr’   rJ   c                 C   s|  | d }| d }| d }| d }| d }|d }|d }|d }	t |ƒ}
|
d	 }|d	 }|d
 }|shdS t|ƒD ]†\}}|| | d	 }||
 d	 }|j||d�}|jdkr¸d|› �|_||_||_tddd�|_|j||||d� t	||||||	ƒ qpt|ƒD ]v\}}|| | d	 }||
 d	 }t
||d	 ƒD ].}|j||d�}||_||_tddd�|_�q2t	||||||	ƒ �q dS )u5  
    Deja los encabezados exactamente segÃºn el layout:
      - Merge + valor 'Bomba XXX' en fila v_offset+1 por bloque
      - SubtÃ­tulos (nombres de columnas) estilados en fila v_offset+2
      - Bordes en ambas filas por bloque

    Requiere en ctx: worksheet, pump_names, v_offset, h_offset, columns
    rÜ   rÝ   rÚ   rß   rà   r¬   r­   r±   r   r*   Nr#  )Nrl   rÆ   Úcenter)Ú
horizontalÚvertical)r¾   r½   r   Ú
end_column)ry   ró   r&  Úvaluer¬   r­   r   Ú	alignmentÚmerge_cellsr)  rx   )r*  r’   rü   rÝ   rÚ   rß   rà   r¬   r­   r±   rý   rþ   Ú
header_rowÚcolumns_rowr  ÚpumpÚcol_start_idxÚcol_end_idxZ
cell_titler  r(  r&  r4   r4   r5   Ú_style_headers_blockwiseû  sN    	
  þr7  c                 C   sP   t |gt |g ¡ ƒ}t| ƒD ]\}}||kr|  S qtd|› d| › �ƒ‚d S )NzColumn 'z' not found in )ÚsetÚ_COLUMN_ALIASESr0   ró   ÚKeyError)rà   Zlogical_nameZwantedrh   rS   r4   r4   r5   Ú_find_col_index_in_block6  s
    
r;  T)r*  r’   ro   rp   c           ;   
      sŒ  �z@dD ]"}|| krdd|› d�f  W S qdD ]"}||kr0dd|› d�f  W S q0| d ‰| d }| d	 }	| d
 }
| d }| d }|d }|d }|d }|d }|d }t dd�}ttƒ}|rÌ| |¡ ˆj|
d dd�ˆ_|�r@ztˆ|ddt|ƒdd� W n< tk
�r> } zt	 
dˆj› d|› �¡ W 5 d }~X Y nX t| |ƒ z6t|dƒ}t|dƒ}t|dƒ}t|d ƒ}t|d!ƒ}W n8 tk
�r¸ } zdd"|› �f W Y ¢W S d }~X Y nX ˆj}|
d# }|D �]¾}|	| d$ }|	| d% }t|ƒ} t|ƒ}!|	| d& }"|}#|"|#k�r&tˆ|"|#| |!|ƒ t|  d'i ¡ |g ¡ƒ}$t|  d(i ¡ |g ¡ƒ}%t|  d)i ¡ |g ¡ƒ}&t|"|#d ƒD �]
‰ ‡ ‡fd*d+„t| |!d ƒD ƒ}'|'D ]}(td,d,d-d.�|(_�q¤|'| j})|)|$k}*|)|%k�oÚ|*}+|)|&k},|,�rþ|'D ]}-||-_�qîn2|+�r|'D ]}-||-_�qn|*�r0|'D ]}-||-_�q"ˆ |k�r|z„|'| j}.|'| j}/|.d k	�rntt|.ƒ d/d0¡ƒnd }0|/d k	�r�tt|/ƒ d/d0¡ƒnd }1|0d k	�r¼|1d k	�r¼|1|0k �r¼||'| _W n tk
�rÔ   Y nX zR|'| j}2|2d k	�r tt|2ƒ d/d0¡ƒnd }3|3d k	�r&|3|d1 k�r&||'| _W n tk
�r>   Y nX z.|'| j}4t|4tƒ�rld2|4k�rl||'| _W n tk
�r„   Y nX �q|�qÌˆjD ]l}5d3}6|5d3 j}7|5D ]0}(|(j}8|8d k	�rªtt|8ƒƒ}9|9|6k�rª|9}6�qª|6�r”t d4t!d5|6d# ƒƒˆj"|7 _#�q”|�r>d-ˆj$_%d-ˆj$_&d-ˆj$_'|ˆj$_(ˆj)}:||:j*_+d-|:j*_,W d6S  tk
�r† } z$dd7|  d8d9¡› d|› �f W Y ¢S d }~X Y nX d S ):N)rÜ   rÝ   rÞ   rÚ   rß   rà   FzMissing ctx['z']r«   zMissing styles['rÜ   rÝ   rÞ   rÚ   rß   rà   r®   r¯   r°   r±   r²   ZFF0000)ÚcolorrÈ   r   r#  r¹   rº   r»   r¼   zWatermark error on ré   r   r    r;   r&   rC   zStyling error: r*   rÕ   rÖ   r×   rá   rã   rå   c                    s   g | ]}ˆj ˆ |d �‘qS )r#  )r&  )rg   r(  ©r'  rü   r4   r5   rk   �  s     z%_style_day_modern.<locals>.<listcomp>r+  T)r,  r-  Úshrink_to_fitr@   r¢   rD   ÚAr   é   é(   ©Trl   zStyling failed on sheet rf   z	<unknown>)-r   ÚdictÚ_DEFAULT_THRESHOLDSÚupdater&  Úfreeze_panesr   ry   r   r   rW   r¸   r7  r;  r:  Úmax_rowr   r)  r8  r0   rx   r   r0  r/  r­   rõ   r  Úreplacer¬   rô   rà   Úcolumn_letterrñ   ÚminÚcolumn_dimensionsÚwidthÚ
protectionÚsheetÚobjectsÚ	scenariosÚpasswordÚparentÚsecurityÚworkbookPasswordÚlockStructure);r*  r’   rm   rn   ro   rp   ÚkÚskrÝ   rÞ   rÚ   rß   rà   r®   r¯   r°   r±   r²   Zred_fontÚthÚexZidx_timeZ	idx_sp_onZidx_o2Z
idx_alarmsZidx_vorš   Zlast_rowr3  r4  Zcol_start_letterZcol_end_letterr5  r6  Zdata_start_rowZdata_end_rowZbomba_on_timesZiny_on_timesZiny_manual_timesÚ	row_cellsr&  Ztime_valZbomb_activeZactive_injectZmanual_injectr(  Z	sp_on_valZo2_valZsp_on_fZo2_fZvo_valZvo_fZ
alarms_valÚcolZmax_lenZletterÚvÚlÚwbr4   r=  r5   Ú_style_day_modern?  sè      
 

 ÿ
*




&


   



""
"




  r_  )r’   ro   rp   c           
   
   C   st   z:| D ].}t ||||||d�\}}|sd|f  W S qW dS  tk
rn }	 zdd|	› �f W Y ¢S d }	~	X Y nX d S )N)r*  r’   rm   rn   ro   rp   FrB  zBulk styling failed: )r_  r   )
r–   r’   rm   rn   ro   rp   r*  r˜   r™   rš   r4   r4   r5   r}   ß  s    ú
r}   )r*  c           +         s¼  �z~| d }| d }| d }| d }|   di ¡}|   di ¡}|   di ¡‰|   di ¡}tj d	d
ddd
d
dœ¡ |D �]‰ �zÄ|  ˆ g g g dœ¡}|  dg ¡}	|  dg ¡}
|  dg ¡}|	r¼|
sÀW qrt |	¡}|
}|rÖ|ndgt|ƒ }‡ ‡fdd„|  ˆ g ¡D ƒ}|  ˆ g ¡}tjddd�}d\}}}d|�r0dnd |�r>dnd }d}|| }|| }| ||||g¡}|j	||dddd� | 
t|ƒt|ƒ¡ | dtdt t|ƒd ¡ƒ¡ |jdd d!� |jddd d"� |jd#dd$� | ¡ \}}|�rPt |¡}t|ƒdk�rt t t |¡¡¡nd%}|j||gt|ƒ ||d&dd'd(� | ||¡ |�r¶t |¡}t|ƒdk�r„t t t |¡¡¡nd%}|j||gt|ƒ ||d)dd*d(� | ||¡ | ¡ } | j	||d+d,d-dd.� |  
t|ƒt|ƒ¡ |  dt|ƒ�rt|ƒd/ nd¡ | jd+d,d d"� | jd#d,d$� |j tjd0d1�¡ |j t d2¡¡ | ¡  |  ¡ D ]}!|! !d3¡ |! "d4¡ �q^|j#d5ˆ › �dd!� | $d6¡ |j%|d7� | &¡ \}"}#|  &¡ \}$}%|j'|"|$ |#|% dd8d9|j(d:� t)ƒ }&|j*|&d;dd<� t +|¡ |& ,d¡ t-|&ƒ}'d=\|'_.|'_/|ˆ  d> }(|(› d?�})| 0|'|)¡ W qr t1k
�rx }* zt2 3d@ˆ › dA|*› �¡ W 5 dB}*~*X Y qrX qrW dCS  t1k
�r¶ }* zdDdE|*› �f W Y ¢S dB}*~*X Y nX dBS )Fu  
    Inserta grÃ¡ficos por bomba en la hoja usando el context devuelto por _process_day_data.
    Requiere en ctx:
      - worksheet, pump_names, ranges{pump:{graph_col}}, v_offset
      - chart_data[pump]: {"ts":[], "O2":[], "SO2":[]}
      - rangos_*_ts[pump]: listas de datetime
    rÜ   rÝ   rÞ   rÚ   rç   rä   râ   ræ   r(   é   é   )z	font.sizezaxes.titlesizezxtick.labelsizezytick.labelsizezlegend.fontsizezfigure.titlesizerÄ   rÅ   r;   r<   r   c                    s$   g | ]}|t ˆ ˆ g ¡ƒkr|‘qS r4   )r8  r0   )rg   rÅ   ©r4  râ   r4   r5   rk   .  s   ÿz6insert_matplot_graphs_from_context.<locals>.<listcomp>)é   g333333@rÔ   )ÚfigsizeÚdpi)gš™™™™™¹?çffffffî?rf  r*   r   g333333Ó?zNivel de O2 (mg/L)z#1e4882)Úlabelr<  Ú	linewidthé   u   Hora del dÃ­aé   )Úfontsize)r<  rk  Úy)ÚaxisZ
labelcolorglÁlÁF?z#92CDDCu   InyecciÃ³n O2 - AutomÃ¡tica)rL  Úbottomr<  Úalpharg  z#92DC97u   InyecciÃ³n O2 ManualrG   z#ab0202z--)rg  r<  Z	linestylerh  é
   é<   )Úintervalz%H:%Mé-   ÚrightzSensor T)rn  zupper center)g      à?gš™™™™™É¿)ÚncolÚlocZbbox_to_anchorZbbox_transformÚpng)Úformatre  )il  i†  rØ   Ú2u$   Error generando grÃ¡fico para bomba ré   NrB  Fu   Error insertando grÃ¡ficos: )4r0   ÚpltÚrcParamsrE  ÚmdatesZdate2numry   ÚfigureZadd_axesÚplotÚset_xlimrJ  rñ   Úset_ylimrö   ÚceilÚ
set_xlabelÚ
set_ylabelZtick_paramsÚget_ylimÚnpÚdiffÚsortÚbarZtwinxÚanyÚxaxisÚset_major_locatorZMinuteLocatorÚset_major_formatterÚDateFormatterÚautofmt_xdateZget_xticklabelsZset_rotationZset_haÚ	set_titleÚgridZsubplots_adjustZget_legend_handles_labelsÚlegendZ	transAxesr   Úsavefigr  r  ÚExcelImgrL  ÚheightÚ	add_imager   r   r‚   )+r*  rÜ   rÝ   rÞ   rÚ   r  rä   ræ   ÚseriesZts_listZo2_listZso2_listÚxZo2Zso2Zts_inyectingZts_iny_manualÚfigÚleftrt  ÚtopZtotal_graphsZbottom_marginrL  r”  Zax1Zy_minZy_maxZx_injÚdxZx_injmZdxmZax2ZlblZlines_1Zlabels_1Zlines_2Zlabels_2Úimg_dataÚimgZgraph_col_letterÚanchorrš   r4   rb  r5   r|     sÊ    ú	


ÿ
  
(  ÿ
(  ÿ"

  þ


*r|   Ú__main__)r\   r]   r^   NNr_   r`   )r_   )Tr,   )Tr,   )VÚ__doc__Ú__all__Úpathlibr   ÚsysrO   rs   rö   Únumpyr…  r   r   r   Útypingr   r	   r
   Úpymongor   r³   Úopenpyxl.utilsr   Úopenpyxl.stylesr   r   r   r   r   r   Úopenpyxl.drawing.imager   r“  Úior   Úmatplotlib.pyplotÚpyplotrz  Úmatplotlib.datesr•   r|  Zreports_utilsr   r   r   r   r   r   r   r   r   rð   r)   rù   Ú__annotations__r+   r-   r  ZCOLUMN_EXTRACTORSrD  r9  Úgetattrr  r  ÚresolverR  rZ   Zdesktoprî   Zsave_dirrœ   r   r¤   ru   rv   rf   rz   r~   r)  rC  r7  r;  rø   r_  r}   r|   Ú__name__r4   r4   r4   r5   Ú<module>   sÖ   ,÷ó÷+       ÷
o*

!ú  3;  úú &  úú" 
