U
    ^¨jw®  ã                   @   sŽ  d dl Z d dlZd dlZd dlZej d d¡ 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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mZmZmZm Z m!Z!m"Z"m#Z#m$Z$ dZ%e&eddƒ�ree&edƒƒZ'nee(ƒ )¡ j*Z'edœdd„Z+e+ƒ Z,e'd d Z-e,Z.d'dd„Z/d(dd„Z0dd „ Z1e2d!k�rŠd"Z%d#Z3d$d$d%œZ4e5e4ƒ e/e4e3e%dd&� dS ))é    Nz./)ÚdatetimeÚ	timedelta)ÚBytesIO)ÚPath)ÚMongoClient)Úget_column_letter)ÚBorderÚSideÚPatternFillÚFontÚ	Alignment)r   Úcolumn_index_from_string)ÚImageé   )	Ú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Ú	localhostÚfrozenFZ_MEIPASS)Úreturnc                  C   s¾   t  ¡ } g }tjdkrbtj d¡}|rx| t |ƒd t |ƒd t |ƒd d t |ƒd d g¡ n| | d | d g¡ |D ]$}| ¡ r|t 	d|› �¡ |  S q|t  
¡ }t 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.
    ÚntÚUSERPROFILEÚDesktopÚ
EscritoriozOneDrive - ITG ChilezEscritorio identificado: zANo fue posible identificar escritorio. Usando directorio actual: )r   ÚhomeÚosÚnameÚenvironÚgetÚextendÚexistsr   ÚinfoÚcwdÚwarning)r    Ú
candidatesÚuserprofileÚdeskr(   © r-   úF/var/www/itgmanager/itgmanager/nanoox/reports_management_ts_service.pyÚget_desktop_pathN   s,    


üþ
r/   ÚimagesúLogo_Reportes.pngÚsensores_timeseriesÚmetadataÚ c	           n      C   sÖ  t ƒ  | ¡ }	t d|›d||	k›�¡ t d|›d||	k›�¡ t ƒ  t ¡ }
�z:t ¡ }t d|› �¡ t | ¡ t ¡ }zt||ƒ W n2 tk
r¾ } zt d|› �¡ W 5 d }~X Y nX t ¡ | d }t	 
| d d	¡}t	 
| d
 d	¡}tt|| ƒ d¡ƒdk�r>tt|| ƒ d¡d ƒd }t d|› d�¡ nd}t ¡ }g }g }t d¡ g }g }tƒ \}}}}}}}t ¡ | d }t|ƒD �]è}t ¡ } t|t|d� ƒ d¡d  d¡}!d |!¡}"| |"¡ t d|"›�¡ t||"||d�}#t ¡ |  d }$d|$d›d�}%|#�
r:t d|"› �¡ t ¡ }&| |"¡ t|# ¡ ƒ}'|' ¡  t d|'›�¡ dd„ |'D ƒ}(dd„ |'D ƒ})dd„ |'D ƒ}*dd„ |'D ƒ}+dd„ |'D ƒ},d d„ |'D ƒ}-t|#|'d  ƒ}.| |"¡}/| |"¡ d!}0d"}1d#}2|0d }3d$g|3d%  }4d$g|3d!  }4|0|2 d }5t|1ƒD ]}|/ g ¡ �qg }6|'D ]:}7|6d$g|2 7 }6|6 d&|7› �¡ |6d$g|5 7 }6|6|47 }6�q4|/ |6¡ d$g|2 d'd(d)d*d+d,g }8|8d$g|2d  d'd(d)d*d+d-g t|'ƒd  7 }8|/ |8¡ i }9t|'ƒD ]†\}:};t|:|3 |2 d ƒ}<t|:|3 |2 |0 ƒ}=t|:|3 |2 d ƒ}>|<|=|>t|<td#|1 ƒ ƒt|=tt|#|; ƒd# |1 ƒ ƒd.œ|9|;< �qØi }?d}@d}Ad}Bt|.ƒD �](}d$g|2d  }Ct|'ƒD �]ô\}:};|#|; }Dt|Dƒ|k�r”|Bd7 }B|D| }E|Ed/  d0¡}F|Ed/ }G|Ed1 |Ed2  }H}I|H�s|I�s|@d7 }@�q”|E d3¡}Jt|E d4¡ƒ}K|E d5¡}L|Ld k	�r>tt|Lƒƒ}Mn2|Jd k�rlt d6|J›d7|L› d8|E› �¡ |@d7 }@d9}M|M�rˆ|)|; }N|+|; }On|-|; }N|,|; }Od }P|M�rôt|*|; ƒdk�r
t|Oƒdk�r
|Od: }Pt|*|; ƒdk�r
t|Oƒdk�r
|Od; }Qnt|Oƒdk�r
|Od: }Pd}Rd}S|dk�rF|D|d  d/ }R|d#k�rF|D|d#  d/ }S|E d<¡}T|E d=¡}U|E  d>g ¡}V|E  d?¡}W|P|Rk}X|Wd@k}Y|P|Sk}Z|Y�pž|dAk�ož|JdBk}[|Y�pÄ|dCk�oÄ|Jd k	�oÄtt|Jƒƒ}\|[�sÒ|\�oÖ|V }]|Z�r|X�s|]�r|O |R¡ |N |R d0¡¡ |Ad7 }A|]�r&|N |F¡ |O |G¡ |M�rT|K�rT|]�rT|(|;  |F¡ |*|;  |G¡ |C d$¡ |EdD �rÔz>t!|EdD d#ƒ}^|C|F|Ed1 |Ed2 |EdE |^dFk�rœ|^nd g7 }CW n*   |C|F|Ed1 |Ed2 |EdE d g7 }CY nX n|C|F|Ed1 |Ed2 |EdE d g7 }C|C|V�rdG |V¡gnd7 }C|C|4d|2 … 7 }C|;|?k�r:g g g dHœ|?|;< nNt"|Ed1 t#ƒ�r”|?|; dI  |G¡ |?|; d1  |Ed1 ¡ |?|; d2  |Ed2 ¡ �q”t |C¡ |/ |C¡ �qx|@�s°|A�	r&zh|"› dJ|B› �}_|@�ræ|_dK|@› dL|@|B dM d›dN�7 }_|A�	r|_dO|A› dL|A|B dM d›dN�7 }_t |_¡ W n   Y nX t dP|?›�¡ t ¡ |& d }`|%dQ|`d›d�7 }%t ¡ }at$|/|?|*|+|,|9ƒ t ¡ |a d }b|%dR|bd›d�7 }%t ¡ }ct%|/t&dSdTt|# ¡ ƒdUdV� t'|/|'|9|0|3|2|1|.|)|(|-|||||||ƒ t ¡ |c d }d|%dW|dd›d�7 }%dX}edY|/j(_)dY|/j(_*dY|/j(_+|e|/j(_,|e|j-_.dY|j-_/nt 0dZ|"› �¡ t ¡ |  d }f| |"› d[|fd›d\|%› d]�¡ �q�|�
s’t 0d^¡ W d_S d`|j1k�
r¬| 2|d` ¡ �z–t ¡ }gt3ƒ }ht da|h› �¡ t db| ›�¡ t d|"›�¡ t dc|›dd|d ›d8|d: › de�¡ |d |d: k�r<|d › df|d: › �n|d › }i|�rZ|› df|i› �}it dg|›�¡ t4j5 |dh|i› df|› di�¡}jt dj|j› dk�¡ | 6|j¡ t7|dlƒ�r¶| 8¡  t dm|j› �¡ t ¡ }kt ¡ }ldn|l|
 d d›do�}m|mdp|d›dq�7 }m|mdr|d›ds�7 }m|mdt |¡7 }m|mdu|k|g d d›dq�7 }mt |m¡ W n> tk
�r‚ } zt dv|j9j:› dw|› �¡ W 5 d }~X Y nX dY|jfW S  tk
�rÐ } z$t dx|› d|j9j:› �¡ W Y ¢d_S d }~X Y nX d S )yNzsensores_coll_name=z* (sensores_coll_name in collection_names)=zmetadata_coll_name=z* (metadata_coll_name in collection_names)=zgenerando reporte de tipo u3   Error revisando indices de la colecciÃ³n sensores: g     @�@Ú	startDateú%d/%m/%YÚendDateÚ r   r   úSe han seleccionado ú diaszComenzando a generar reporte...©ÚdaysÚ-zfecha_format=)Úsensors_coll_nameÚmetadata_coll_namez
		 Obtener y Preparar datos: z.2fÚmszExisten datos en la fecha zbomb_names=c                 S   s   i | ]
}|g “qS r-   r-   ©Ú.0Úalias_bombar-   r-   r.   Ú
<dictcomp>ñ   s      z$_gen_data_report.<locals>.<dictcomp>c                 S   s   i | ]
}|g “qS r-   r-   rA   r-   r-   r.   rD   ò   s      c                 S   s   i | ]
}|g “qS r-   r-   rA   r-   r-   r.   rD   õ   s      c                 S   s   i | ]
}|g “qS r-   r-   rA   r-   r-   r.   rD   ö   s      c                 S   s   i | ]
}|g “qS r-   r-   rA   r-   r-   r.   rD   ø   s      c                 S   s   i | ]
}|g “qS r-   r-   rA   r-   r-   r.   rD   ú   s      é   é   é   r4   é   zBomba ÚHorau   OxÃ­geno mg/Lu   SaturaciÃ³n %u   Temperatura Â°Cu   PresiÃ³n barzAlarmas ÚAlarmas©Ú	L_InicialÚL_FinalÚL_GraphÚceldaInicialÚ
celdaFinalÚ	timestampz%H:%M:%SÚO2ÚSO2ÚInStartÚRLYÚInSelz!Dato con null detectado: InStart=z, InSel=z, FéÿÿÿÿéþÿÿÿÚIoÚVoÚalarmsÚStatusé	   ÚVDFÚ01ÚPSÚPresionÚTEMPg      à¿Ú,)ÚtsrR   rS   rd   z: 
	Datos totales: z
	Datos con null detectados: z (éd   z%).z
	Caso sandwich corregidos: zvalues_for_charts=z
		 Agregar datos: z
		 Graficar: ÚCé   é   )Ústart_columnÚ	start_rowÚrepeatsÚstepz
		 Estilizar: Úitg123chileTzNo hay datos para esta fecha: z : zms z 
õ0   No hay dÃ­as con datos en el rango seleccionado.)FNÚSheetzRuta detectada del escritorio: zrango_fechas=zfechas=z, fechas[0]=Ú=Ú_zexcel_save_path=ÚReporte_ú.xlsxzGuardado archivo Excel  en: z...Úcloseú)Archivo Excel guardado correctamente en: zTiempo total de procesamiento: z ms
u9   	 Asegurar Ã­ndices de bÃºsqueda en ColecciÃ³n sensores: zms
z	 Preparar documento: zms
	 z	 z	 Guardado de archivo: zError al guardar el archivo (z) : úError: );ÚprintÚlist_collection_namesr   r'   ÚtimeÚdebugr   Ú	ExceptionÚerrorr   ÚstrptimeÚlenÚstrÚsplitÚintÚopenpyxlÚWorkbookr   Úranger   ÚjoinÚappendr   ÚlistÚkeysÚsortÚcreate_sheetÚ	enumerater   ÚstrftimeÚpopÚboolr$   ÚroundÚ
isinstanceÚfloatr   r   Úimg_pathr   Ú
protectionÚsheetÚobjectsÚ	scenariosÚpasswordÚsecurityÚworkbookPasswordÚlockStructurer)   Ú
sheetnamesÚremover   r!   ÚpathÚsaveÚhasattrrt   Ú__traceback__Ú	tb_lineno)nÚrango_fechasÚcontrol_typeÚdbÚexcel_save_pathZsensores_coll_namer?   Úcentro_nameÚ	centro_idZ
ts_requestZcollection_namesÚ
time_totalZtime_db_startZt_indices_startÚeZ	t_indicesÚstartÚendÚ	diasEntreÚworkbookÚws_namesÚfechasZt_diasÚdays_with_dataÚfontÚfillÚfill_inyÚfill_iny_manÚfill_vdfÚborderÚ
fill_alarmZtime_dbÚiZ
t_dia_initÚdiaÚfecha_formatZdatos_sensores_bombasZt_prepare_dataZprocess_data_textZt_put_data_startÚ
bomb_namesÚrangos_iny_onÚrangos_bomba_onÚrangos_iny_on_tsÚrangos_bomba_on_tsÚrangos_iny_on_manual_tsÚrangos_iny_on_manualÚ
max_columnÚ	worksheetÚcant_keys_tablaÚv_offsetÚh_offsetÚtablas_distÚtablas_spaceÚspace_titlesÚfilarC   Ú
estructuraÚRangosÚidxÚchannelÚcell_inicial_LetraÚcell_final_LetraÚ
cell_graphÚvalues_for_chartsÚ	null_dataÚsandwich_caseÚ
total_dataÚ
nueva_filaZdato_sensores_bombaÚ	data_filard   Úts_objÚdato_o2Údato_so2rT   Úinyection_o2Úin_selÚtcb_autoÚ
data_arrayÚgraph_arrayÚprev_graph_tsZprev_prev_graph_tsÚlast_tsÚlast_last_tsÚ	corrienteÚvoltajeÚalarmasr\   Úprev_is_fillÚcorrect_this_cellÚprev_prev_is_fillÚinyecting_vdfÚinyecting_psÚpump_runningÚrounded_pressZday_infoZ
t_put_dataZt_graph_startZt_graphZt_styles_startZt_stylesr—   Zt_diaZt_saveZpath_escritorioÚ
identifierÚ	dest_pathZ
t_save_endZt_total_endZ	time_infor-   r-   r.   Ú_gen_data_report{   s   
"
"

ý


  
.
ú




  





&




0&

    
 þ            ý
"
&2
,
rï   Ú	NANOOX_TSÚhistorial_controlc           D      C   sH  t  | d d¡}t  | d d¡}tt|| ƒ d¡ƒdkrltt|| ƒ d¡d ƒd }t d|› d�¡ nd}�z’t||ƒ}t	||ƒ}	d	}
d	}d
}dg|d  }d}|| d }t
 ¡ }g }tƒ \}}}}}}tƒ }i }|	 ¡ D ]¶\}}t|d ƒ}t|| ƒ}t|d ƒ}|||t|td|
 ƒ ƒt|tt|ƒd	 |
 ƒ ƒdœ||< |D ]H}||k�rdg ||< |d dk�r†||  |d ¡ n||  d¡ �qNqâg } g }!t|ƒD �]b}"t|t|"d� ƒ d¡d  d¡}#d |#¡}$|! |$¡ |$|	 ¡ k�rª| |$¡}%| |$¡ |  |$¡ t|
ƒD ]}"|% g ¡ �qdg| dg }&|% |&¡ dg| dddg }'|% |'¡ |	|$ }(t|(ƒ})t|(ƒD ]È\}*}+g },|, d¡ |, d¡ z\|+ dd¡}-|- d¡}*|+ d¡ d¡d }.|-d|*d … }/|-|*d d… }0|,|.|/|0g7 },W n> tk
�r6 }1 zt d|1› d|1jj› �¡ W 5 d}1~1X Y nX |% |,¡ �q|zttj tj  t!¡¡}2tj |2ddd ¡}3tj "|3¡�sŠt#d!|3› �ƒ‚t$|3ƒ}4d"|4_%d#|4_&d$|4_'|% (|4¡ t d%¡ W n4 tk
�rî }1 zt d&|1› �¡ W 5 d}1~1X Y nX t|d ƒ}5t|d	 ƒ}6t|d ƒ}7|%|5t|
d ƒ  }8||8_)||8_*|%|5t|
d	 ƒ  }9|%|6t|
d	 ƒ  }:|%|7t|
d	 ƒ  };||9_)||:_)||;_)||9_*||:_*||;_*|%j+|
d |d |
d |d d'� |%||$ d( ||$ d) … }<|<D ]}=|=D ]}>||>_,�qÞ�qÖt|%j-|
d |)|
 d	 d*�ƒD ]6\}*}=|=D ]&}>t.||$ |* dd… d+� |>_)}�q�qt|%j-|
d |)|
 d	 d*�ƒD ](\}*}=|=D ]}>t/d,d,d-d.d/�|>_0�qp�qd|%j1D ]v}?d}@|?D ]B}>z.|>j2dk	�rÐtt|>j2ƒƒ|@k�rÐt|>j2ƒ}@W n   Y nX �q |@d	 }A|Ad	k�r”|A|%j3|?d j4 _&�q”�qª| �s&t 5d0¡ W d.S d1|j6k�r@| 7|d1 ¡ zŒ|!d |!d2 k�rj|!d › d3|!d2 › �n|!d › }B|�rˆ|› d3|B› �}Bt8d4|B› d5� }C| 9|C¡ t:|d6ƒ�r¶| ;¡  t d7|C› �¡ W W d-S  tk
�r  }1 zt d8|1› �¡ W 5 d}1~1X Y nX W n> tk
�rB }1 zt d9|1› d|1jj› �¡ W 5 d}1~1X Y nX dS ):uÆ  
    Funcion que genera un reporte Excel con el historial de control para un rango de fechas, en una BD.
    Inputs:
      - rango_fechas: {startDate: str, endDate: str} -> Fechas como str en formato "%d/%m/%Y"
      
      - db_host [opcional] str -> direccion IP de bd. Por defecto: "localhost"
      - db_name [opcional] str -> Nombre de la base de datos. Por defecto: "NANOOX_TS"
      - coll_name [opcional] str -> Nombre de la colecciÃ³n en bd. Por defecto: "historial_control"
      - centro_name [opcional] str -> Nombre aÃ±adido al reporte: Reporte_{centro_name}_{rango_fechas}.xslm. Por defecto "".
      
    Retorna booleano: True indica reporte generado correctamente, False error al generar.
    r5   r6   r7   r8   r   r   r9   r:   rG   rE   r4   é   é   rK   Úcolorz#FFFFFFz#000000r;   r=   zHistorial de controlrI   u
   CategorÃ­au   DescripciÃ³nÚmsgú]ÚdateNrv   z  z..r0   r1   zNo se encuentra la imagen en: ZC21iX  iÂ  z%Marca de agua agregada correctamente.z#Error al agregar la marca de agua: )rj   ri   Úend_rowÚ
end_columnrO   rP   )Úmin_rowÚmax_row)rô   ÚcenterTF)Ú
horizontalÚverticalÚshrink_to_fitÚ	wrap_textrn   ro   rW   rq   ZReporte_historial_control_rs   rt   ru   zError al guardar el archivo: z1Error generando reporte de historial de control: )<r   r}   r~   r   r€   r�   r   r'   Úget_dbr   r‚   rƒ   r   ÚdictÚitemsr   r†   r„   r   r…   rˆ   rŠ   r‹   r$   Úfindr{   r|   r    r¡   r!   r�   ÚdirnameÚabspathÚ__file__r&   ÚFileNotFoundErrorÚExcelImgÚanchorÚwidthÚheightÚ	add_imager±   r²   Úmerge_cellsr¶   Ú	iter_rowsr   r   Ú	alignmentÚcolumnsÚvalueÚcolumn_dimensionsÚcolumn_letterr)   r›   rœ   Úsave_dirrž   rŸ   rt   )Dr¢   Údb_hostÚdb_nameÚ	coll_namer¦   rª   r«   r¬   r¤   Ú	dicc_logsrÅ   rÆ   rÇ   rÈ   rÄ   rÉ   r­   r®   r±   r²   r³   r´   rµ   r¶   ÚcolorsrÌ   Úkeyr  rÏ   rÐ   rÑ   Úregr°   r¯   r¸   r¹   rº   rÃ   rË   rÊ   Úsheet_data_srcrÂ   rÍ   ÚlogrÖ   rõ   Úts_hh_mm_ssÚcatÚdecr©   Úbase_dirr’   ÚimgÚLetra1ÚLetra2ÚLetra3Ú
cell_mergeÚcell_1Úcell_2Úcell_3Ú
cell_rangeÚrowÚcellÚcolumnÚ
max_lengthÚadjusted_widthrí   rî   r-   r-   r.   Ú_gen_reporte_historial{  s"   

ú
	
"









,
"
ý	&(&ý
 


2
&r1  c                 C   s8   d| › d�}t  d|› d|› d�¡ t|ƒ}|| }|S )Nz
mongodb://z:27017u   Buscando datos en colecciÃ³n z de Ú.)r   r'   r   )r  r  Ú	mongo_uriÚclientr¤   r-   r-   r.   r  À  s
    r  Ú__main__z	10.0.0.53r`   z
24/04/2025)r5   r7   )r¢   r£   r  r§   )r2   r3   NNr4   )r   rð   rñ   r4   )6Úcopyr!   Úsysry   r�   Úinsertr   r   Úior   Úpathlibr   Úpymongor   r‚   Úopenpyxl.utilsr   Úopenpyxl.stylesr   r	   r
   r   r   r   Úopenpyxl.drawing.imager   r	  Úreports_utilsr   r   r   r   r   r   r   r   r   ÚDB_HOSTÚgetattrÚcurrent_dirr  ÚresolveÚparentr/   Údesktopr’   r  rï   r1  r  Ú__name__ÚCONTROLr¢   rw   r-   r-   r-   r.   Ú<module>   sL   ,#
    
  G

