
    h                     |   d dl Z d dlZd dl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 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# 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l0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 d dl8m9Z9  e	d       d.dZ:d Z;ed/d       Z<d Z=d  Z>d d!lm?Z?m@Z@ d d"lAmBZB d d#lCmDZD 	 d0d$ZEed%        ZFd d!lm?Z?m@Z@ d d"lAmBZB d& ZGed'        ZHed(        ZId 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+lJmKZK d d,lLmMZM ed-        ZNy)1    N)use)Document)Inches)renderget_object_or_404redirect)HttpResponseHttp404)settings)
connection)reverse)messages)login_required)combinations_with_replacement)datetime)Projeto)Ambiente)Parede)Vidro)Porta)Telhado)DadosTermicos   )RENOVADOR_MODELOS)HIWALL_MODELOS)TIPODUTO_MODELOS)CASSETE_4VIAS_MODELOS) calcular_vazao_total_ar_exteriorAggc                 T   t        | ||||      }t        |t        j                  t        f      rt        t        j                  |            }nt        |      }|dz  }t        d   }|d   D cg c]  }|d   	 }	}|	j                          |	D ]<  |k\  s	t        fd|d   D              }
|j                         }|
g|d<   |g|dc S  d}t        d      }t        d      }t        d	d
      D ][  }t        |	|      D ]J  }t        |      }||k\  s||z
  }t        |      |k  st        |      |k(  s6||k  s<|}|}t        |      }L ] |rLg }|D ]@  t        fd|d   D              }
|j                         }|
g|d<   |j                  |       B ||dS g |dS c c}w )u   
    Seleciona a combinação ideal de renovadores para atender à vazão necessária.
    Busca primeiro um único aparelho que atenda, depois a melhor combinação possível.
       r   velocidadesvazao_maxima_m3hc              3   2   K   | ]  }|d    k(  r|  ywr#   N ).0vvazaos     4/var/www/html/cagpublico/cag/centraltermica/views.py	<genexpr>z.escolher_aparelho_renovacao.<locals>.<genexpr>E   s'      ('(E1 (   )melhor_combvazao_total_ar_exteriorNinf   
   c              3   2   K   | ]  }|d    k(  r|  ywr%   r&   )r'   r(   vazao_necessarias     r*   r+   z.escolher_aparelho_renovacao.<locals>.<genexpr>e   s(      ('(,<< (r,   )r   
isinstancenpndarraylistfloatsumr   sortnextcopyranger   lenappend)	area_piso
pe_direitonumero_pessoastaxa_renovacao	horas_diar.   
vazao_horaaparelho_disponivel
velocidadevazoes_disponiveisvelocidade_escolhidaaparelhor-   menor_excessomenor_quantidaden_aparelhoscomb
soma_vazaoexcesso	resultador)   r3   s                       @@r*   escolher_aparelho_renovacaorR   (   s0    ?y*Vdftv  A )BJJ+=>"'/F(G"H"'(?"@ )2-J ,A. .m< 	%&   $ J#' (.}=( $  +//1H';&<H]# (z+5  K%LMU| Q| 	112DkR 	1DTJZ'$z1I 00Y"22w7N"&K$+M'*4y$	1	1 	 + 	'#' (.}=( $  +//1H';&<H]#X&	' %'1
 	
 #- os   1F%c           
      h   |dk(  rt         }n|dk(  rt        }n|dk(  rt        }nyt        |d       }d}t	        d      }t	        d      }t        d	|  d
|        t        dd      D ]}  }t        ||      D ]l  }t        d |D              }|| z
  }	|| k\  s t        |      |k  st        |      |k(  s=|	|k  sC|}|	}t        |      }t        dt        |       d| d       n  |r8t        |      }
t        dt        |
       d|
D cg c]  }|d   	 c}        |
S t        d       yc c}w )u   
    Determina a combinação de aparelhos (hiwall, tipoduto ou cassete4vias) para atender a 'carga_maxima_watts'.
    Retorna a melhor combinação possível (menor excesso e menor quantidade).
    hiwalltipodutocassete4viasu   Tipo de aparelho não suportadoc                     | d   S )Ncapacidade_resfriamento_wr&   )xs    r*   <lambda>z%determinar_aparelho.<locals>.<lambda>   s    2M0N     )keyNr/   u   Carga máxima: z
 W, Tipo: r      c              3   &   K   | ]	  }|d      yw)rX   Nr&   )r'   as     r*   r+   z&determinar_aparelho.<locals>.<genexpr>   s     "Pa1%@#A"Ps   u   Combinação encontrada: z aparelhos, Capacidade:  WzRetornando z aparelhos: modelou(   Nenhuma combinação adequada encontradau,   Não há combinação adequada de aparelhos.)r   r   r   sortedr8   printr=   r   r9   r>   r7   )carga_maxima_wattstipo_aparelho	aparelhosr-   rK   rL   rrN   capacidade_totalrP   rQ   aps               r*   determinar_aparelhorj   {   sf   
  "		*	$$		.	()	0y&NOIK%LMU|	O./z-
IJ1b\ 
o1)Q? 		oD""P4"PP&);;G#55t9//CIAQ4QV]`mVm"&K$+M'*4y$5c$i[@XYiXjjlmn		o
o %	C	N+<PY8Z"H8Z7[\]89=	 9[s   D/c                    | j                   j                  rI| j                   j                  r3t        j                  | j                   j                  j
                         t        t        |      }|r!t        j                  j                  ||      nt        j                  j                  |      }i }|D ]:  }| j                  j                  d|j                   d       }|||j                  <   < g }|D ]  }	|j                  |	j                        xs |	j                  xs d}
|	j                  |
k7  r#|	j                  s|
|	_        |	j!                          |	j                  rG|j#                  |	j                  d|	j$                  xs dddddddd	g|	j                  xs dd
d       	 t&        j(                  j+                  t,        j.                  d|j0                         }t&        j(                  j+                  ||	j                   d      }t&        j(                  j3                  |      rNt5        j6                  |d      }d|j8                  v r$|d   j;                         }t=        ||
      xs g }n	d}g }nd}g }|j#                  |	j                  |||
dd        |||d}tA        | d|      S # t>        $ r}d| }g }Y d }~Ld }~ww xY w)Nidprojetonome_ambientero   tipo_aparelho_rT   zN/A - Equipamento existenteu   Não especificadoN/A)ra   capacidade_resfriamento_btucapacidade_aquecimento_bturX   capacidade_aquecimento_wfonte_alimentacao%tubulacao_refrigerante_liquido_gas_mmT)nomecarga_termica_maxaparelho_detalhesre   equipamento_existentez!arquivos_cargas_termicas/projeto__resultados_termicos.xlsxopenpyxlengine   Carga Térmica Total Ambienteu   Coluna não encontradau   Arquivo não encontradozErro ao processar arquivo: F)ro   lista_ambientestipos_aparelhosz1centraltermica/lista_ambientes_carga_termica.html)!useris_authenticatedtenantr   
set_schemaschema_namer   r   r   objectsfilterGETgetrp   re   r|   saver?   modelo_aparelhoospathjoinr   BASE_DIRnome_projetoexistspd
read_excelcolumnsmaxrj   	Exceptionr   )request
projeto_idambiente_nomero   	ambientesr   ambre   r   ambientetipo_aparelho_atualcaminho_basecaminho_arquivodfrz   aparelhos_recomendadosecontextos                     r*   lista_projetos_ambientesr      s   ||$$)<)<gll11==>J7GYf  ''}'Ultl|l|  mD  mD  MT  mD  mUIO ;.9J9J8K(LdS-:))*; O 2-11(2H2HIoXMcMcogo!!%88A_A_%8H"MMO))"" ..%B&66M:M38271605).=B' & "*!7!7!C8)-$  	(77<<(9(9=^_f_s_s^t;uvL ggll<H<R<R;SSl9mnOww~~o.]]?:F2bjj@(*+J(K(O(O(Q%-@ARTg-h-nln*(@%-/*$=!)+&
 	**!2!70%* 
 	Y2j **H
 'NPXYY#  	("=aS A%'"	(s   0CK  	K	KKc           	      p   t        j                  t         j                  j                  |      d       | d   dz  }t	        j
                  d       t	        j                  | d   |dd	
       t        |      D ]*  \  }}t	        j                  | d   |   ||ddddd       , t	        j                  d       t	        j                  d       t	        j                  d       t	        j                          t	        j                          t	        j                  |       t	        j                          y)u]   
    Gera e salva o gráfico da carga térmica total (convertida em TR) ao longo do dia.
    Texist_okr   i  )r1      )figsizeu   Horáriou   Carga Térmica Total (TR)o)labelmarker.2fz TRcenterbottom   )havafontsizeu   Horário do Diau8   Carga Térmica Total do Ambiente ao Longo do Dia (em TR)N)r   makedirsr   dirnamepltfigureplot	enumeratetextxlabelylabeltitlelegendgridsavefigclose)r   caminho_graficocarga_termica_trivalors        r*   gerar_grafico_carga_termicar      s     KK04@9:TAJJwHHR
^-5PY\]./ d5J"EeC[+<habcd JJ !JJ*+IIHIJJLHHJKK IIKr[   c                 L   t         j                  j                  t        j                  d| j
                   d      }t        j                  |d       i d|gd|j                  gd|j                  gd|j                  gd	|j                  gd
|j                  gd|j                  gd|j                  gd|j                  gd|j                  gd|j                   gd|j"                  gd|j$                  gd|j&                  gd|j(                  gd|j*                  gd|j,                  gi d|j.                  gd|j0                  gd|j2                  gd|j4                  gd|j6                  gd|j8                  gd|j:                  gd|j<                  gd|j>                  gd|j@                  gd |jB                  gd!|jD                  gd"|jF                  gd#|jH                  gd$|jJ                  gd%|jL                  gd&|jN                  gi d'|jP                  gd(|jR                  gd)|jT                  gd*|jV                  gd+|jX                  gd,|jZ                  gd-|j\                  gd.|j^                  gd/|j`                  gd0|jb                  gd1|jd                  gd2|jf                  gd3|jh                  gd4|jj                  gd5|jl                  gd6|jn                  gd7|jp                  g|jr                  g|jt                  g|jv                  g|jx                  g|jz                  gd8}t}        j~                  |      }	t         j                  j                  || d9      }
|	j                  |
d:;       |	S )<uG   
    Salva as variáveis do ambiente em CSV e retorna o DataFrame.
    z9/var/www/html/cagpublico/cag/arquivos_climaticos/projeto_/Tr   rp   area_parede_nortecoeficiente_parede_nortetipo_parede_nortearea_parede_sulcoeficiente_parede_sultipo_parede_sularea_parede_lestecoeficiente_parede_lestetipo_parede_lestearea_parede_oestecoeficiente_parede_oestetipo_parede_oestearea_vidro_nortecoeficiente_vidro_nortetipo_vidro_nortearea_vidro_sulcoeficiente_vidro_sultipo_vidro_sularea_vidro_lestecoeficiente_vidro_lestetipo_vidro_lestearea_vidro_oestecoeficiente_vidro_oestetipo_vidro_oestearea_porta_nortecoeficiente_porta_nortetipo_porta_norte!diferencial_insolacao_porta_nortearea_porta_sulcoeficiente_porta_sultipo_porta_suldiferencial_insolacao_porta_sularea_porta_lestecoeficiente_porta_lestetipo_porta_leste!diferencial_insolacao_porta_lestearea_porta_oestecoeficiente_porta_oestetipo_porta_oeste!diferencial_insolacao_porta_oestetipo_telhadocoeficiente_transmissao_telhadoarea_telhadodiferencial_insolacao_telhadocalor_sensivel_pessoacalor_latente_pessoarB   taxa_iluminacaodissipacao_equipamentosrA   )r@   temperatura_internaumidade_relativa_internaumidade_absoluta_internarC   z
_dados.csvF)index)Ar   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   diferencial_insolacao_norter   r   r   diferencial_insolacao_sulr   r   r   diferencial_insolacao_lester   r   r   diferencial_insolacao_oester   coeficiente_telhador   r   r   r   rB   r   r   rA   r@   r   r   r   rC   r   	DataFrameto_csv)ro   rp   paredevidroportatelhadotermicor   dadosr   caminho_csvs              r*   salvar_dados_em_csvr    sq    77<< 1 15nov  pD  pD  oE  EF  4G  HLKKt,C-C 	f667	C
 	#V%D%D$EC 	f667C 	F223C 	!6#@#@"AC 	F223C 	f667C 	#V%D%D$EC 	f667C 	f667C 	#V%D%D$EC 	f667C$ 	U334%C& 	"E$A$A#B'C( 	U334)C* 	5//0+C, 	 %"="=!>-C. 	5//0/C0 	U3341C2 	"E$A$A#B3C4 	U3345C6 	U3347C8 	"E$A$A#B9C: 	U334;C@ 	U334ACB 	"E$A$A#BCCD 	U334ECF 	,e.O.O-PGCH 	5//0ICJ 	 %"="=!>KCL 	5//0MCN 	*E,K,K+LOCP 	U334QCR 	"E$A$A#BSCT 	U334UCV 	,e.O.O-PWCX 	U334YCZ 	"E$A$A#B[C\ 	U334]C^ 	,e.O.O-P_Cd 	--.eCf 	*G,G,G+HgCh 	--.iCj 	('*O*O)PkCp 	 '"?"?!@qCr 	!=!= >sCt 	7112uCv 	G334wCx 	"G$C$C#DyCz 	w))*{C| ''( ' ; ;<%,%E%E$F%,%E%E$F"112ECEJ 
e	B'',,|j-IJKIIkI'Ir[   )PtRGBColor)WD_ALIGN_PARAGRAPH)get_current_requestc                    t               }t               }|r|j                  j                  j                  dk(  r|j
                  D ]  }	|	j                  }
|
j                  r|
j                  d   n|
j                         }d|_	        t        j                  |_        |j                  d   }t        d      |j                  _        t#        ddd      |j                  j$                  _         |j)                  dd       |j                  d	| j*                          |j                  d
| j,                          |j                  d| j.                   d| j0                   d       |j                  dt3        j4                         j7                  d              |j                  d       |j)                  dd       ||j8                  s|j;                  dd      }d|_        |j>                  d   j@                  }d|d   _	        d|d   _	        |jB                  d   jE                         D ]E  \  }}|jG                         j@                  }tI        |      |d   _	        tI        |      |d   _	        G n|j                  d       |j                  d       tJ        jL                  jO                  |      r|jQ                  |tS        d             n|j                  d       |j)                  dd       |j                  d|jU                                 tJ        jL                  jW                  tX        jZ                  ddd       tJ        jL                  jW                  tX        jZ                  ddd!      tJ        jL                  jW                  tX        jZ                  ddd"      d#}|j]                  |      }|r<tJ        jL                  jO                  |      r|jQ                  |tS        d$             n|j                  d%       |r:t_        |t`              r)|j;                  dd&      }d|_        |j>                  d   j@                  }g d'}tc        |      D ]  \  }}
|
||   _	         |D ]  }t_        |td              s|jG                         j@                  }|j]                  d(d)      |d   _	        |j]                  d*d)       d+|d   _	        |j]                  d,d)       d+|d   _	        |j]                  d-d)      |d$   _	        |j]                  d.d)      |d/   _	        |j]                  d0d)      |d   _	         n|j                  d1       |j)                  d2d       |j                  d3       tJ        jL                  jW                  tX        jZ                  ddd4      }tJ        jL                  jO                  |      r|jQ                  |tS        d$             n|j                  d5       tJ        jL                  jW                  tX        jZ                  d6| j*                   d7|jf                   d8      }tK        jh                  tJ        jL                  jk                  |      d9:       |jm                  |       |S );u   
    Gera um arquivo DOCX contendo:
      - Informações do projeto
      - Dados do ambiente
      - Gráfico de carga térmica
      - Aparelhos recomendados
      - Sistema de renovação de ar (imagem + dados estáticos de exemplo)
    Retorna o caminho do arquivo .docx gerado.
    tester   -   VERSÃO DE TESTE – NÃO USAR COMERCIALMENTE$      u+   Relatório de Carga Térmica e Equipamentosr   level	Projeto: Cidade: Coordenadas: (, )u   Data de Criação: z%Y-%m-%d %H:%M:%SP________________________________________________________________________________Dados do Ambienter0   rowscols
Table Grid
   ParâmetroValor#   Dados do ambiente não encontrados.u   
Gráfico de Carga Térmica:   width   (Gráfico não disponível)zAparelhos RecomendadosTipo de Aparelho Selecionado: staticimagenshi-wall-02.jpgPDuto_Inverter.jpgPCassete_Inverter.jpgrT   rU   rV      %   (Imagem do aparelho não disponível)r   )Modeloz
Cap. Resf.z
Cap. Aque.   Alimentaçãou   Tubulação	   Potênciara   rs   rt   z BTU/hru   rw   rx      potencia_motor_w+Nenhum aparelho recomendado foi encontrado.   Sistema de Renovação de Aru-   Vazão Total Necessária (Exemplo): N/A m³/hrenovador.jpg&   (Imagem do renovador não disponível)arquivos_relatorios_relatorio_z.docxTr   )7r   r  r   r   r   sectionsheader
paragraphsadd_paragraphr   r  CENTER	alignmentrunsr  fontsizer  colorrgbadd_headingr   cidadelatitude	longituder   nowstrftimeempty	add_tablestyler"  cellsilocitemsadd_rowstrr   r   r   add_picturer   
capitalizer   r   r   r   r4   r7   r   dictrp   r   r   r   )ro   r   dados_ambienter   r   df_dados_ambientere   docr   sectionrA  header_paragraphruntabela	hdr_cellscolval	row_cellsr.  caminho_imagem_aparelhoheadersr   rJ   imagem_renovadorcaminho_docxs                            r*   gerar_relatorio_docxrk  h  s    *C
 "#G7<<&&22g=|| 	9G^^F7=7H7Hv003fNbNbNd$S!);)B)B&"''*CrFCHHM!)#sC!8CHHNN	9 OOAOK	'"6"6!789 012w'7'7&87;L;L:MQOP+HLLN,C,CDW,X+YZ[h OO'qO1$->-D-DAA.#KKN((	(	!#	!)..q1779 	)HC(..I #CIaL #CIaL	)
 	?@ 56	ww~~o&vay978 OO,AO66}7O7O7Q6RST '',,x00(IGWXGGLL!2!2HiI]^X%6%6)MdeG
 &kk-8277>>2I#J/vayAAB *-CT"JAA.#KKN((	e"7+ 	'IAv &IaL	' / 	LH(D)"NN,22	$,LL5$A	!!'/||4QSX'Y&ZZ`$a	!!'/||4PRW'X&YY_$`	!!$,LL1De$L	!!$,LL1XZ_$`	!!$,LL1CU$K	!!	L 	GH OO2!O<EFww||H$5$5xO\	ww~~&'(q	:BC 77<< 1 13HWMaMaLbbmnv  oE  oE  nF  FK  KL  MLKK-=HH\r[   c                    | j                   j                  rI| j                   j                  r3t        j                  | j                   j                  j
                         | j                  dk(  r| j                  j                  d      }t        t        |      }t        t        ||      }||_        |j                          t        j                  | d       t!        t#        d||d            S y )	NPOSTre   rl   rn   z%Tipo de aparelho salvo com sucesso!!!r   )r   r   )kwargs)r   r   r   r   r   r   methodrm  r   r   r   r   re   r   r   successr   r   )r   r   r   re   ro   r   s         r*   salvar_tipo_aparelhorq    s    ||$$)<)<gll11==>~~((9#G
;$Xwm\!."IJ :R\o|C}~  r[   c                    d}| j                   D ]e  }|j                  }|j                  r|j                  d   n|j                         }|j	                  |      }t        d      |j                  _        t        ddd      |j                  j                  _
        t        j                  |_        |j	                  d|z          |j                  }|j                  r|j                  d   n|j                         }|j	                  |      }t        d      |j                  _        t        ddd      |j                  j                  _
        t        j                  |_        |j	                  d|z          h y)uq   
    Insere uma marca d'água de texto em todas as páginas do documento de forma mais visível e inclinada.
    r  r         z

N)r@  rA  rB  rC  add_runr  rG  rH  r  rI  rJ  r  rD  rE  footer)	r^  watermark_textr_  rA  paragraph_header
run_headerrv  paragraph_footer
run_footers	            r*   inserir_marca_daguar|    s7    EN<< :393D3D6,,Q/&J^J^J`%--n=
!"v
$,S#s$;
!%7%>%>" 	  .!89 393D3D6,,Q/&J^J^J`%--n=
!"v
$,S#s$;
!%7%>%>" 	  .!89+:r[   c           	          | j                   j                  rI| j                   j                  r3t        j                  | j                   j                  j
                         t        t        |      }t        t        |      }t        t        |      }t        t        |      }t        t        |      }t        t        |      }t        t        |      }	t        j                  j!                  t"        j$                  d|j&                   |j(                   d      }
t        j                  j+                  |
      r5t-        j.                  |
d      }|d   j1                         |d   |d	   d
}ndddd
}t3        ||j(                  |||||	      }t        j                  j!                  t"        j$                  dd|j(                   d      }t        j                  j+                  |
      rt5        |       |j6                  }|d   dk7  rt9        |d   |      }ng }t;               }| j                   j                  j
                  dk(  rt=        |       |j>                  d   j@                  }|jB                  r|jB                  d   n|jE                         }d}t        j                  j+                  |      rA|jG                         }|jI                  |tK        d             tL        jN                  |_(        d|jG                  d      _)        |jG                  d|j(                   d       |jG                  d|j&                   d       |jG                  d|jT                   d       |jG                  dtW        jX                         j[                  d       d       |jE                  d       |j]                  dd        ||j^                  s|ja                  dd"#      }d$|_1        |jd                  d   jf                  }d%|d   _4        d&|d   _4        |jj                  d   jm                         D ]E  \  }}|jo                         jf                  }tq        |      |d   _4        tq        |      |d   _4        G n|jE                  d'       |j]                  d(d        t        j                  j+                  |      r|jI                  |tK        d)             n|jE                  d*       |j]                  d+d        |jE                  d,|js                                 t        j                  j!                  t"        j$                  d-d.d/      t        j                  j!                  t"        j$                  d-d.d0      t        j                  j!                  t"        j$                  d-d.d1      d2}|ju                  |      }|r<t        j                  j+                  |      r|jI                  |tK        d3             n|jE                  d4       |r?tw        |tx              r.|ja                  dd5#      }d$|_1        |jd                  d   jf                  }g d6}t{        |      D ]  \  }} | ||   _4         |D ]  }!tw        |!t|              s|jo                         jf                  }|!ju                  d7d      |d   _4        |!ju                  d8d       |d   _4        |!ju                  d9d       |d"   _4        |!ju                  d:d      |d3   _4        |!ju                  d;d      |d<   _4        tq        |!ju                  d=d            |d)   _4         n|jE                  d>       |j]                  d?d        |U|j^                  sI|d@   jj                  d   }"|dA   jj                  d   }#|dB   jj                  d   }$|dC   jj                  d   }%ndD\  }"}#}$}%t        |"|#|$|%      }&|&ju                  dEd      }'|jE                  dF|'dGdH       t        j                  j!                  t"        j$                  d-d.dI      }(t        j                  j+                  |(      r|jI                  |(tK        d3             n|jE                  dJ       |&ju                  dKg       })|)rl|jE                  dLt        |)       dM       |ja                  ddN#      }*d$|*_1        |*jd                  d   jf                  }g dO}t{        |      D ]  \  }} | ||   _4         d}+t{        |)d      D ]  \  },}-|*jo                         jf                  }|-ju                  d7d      }.|-dP   dQ   }/|+|/dR   z  }+tq        |,      |d   _4        |.|d   _4        |/dS   |d"   _4        |/dR    dH|d3   _4        |/dT    dU|d<   _4        |/dV    dW|d)   _4        |/d=    dX|d5   _4         |jE                  dY|+ dH       |+|'k\  r|jE                  dZ       n#|jE                  d[       n|jE                  d\       |j(                   d]}0t        j                  j!                  t"        j$                  d^|0      }1t        j                  t        j                  j                  |1      d_       |j                  |1       t        |1d`      5 }2t        |2j                         dab      }3dct        j                  j                  |1       dd|3de<   d!d!d!       |3S # 1 sw Y   3S xY w)fu   
    Gera o relatório DOCX de um ambiente específico e devolve como download,
    incluindo dados do ambiente, gráfico, aparelhos de ar condicionado e
    sistema de renovação de ar.
    rl   r   >/var/www/html/cagpublico/cag/arquivos_cargas_termicas/projeto_r}   r~   r   r       Somatório Carga Sensível Total   Somatório Carga Latente Total carga_termica_total_ambiente_maxsomatorio_carga_sensivel_totalsomatorio_carga_latente_totalrs   mediagrafico_carga_termica_.pngr  r  r   @/var/www/html/cagpublico/cag/static/relatorio/grf_graph_logo.png      @r)  Tu   
Relatório do Ambiente

Ambiente: 
r  r     Data de geração: %d/%m/%Yr  r   r   r  Nr0   r!  r$  r%  r&  r'  u"   Gráfico de Carga Térmica (em TR)r(  r+  )Aparelhos de Ar Condicionado Recomendadosr,  r-  r.  r/  r0  r1  r2  r3  r4  r   r5  zCap. Resf. (BTU/h)zCap. Aque. (BTU/h)r6  u   Tubulação (mm)u   Potência (W)ra   rt   ru   rw   rx   r8  r9  r:  r;  r@   rA   rB   rC   r   r   r   r   r.   u+   Vazão Total Necessária para Renovação: r       m³/hr<  r=  r-      Combinação de  Renovador(es) Selecionada.   Aparelhor5  
Velocidadeu   Vazãou   Pressãou   Nível Sonoror7  r"   r#   ry   pressao_maxima_mmca mmCAnivel_pressao_sonora_dba dBAr`      Vazão Total da Combinação: >   ✓ A combinação atende à necessidade de renovação de ar.Q   ⚠ A combinação não atende completamente à necessidade de renovação de ar.4Nenhum renovador foi selecionado para este ambiente.z_relatorio.docxr>  r   rbGapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentcontent_typeattachment; filename=""Content-Disposition)Hr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rp   r   r   r   r   r  r   re   rj   r   r|  r@  rA  rB  rC  ru  rY  r   r  rD  rE  boldrL  r   rO  rP  rK  rQ  rR  rS  r"  rT  r   rU  rV  rW  rX  rZ  r   r4   r7   r   r[  rR   r>   r   r   r   openr	   readbasename)4r   r   ambiente_idro   r   r  r  r	  r
  r  caminho_xlsxr   r\  r]  r   re   r   r^  header_sectionr`  	logo_pathra  rb  rc  rd  re  rf  r.  rg  	tabela_arrh  r   rA  rJ   r@   rA   rB   rC   renovador_infor3   ri  combinacao_renovadores	tabela_rnvazao_total_combinadaidx	renovador
modelo_renrG   	nome_docxrj  fresponses4                                                       r*   gerar_relatorio_ambienter    sB
    ||$$)<)<gll11==>J7G k:H v9Feh7Eeh7E(;GAG
 77<<
HI]I]H^_!!
"";<L
 
ww~~l#]]<
;023R0S0W0W0Y.01S.T-/0P-Q
 16.3-2
 , ggll
 !7!7 8=O
 
ww~~l##B8
 **M89UB!4=>"

 "$
 *C ||&&'1C  \\!_++N7E7P7P~003VdVrVrVt SI	ww~~i &&(	5%7%>%>" CG9:?z(*@*@)ADEy)=)=(>bABx'7r:;28<<>3J3J:3V2WWYZ[ h OO'qO1$->-D-DAA.#KKN((	(	!#	!)..q1779 	)HC(..I #CIaL #CIaL	)
 	?@
 OO8OB	ww~~o&vay978
 OO?qOI6}7O7O7Q6RST '',,x00(IGWXGGLL!2!2HiI]^X%6%6)MdeG
 &kk-8277>>2I#J/vayAAB *-CT"JMMqqM1	&	NN1%++	
 #7+ 	'IAv &IaL	' / 	QH(D)%--/55	$,LL5$A	!!'/||4QSX'Y&Z	!!'/||4PRW'X&Y	!!$,LL1De$L	!!$,LL1XZ_$`	!!$'5G(O$P	!!	Q 	GH
 OO2!O<$->-D-D%k277:	&|499!<
*+;<AA!D*+;<AA!D@J=	:~~ 1	N &))*CQGCDTUXCYY_`a ww||H$5$5xO\	ww~~&'(q	:BC ,//rB,S1G-H,IIdefMMqqM1	&	NN1%++	j"7+ 	'IAv &IaL	' !"'(>B 	FNC!))+11I"x7J"=1"5J!Z0B%CC! #CIaL *IaL *6 2IaL#-.@#A"B& IIaL#-.C#D"EU KIaL#-.H#I"J$ OIaL#-.@#A"B" EIaL	F 	:;P:QQWXY $44^_qrPQ
 ))*/:I77<< 1 13H)TLKK-=HH\ 
lD	! eQFFHb
 -C277CSCST`CaBbbc*d&'e Oe Os   7Allc           
         | j                   j                  rI| j                   j                  r3t        j                  | j                   j                  j
                         t        t        |      }t        j                  j                  |      }|j                         s!t        j                  | d       t        d      S |j                         }t!               }| j                   j                  j
                  dk(  rt#        |       |j%                  dd       |j'                  d	|j(                          |j'                  d
|j*                          |j'                  d|j,                   d|j.                   d       |j'                  dt1        j2                         j5                  d              |j'                  d       |j6                  d   j8                  }|j:                  r|j:                  d   n|j'                         }d}t<        j>                  j                  |      rA|jA                         }	|	jC                  |tE        d             tF        jH                  |_%        d|jA                  d      _&        |jA                  d|jN                   d       |jA                  d	|j(                   d       |jA                  d
|j*                   d       |jA                  dt1        j2                         j5                  d       d       |j'                  d       |j%                  dd       tQ        |d      D ]'  \  }
}|j'                  |
 d|jN                   d       ) |jS                          g }g }|D ]e  }|j%                  d|jN                   d       t        tT        |      }t        tV        |      }t        tX        |      }t        tZ        |      }t        t\        |      }t<        j>                  j_                  t`        jb                  d |j(                   |jN                   d!      }t<        j>                  j                  |      r5te        jf                  |d"#      }|d$   ji                         |d%   |d&   d'}nd(d(d(d'}tk        ||jN                  |||||      }t<        j>                  j_                  t`        jb                  d)d*|jN                   d+      }t<        j>                  j                  |      rtm        |       |j%                  d,d-       ||jn                  s|jq                  dd-/      }d0|_9        |jt                  d   jv                  }d1|d   _<        d2|d   _<        |jz                  d   j}                         D ]E  \  }}|j                         jv                  }t        |      |d   _<        t        |      |d   _<        G n|j'                  d3       |j%                  d4d-       t<        j>                  j                  |      r|jC                  |tE        d5             n|j'                  d6       |j%                  d7d-       |j                  }|j'                  d8|j                                 t<        j>                  j_                  t`        jb                  d9d:d;      t<        j>                  j_                  t`        jb                  d9d:d<      t<        j>                  j_                  t`        jb                  d9d:d=      d>}|j                  |      }|r<t<        j>                  j                  |      r|jC                  |tE        d?             n|j'                  d@       |dA   d(k7  rt        |dA   |      } ng } | r`t        | t              rO|jq                  ddB/      }!d0|!_9        |!jt                  d   jv                  }g dC}"tQ        |"      D ]  \  }
}#|#||
   _<         | D ]  }$t        |$t              s|!j                         jv                  }|$j                  dDd(      |d   _<        t        |$j                  dEd(            |d   _<        t        |$j                  dFd(            |d-   _<        |$j                  dGd(      |d?   _<        |$j                  dHd(      |dI   _<        t        |$j                  dJd(            |d5   _<        |j                  |$        n|j'                  dK       |j%                  dLd-       |U|jn                  sI|dM   jz                  d   }%|dN   jz                  d   }&|dO   jz                  d   }'|dP   jz                  d   }(ndQ\  }%}&}'}(t        |%|&|'|(      })|)j                  dRd      }*|j'                  dS|*dTdU       t<        j>                  j_                  t`        jb                  d9d:dV      }+t<        j>                  j                  |+      r|jC                  |+tE        d?             n|j'                  dW       |)j                  dXg       },|,r|j'                  dYt        |,       dZ       |jq                  dd[/      }-d0|-_9        |-jt                  d   jv                  }g d\}"tQ        |"      D ]  \  }
}#|#||
   _<         d}.tQ        |,d      D ]  \  }/}0|-j                         jv                  }|0j                  dDd(      }1|0d]   d^   }2|.|2d_   z  }.t        |/      |d   _<        |1|d   _<        |2d`   |d-   _<        |2d_    dU|d?   _<        |2da    db|dI   _<        |2dc    dd|d5   _<        |2dJ    de|dB   _<        |j                  |0        |j'                  df|. dU       |.|*k\  r|j'                  dg       B|j'                  dh       U|j'                  di       h |j%                  djd       |j%                  dkd-       i }3|D ],  }$|$j                  dDd(      }4|3j                  |4d      dz   |3|4<   . |3r|jq                  dd-/      }!d0|!_9        |!jt                  d   jv                  }dl|d   _<        dm|d   _<        |3j}                         D ]<  \  }4}5|!j                         jv                  }|4|d   _<        t        |5      |d   _<        > n|j'                  dn       |j'                  do       |j%                  dpd-       i }6|D ]>  }0|0j                  dDd(      }4|0d]   d^   d`   }2|4 dq|2 }7|6j                  |7d      dz   |6|7<   @ |6r|jq                  dd-/      }-d0|-_9        |-jt                  d   jv                  }dr|d   _<        dm|d   _<        |6j}                         D ]<  \  }8}5|-j                         jv                  }|8|d   _<        t        |5      |d   _<        > n|j'                  ds       t<        j>                  j_                  t`        jb                  dt|j(                   du      }9t=        j                  t<        j>                  j                  |9      dv       |j                  |9       t        |9dw      5 }:t        |:j                         dxy      };dzt<        j>                  j                  |9       d{|;d|<   d.d.d.       |;S # 1 sw Y   ;S xY w)}u   
    Gera um relatório DOCX para todos os ambientes do projeto, incluindo:
      - Capa
      - Índice (simplificado)
      - Seção de cada ambiente (dados, gráfico, aparelhos, renovador)
      - Resumo final de todos os aparelhos
    rl   rq   u-   Não há ambientes cadastrados neste projeto.lista_projetosr  u   Relatório do Projetor   r  r  r  r  r  r  r  r  r  r  r  r)  Tu   
Relatório do Projeto
zAmbiente (exemplo): r  u   Índicer   )startz. Ambiente: zList Number)rS  r  r~  r  r}   r~   r   r   r  r  r  rs   r  r  r  r   r0   Nr!  r$  r%  r&  r'  u4   Gráfico de Carga Térmica Total do Ambiente (em TR)r(  r+  r  r,  r-  r.  r/  r0  r1  r2  r3  r4  r  r   r  ra   rt   ru   rw   rx   r8  r9  r:  r;  r@   rA   rB   rC   r  r.   u   Vazão Total Necessária: r   r  r<  r=  r-   r  r  r  r  r"   r  r#   ry   r  r  r  r  r`   r  r  r  r  zResumo Final dos EquipamentoszAparelhos de Ar Condicionador5  
Quantidadez/Nenhum aparelho de ar condicionado selecionado. zRenovadores de Arz - zModelo / VelocidadezNenhum renovador selecionado.r>  z_relatorio_projeto.docxr   r  r  r  r  r  r  )Rr   r   r   r   r   r   r   r   r   r   r   r   r   errorr   firstr   r|  rK  rC  r   rL  rM  rN  r   rO  rP  r@  rA  rB  r   r   ru  rY  r   r  rD  rE  r  rp   r   add_page_breakr   r   r   r   r   r   r   r   r   r   r   r  r   rQ  rR  rS  r"  rT  r   rU  rV  rW  rX  re   rZ  r   rj   r4   r7   r[  r?   rR   r>   r   r   r   r  r	   r  r  )<r   r   ro   r   ambiente_exemplor^  r  r`  r  ra  r   r   aparelhos_selecionadosrenovadores_selecionadosr  r  r	  r
  r  r  r   r\  r]  r   tabela_dadosrc  rd  re  rf  re   r.  rg  recomendadosr  rh  rA  rJ   r@   rA   rB   rC   r  r3   ri  r  r  r  r  r  r  rG   aparelhos_por_modelora   qtdrenovadores_agrupadoschavemvcaminho_docx_projetor  r  s<                                                               r*   gerar_relatorio_projetor  .  s3    ||$$)<)<gll11==>J7G  '''8I w OP()) ( *C
 ||&&'1C 
 OO+1O5	'"6"6!789 012w'7'7&87;L;L:MQOP+HLLN,C,CJ,O+PQRh
 \\!_++N7E7P7P~003VdVrVrVt SI	ww~~i &&(	5%7%>%>" BF89>34D4R4R3SSUVWy)=)=(>bABx'7r:;28<<>3J3J:3V2WWYZ[h
 OOIQO' !4 [8QC|H,B,B+CDMZ[   !
  AV*X%;%;$<=QG #6H=!%(;!%(;#Gh?#MHE ww||LWMaMaLbc%%&&?@

 77>>,'|J?B467V4W4[4[4]245W2X134T1UN 5:2716N 0""
 '',,$X%;%;$<DA

 77>>,''O<
 	+15(1B1H1H==aa=8L!-L$))!,22I ,IaL 'IaL-2215;;= -S(00288	$'H	!!$'H	!!-
 CD
 	NVWX77>>/*OOO6!9O=;<
 	C1M ..:=;S;S;U:VWX ggll8#4#4h	K[\X%6%6)MabGGLL):):HiQhi

 #*++m"<"rww~~6M'NOO36!9OEEF <=F.ABL
 LJ|T:115I*IO!q)//IG 'w/ +	6$*	!!+ ) <h- ) 1 1 3 9 9I(0Xu(EIaL%(+HLL9VX],^(_IaL%(+HLL9UW\,](^IaL%(05H%(PIaL%(05\^c(dIaL%(+HLL9KU,S(TIaL% +11(;< KL
 	6a@ (1B1H1H)+6;;A>I*<8==a@J./?@EEaHN./?@EEaHNDNAIz>>4Y
N\jk)--.GK67G6LFST 77<<(9(98YP_`77>>*+OO,F1IO>FG!/!3!3M2!F! 05K1L0MMhij115I*IO!q)//InG&w/ +	6$*	!!+ %&!"+,BA"F ;Y%--/55	&]]8U;
&}5b9
%4F)GG%$'H	!!$.	!!$.v$6	!!'12D'E&Ff$M	!!'12G'H&I$O	!!'12L'M&Nd$S	!!'12D'E&Fb$I	!! )//	:;   >?T>UU[\]$(88!!"bc!!"uvTUCAVP OO31O= OO2!O<* Oh.';'?'?'JQ'NV$O MMqqM1	&	NN1%++	$	!(	!/557 	)KFC!))+11I &IaL #CIaL	)
 	KLb OO'qO1- O	x/}-b1&9
(#j\*'<'@'@'JQ'Ne$	O MMqqM1	&	NN1%++	1	!(	!,224 	)GB!))+11I "IaL #CIaL	)
 	9:
 77<<
  78
 KK 45EHH!" 
"D	) mQFFHb
 -C277CSCSThCiBjjk*l&'m Om Os   A{##{-)r   r   )r	   )PermissionDenied)gerar_relatorio_todos_ambientesc           	         	 | j                   j                  st        d      t        j                  | j                   j                  j
                         t        t        |      }t        | |      }t        |t              r|S t        j                  | d       t        | dd|i      S # t        $ rD}t        j                  | dt        |              t        | ddt        |      i      cY d}~S d}~ww xY w)	uR   
    View para gerar o relatório completo do projeto com todos os ambientes.
    u   Usuário sem tenant associado.rl   u   Erro ao gerar o relatório.z"centraltermica/erro_relatorio.htmlro   u   Erro ao gerar o relatório: erroN)r   r   r  r   r   r   r   r   r  r4   r	   r   r  r   r   rX  )r   r   ro   r  r   s        r*   gerar_relatorio_completor    s    
W||"""#CDD 	gll11==> $G
; 37JG h-Ow =>gCiQXEYZZ Ww">s1vh GHgCfcRSfEUVVWs$   BB* $B* *	C739C2,C72C7)r!   )N)rT   )Or   pandasr   numpyr5   matplotlib.pyplotpyplotr   
matplotlibr   docxr   docx.sharedr   django.shortcutsr   r   r   django.httpr	   r
   django.confr   	django.dbr   django.urlsr   django.contribr   django.contrib.auth.decoratorsr   	itertoolsr   r   projeto.modelsr   ctermica.modelsr   paredes.modelsr   vidros.modelsr   portas.modelsr   telhados.modelsr   termicos.modelsr   r  r   rT   r   rU   r   rV   r   calculotermica.cargastermicosr   rR   rj   r   r   r  r  r  docx.enum.textr  cag.middlewarer  rk  rq  r|  r  r  django.core.exceptionsr  )calculotermica.relatorio_completo_projetor  r  r&   r[   r*   <module>r     s3   > > >    @ @ -      # 9 3  # $ !   # ) ) " & / K E
Mf'>Z GZ GZ^,Ol % - . S[oj @ @( % -:F N Nj X X|
 7 $ 9 #   3 U W Wr[   