123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- from datetime import datetime
- from antrag import SampleAntrag as Antrag
- from pathlib import Path
- from os import getcwd
- from dataclasses import dataclass
- @dataclass
- class Field:
- name: str
- fieldVisibilityType: int
- isGroupField: bool
- group: str
- valueOutput: object
- kurzbeschreibung: str
- class AntragDrucken:
- def __init__(self, antrag: Antrag):
- self.antrag = antrag
- self.pathAndFileName: Path = Path()
- self.activityFields = []
- def executeActivity(self) -> bool:
- # Build field-list for printout
- for fieldGroup in self.antrag.instance["field_groups"]:
- self.activityFields.append(Field(name=fieldGroup["name"],
- fieldVisibilityType=fieldGroup["fieldVisibilityType"],
- isGroupField=True, group="", valueOutput=None,
- kurzbeschreibung=fieldGroup["brief"]))
- for field in self.antrag.instance[fieldGroup["name"]]:
- self.activityFields.append(Field(name=field["name"],
- fieldVisibilityType=field["fieldVisibilityType"],
- isGroupField=False, group=fieldGroup["name"],
- valueOutput=field["value"],
- kurzbeschreibung=field["brief"]))
- self._printPDF()
- return True
- def getFolderAndPath(self) -> str:
- if self.pathAndFileName:
- # 28.10.20: Return only filename
- return str(self.pathAndFileName.name)
- def _printPDF(self):
- html_start = """
- <html>
- <head>
- </head>
- <body>
- <font face="arial">
- <p align="center"><font face="arial" size="20">Premium indication "$(Produktname)"</font></p>
- <p align="center"><font face="arial" size="6">$(Datum)</font></p>
- <br>
- <p><font face="arial" size="9">Thank you for your interest in $(Produktname).
- Based on the given parameters we are happy to provide a premium indication as follows:</font></p>
- <br>
- <table>
- <tr>
- <th width=30% align="right">Parameter/Statement</th>
- <th width=70% align="left">Base for Indication</th>
- </tr>"""
- html_end = """</table>
- <p><font face="arial" size="9">Please contact our sales staff for a complete and binding offer!</font></p>
- </font>
- </body>
- </html>
- """
- html_start = html_start.replace("$(Produktname)", self.antrag.product_name)
- html_start = html_start.replace("$(Datum)", datetime.now().strftime("%Y-%M-%D"))
- html = ""
- # Output of field groups and their fields
- for groupField in [x for x in self.activityFields if x.isGroupField]:
- template = f"""<tr><font face="arial" size="10">
- <td align="right"><br><b>{str(groupField.kurzbeschreibung)}</b>
- <p style="font-size:1px"> </p>
- </td></font>
- <td></td>
- </tr>"""
- html += template
- for field in [x for x in self.activityFields if not x.isGroupField and x.group == groupField.name]:
- if isinstance(field.valueOutput, datetime):
- field.valueOutput = field.valueOutput.strftime("%Y-%M-%D")
- if field.fieldVisibilityType == 3: # Don' print hidden fields!
- continue
- template = f"""<tr><font face="arial" size="8"><b>
- <td align="right">{str(field.kurzbeschreibung)}</td></b></font>
- <td><font face="arial" size="9">{str(field.valueOutput)}</font></td>
- </tr>"""
- html += template
- # Output of fields without group
- for field in [x for x in self.activityFields if not x.isGroupField and not x.group]:
- if isinstance(field.valueOutput, datetime):
- field.valueOutput = field.valueOutput.strftime("%Y-%M-%D")
- if field.fieldVisibilityType == 3: # Don' print hidden fields!
- continue
- if field.name == "premium":
- template = f"""<tr><font face="arial" size="9"><b>
- <td align="right"><br>{str(field.kurzbeschreibung)} in Euro</td></b></font>
- <td align="left"><b>{str(field.valueOutput)}</b></td>
- </tr>"""
- html += template
- else:
- template = f"""<tr><font face="arial" size="9"><b>
- <td align="right">{str(field.kurzbeschreibung)} </td></b></font>
- <td>{str(field.valueOutput)}</td>
- </tr>"""
- html += template
- html = html_start + html + html_end
- html = html.replace("€", "EURO")
- self.outputPDFfromHTML(html)
- # self.writePDFfromHTML(html)
- def outputPDFfromHTML(self, html):
- from fpdf import FPDF, HTMLMixin
- class HTML2PDF(FPDF, HTMLMixin):
- pass
- pdf = HTML2PDF()
- pdf.add_page()
- pdf.write_html(html)
- self.pathAndFileName = Path(getcwd()).joinpath("pdfoutput").\
- joinpath(f"{self.antrag.product_name}_{datetime.now().strftime('%Y%m%d_%H%M%S%f')}.pdf")
- if not self.pathAndFileName.parent.exists():
- print(f"filename: {self.pathAndFileName}")
- self.pathAndFileName.parent.mkdir(parents=False)
- pdf.output(str(self.pathAndFileName))
|