
    g*j?                        d Z ddlmZ ddlZddlZddlmZ ddl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  ej*                  d      Z ej*                  d      Z ej*                  d      Z ej*                  d      Z ej*                  d      Z ee      j8                  dz  dz  Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ 	 	 	 	 	 	 	 	 	 	 	 	 ddZ!d Z"	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d dZ#d!dZ$d"d#dZ%d$dZ&y)%zDBuild the signed record: original PDF + one appended signature page.    )annotationsN)datetime)Path)	PdfReader	PdfWriter)colors)A4)mm)ImageReader)canvasz#D72229z#1F3A5Fz#5F5E5Az#F5F5F5z#D9D9D9staticzlfcs-logo.jpegc           	        t        j                         }t        j                  |t              }t        \  }	}
|
dt
        z  z
  }|j                  dd       |j                  dt
        z  |d       |dt
        z  z  }|j                  dd	       d
| fd|fd|xs dfd|fd|j                  d      j                         ffD ]H  \  }}|j                  dt
        z  || d       |j                  dt
        z  ||       |dt
        z  z  }J |dt
        z  z  }|j                  dt
        z  |d       |dt
        z  z  }|j                  dt
        z  |d       |dt
        z  z  }|j                  dt
        z  |dt
        z  dt
        z         |j                  t        t        j                  |            dt
        z  |dt
        z  z   dt
        z  dt
        z  dd !       |j                  dd       |j                  dt
        z  d"t
        z  d#|d d$         |j                          |j                          |j                         S )%Npagesize   Helvetica-Bold      zSign-on record   	Helvetica   JobDocumentRevision-Name	Signed at%d/%m/%Y %H:%M %Z:7         z3I confirm I have read and understood this document.
   
Signature:-   x   (         t   $   TautowidthheightpreserveAspectRatiomask   zDevice:    )ioBytesIOr   Canvasr	   r
   setFont
drawStringstrftimestriprect	drawImager   showPagesavegetvalue)jobdoc_namerevnamewhensig_png
user_agentbufcwhylabelvals                 /opt/lfcs-signon/app/pdf.py	_sig_pagerO      s   
**,CcB'ADAq	BGAII#LLb!-.bLAIIk2		X	SZC 		dmm$78>>@A 	
s 	
R"WaE7!-	R"Wa%	QV	 RKALLb!RSbLALLb!\*bLAFF27AsRxb)KKBJJw/0"r'1q2v:BhrBwDv  WIIk1LLb"r'Xj#.>-?#@AJJLFFH<<>    c                  t        j                  |j                  dd      d         }t               }	t	        t        j                  |             j                  D ]  }
|	j                  |
        t	        t        j                  t        |||||||                  j                  D ]  }
|	j                  |
        t        j                         }|	j                  |       |j                         S )N,   )base64	b64decodesplitr   r   r4   r5   pagesadd_pagerO   writer?   )originalr@   rA   rB   rC   rD   sig_data_urlrF   rE   outprG   s               rN   build_signed_pdfr^   =   s    |11#q9!<=G
+Crzz(+,22 Qrzz)C3dGU_"`abhh Q
**,CIIcN<<>rP   c        	   
      	   ddl m}	 ddlm t	        j
                  |j                  dd      d         }
t        j                         }t        j                  |t              t        \  }} |	ddd	d
      } |	d|d      }fd}|dt        z  z
  }j                  ddd       j                  dd       j                  dt        z  |d       j                  ddd       |d	t        z  z  }j                  dd	       j                  dt        z  |d|         |dt        z  z  }j                  dt        z  |d|        |dt        z  z  }j                  dt        z  |d|j!                  d      j#                          d|        |dt        z  z  }| |d|dt        z  |dt        z        dt        z  z   z  }| |||dt        z  |dt        z        d t        z  z   z  }| |d!|dt        z  |dt        z        d"t        z  z   z  }|s)|s'| |d#|d$t        z  |d%t        z        d"t        z  z   z  }|D ]  \  }}| |d&| |d$t        z  |d%t        z        d't        z  z   z  }|r'| |||d(t        z  |d)t        z        d*t        z  z   z  }|d+t        z  k  sfj%                          |dt        z  z
  } |rN| |d,|d$t        z  |d%t        z        d't        z  z   z  }| |||d(t        z  |d)t        z        d*t        z  z   z  }|d+t        z  k  rj%                          |dt        z  z
  }|d-t        z  z  }j                  dd	       j                  dt        z  |d.       |d/t        z  z  }j                  dt        z  |d0       |d1t        z  z  }j'                  dt        z  |d2t        z  d3t        z         j)                  t+        t        j                  |
            dt        z  |d"t        z  z   d4t        z  d5t        z  d6d78       j                  dd9       j                  dt        z  d:t        z  d;|d<d=         j%                          j-                          |j/                         S )>zYOne-page Take-5 record: task in the worker's words, hazards ticked + controls, signature.r   ParagraphStyle	ParagraphrR   rS   r   br   r#      fontNamefontSizeleadingbbr   parentrg   c                     | j                  dd      j                  dd      |      }|j                  |d      \  }}|j                  	|||z
         |S )N&&amp;<&lt;  replacewrapdrawOn
textstylexrK   r.   r]   _phrc   rH   s
           rN   parazbuild_take5_pdf.<locals>.paraV   sT    dll3088fEuMud#2	Aq2v	rP   r(   `"?/$?S㥛?   r   u   Take 5 — task hazard checkJob:       @zName: z	Started: r   	    Ref: 	   zTask (in my words):      z1Hazards I identified and how I will control them:r)   u   — none ticked —      z[x]  g      ?r      g      @K   z[x]  Other / how I'll do it:r"   zUI have stopped, looked at the task and the area, and will work to the controls above.   r$   r'   n   #   j      Tr,   r-   r!   r2   zSigned on worker's own device: N   )reportlab.lib.stylesra   reportlab.platypusrc   rT   rU   rV   r4   r5   r   r6   r	   r
   setFillColorRGBr7   r8   r9   r:   r=   r;   r<   r   r>   r?   )r@   rC   taskrD   hazardsotherr[   rF   take5_idra   rE   rG   rI   rJ   bodyboldr}   rK   hzctlrc   rH   s                       @@rN   build_take5_pdfr   J   sC    4,|11#q9!<=G
**,CcB'ADAq#b"MD$t6FGD 	
BGAeUE*II#LLb!;<aAbLAIIk2LLb!uSE]+rMALLb!vdV_-rMALLb!y7J)K)Q)Q)S(TT]^f]ghiRKA#T27AsRx	@1r6	IIAdD"r'1cBh	/!b&	88AA4bRSUX[]U]	^abegag	ggA5	T'rBw38Dq2vMM *C	TE",b2gq#(;cBhFFc4b!S2X6rAAArBw;JJLa"r'k!* 	T0$RC"HMPSVXPXXX	T%rBw384sRx??27{	

!b2g+aRKAIIk2LLb!tuRKALLb!\*bLAFF27AsRxb)KKBJJw/0"r'1q2v:BhrBwDv  WIIk1LLb"r'%DZPTQTEUDV#WXJJLFFH<<>rP   c           
     >   ! ddl m} ddlm  t	        j
                         }t        j                  |t              !t        \  }} |dddd	      } |d
|d      } !fd}|dt        z  z
  }!j                  ddd       !j                  dd       !j                  dt        z  |d       !j                  ddd       |dt        z  z  }!j                  dd       d|  d| d| d|j                  d      j                          d| fD ](  }!j                  dt        z  ||       |dt        z  z  }* |dt        z  z  }d|fd|fd|fd |ffD ]S  \  }}| |||dt        z  |d!t        z        d"t        z  z   z  }| |||dt        z  |d!t        z        d#t        z  z   z  }U |r	 t        t	        j
                  |            }|j!                         \  }}d!t        z  d$t        z  }}t#        ||z  ||z        }||z  ||z  }}||z
  d%t        z  k  r!j%                          |dt        z  z
  }!j'                  |dt        z  ||z
  ||&       ||d't        z  z   z  }|	j+                  d)      r|d%t        z  k  r!j%                          |dt        z  z
  }!j                  dd       !j                  dt        z  |d*       |d+t        z  z  }!j-                  dt        z  |d$t        z  d,t        z         t/        j0                  |	j3                  d-d"      d"         }!j'                  t        t	        j
                  |            dt        z  |d.t        z  z   d/t        z  d0t        z  d1d23       !j                  dd4       !j                  dt        z  d5t        z  d6|
d7d8         !j%                          !j5                          |j7                         S # t(        $ r+ | |d(|dt        z  |d!t        z        dt        z  z   z  }Y w xY w)9zeOne/two-page hazard / near-miss / incident report in the reporter's words, photo, optional signature.r   r`   rb   r   rd   r   r#   re   rf   rj   r   rk   c                     | xs dj                  dd      j                  dd      |      }|j                  |d      \  }}|j                  	|||z
         |S )Nr   rn   ro   rp   rq   rr   rs   rw   s
           rN   r}   z build_incident_pdf.<locals>.para   s[    t{s++C9AA#vNPUVud#2	Aq2v	rP   r(   r~   r   r   r   r   z$Hazard / Near-miss / Incident reportr   zType: zReported by: zWhen: r   r   r   r"   zWhat happened (in my words):zWhere:zWho was involved / saw it:zWhat was done straight away:r   rS      Z   <   r.   r/   r   z&(photo attached could not be embedded)data:image/pngr$          rR   r)   V   r   Tr,   r-   r!   r2   zKDesk follow-up: MSF22-3 / NCR as required; toolbox next Wednesday. Device: Nd   )r   ra   r   rc   r4   r5   r   r6   r	   r
   r   r7   r8   r9   r:   r   getSizeminr=   r<   	Exception
startswithr;   rT   rU   rV   r>   r?   )"r@   
kind_labelrC   whatwherewhoactionrD   
photo_jpegr[   rF   	report_idra   rG   rI   rJ   r   r   r}   rK   linerL   rM   imgiwihmaxwmaxhscaledwdhrE   rc   rH   s"                                   @@rN   build_incident_pdfr      s    4,
**,CcB'ADAq#b"MD$t6FGD 	
BGAeUE*II#LLb!CDaAbLAIIk2& 5tf7M$--(;<BBDEYykZ\ 6	R"Wa&S2X6 RKA6=%?PSoqtRu6?A <
s	T%rBw384q2v==	T#tR"War2QV;;< 	ebjj45C[[]FBr27$Dr	4"9-E%ZeB2vR

!b2g+aKKR"Wa"fBrKBa"fA /0rBw;JJLa"r'k!			+r"	R"Wa.	R"W	rBw27BG,""<#5#5c1#=a#@A	K

7 34b2gq1r6zQSVXQXacfhah(,6 	 	;IIk1LLb"r'%pq{  }A  ~A  rB  qC  $D  EJJLFFH<<>!  	e>b2gqRUXZRZ[^_bd^dddA	es   0B9O( (0PPc            
        	 ddl m}  ddlm} dD ]]  }t	        |      j                         s| j                   |d|             | j                   |d|j                  dd                    y	 	 y
# t        $ r Y y
w xY w)zOCalibri if the box has it, Helvetica otherwise. Same rule as tools/prestart.py.r   )
pdfmetrics)TTFont)zC:/Windows/Fonts/calibri.ttfz%/usr/share/fonts/truetype/calibri.ttfCalibriCalibri-Boldzcalibri.ttfzcalibrib.ttf)r   r   )r   r   )	reportlab.pdfbaser   reportlab.pdfbase.ttfontsr   r   existsregisterFontrt   r   )r   r   cands      rN   _brand_fontsr      s    	04] 	1DDz  "''y$(?@''~t||M[i?j(kl0		1 )  (s   *A2 AA2 /A2 2	A>=A>c                
  ./012345 ddl m} ddlm}m}m0m}m}m1m	2 t               \  .} |d.ddt        j                        } |d|d	d
t              } |d||ddt              } |d||ddt        j                        3 |d||t               }|f0fd	/ |d|d      } |d|d|      }t#        j$                         } ||t&        dt(        z  dt(        z  dt(        z  dt(        z  d|       }|j*                  5dQ/1235fd}t,        j/                         r5dt(        z  z
  n5} 1 /d|      g /d |      gg|g!      }|j1                   2g d"             t,        j/                         r; 1 |t3        t,              dt(        z  dt(        z  #      |ggdt(        z  |g!      }n 1|gg|g!      }|j1                   2g d$             t5        d% |D              }d&| fd'|fd(|j7                  d)      fd*|xs d+fg} 1|D  !cg c]  \  } }! /| |       /|!      g c}!} d,t(        z  5d,t(        z  z
  g!      }"|"j1                   2d-d.d/d0d1t8        fd2d3g              /d4|       /d5|      gg}#|D ]'  \  }$}%|#j;                   /|$       /|%d6|      g       ) |#j;                   /d7|       /|d6|      g        1|#5d8t(        z  z
  d8t(        z  gd9:      }&d-d.d/d0d1t8        fd2d3d;d/d<t<        fd;d=d0t<        fg}'|&j1                   2|'             | |d9d	      |" |d9d       | |d>       |d9d?       /|xs d+       |d9d	      g       | |d@       |d9d?      |& |d9d	      g      g}(|j?                         r5|(j;                   | |dA       |d9d?       /|       |d9d	      g              /dB|       /|xs d+      g /dC|       /|xs d+      g /dD|       /|	r|	j7                  dE      nd+      gg}) 1|)d,t(        z  5d,t(        z  z
  g!      }*|*j1                   2d-d.d/d0d1t8        fd2d3g              |dF       |d9d?       /dG|       |d9d?      |* |d9d?      g}+|
jA                  dH      rdtC        jD                  |
jG                  dId9      d9         },|+j;                   |t#        j$                  |,      dJt(        z  dKt(        z  dLM             |(j;                   ||+             |  dN| 4.4fdO}-|jI                  |(|-|-P       |jK                         S c c}!} w )Ra  The T&M docket the head contractor signs on the phone. LFCS letterhead, one page.

    This is the piece of paper the money hangs off, so it says exactly four things: what was done,
    who did it and for how long, what plant and materials went into it, and who signed for it.
    r   r`   )ImageKeepTogetherrc   SimpleDocTemplateSpacerTable
TableStylerd   g      #@re   )rg   rh   ri   	textColorsr   g      %@)rl   rh   ri   r   h1r      )rl   rg   rh   ri   r   h2r#   l)rl   rg   r   c                     t        |       j                  dd      j                  dd      j                  dd      |      S )Nrn   ro   rp   rq   
z<br/>)strrt   )tstrc   s     rN   Pzbuild_tm_pdf.<locals>.P   s<    QW5==c6JRRSWY`aceffrP   rr)   )rl   	alignmentrb)rl   r   rg   r   r(   zT&M docket )r   
leftMarginrightMargin	topMarginbottomMargintitlec                      | j                               ggg      }|j                   dddt        fdddg             |S )N	colWidths
BACKGROUNDr   r   r   )LEFTPADDINGr   r   r   )
TOPPADDINGr   r   r   )BOTTOMPADDINGr   r   r   )uppersetStyleRED)r   r   r   r   r   r   rI   s     rN   bannerzbuild_tm_pdf.<locals>.banner   sX    AekkmR()*qc:	

:fhDFjBDjl m 	nrP   zT&M / Day Works Docketu.   LF Construction Services · Licence No 292303cr   )r   r   r   r   r   r   r   r   )r   r   r   rS   r   ))VALIGNr   r   MIDDLEr   )RIGHTPADDINGr   r   r   )r   r   r   r   r   c              3  &   K   | ]	  \  }}|  y wN ).0r{   rJ   s      rN   	<genexpr>zbuild_tm_pdf.<locals>.<genexpr>
  s     "da"s   r   z	Docket NozDate of worksz%d/%m/%Yz	Raised byr   *   )r   r   r   TOP	LINEBELOWr   r   g?)r   r   r   r"   )r   r   r   r"   r   HoursgzTotal hoursr   rS   )r   
repeatRowsr   )r   r   )r   r   zExtra work carried outr"   LabourzPlant and materialsz	Signed byCompanyr   z%d/%m/%Y %H:%Mu)   Signed — head contractor representativezfI confirm the work described above was carried out as day works / T&M and the hours shown are correct.r   rR   r   r   proportional)r.   r/   kindu    · Docket c                   | j                          | j                  d       | j                  t               | j	                  |j
                  dt        z  d        | j                  t        d   |j                  z
  dt        z  d|j                          r<| j                  d       | j	                  |j
                  dt        z  dd d	         | j                  t               | j                  d
       | j                  |j
                  dt        z  t        d   |j                  z
  dt        z         | j                          y )Ng      @r   u*   LF Construction Services · T&M Docket · r   zPage g      @r   zSigned on site: r   g333333?r   )	saveStater7   setFillColorGREYr8   r   r
   drawRightStringr	   r   pagesetStrokeColorr   setLineWidthr   restoreState)rH   dFr   rF   s     rN   footerzbuild_tm_pdf.<locals>.footer1  s    				!S	t	Q\\27.XY]X^,_`	"Q%!--/bE!&&:JKIIaLLq2v1A*TcBRAS/TU		s	q||R"Wbeamm&;R"WE	rP   )onFirstPageonLaterPages)r   r   )&r   ra   r   r   r   rc   r   r   r   r   r   r   blackr	  r   whiteNAVYr4   r5   r	   r
   r.   LOGOr   r   r   sumr9   LINEappendSTRIPEr:   r   rT   rU   rV   buildr?   )6r@   	docket_norD   descriptionmenplant	raised_by	signed_bycompany	signed_atr[   rF   ra   r   r   r   r   FBbasesmallr   lblrightright_brG   docr   wordsr   httotalkvkvkvtlabournrJ   ltr   r   sig_rowssgt	sig_blockrE   r  r  r   rc   r   r   r   r   rI   s6              `                                  @@@@@@@@rN   build_tm_pdfr9     s    4oooNEAr#Cv||\D3taQUVE	TBR[^	_B	TBR[a[g[g	hB
TB$
GC  g 3tq9ET$!bIG
**,C
C"bbSUg&(2gBG[YbXcKdfC		A   ;;=ARKaEA.34FNOQ]b\ceE	NN: G H I{{}U3t9BGBGDeLMZ\_aZachYijUG90KK
 i j k "c""E#,i0?DMMR\D]2^	(S
)
+B
r2tq!!As)QqT"2rBwBQSG>T
UCLL@;PVX`begkBl@Bhj k l ~q#/0F 21qtQ!A/012
MM1]C(!uQi'*BCD	v!b2g+rBw!7A	FB
-VXsTX/Y
-/U&
1L'8U[3\
^B KK
2	VAq\3q"	v671qI[X[G\^defhi^jk	l	vh'1r6!Q<H	I	KA {{}	v&;<fQlAeHV\]^`aVbcde;$a	(8S&9:9c"Agn$56;$aPY	(:(:;K(L_b&cdfH R"Wa"r'k$:
;CLL@;PVX`begkBl@Bhj k lCDfQPQl ().0171sF1aLRI /0""<#5#5c1#=a#@Arzz'2"r'"r'XfghHH\)$%U+i[)D IIaV&I9<<>g 3s   U
c                d    t        t        t        j                  |             j                        S r   )lenr   r4   r5   rW   )pdfs    rN   
page_countr=  C  s     yC)//00rP   c                $   ddl }|j                  |       }|dk  s|t        |      kD  rt        |      ||dz
     j	                  |      j                         }t        j                         }|j                  |dd       |j                         S )uJ   Render page n (1-based) to PNG. pypdfium2 — fast, no poppler dependency.r   NrS   )r   PNGT)formatoptimize)
	pypdfium2PdfDocumentr;  
IndexErrorrenderto_pilr4   r5   r>   r?   )r<  r4  r   pdfiumr+  r   rG   s          rN   render_page_pngrH  G  s}    


S
!C1uCHm
a!e*

%

(
/
/
1C
**,CHHSH.<<>rP   c                    dd l }|j                  | dd      }t        j                         }|j	                  |d       dt        j                  |j                               j                         z   S )Nr   r   r)   )box_sizeborderr?  )r@  zdata:image/png;base64,)	qrcodemaker4   r5   r>   rT   	b64encoder?   decode)rx   rL  r   rG   s       rN   qr_data_urlrP  S  sY    
++dQq+
1C
**,CHHSH#f&6&6s||~&F&M&M&OOOrP   )r@   r   rA   r   rB   r   rC   r   rD   r   rE   bytesrF   r   returnrQ  )rZ   rQ  r@   r   rA   r   rB   r   rC   r   rD   r   r[   r   rF   r   rR  rQ  )r@   r   rC   r   r   r   rD   r   r   zlist[tuple[str, str]]r   r   r[   r   rF   r   r   r   rR  rQ  )r@   r   r   r   rC   r   r   r   r   r   r   r   r   r   rD   r   r   zbytes | Noner[   r   rF   r   r   r   rR  rQ  )r@   r   r  r   rD   r   r  r   r  zlist[tuple[str, float]]r   r   r!  r   r"  r   r#  r   r$  zdatetime | Noner[   r   rF   r   rR  rQ  )r<  rQ  rR  int)g?)r<  rQ  r4  rS  r   floatrR  rQ  )rx   r   rR  r   )'__doc__
__future__r   rT   r4   r   pathlibr   pypdfr   r   reportlab.libr   reportlab.lib.pagesizesr	   reportlab.lib.unitsr
   reportlab.lib.utilsr   reportlab.pdfgenr   HexColorr   r  r	  r  r  __file__rl   r  rO   r^   r   r   r   r9  r=  rH  rP  r   rP   rN   <module>r`     s   J "  	   &   & " + # fooi vy!vy!		#vy!H~x'*::  *- 27 F
#
36
DG
LQ
<<.1<?B<NQ<V[<~<%<3?<OR<`c<"%<*/<~)i-i69iFIii*-i:Ii  #i 14i 9>iX1	PrP   