
    AhF<              	          S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJr  S SK	J
r
  S SKJr  S SKJr  S S	KJrJr  S S
KJr  S SKJrJrJrJrJrJrJrJrJrJr  S SK J!r!J"r"  S SK#J$r$J%r%J&r&  S SK'J(r(  S SK)J*r*  S SK+J,r,  S SK-Jr.  S SK/J0r1  S SK2J3r3J4r4J5r5J6r6  S SK7J8r8  \ Rr                  Ru                  \Rv                  SS5      r<\*Rz                  " \," S\ Rr                  Ru                  \<S5      5      5        \*Rz                  " \," S\ Rr                  Ru                  \<S5      5      5        \ Rr                  Ru                  \Rv                  SS5      r>S"S\?S\@S\4S jjrAS rBS  rC\
S! 5       rDg)#    N)datetime)get_object_or_404)JsonResponse)settings)login_required)
connection)Sum)A4	landscape)cm)
SimpleDocTemplate	ParagraphSpacerTable
TableStyle	PageBreakImageFramePageTemplateKeepTogether)getSampleStyleSheetParagraphStyle)	TA_CENTERTA_LEFT
TA_JUSTIFY)colors)
pdfmetrics)TTFont)r   )Obra	EtapaObra	PagamentoFoto)atingiu_limite_hdstaticfonts
DejaVuSanszDejaVuSans.ttfDejaVuSans-BoldzDejaVuSans-Bold.ttficonsnomesizereturnc                 ^    [         R                  R                  [        U 5      n[	        X!US9$ )uE   Retorna RLImage do ícone solicitado com tamanho indicado (quadrado).widthheight)ospathjoinICON_DIRRLImage)r)   r*   caminhos      */var/www/html/minhaobra/obras/relatorio.py_icor7   (   s#    ggll8T*G7t44    c                    UR                  5       (       d  g U R                  [        [        SS5      [	        SUS   5      //S/SUR
                  S-
  /S95        U R                  [        SS	[        -  5      5        0 nU HM  nUR                  (       a  UR                  R                  OS
nUR                  U/ 5      R                  U5        MO     UR                  5        GH  u  pxU R                  [	        SU S3US   5      5        U R                  [        SS[        -  5      5        / SpU GH  n [        R                  " UR                  R                  5       nUR                   u  p[#        UR
                  S-  U-  UR$                  S	-  U-  S5      nU	R                  ['        UR                  R                  X-  X-  S95        U
S-  n
S S S 5        U
S:X  d
  XS   :X  d  M  U R                  [        U	/UR
                  S-  UR
                  S-  /S95        U R                  [        SS[        -  5      5        / SpGM     U R                  [+        5       5        GM     g ! , (       d  f       N= f! [(         a     GMX  f = f)Nz	fotos.png   u   <b>Relatório Fotográfico</b>	subtituloVALIGNr   r   r@   MIDDLE   style	colWidths   333333?zSem etapa vinculada<b></b>normal      ?r   gQ?r-      r@   )rE         ?)existsappendr   r7   r   r.   r   r   etapar)   
setdefaultitemsPILImageopenimagemr1   r*   minr/   r4   	Exceptionr   )elfotosstdocfotos_por_etapafchaverP   listalinhacontfotoimgwhratios                   r6    _adicionar_relatorio_fotograficorg   0   s   <<>>IIetK+Y7WY[\gYh-ikl<="ciiXZlI[] ^IIfQ2O !-B""5"-44Q7  (--/
		)c%-r(|<=
		&CF#$!tD]]4;;#3#3488DA3 1CJJsNA3EqIELL)9)9QRQX!YZAID	 5 qyD"I-		%CIIcM399S=3QRS		&BrE*+2qD  			)+! 0 54
  s1   6*I; A3I*I;*
I84I;8I;;
J
	J
c                    U R                  [        [        SS5      [        SUS   5      //S/SUR                  S-
  /S95        U R                  [        SS	[        -  5      5        U(       d  U R                  [        S
US   5      5        g U R                  [        XGR                  UR                  S-  S95        U R                  [        SS	[        -  5      5        U R                  [        SUS SUS SXe-
  S S3US   5      5        g )Npagamento.pngr:   u(   <b>Curva S – Pagamentos Acumulados</b>r;   r<   rB   rC   rF   皙?u+   Nenhum pagamento registrado até o momento.rJ   rM   r-   zForam pagos <b>R$ ,.2fz</b> de <b>R$ z</b> (restam <b>R$ z</b>).
explicacao)rO   r   r7   r   r.   r   r   r4   )rX   rZ   datascumulbufval_pagoval_orcr[   s           r6   _adicionar_curva_srr   N   s   IIetOB/ !KRP[_]` a<="ciiXZlI[] ^ IIfQ2
		)I2h<XYIIgc399R<@AIIfQ2IIi
XdO>'$ H )$/v	78:<8HJ Kr8   c                 V  ^-^.^/ U R                   R                  (       a  [        U R                   SS 5      (       d  [        SS0SS9$ [        R
                  " U R                   R                  R                  5        U R                  S:w  a  [        SS0SS9$ [        [        US	9n[        U R                   5      (       a  [        SS
0SS9$ [        R                  R                  [        R                   SU R                   R                  R                  U R                   R"                  SUR$                   35      n[        R&                  " USS9  SUR$                   SU R                   R$                   S3n[        R(                  " U5       Vs/ s H  nUR+                  U5      (       d  M  UR-                  S5      (       d  M3  UR/                  US5      R/                  SS5      R1                  5       (       d  Mj  [3        UR/                  US5      R/                  SS5      5      PM     nnU(       a  [5        U5      S-   OSnU U S3n[        R                  R                  X85      n	[6        R8                  R;                  US9R=                  S5      n
[>        R8                  R;                  US9R=                  S5      n[@        R8                  R;                  US9R=                  SS5      n[C        URD                  =(       d    S5      n[C        URG                  [I        S5      S9S   =(       d    S5      nURJ                  (       a:  [L        RN                  " 5       RQ                  5       URJ                  -
  RR                  OSn/ / SnnnU HV  nU[C        URT                  5      -  nURW                  URX                  R[                  S5      5        URW                  U5        MX     [\        R^                  " 5       nU(       a  [`        Rb                  " S5        [`        Rd                  " S S!9  [`        Rf                  " UUS"S#9  [`        Rh                  " S$5        [`        Rj                  " S%5        [`        Rl                  " S&5        [`        Rn                  " S'S(S)9  [`        Rp                  " SS*S+S,9  [`        Rr                  " 5         [`        Rt                  " US-S.9  [`        Rv                  " 5         URy                  S5        [{        5       n[}        S/US0   S1[~        S2S3S49[}        S5US6   S1[        S7S8S49[}        S9US:   S;S8S<S=9[}        S>US?   S;S@SAS=9[}        SBUS?   S;SC[        R                  SD9[}        SEUS:   S;[        S@S@S49SF.nU-4SG jn[\        R^                  " 5       n[        U[        [        5      SH[        -  SH[        -  SH[        -  SH[        -  SI9m-[        T-R                  T-R                  T-R                  T-R                  SJS	9n/ n[        R                  R                  [        R                  SKSLSM5      nURW                  [        SSN[        -  5      5        URW                  [        USOSPSQSR95        URW                  [        SSS[        -  5      5        URW                  [        STUS/   5      5        URW                  [        SSU[        -  5      5        SVSWUR                  =(       d    SX4SYSZURJ                  (       a  URJ                  R[                  S5      OSX4S[S\S]US^ 34S_S`S]US^ 34S_SaS]X-
  S^ 34SYSbU Sc34SYSd[L        RN                  " 5       R[                  S5      4/nU H^  u  nnnURW                  [        [        US75      [        SeU Sf3USg   5      [        UUSg   5      //ShSiT-R                  Sj-
  /Sk/Sl95        M`     URW                  [        5       5        URW                  [        [        SmSh5      [        SnUSo   5      //S3T-R                  S3-
  /Sk/Sl95        URW                  [        SSp[        -  5      5        SqSrSsStSu.m/U
 GH  m.[        U.U/4Sv jT/ 5       Ss5      n [        U  SwT.R                   Sx3USg   5      [        SyT.R                  =(       d    SX 3US>   5      [        SzT.R                  =(       d    SX 3US>   5      [        S{T.RJ                  (       a  T.RJ                  R[                  S5      OSX S|T.R                  (       a  T.R                  R[                  S5      OSX S}T.R                  (       a  T.R                  R[                  S5      OSX 3US>   5      /n![C        T.R                  =(       d    S5      n"[C        UR;                  T.S~9RG                  [I        S5      S9S   =(       d    S5      n#U"U#-
  n$U!RW                  [        SU"S^ SU#S^ SU$S^ 3US>   5      5        UR;                  T.SS9n%U%R                  5       (       Ga  U!RW                  [        SS[        -  5      5        U!RW                  [        [        SS5      [        SUS>   5      //S7T-R                  S7-
  /Sk/Sl95        / SQ/n&U% Hy  n'U&RW                  U'R                  =(       d    U'R                  =(       d    SXU'R                  =(       d    SXU'R                  =(       d    SX[C        U'RT                  5      S^ /5        M{     [        U&ST-R                  S-  T-R                  S-  T-R                  S-  T-R                  Sp-  /S9n(U(R                  [        SSS[        R                  " S5      4SSSS[        R                  4SSSSS[        R                  [        R                  /4/5      5        U!RW                  U(5        U!RW                  [        SS+[        -  5      5        URW                  [        U!5      5        GM     URW                  [        5       5        URW                  [        [        S_Sh5      [        SUSo   5      //S3T-R                  S3-
  /Sk/Sl95        URW                  [        SSp[        -  5      5        / SQ/n)U H  nUR                  (       a  UR                  R                  OUR                  n*U)RW                  URX                  R[                  S5      UR                  U*[C        URT                  5      S^ /5        M     [        U)ST-R                  SU-  T-R                  S-  T-R                  S-  T-R                  S-  /S9n+U+R                  [        SSS[        R                  " S5      4SSSS[        R                  4SSSSS[        R                  [        R                  /4/5      5        URW                  U+5        URW                  [        5       5        [        UUUT-5        [        UUUUUXT-5        T-R                  [        SU/US9/5        T-R                  U5        URy                  S5        [        U	S5       oUR                  UR                  5       5        S S S 5        URw                  5         [        R                  R                  [        R                  SU R                   R                  R                  U R                   R"                  SUR$                   3U5      n,[        U,US.5      $ s  snf ! , (       d  f       N= f)Ntenanterroru   Usuário sem tenant.i  )statusPOSTu   Método não permitido.i  )idzLimite de 800 MB excedido.i  
relatoriosobra_T)exist_ok_user__vz.pdf rF   r   )obraordemdata	etapa__idz-data_enviovalor)sr   z%d/%m/%YAGG)
      )figsizeo)markeru   Curva S – PagamentosDatazR$ acumulado-   right)rotationhaz--g?)	linestylealphapng)formattituloHeading1r'         )parentfontName	alignmentfontSize
spaceAftersubtHeading2r:      normBodyTextr&      )r   r   r   r   menorNormalr      rb   	   )r   r   r   	textColorexp)r   r;   rJ   r   	foto_descrl   c                    > U R                  SS5        U R                  TR                  TR                  -   TR                  -   S-  S[
        -  SUR                   35        g )Nr&   r   g       @rF   u   Página )setFontdrawCentredString
leftMarginr.   rightMarginr   page)canvas_docr[   s     r6   rodape'gerar_relatorio_pdf_api.<locals>.rodape   sS    |A&  #..":3??"JC!OQRSUQU#+DII;!7	9r8   rL   )pagesizer   r   	topMarginbottomMarginconteudor$   	relatoriozgrf_graph_logo.pnggffffff?   K   CENTER)r.   r/   hAlignrG   u+   <b>Relatório de Evolução da Sua Obra</b>g333333?zlocalizacao.pngu	   Endereçou   —zcalendario.pngu   Data de iníciozorcamento.pngu   Orçamento totalzR$ rk   ri   u   Já pagozSaldo a pagarzDias decorridosz diasu   EmissãorH   z:</b>rJ   rB   x      r<   )rE   rD   z
etapas.pngz<b>Etapas da Obra</b>r;   rj   u   ✅u   🚧u   ⏳u   🕒)	concluidaem_andamentoatrasadanao_iniciadac              3   ~   >#    U  H2  oTR                   =(       d    S R                  5       ;   d  M+  TU   v   M4     g7f)r~   N)rv   lower).0kestatus_emojis     r6   	<genexpr>*gerar_relatorio_pdf_api.<locals>.<genexpr>   s.     ]|!QXX^QSDZDZD\?\ol1o|s   *==z <b>rI   u   👷 Profissional: u   📑 Doc.: u   📅 Início: z | Prev. fim: z | Fim real: )rP   )tr   u   💰 Orçado: R$ z | Pago: R$ z | Saldo: R$ Material)rP   tipog?zmateriais.png   	Materiais)r   zQtd.zUn.
Valor (R$)gq=
ףp?gQ?)
repeatRowsrE   
BACKGROUNDr>   r@   r   z#D9D9D9GRIDr?   g?)FONTNAMEr>   r   r'   )ALIGN)   rF   )r   r@   RIGHTROWBACKGROUNDS)r   rF   u   <b>Histórico de Pagamentos</b>)r   Tipou   Referênciar   g(\?gQ?rK   pages)rx   framesonPagewb)urlversao)ruseris_authenticatedgetattrr   r   
set_schemart   schema_namemethodr   r   r#   r0   r1   r2   r   
MEDIA_ROOTusernamerx   makedirslistdir
startswithendswithreplaceisdigitintmaxr    objectsfilterorder_byr!   r"   floatorcamento_total	aggregater	   data_inicior   nowdatedaysr   rO   r   strftimeioBytesIOpltswitch_backendfigureplottitlexlabelylabelxticksgridtight_layoutsavefigcloseseekr   r   r   r   r   greyr   r   r   r
   r   r   r   r   r.   r/   BASE_DIRr   r4   r   enderecor   r7   r   nextr)   profissionaldocumento_profissionaldata_prevista_fimdata_fimvalor_orcadorN   material_outro	descricao
quantidadeunidadesetStyler   HexColorwhite
whitesmoker   rP   r   rg   rr   addPageTemplatesr   buildrT   writeread	MEDIA_URL)0requestobra_idr   rel_dirprefixor]   versoesr   nome_pdfcaminho_pdfetapas
pagamentosrY   rq   val_pagdiasrm   rn   somap	buf_chartr   STr   buf_pdfframeELlogocapa_camposicolabelvalemojiblocoval_epagos_esaldo_ematstblmTtab_pagrefTPGr   r[   r   r   s0                                                @@@r6   gerar_relatorio_pdf_apirD  _   s   LL))ggllHd.S.SW%;<SII',,--99:~~W%>?LLTg.D&&W%AB3OO ggll8..|"<<..::GLL<Q<Q"477),.G KK$'dggYfW\\__$5R8GFHjjQXFY wFY,,w' =,-JJv,> =CD99WUWCXC`C`aghjCkCsCsCu =s199WR(00;<FYG w 'c'l1nQF6($'H'',,w1K ""))t)4==gFF""))t)4==fEJ$$$$/88]SED((-A.GJ((3w<(8=BCGAEAQAQx||~""$t'7'77==WXD R$5EaggQVV__Z015<<3E  

I5!

6"c*		*+

6CJJ~6

B7+SXXddRT-UCKK	%@#))+y~~^_O` 	A !J-J[+4rbR#F1Z=K\.5rS **,<(l)+;#F1X;-.&++G$U1Z=</9BSUW
B 9 jjlG
Gim'(t2&'d2?C #..#"2"2CIIszzjYE	B 77<<))8[BVWDIIfQr"uoIIgd#bBCIIfQr"uoIIiEr(|TUIIfQs2v 
K)?%@	-X\XhXht/?/?/H/H/Tnst	.#gd^0DE	J#gd^(<=	Os7?42H-IJ	-$u~>	J(?(?
(KLK 'UC
		%4B<$s5'%7HF$S"X,7: ; $&sCIIcM":@A	C 	D ' IIik IIetL, !8"[/JM N!399R<0<=? @ IIfQr"uo !&Vu\bcL]|]_detAFF840"X,?+ANN,Ce+DEr'{SA$<$<$E#FGGU q}}!7!7
!CZ_ ` a LML_L_ 3 3 < <Z Hejk lBC**qzz22:>RWXZ[]^e[fh	
 ann)*
)))2<<s7|<LSQVUVW'/Yd|<~]SZ[_R`awK 	   qz :;;==LL"R%)LL$r":"+KG"E!H  I+-syy|*<'H&IK L ::C

A,,DDuLL1EII.$QWW~d36 7 
 ca!$3		#syy}ciiX[m \^AJJzeF6??9+EFgc&++6;.!%v?P?P0QR#T U V LLOVAbe_%
		,u%&S T IIik IIetOB/ !BB{OTW X!399R<0<=? @ IIfQr"uo9:Gggaggll1;;
3QVVSU177^TXDY[\  A99S=#))C-3		RUVXCLL	eF6??9#=>	gc&++.3&	%v7H7H(IJL M N IIcNIIik %RC8r2ueY#N ,'5'&QRSIIbMLLO	k$	1ggglln&=	MMO
'',,x)),||**668M8Mtwwi((4C sV455cwV 
 	s$   |-|3|</||
|()r   )Er0   r   r   django.shortcutsr   django.httpr   django.confr   django.contrib.auth.decoratorsr   	django.dbr   django.db.modelsr	   reportlab.lib.pagesizesr
   r   reportlab.lib.unitsr   reportlab.platypusr   r   r   r   r   r   r   r4   r   r   r   reportlab.lib.stylesr   r   reportlab.lib.enumsr   r   r   reportlab.libr   reportlab.pdfbaser   reportlab.pdfbase.ttfontsr   PILrS   matplotlib.pyplotpyplotr   obras.modelsr   r    r!   r"   obras.uploadsr#   r1   r2   r  FONT_DIRregisterFontr3   strr   r7   rg   rr   rD   r8   r6   <module>r\     s     . $   9     1 "   E > >   ( , !  9 9 +
 77<<))8W= 
  |"'',,xIY2Z[ \ 
  0"'',,xI^2_` a
 77<<))8W=5s 5# 5w 5<K" B6 B6r8   