diff --git a/stages/pdf.py b/stages/pdf.py index 38ce4a7..24c9020 100644 --- a/stages/pdf.py +++ b/stages/pdf.py @@ -28,6 +28,9 @@ style_smallx = PS(name='CORPS', fontName="Helvetica-BoldOblique", fontSize=6, al LOGO_EPC = find('img/logo_EPC.png') LOGO_ESNE = find('img/logo_ESNE.png') LOGO_EPC_LONG = find('img/header.gif') +LOGO_CIFOM = find('img/logo_CIFOM.png') +LOGO_CPLN = find('img/logo_CPLN.jpg') +LOGO_CPMB = find('img/logo_CPMB.png') class HorLine(Flowable): @@ -76,27 +79,23 @@ class EpcBaseDocTemplate(SimpleDocTemplate): footer.drawOn(canvas, doc.leftMargin, h) canvas.restoreState() - def header_iso(self, canvas, doc): + def header_cifom(self, canvas, doc): canvas.saveState() - canvas.setStrokeColor(colors.black) - canvas.setFillColorRGB(0, 0, 0, 0.2) - canvas.rect(2.5 * cm, doc.height - 0.5 * cm, doc.width, 1.5 * cm, fill=True) - canvas.setFillColor(colors.black) - canvas.setFont('Helvetica-Bold', 11) - canvas.drawString(2.7 * cm, doc.height + 0.5 * cm, "CIFOM") - canvas.setFont('Helvetica', 7) - canvas.drawString(2.7 * cm, doc.height + 0.1 * cm, "Centre interrégional de formation") - canvas.drawString(2.7 * cm, doc.height - 0.15 * cm, "des montagnes neuchâteloises") - canvas.setFont('Helvetica-Bold', 12) - canvas.drawString(8 * cm, doc.height + 0.5 * cm, "INDEMNISATION D'EXPERTS") - canvas.drawString(16 * cm, doc.height + 0.5 * cm, "51.05 FO 05") - canvas.drawString(8 * cm, doc.height - 0.1 * cm, "AUX EXAMENS") - canvas.setFont('Helvetica-Bold', 11) - canvas.drawString(8 * cm, doc.height - 2.5 * cm, "Ecole Santé-social Pierre-Coullery") + top = doc.height - 1.5 * cm + logo_height = 1.5 * cm + canvas.drawImage( + LOGO_CIFOM, doc.leftMargin, top, 1.7 * cm, logo_height, preserveAspectRatio=True + ) + canvas.drawImage( + LOGO_CPLN, doc.leftMargin + 2.4 * cm, top, 1.5 * cm, logo_height, preserveAspectRatio=True + ) + canvas.drawImage( + LOGO_CPMB, doc.leftMargin + 4.6 * cm, top, 3.6 * cm, logo_height, preserveAspectRatio=True + ) canvas.restoreState() - def formating(self, text, maxLineLength=25): - return Preformatted(text, style_normal, maxLineLength=maxLineLength) + def formating(self, text, style=style_normal, maxLineLength=25): + return Preformatted(text, style, maxLineLength=maxLineLength) def add_address(self, person): self.story.append(Spacer(0, 2 * cm)) @@ -296,56 +295,51 @@ class CompensationForm: def add_private_data(self, person): self.story.append(Spacer(0, 0.5 * cm)) - self.story.append(Paragraph('DONNÉES PRIVÉES', style_bold)) + style = PS(name='Title1', fontName='Helvetica', fontSize=12, alignment=TA_CENTER) + self.story.append(Paragraph('INDEMNISATION D’EXPERTS', style)) self.story.append(Spacer(0, 0.2 * cm)) data = [ - [self.formating('Nom : '), person.last_name or self.points, '', ''], + [self.formating('ECOLE :', style=style_bold), 'École Santé-social Pierre-Coullery', '', ''], + [Paragraph('COORDONNÉES DE L’EXPERT', style=style_bold), '', '', ''], + [self.formating('NOM : '), person.last_name or self.points, '', ''], [self.formating('Prénom :'), person.first_name or self.points, '', ''], - [self.formating('Adresse complète :'), person.street or self.points, '', ''], - ['', person.pcode_city if person.pcode else self.points, '', ''], - ['', self.points, '', ''], + [self.formating('Adresse complète :'), person.street, '', ''], + ['', person.pcode_city if person.pcode else '', '', ''], + ['', '', '', ''], [ self.formating('Date de naissance :'), - django_format(person.birth_date, 'j F Y') if person.birth_date else '.' * 30, - self.formating('Nationalité :'), person.nation or '.' * 30, + django_format(person.birth_date, 'j F Y') if person.birth_date else '', + self.formating('Nationalité :'), person.nation or '', ], [ - self.formating('N° de téléphone :'), person.tel or '.' * 30, - self.formating('Si étranger, joindre copie permis de séjour', maxLineLength=None), '' + self.formating('N° de téléphone :'), person.tel or '', + self.formating('Si étranger, joindre copie permis de séjour', style=style_bold, maxLineLength=None), '' ], [ - self.formating('N° AVS :'), person.avs or '.' * 30, - self.formating('Employeur :'), person.corporation.name if person.corporation else '.' * 30, + self.formating('N° AVS :'), person.avs or '', + self.formating('Employeur :'), Paragraph(person.corporation.name if person.corporation else '', style=style_normal), ], - [Spacer(0, 0.2 * cm)], + [Paragraph('COORDONNÉES DE PAIEMENT', style=style_bold), '', '', ''], + [Paragraph('N° de ccp ou compte bancaire (IBAN) :', style_normal), person.iban or '', '', ''], + [Paragraph('Si banque, nom et adresse de celle-ci :', style_normal), person.bank or '', '', ''], ] - t = Table(data, colWidths=[4 * cm, 12 * cm], hAlign=TA_LEFT) - t = Table(data, colWidths=[4 * cm, 4 * cm, 3 * cm, 5 * cm], hAlign=TA_LEFT) + t = Table(data, colWidths=[4 * cm, 4 * cm, 2 * cm, 6 * cm], hAlign=TA_LEFT) t.setStyle(TableStyle([ ('ALIGN', (1, 0), (-1, -1), 'LEFT'), - ('BOX', (0, 0), (-1, -1), 0.25, colors.black), - ('SPAN', (1, 0), (-1, 0)), - ('SPAN', (1, 1), (-1, 1)), - ('SPAN', (1, 2), (-1, 2)), - ('SPAN', (1, 3), (-1, 3)), - ('SPAN', (1, 4), (-1, 4)), + ('BOX', (0, 0), (-1, 9), 0.25, colors.black), + ('BOX', (0, 10), (-1, -1), 0.25, colors.black), + ('SPAN', (1, 0), (-1, 0)), # ecole + ('TOPPADDING', (0, 0), (-1, 0), 12), # ecole + ('BOTTOMPADDING', (0, 0), (-1, 0), 12), # ecole + ('SPAN', (0, 1), (-1, 1)), # coord expert + ('SPAN', (1, 2), (-1, 2)), # nom + ('SPAN', (1, 3), (-1, 3)), # prenom + ('SPAN', (1, 4), (-1, 4)), # adresse ('SPAN', (2, 6), (-1, 6)), - ])) - self.story.append(t) - self.story.append(Spacer(0, 0.5 * cm)) - - self.story.append(Paragraph('COORDONNÉES DE PAIEMENT', style_bold)) - self.story.append(Spacer(0, 0.2 * cm)) - data = [ - [self.formating('N° de ccp ou compte bancaire (IBAN) :'), person.iban or self.points], - [self.formating('Si banque, nom et adresse de celle-ci :'), person.bank or self.points], - ] - - t = Table(data, colWidths=[4 * cm, 12 * cm], hAlign=TA_LEFT) - t.setStyle(TableStyle([ - ('ALIGN', (1, 0), (-1, -1), 'LEFT'), - ('BOX', (0, 0), (-1, -1), 0.25, colors.black), + ('VALIGN', (0, 9), (-1, 9), 'TOP'), # avs / employeur + ('SPAN', (0, 10), (-1, 10)), # coord paiement + ('TOPPADDING', (0, 10), (-1, 10), 8), # coord paiement ])) self.story.append(t) self.story.append(Spacer(0, 0.5 * cm)) @@ -363,8 +357,6 @@ class CompensationForm: elif student.klass.is_Ede_ps(): otp = self.OTP_EDE_PS_OTP - self.story.append((Paragraph(self.points * 2, style_normal))) - self.story.append((Paragraph("À remplir par la comptabilité", style_normal))) self.story.append(Spacer(0, 0.5 * cm)) if mandat == self.EXPERT_MANDAT: data = [ @@ -389,39 +381,16 @@ class CompensationForm: else: self.story.append(Spacer(0, 2 * cm)) - data = [['Visa chef de service:', "Donneur d'ordre et visa:", "Total en Fr:"]] - t = Table( - data, colWidths=[4 * cm, 4 * cm, 4 * cm], rowHeights=(1.2 * cm,), hAlign=TA_CENTER - ) - t.setStyle(TableStyle( - [ - ('ALIGN', (0, 0), (-1, -1), 'LEFT'), - ('VALIGN', (0, 0), (-1, -1), 'TOP'), - ('FONTSIZE', (0, 0), (-1, -1), 7), - ('BOX', (0, 0), (-1, -1), 0.25, colors.black), - ('GRID', (0, 0), (-1, -1), 0.25, colors.black), - ] + self.story.append(Spacer(0, 1.5 * cm)) + self.story.append(Paragraph( + f'Veuillez indiquer l’OTP (champ obligatoire): {otp}', + style_normal )) - self.story.append(t) - - data = [ - ['No écriture', "Compte à débiter", "CC / OTP", " Montants"], - ["Pièces annexées", account, otp, 'Fr. {0}'.format(total)], - ["Ordre", '', '', 'Fr.'], - ["No fournisseur", '', '', 'Fr.'], - ["Date scannage et visa", '', '', 'Fr.'], - ] - t = Table(data, colWidths=[3 * cm] * 4, hAlign=TA_CENTER) - t.setStyle(TableStyle( - [ - ('ALIGN', (0, 0), (-1, -1), 'LEFT'), - ('VALIGN', (0, 0), (-1, -1), 'TOP'), - ('FONTSIZE', (0, 0), (-1, -1), 7), - ('BOX', (0, 0), (-1, -1), 0.25, colors.black), - ('GRID', (0, 0), (-1, -1), 0.25, colors.black), - ] + self.story.append(Spacer(0, 1.5 * cm)) + self.story.append(Paragraph( + 'Date et signature de la direction de l’établissement ou du/de la responsable', + style_normal )) - self.story.append(t) class ExpertEdeLetterPdf(CompensationForm, EpcBaseDocTemplate): @@ -453,7 +422,7 @@ class ExpertEdeLetterPdf(CompensationForm, EpcBaseDocTemplate): super().__init__(out) self.addPageTemplates([ PageTemplate(id='FirstPage', frames=[self.page_frame], onPage=self.header), - PageTemplate(id='ISOPage', frames=[self.page_frame], onPage=self.header_iso), + PageTemplate(id='ISOPage', frames=[self.page_frame], onPage=self.header_cifom), ]) def exam_data(self): @@ -554,20 +523,28 @@ class CompensationPDFForm(CompensationForm, EpcBaseDocTemplate): def __init__(self, out, *args, **kwargs): super().__init__(out, *args, **kwargs) self.addPageTemplates([ - PageTemplate(id='FirstPage', frames=[self.page_frame], onPage=self.header_iso) + PageTemplate(id='FirstPage', frames=[self.page_frame], onPage=self.header_cifom) ]) def produce(self): self.add_private_data(self.expert) + self.story.append(Paragraph('Mandat ou autre type d’indemnité (préciser) :', style_normal)) self.story.append(Paragraph( self.mandat_template.format( self.student.civility, self.student.full_name, self.student.klass - ), style_normal_center + ), style_normal )) self.story.append(Spacer(0, 0.2 * cm)) - self.produce_under_mandat() - self.story.append(Spacer(0, 3 * cm)) + self.story.append(Paragraph( + 'Examen, type d’épreuve et date-s (rédaction, surveillance, correction, travail diplôme, nombre, etc) :', + style_normal + )) + self.story.append(Paragraph("Date des examens : {}".format( + django_format(self.exam.date_exam, 'j F Y') if self.exam else '' + ), style_normal)) + + self.story.append(Spacer(0, 0.2 * cm)) self.add_accounting_stamp(self.student, self.mandat_type) @@ -576,7 +553,7 @@ class CompensationPDFForm(CompensationForm, EpcBaseDocTemplate): class MentorCompensationPdfForm(CompensationPDFForm): mandat_type = CompensationPDFForm.MENTOR_MANDAT - mandat_template = "Mandat : Mentoring de {0} {1}, classe {2}" + mandat_template = "Mentoring de {0} {1}, classe {2}" AMOUNT = '' def __init__(self, out, student): @@ -585,13 +562,10 @@ class MentorCompensationPdfForm(CompensationPDFForm): self.exam = None super().__init__(out) - def produce_under_mandat(self): - pass - class EntretienProfCompensationPdfForm(CompensationPDFForm): mandat_type = CompensationPDFForm.EXPERT_MANDAT - mandat_template = "Mandat : Entretien professionnel pour {0} {1}, classe {2}" + mandat_template = "Entretien professionnel pour {0} {1}, classe {2}" AMOUNT = '' def __init__(self, out, exam): @@ -600,14 +574,9 @@ class EntretienProfCompensationPdfForm(CompensationPDFForm): self.exam = exam super().__init__(out) - def produce_under_mandat(self): - self.story.append(Paragraph("Date des examens : {}".format( - django_format(self.exam.date_exam, 'j F Y') if self.exam else self.points - ), style_normal_center)) - class SoutenanceCompensationPdfForm(EntretienProfCompensationPdfForm): - mandat_template = "Mandat : Soutenance pour {0} {1}, classe {2}" + mandat_template = "Soutenance pour {0} {1}, classe {2}" AMOUNT = '' diff --git a/stages/static/img/logo_CIFOM.png b/stages/static/img/logo_CIFOM.png new file mode 100644 index 0000000..96c1502 Binary files /dev/null and b/stages/static/img/logo_CIFOM.png differ diff --git a/stages/static/img/logo_CPLN.jpg b/stages/static/img/logo_CPLN.jpg new file mode 100644 index 0000000..aa9c287 Binary files /dev/null and b/stages/static/img/logo_CPLN.jpg differ diff --git a/stages/static/img/logo_CPMB.png b/stages/static/img/logo_CPMB.png new file mode 100644 index 0000000..f1e537d Binary files /dev/null and b/stages/static/img/logo_CPMB.png differ