gchr_export.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import xml.etree.ElementTree as ET
  2. from dataclasses import dataclass
  3. from datetime import datetime
  4. from xml.dom import minidom
  5. ACCOUNT_INFO = [
  6. "Account",
  7. "Make",
  8. "Site",
  9. "Origin",
  10. "SalesChannel",
  11. "CostCarrier",
  12. "CostAccountingString",
  13. ]
  14. @dataclass
  15. class GchrExportConfig:
  16. main_site: str
  17. current_year: str
  18. current_month: str
  19. makes_used: dict[str, str]
  20. sites_used: dict[str, str]
  21. first_month: str
  22. period_no: str
  23. bookkeep_filter: dict[str, str]
  24. extraction_date: datetime
  25. export_file: str
  26. bookkeep_records = dict[str, list[str]]
  27. header: dict[str, str] | None = None
  28. def export_skr51_xml(export_cfg: GchrExportConfig):
  29. record_elements = (
  30. ACCOUNT_INFO
  31. + ["Decimals"]
  32. + list(export_cfg.bookkeep_filter.values())[: export_cfg.period_no]
  33. + ["CumulatedYear"]
  34. )
  35. root = ET.Element("HbvData")
  36. h = ET.SubElement(root, "Header")
  37. for k, v in export_cfg.header.items():
  38. ET.SubElement(h, k).text = str(v)
  39. make_list = ET.SubElement(root, "MakeList")
  40. for make, make_code in export_cfg.makes_used.items():
  41. e = ET.SubElement(make_list, "MakeListEntry")
  42. ET.SubElement(e, "Make").text = make
  43. ET.SubElement(e, "MakeCode").text = make_code
  44. bm_code_list = ET.SubElement(root, "BmCodeList")
  45. for s, bmcode in export_cfg.sites_used.items():
  46. make, site = s.split("-")
  47. e = ET.SubElement(bm_code_list, "BmCodeEntry")
  48. ET.SubElement(e, "Make").text = make
  49. ET.SubElement(e, "Site").text = site
  50. ET.SubElement(e, "BmCode").text = bmcode
  51. record_list = ET.SubElement(root, "RecordList")
  52. for row in export_cfg.bookkeep_records:
  53. record = ET.SubElement(record_list, "Record")
  54. for e in record_elements:
  55. child = ET.SubElement(record, e)
  56. field = row.get(e, 0.0)
  57. if str(field) == "nan":
  58. field = "0"
  59. elif type(field) is float:
  60. field = "{:.0f}".format(field * 100)
  61. child.text = str(field)
  62. with open(export_cfg.export_file, "w", encoding="utf-8") as fwh:
  63. fwh.write(minidom.parseString(ET.tostring(root)).toprettyxml(indent=" "))
  64. def header(export_cfg: GchrExportConfig) -> dict[str, str]:
  65. return {
  66. "Country": "DE",
  67. "MainBmCode": export_cfg.main_site,
  68. "Month": export_cfg.current_month,
  69. "Year": export_cfg.current_year,
  70. "Currency": "EUR",
  71. "NumberOfMakes": len(export_cfg.makes_used),
  72. "NumberOfSites": len(export_cfg.sites_used),
  73. "ExtractionDate": export_cfg.extraction_date.strftime("%d.%m.%Y"),
  74. "ExtractionTime": export_cfg.extraction_date.strftime("%H:%M:%S"),
  75. "BeginFiscalYear": export_cfg.first_month,
  76. }