AntragDrucken.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. from datetime import datetime
  2. from antrag import SampleAntrag as Antrag
  3. from pathlib import Path
  4. from os import getcwd
  5. from dataclasses import dataclass
  6. @dataclass
  7. class Field:
  8. name: str
  9. fieldVisibilityType: int
  10. isGroupField: bool
  11. group: str
  12. valueOutput: object
  13. kurzbeschreibung: str
  14. class AntragDrucken:
  15. def __init__(self, antrag: Antrag):
  16. self.antrag = antrag
  17. self.pathAndFileName: Path = Path()
  18. self.activityFields = []
  19. def executeActivity(self) -> bool:
  20. # Build field-list for printout
  21. for fieldGroup in self.antrag.instance["field_groups"]:
  22. self.activityFields.append(Field(name=fieldGroup["name"],
  23. fieldVisibilityType=fieldGroup["fieldVisibilityType"],
  24. isGroupField=True, group="", valueOutput=None,
  25. kurzbeschreibung=fieldGroup["brief"]))
  26. for field in self.antrag.instance[fieldGroup["name"]]:
  27. self.activityFields.append(Field(name=field["name"],
  28. fieldVisibilityType=field["fieldVisibilityType"],
  29. isGroupField=False, group=fieldGroup["name"],
  30. valueOutput=field["value"],
  31. kurzbeschreibung=field["brief"]))
  32. self._printPDF()
  33. return True
  34. def getFolderAndPath(self) -> str:
  35. if self.pathAndFileName:
  36. # 28.10.20: Return only filename
  37. return str(self.pathAndFileName.name)
  38. def _printPDF(self):
  39. html_start = """
  40. <html>
  41. <head>
  42. </head>
  43. <body>
  44. <font face="arial">
  45. <p align="center"><font face="arial" size="20">Premium indication "$(Produktname)"</font></p>
  46. <p align="center"><font face="arial" size="6">$(Datum)</font></p>
  47. <br>
  48. <p><font face="arial" size="9">Thank you for your interest in $(Produktname).
  49. Based on the given parameters we are happy to provide a premium indication as follows:</font></p>
  50. <br>
  51. <table>
  52. <tr>
  53. <th width=30% align="right">Parameter/Statement</th>
  54. <th width=70% align="left">Base for Indication</th>
  55. </tr>"""
  56. html_end = """</table>
  57. <p><font face="arial" size="9">Please contact our sales staff for a complete and binding offer!</font></p>
  58. </font>
  59. </body>
  60. </html>
  61. """
  62. html_start = html_start.replace("$(Produktname)", self.antrag.product_name)
  63. html_start = html_start.replace("$(Datum)", datetime.now().strftime("%Y-%M-%D"))
  64. html = ""
  65. # Output of field groups and their fields
  66. for groupField in [x for x in self.activityFields if x.isGroupField]:
  67. template = f"""<tr><font face="arial" size="10">
  68. <td align="right"><br><b>{str(groupField.kurzbeschreibung)}</b>
  69. <p style="font-size:1px">&nbsp;</p>
  70. </td></font>
  71. <td></td>
  72. </tr>"""
  73. html += template
  74. for field in [x for x in self.activityFields if not x.isGroupField and x.group == groupField.name]:
  75. if isinstance(field.valueOutput, datetime):
  76. field.valueOutput = field.valueOutput.strftime("%Y-%M-%D")
  77. if field.fieldVisibilityType == 3: # Don' print hidden fields!
  78. continue
  79. template = f"""<tr><font face="arial" size="8"><b>
  80. <td align="right">{str(field.kurzbeschreibung)}</td></b></font>
  81. <td><font face="arial" size="9">{str(field.valueOutput)}</font></td>
  82. </tr>"""
  83. html += template
  84. # Output of fields without group
  85. for field in [x for x in self.activityFields if not x.isGroupField and not x.group]:
  86. if isinstance(field.valueOutput, datetime):
  87. field.valueOutput = field.valueOutput.strftime("%Y-%M-%D")
  88. if field.fieldVisibilityType == 3: # Don' print hidden fields!
  89. continue
  90. if field.name == "premium":
  91. template = f"""<tr><font face="arial" size="9"><b>
  92. <td align="right"><br>{str(field.kurzbeschreibung)} in Euro</td></b></font>
  93. <td align="left"><b>{str(field.valueOutput)}</b></td>
  94. </tr>"""
  95. html += template
  96. else:
  97. template = f"""<tr><font face="arial" size="9"><b>
  98. <td align="right">{str(field.kurzbeschreibung)} </td></b></font>
  99. <td>{str(field.valueOutput)}</td>
  100. </tr>"""
  101. html += template
  102. html = html_start + html + html_end
  103. html = html.replace("€", "EURO")
  104. self.outputPDFfromHTML(html)
  105. # self.writePDFfromHTML(html)
  106. def outputPDFfromHTML(self, html):
  107. from fpdf import FPDF, HTMLMixin
  108. class HTML2PDF(FPDF, HTMLMixin):
  109. pass
  110. pdf = HTML2PDF()
  111. pdf.add_page()
  112. pdf.write_html(html)
  113. self.pathAndFileName = Path(getcwd()).joinpath("pdfoutput").\
  114. joinpath(f"{self.antrag.product_name}_{datetime.now().strftime('%Y%m%d_%H%M%S%f')}.pdf")
  115. if not self.pathAndFileName.parent.exists():
  116. print(f"filename: {self.pathAndFileName}")
  117. self.pathAndFileName.parent.mkdir(parents=False)
  118. pdf.output(str(self.pathAndFileName))