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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é   )Ú
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=   rA   Úcentro_nameZ	row_titleZ
row_headerÚ
cell_titleÚcÚiÚheaderr:   r,   r,   r-   Ú_style_flux_headers<   s    rL   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_graphS   s      rR   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   FrM   Tz	font.sizeé
   )rS   é   é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[   Ú	linestyler`   r^   r]   z%H:%MzFlujometro - g333333Ó?)r\   ÚpngÚtightgš™™™™™¹?)ÚformatÚbbox_inchesÚ
pad_inchesi,  )#ÚappendÚgetrR   rN   ÚpltÚrcParamsÚupdateÚsubplotsÚanyÚfill_betweenÚget_xaxis_transformÚ
set_xlabelÚlenrC   Ú
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)rD   Ú	data_rowsZanchor_cellrG   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           4      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 �]4\}}td |tt   }|t d }t|ƒ}t| ||ƒ}t||||||| ¡ ||ƒ	 |�s"qÀ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ô�q<d}%t tƒD ]B}#||# d }&t!dt"|&dƒƒ}'t||# ƒ}(|'|j#|( _$|%|'7 }%�q.|%t% })|› d�}*t&|||*||)ƒ t|ƒD �]V\}+}||+ },| d¡}| d¡}| d¡}-d}.|dk	�r|dk�rztt|ƒd
ƒ}.W n   d}.Y nX d}/|dk	�rD|dk�rDztt|ƒd
ƒ}/W n   d}/Y nX |dk�sX|-dk�r\dnd}0|d   d¡|.|/|0g}1t|1ƒD ]r\}#}2|j|,||# |2d �}3||3_'t(d!d!d"�|3_)t*dd#�|3_+|#d$k�rÔ|2dk	�rÔd%|3_,|#dk�r~|2dk�r~||3_-�q~�qœqÀd|j+_.d|j+_/d|j+_0t1|j+_2|S )&u3   Procesa una hoja completa para un dÃ­a especÃ­fico.z%d-%m-%Y)ÚtitleÚFF0000r_   ÚimageszLogo_Reportes.pngÚCr   )r7   r6   ÚrepeatsÚstepr   é   r/   FTc                 S   s   i | ]\}}|t t|ƒƒ“qS r,   )rx   Ústr)rd   rJ   Ú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)r0   r1   r;   r2   r3   )Úlocked)r   r   z0.00)3ÚstrftimeÚcreate_sheetÚWORKBOOK_AUTHORÚ
propertiesÚcreatorÚlastModifiedByr   r   ÚosÚpathÚjoinÚdirnameÚ__file__Úexistsr   ÚVERTICAL_OFFSETrx   ÚCOLUMNS_PER_SENSORÚSPACING_BETWEEN_SENSORSr:   Úfreeze_panesrB   ÚHORIZONTAL_OFFSETr   r.   rL   Ú
capitalizerC   ro   rž   ÚroundrN   r@   r!   r   Úcolumn_dimensionsrŠ   ÚPIXELS_PER_COLUMN_UNITr–   rA   r   r>   r	   Ú
protectionÚnumber_formatr<   ÚsheetÚobjectsÚ	scenariosÚSHEET_PASSWORDÚpassword)4r%   ÚworkbookÚdate_objÚ
centro_idsZ
sheet_namerD   r<   r=   Úfill_inyÚfill_iny_manÚfill_vdfrA   Ú
fill_alarmÚred_fontÚimg_pathZrow_title_mergedZrow_headersZrow_data_startÚhas_dataÚidxr&   Ú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_valsrJ   Ú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ÚvalsrQ   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Úpyplotrp   Úmatplotlib.datesÚdatesr€   Úreports_utilsr   r   r   r   Úswitch_backendr³   r·   r´   rµ   r»   rÁ   r©   rC   r.   rL   rR   r–   rÖ   r,   r,   r,   r-   Ú<module>   s4   

W