gchr_export_skr51.py 2.3 KB

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