diff --git a/facho/fe/model/__init__.py b/facho/fe/model/__init__.py index 061890d..6b10421 100644 --- a/facho/fe/model/__init__.py +++ b/facho/fe/model/__init__.py @@ -20,16 +20,20 @@ class PhysicalLocation(model.Model): class PartyTaxScheme(model.Model): __name__ = 'PartyTaxScheme' + registration_name = fields.Many2One(Name, name='RegistrationName', namespace='cbc') company_id = fields.Many2One(ID, name='CompanyID', namespace='cbc') tax_level_code = fields.Many2One(ID, name='TaxLevelCode', namespace='cbc', default='ZZ') - + + class Party(model.Model): __name__ = 'Party' id = fields.Virtual(setter='_on_set_id') + name = fields.Many2One(PartyName, namespace='cac') tax_scheme = fields.Many2One(PartyTaxScheme, namespace='cac') location = fields.Many2One(PhysicalLocation, namespace='cac') + contact = fields.Many2One(Contact, namespace='cac') def _on_set_id(self, name, value): self.tax_scheme.company_id = value @@ -43,7 +47,7 @@ class AccountingCustomerParty(model.Model): class AccountingSupplierParty(model.Model): __name__ = 'AccountingSupplierParty' - party = fields.Many2One(Party) + party = fields.Many2One(Party, namespace='cac') class Quantity(model.Model): __name__ = 'Quantity' diff --git a/facho/fe/model/common.py b/facho/fe/model/common.py index c79a780..fa875ee 100644 --- a/facho/fe/model/common.py +++ b/facho/fe/model/common.py @@ -3,7 +3,7 @@ import facho.model.fields as fields from datetime import date, datetime -__all__ = ['Element', 'Name', 'Date', 'Time', 'Period', 'ID', 'Address', 'Country'] +__all__ = ['Element', 'PartyName', 'Name', 'Date', 'Time', 'Period', 'ID', 'Address', 'Country', 'Contact'] class Element(model.Model): """ @@ -71,3 +71,20 @@ class Address(model.Model): #DIAN 1.7.-2020: CAJ10 city = fields.Many2One(Element, name='CityName', namespace='cbc') + +class PartyName(model.Model): + __name__ = 'PartyName' + + name = fields.Many2One(Name, namespace='cbc') + + def __default_set__(self, value): + self.name = value + return value + + def __default_get__(self, name, value): + return self.name + +class Contact(model.Model): + __name__ = 'Contact' + + email = fields.Many2One(Name, name='ElectronicEmail', namespace='cbc') diff --git a/tests/test_model_invoice.py b/tests/test_model_invoice.py index 9b156b3..f4b98df 100644 --- a/tests/test_model_invoice.py +++ b/tests/test_model_invoice.py @@ -8,11 +8,10 @@ from datetime import datetime import pytest - +from lxml import etree import facho.fe.model as model import facho.fe.form as form from facho import fe - import helpers def simple_invoice(): @@ -68,3 +67,53 @@ def test_dian_extension_authorization_provider(): assert provider_id.attrib['schemeAgencyName'] == 'CO, DIAN (Dirección de Impuestos y Aduanas Nacionales)' assert provider_id.attrib['schemeAgencyID'] == '195' assert provider_id.text == '800197268' + +def test_invoicesimple_xml_signed_using_fexml(monkeypatch): + invoice = simple_invoice() + + xml = fe.FeXML.from_string(invoice.to_xml()) + + signer = fe.DianXMLExtensionSigner('./tests/example.p12') + + print(xml.tostring()) + with monkeypatch.context() as m: + import helpers + helpers.mock_urlopen(m) + xml.add_extension(signer) + + elem = xml.get_element('/fe:Invoice/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent/ds:Signature') + assert elem.text is not None + +def test_invoice_supplier_party(): + invoice = simple_invoice() + invoice.supplier.party.name = 'superfacho' + invoice.supplier.party.tax_scheme.registration_name = 'legal-superfacho' + invoice.supplier.party.contact.email = 'superfacho@etrivial.net' + + xml = fe.FeXML.from_string(invoice.to_xml()) + + name = xml.get_element('/fe:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name') + assert name.text == 'superfacho' + + name = xml.get_element('/fe:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName') + assert name.text == 'legal-superfacho' + + name = xml.get_element('/fe:Invoice/cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:ElectronicEmail') + assert name.text == 'superfacho@etrivial.net' + +def test_invoice_customer_party(): + invoice = simple_invoice() + invoice.customer.party.name = 'superfacho-customer' + invoice.customer.party.tax_scheme.registration_name = 'legal-superfacho-customer' + invoice.customer.party.contact.email = 'superfacho@etrivial.net' + + xml = fe.FeXML.from_string(invoice.to_xml()) + + name = xml.get_element('/fe:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PartyName/cbc:Name') + assert name.text == 'superfacho-customer' + + name = xml.get_element('/fe:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName') + assert name.text == 'legal-superfacho-customer' + + name = xml.get_element('/fe:Invoice/cac:AccountingCustomerParty/cac:Party/cac:Contact/cbc:ElectronicEmail') + assert name.text == 'superfacho@etrivial.net'