94 lines
3.5 KiB
Python
94 lines
3.5 KiB
Python
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)
|