import datetime from typing import List from uuid import uuid4 from xml.dom import minidom from xml.etree.ElementTree import Element, SubElement, tostring from vbv_lernwelt.shop.invoice.creator import InvoiceCreator, Item from vbv_lernwelt.shop.invoice.repositories import InvoiceRepository class AbacusInvoiceCreator(InvoiceCreator): def __init__(self, repository: InvoiceRepository): self.repository = repository def create_invoice( self, customer_number: str, purchase_order_date: datetime.date, delivery_date: datetime.date, reference_purchase_order: str, unic_id: str, items: List[Item], filename: str = None, ): invoice = self.render_invoice( customer_number, purchase_order_date, delivery_date, reference_purchase_order, unic_id, items, ) if filename is None: filename = f"vbv-vv-{uuid4().hex}.xml" self.repository.upload_invoice(invoice, filename) @staticmethod def render_invoice( customer_number: str, purchase_order_date: datetime.date, delivery_date: datetime.date, reference_purchase_order: str, unic_id: str, items: List[Item], ) -> str: container = Element("AbaConnectContainer") task = SubElement(container, "Task") parameter = SubElement(task, "Parameter") SubElement(parameter, "Application").text = "ORDE" SubElement(parameter, "Id").text = "Verkaufsauftrag" SubElement(parameter, "MapId").text = "AbaDefault" SubElement(parameter, "Version").text = "2022.00" transaction = SubElement(task, "Transaction") sales_order_header = SubElement(transaction, "SalesOrderHeader", mode="SAVE") sales_order_header_fields = SubElement( sales_order_header, "SalesOrderHeaderFields", mode="SAVE" ) SubElement(sales_order_header_fields, "CustomerNumber").text = customer_number SubElement( sales_order_header_fields, "PurchaseOrderDate" ).text = purchase_order_date.isoformat() SubElement( sales_order_header_fields, "DeliveryDate" ).text = delivery_date.isoformat() SubElement( sales_order_header_fields, "ReferencePurchaseOrder" ).text = reference_purchase_order SubElement(sales_order_header_fields, "UnicId").text = unic_id for index, item in enumerate(items, start=1): item_element = SubElement(sales_order_header, "Item", mode="SAVE") item_fields = SubElement(item_element, "ItemFields", mode="SAVE") SubElement(item_fields, "ItemNumber").text = str(index) SubElement(item_fields, "ProductNumber").text = item.product_number SubElement(item_fields, "QuantityOrdered").text = item.quantity item_text = SubElement(item_element, "ItemText", mode="SAVE") item_text_fields = SubElement(item_text, "ItemTextFields", mode="SAVE") SubElement(item_text_fields, "Text").text = item.description return AbacusInvoiceCreator.create_xml_string(container) @staticmethod def create_xml_string(container: Element, encoding: str = "UTF-8") -> str: xml_bytes = tostring(container, encoding) xml_pretty_str = minidom.parseString(xml_bytes).toprettyxml( indent=" ", encoding=encoding ) return xml_pretty_str.decode(encoding)