U
    —âñjä-  ã                   @   s  d dl Z d dlZd dlZd dl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 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 e  d
¡ dZ!dZ"dZ#dZ$dZ%dZ&dZ'ddddgZ(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-dS )é    N)ÚdatetimeÚ	timedeltaÚdate)ÚBytesIO)Úget_column_letter)Ú	AlignmentÚFontÚ
Protection)ÚImage)Úetiqueta_centroé   )Ú
get_stylesÚadd_markwater_imagesÚloggerÚget_escritorio_pathÚAggé   é   é   g      #@ZitgexcelÚitgÚHorazCaudal (L/s)zAcumulado (L)zEstado Comunicacionc           
      C   s„   |  ¡ › d�}||  ¡ krg S | | }t |tj ¡ ¡}t |tj ¡ ¡}d||dœi}ddddddœ}| ||¡ dd¡}	t	|	ƒS )u)   Obtiene los datos de un dÃ­a especÃ­fico.Ú_flux_tsÚ	timestamp)z$gtez$lter   r   )Ú_idr   Ú	flow_rateÚcumulantÚ	connected)
ÚlowerÚlist_collection_namesr   ÚcombineÚminÚtimeÚmaxÚfindÚsortÚlist)
ÚdbZtarget_dateÚ	centro_idÚcollection_nameÚ
collectionZstart_dtZend_dtÚqueryÚ
projectionÚcursor© r-   ú=/var/www/itgmanager/itgmanager/nanoox/generate_flux_report.pyÚget_flux_data_for_day,   s    r/   c	                 C   s¸   | j ||d�}	d|› �|	_||	_||	_tddd�|	_| j||||d� t||d ƒD ]}
|| j ||
d�_qTt	t
ƒD ]@\}}| j ||| d�}||_||_||_tddd�|_||_qrdS )z"Estiliza el bloque de encabezados.©ÚrowÚcolumnzFlujometro: Úcenter©Ú
horizontalÚvertical)Ú	start_rowÚstart_columnÚend_rowÚ
end_columnr   N)ÚcellÚvalueÚfontÚfillr   Ú	alignmentÚmerge_cellsÚrangeÚborderÚ	enumerateÚFLUX_HEADERS)ÚwsÚ	col_startÚcol_endr=   r>   rB   Úcentro_nameZ	row_titleZ
row_headerÚ
cell_titleÚcÚiÚheaderr;   r-   r-   r.   Ú_style_flux_headers=   s    rM   c              	   C   sH   | dkrdS zt | ƒ}|dkr$W dS |W S  ttfk
rB   Y dS X dS )u"   Sanitiza valores para el grÃ¡fico.Nç      ð¿)ÚfloatÚ
ValueErrorÚ	TypeError)ÚvalZf_valr-   r-   r.   Úclean_value_for_graphT   s      rS   c                 C   sZ  |sdS g }g }g }g }|D ]’}	|  |	d ¡ |	 d¡}
|	 d¡}|  t|
ƒ¡ |  t|ƒ¡ d}z4|
dk	r|t|
ƒdkr|d}|dk	r”t|ƒdkr”d}W n   Y nX |  |¡ qtj dd	i¡ tjd
dd�\}}t|ƒrú|j	|dd|| 
¡ ddddd�	 d}| d¡ ttƒdk�rtd nd}|j||d� |j|||dddd� |jd|d� dd„ |D ƒ}|�rt|jdd� | ¡ }d}ttƒdk�r–td nd }|j||d� |j|||d!dd dd"� |jd|d� |j t d#¡¡ | ¡  | d$|› �¡ |jdd%d&� tƒ }tj|d'd(d)d*� t |¡ | d¡ t|ƒ}t|ƒ|_ d+|_!|  "||¡ dS ),u‹   
    Genera e inserta el grÃ¡fico con un ancho dinÃ¡mico calculado.
    Incluye franjas rojas verticales cuando hay desconexiÃ³n (-1).
    Nr   r   r   FrN   Tz	font.sizeé
   )rT   é   éd   )ÚfigsizeÚdpir   r   Úredgš™™™™™É?u   Sin ComunicaciÃ³n)ÚwhereÚ	transformÚcolorÚalphaÚzorderÚlabelz#1e4882r   ZCaudal©r\   g      ø?r   )r\   Ú	linewidthr_   r^   Úy)ÚaxisÚ
labelcolorc                 S   s   g | ]}|d k	r|‘qS )Nr-   )Ú.0Úxr-   r-   r.   Ú
<listcomp>—   s      z%insert_flux_graph.<locals>.<listcomp>)Úbottomz#2ca02cZ	Acumuladoz--)r\   Ú	linestylera   r_   r^   z%H:%MzFlujometro - g333333Ó?)r]   ÚpngÚtightgš™™™™™¹?)ÚformatÚbbox_inchesÚ
pad_inchesi,  )#ÚappendÚgetrS   rO   ÚpltÚrcParamsÚupdateÚsubplotsÚanyÚfill_betweenÚget_xaxis_transformÚ
set_xlabelÚlenrD   Ú
set_ylabelÚplotÚtick_paramsÚset_ylimÚtwinxÚxaxisÚset_major_formatterÚmdatesÚDateFormatterÚautofmt_xdateÚ	set_titleÚgridr   ÚsavefigÚcloseÚseekÚExcelImgÚintÚwidthÚheightÚ	add_image)rE   Ú	data_rowsZanchor_cellrH   Zcustom_width_pixelsÚtsÚflowr   Zbad_data_maskÚdZr_flowZr_cumZis_badÚfigÚax1Z
color_flowZlabel_y1Z
valid_flowÚax2Z	color_cumZlabel_y2Úimg_dataÚimgr-   r-   r.   Úinsert_flux_graph^   st     

     þ
 


r—   c           5      C   s<  |  d¡}|j|d�}t|j_t|j_tƒ \}}}}	}
}}tdd�}tj	 
tj	 t¡dd¡}tj	 |¡rŒt||dtd t|ƒtt d d	� td }td
 }td }|j|dd�|_d}t|ƒD �]T\}}t| jdd|| ¡ ƒ}td |tt   }|t d }t|ƒ}t| ||ƒ}t|||||||||ƒ	 |�s4qÀd}dd„ ttƒD ƒ}|D ]ä}| d¡}| d¡}| d¡}|d   d¡}|dk	�r¦|dk�r¦tt t!|ƒd
ƒƒ} nd} |dk	�rÒ|dk�rÒtt t!|ƒd
ƒƒ}!nd}!|dk�sê|dk�rîdnd}"|| |!|"g}#t|#ƒD ](\}$}%t|%ƒ||$ k�rt|%ƒ||$< �q�qNd}&t"tƒD ]B}$||$ d }'t#dt$|'dƒƒ}(t||$ ƒ})|(|j%|) _&|&|(7 }&�q@|&t' }*|› d �}+t(|||+t| jdd||ƒ|*ƒ t|ƒD �]V\},}||, }-| d¡}| d¡}| d¡}.d}/|dk	�r(|dk�r(zt t!|ƒd
ƒ}/W n   d}/Y nX d}0|dk	�rd|dk�rdzt t!|ƒd
ƒ}0W n   d}0Y nX |dk�sx|.dk�r|d!nd}1|d   d¡|/|0|1g}2t|2ƒD ]r\}$}3|j|-||$ |3d"�}4||4_)t*d#d#d$�|4_+t,dd%�|4_-|$d&k�rô|3dk	�rôd'|4_.|$dk�rž|3dk�rž||4_/�qž�q¼qÀd|j-_0d|j-_1d|j-_2t3|j-_4|S )(u3   Procesa una hoja completa para un dÃ­a especÃ­fico.z%d-%m-%Y)ÚtitleÚFF0000r`   ÚimageszLogo_Reportes.pngÚCr   )r8   r7   ÚrepeatsÚstepr   é   r0   FÚfluxÚbarcosTc                 S   s   i | ]\}}|t t|ƒƒ“qS r-   )ry   Ústr)re   rK   Úhr-   r-   r.   Ú
<dictcomp>ã   s      z$process_flux_day.<locals>.<dictcomp>r   r   r   r   z%H:%M:%SNéÿÿÿÿÚ zDesc.Z	Conectador   é   é2   Ú2ZDesconectado)r1   r2   r<   r3   r4   )Úlocked)r   r   z0.00)5ÚstrftimeÚcreate_sheetÚWORKBOOK_AUTHORÚ
propertiesÚcreatorÚlastModifiedByr   r   ÚosÚpathÚjoinÚdirnameÚ__file__Úexistsr   ÚVERTICAL_OFFSETry   ÚCOLUMNS_PER_SENSORÚSPACING_BETWEEN_SENSORSr;   Úfreeze_panesrC   r   ÚclientÚ
capitalizeÚHORIZONTAL_OFFSETr   r/   rM   rD   rp   r¡   ÚroundrO   rA   r"   r    Úcolumn_dimensionsr‹   ÚPIXELS_PER_COLUMN_UNITr—   rB   r   r?   r	   Ú
protectionÚnumber_formatr=   ÚsheetÚobjectsÚ	scenariosÚSHEET_PASSWORDÚpassword)5r&   ÚworkbookÚdate_objÚ
centro_idsZ
sheet_namerE   r=   r>   Úfill_inyÚfill_iny_manÚfill_vdfrB   Ú
fill_alarmÚred_fontÚimg_pathZrow_title_mergedZrow_headersZrow_data_startÚhas_dataÚidxr'   Únombre_visibleÚcol_start_idxÚcol_end_idxÚcol_start_letterÚdataZcolumn_widthsZrow_dataZraw_flowZraw_cumZis_connZval_tsZ
v_flow_strZ	v_cum_strZ	val_stateZrow_valsrK   ÚtxtZtotal_width_excel_unitsZ
calc_widthZfinal_widthÚ
col_letterZtotal_pixels_graphZgraph_anchorZr_idxZcurrent_rowÚis_connectedZval_flowZval_cumZval_connÚvalsrR   r;   r-   r-   r.   Úprocess_flux_dayµ   sÄ    

 
ÿ  ÿ 



 ÿ


  
  
ürÛ   ).Úsysr°   r!   Úloggingr   r   r   Úior   ÚopenpyxlÚopenpyxl.utilsr   Úopenpyxl.stylesr   r   r	   Úopenpyxl.drawing.imager
   r‰   Úmatplotlib.pyplotÚpyplotrq   Úmatplotlib.datesÚdatesr�   Úblueprints.etiquetasr   Úreports_utilsr   r   r   r   Úswitch_backendr¶   r¼   r·   r¸   r¿   rÅ   r¬   rD   r/   rM   rS   r—   rÛ   r-   r-   r-   r.   Ú<module>   s6   

W