se adiciona namespaces a invoice
FossilOrigin-Name: caf85d4a30e7945ca2a6fc3a9430855fa8623442b1a30ae824f742e2a93e2956
This commit is contained in:
		| @@ -38,9 +38,9 @@ class Time(model.Model): | |||||||
| class InvoicePeriod(model.Model): | class InvoicePeriod(model.Model): | ||||||
|     __name__ = 'InvoicePeriod' |     __name__ = 'InvoicePeriod' | ||||||
|  |  | ||||||
|     start_date = fields.Many2One(Date, name='StartDate') |     start_date = fields.Many2One(Date, name='StartDate', namespace='cbc') | ||||||
|  |  | ||||||
|     end_date = fields.Many2One(Date, name='EndDate') |     end_date = fields.Many2One(Date, name='EndDate', namespace='cbc') | ||||||
|  |  | ||||||
| class ID(model.Model): | class ID(model.Model): | ||||||
|     __name__ = 'ID' |     __name__ = 'ID' | ||||||
| @@ -51,15 +51,27 @@ class ID(model.Model): | |||||||
|     def __str__(self): |     def __str__(self): | ||||||
|         return str(self._value) |         return str(self._value) | ||||||
|  |  | ||||||
|  | class PartyTaxScheme(model.Model): | ||||||
|  |     __name__ = 'PartyTaxScheme' | ||||||
|  |  | ||||||
|  |     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): | class Party(model.Model): | ||||||
|     __name__ = 'Party' |     __name__ = 'Party' | ||||||
|  |  | ||||||
|     id = fields.Many2One(ID) |     id = fields.Virtual(setter='set_id') | ||||||
|  |  | ||||||
|  |     tax_scheme = fields.Many2One(PartyTaxScheme, namespace='cac') | ||||||
|  |  | ||||||
|  |     def set_id(self, name, value): | ||||||
|  |         self.tax_scheme.company_id = value | ||||||
|  |         return value | ||||||
|  |  | ||||||
| class AccountingCustomerParty(model.Model): | class AccountingCustomerParty(model.Model): | ||||||
|     __name__ = 'AccountingCustomerParty' |     __name__ = 'AccountingCustomerParty' | ||||||
|  |  | ||||||
|     party = fields.Many2One(Party) |     party = fields.Many2One(Party, namespace='cac') | ||||||
|  |  | ||||||
| class AccountingSupplierParty(model.Model): | class AccountingSupplierParty(model.Model): | ||||||
|     __name__ = 'AccountingSupplierParty' |     __name__ = 'AccountingSupplierParty' | ||||||
| @@ -100,7 +112,7 @@ class Amount(model.Model): | |||||||
| class Price(model.Model): | class Price(model.Model): | ||||||
|     __name__ = 'Price' |     __name__ = 'Price' | ||||||
|  |  | ||||||
|     amount = fields.Many2One(Amount, name='PriceAmount') |     amount = fields.Many2One(Amount, name='PriceAmount', namespace='cbc') | ||||||
|      |      | ||||||
|     def __default_set__(self, value): |     def __default_set__(self, value): | ||||||
|         self.amount = value |         self.amount = value | ||||||
| @@ -115,14 +127,14 @@ class Percent(model.Model): | |||||||
| class TaxScheme(model.Model): | class TaxScheme(model.Model): | ||||||
|     __name__ = 'TaxScheme' |     __name__ = 'TaxScheme' | ||||||
|  |  | ||||||
|     id = fields.Many2One(ID) |     id = fields.Many2One(ID, namespace='cbc') | ||||||
|     name= fields.Many2One(Name) |     name= fields.Many2One(Name, namespace='cbc') | ||||||
|  |  | ||||||
| class TaxCategory(model.Model): | class TaxCategory(model.Model): | ||||||
|     __name__ = 'TaxCategory' |     __name__ = 'TaxCategory' | ||||||
|  |  | ||||||
|     percent = fields.Many2One(Percent) |     percent = fields.Many2One(Percent, namespace='cbc') | ||||||
|     tax_scheme = fields.Many2One(TaxScheme) |     tax_scheme = fields.Many2One(TaxScheme, namespace='cac') | ||||||
|      |      | ||||||
| class TaxSubTotal(model.Model): | class TaxSubTotal(model.Model): | ||||||
|     __name__ = 'TaxSubTotal' |     __name__ = 'TaxSubTotal' | ||||||
| @@ -154,14 +166,14 @@ class TaxSubTotal(model.Model): | |||||||
| class TaxTotal(model.Model): | class TaxTotal(model.Model): | ||||||
|     __name__ = 'TaxTotal' |     __name__ = 'TaxTotal' | ||||||
|  |  | ||||||
|     tax_amount = fields.Many2One(Amount, name='TaxAmount', default=0.00) |     tax_amount = fields.Many2One(Amount, name='TaxAmount', namespace='cbc', default=0.00) | ||||||
|     subtotals = fields.One2Many(TaxSubTotal) |     subtotals = fields.One2Many(TaxSubTotal, namespace='cac') | ||||||
|  |  | ||||||
|  |  | ||||||
| class AllowanceCharge(model.Model): | class AllowanceCharge(model.Model): | ||||||
|     __name__ = 'AllowanceCharge' |     __name__ = 'AllowanceCharge' | ||||||
|  |  | ||||||
|     amount = fields.Many2One(Amount) |     amount = fields.Many2One(Amount, namespace='cbc') | ||||||
|     is_discount = fields.Virtual(default=False) |     is_discount = fields.Virtual(default=False) | ||||||
|      |      | ||||||
|     def isCharge(self): |     def isCharge(self): | ||||||
| @@ -186,11 +198,12 @@ class Taxes: | |||||||
| class InvoiceLine(model.Model): | class InvoiceLine(model.Model): | ||||||
|     __name__ = 'InvoiceLine' |     __name__ = 'InvoiceLine' | ||||||
|  |  | ||||||
|     quantity = fields.Many2One(Quantity, name='InvoicedQuantity') |     id = fields.Many2One(ID, namespace='cbc') | ||||||
|     taxtotal = fields.Many2One(TaxTotal) |     quantity = fields.Many2One(Quantity, name='InvoicedQuantity', namespace='cbc') | ||||||
|     price = fields.Many2One(Price) |     taxtotal = fields.Many2One(TaxTotal, namespace='cac') | ||||||
|     amount = fields.Many2One(Amount, name='LineExtensionAmount') |     price = fields.Many2One(Price, namespace='cac') | ||||||
|     allowance_charge = fields.One2Many(AllowanceCharge) |     amount = fields.Many2One(Amount, name='LineExtensionAmount', namespace='cbc') | ||||||
|  |     allowance_charge = fields.One2Many(AllowanceCharge, 'cac') | ||||||
|     tax_amount = fields.Virtual(getter='get_tax_amount') |     tax_amount = fields.Virtual(getter='get_tax_amount') | ||||||
|      |      | ||||||
|     def __setup__(self): |     def __setup__(self): | ||||||
| @@ -242,12 +255,12 @@ class InvoiceLine(model.Model): | |||||||
| class LegalMonetaryTotal(model.Model): | class LegalMonetaryTotal(model.Model): | ||||||
|     __name__ = 'LegalMonetaryTotal' |     __name__ = 'LegalMonetaryTotal' | ||||||
|  |  | ||||||
|     line_extension_amount = fields.Many2One(Amount, name='LineExtensionAmount', default=0) |     line_extension_amount = fields.Many2One(Amount, name='LineExtensionAmount', namespace='cbc', default=0) | ||||||
|  |  | ||||||
|     tax_exclusive_amount = fields.Many2One(Amount, name='TaxExclusiveAmount', default=form.Amount(0)) |     tax_exclusive_amount = fields.Many2One(Amount, name='TaxExclusiveAmount', namespace='cbc', default=form.Amount(0)) | ||||||
|     tax_inclusive_amount = fields.Many2One(Amount, name='TaxInclusiveAmount', default=form.Amount(0)) |     tax_inclusive_amount = fields.Many2One(Amount, name='TaxInclusiveAmount', namespace='cbc', default=form.Amount(0)) | ||||||
|     charge_total_amount = fields.Many2One(Amount, name='ChargeTotalAmount', default=form.Amount(0)) |     charge_total_amount = fields.Many2One(Amount, name='ChargeTotalAmount', namespace='cbc', default=form.Amount(0)) | ||||||
|     payable_amount = fields.Many2One(Amount, name='PayableAmount', default=form.Amount(0)) |     payable_amount = fields.Many2One(Amount, name='PayableAmount', namespace='cbc', default=form.Amount(0)) | ||||||
|  |  | ||||||
|     @fields.on_change(['tax_inclusive_amount', 'charge_total']) |     @fields.on_change(['tax_inclusive_amount', 'charge_total']) | ||||||
|     def update_payable_amount(self, name, value): |     def update_payable_amount(self, name, value): | ||||||
| @@ -255,18 +268,27 @@ class LegalMonetaryTotal(model.Model): | |||||||
|  |  | ||||||
| class Invoice(model.Model): | class Invoice(model.Model): | ||||||
|     __name__ = 'Invoice' |     __name__ = 'Invoice' | ||||||
|  |     __namespace__ = { | ||||||
|  |         'cac': 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2', | ||||||
|  |         'cbc': 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2', | ||||||
|  |         'cdt': 'urn:DocumentInformation:names:specification:ubl:colombia:schema:xsd:DocumentInformationAggregateComponents-1', | ||||||
|  |         'ext': 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2', | ||||||
|  |         'sts': 'http://www.dian.gov.co/contratos/facturaelectronica/v1/Structures', | ||||||
|  |         'xades': 'http://uri.etsi.org/01903/v1.3.2#', | ||||||
|  |         'ds': 'http://www.w3.org/2000/09/xmldsig#' | ||||||
|  |     } | ||||||
|      |      | ||||||
|     id = fields.Many2One(ID) |     id = fields.Many2One(ID, namespace='cbc') | ||||||
|     issue = fields.Virtual(setter='set_issue') |     issue = fields.Virtual(setter='set_issue') | ||||||
|     issue_date = fields.Many2One(Date, name='IssueDate') |     issue_date = fields.Many2One(Date, name='IssueDate', namespace='cbc') | ||||||
|     issue_time = fields.Many2One(Time, name='IssueTime') |     issue_time = fields.Many2One(Time, name='IssueTime', namespace='cbc') | ||||||
|      |      | ||||||
|     period = fields.Many2One(InvoicePeriod) |     period = fields.Many2One(InvoicePeriod, namespace='cac') | ||||||
|  |  | ||||||
|     supplier = fields.Many2One(AccountingSupplierParty) |     supplier = fields.Many2One(AccountingSupplierParty, namespace='cac') | ||||||
|     customer = fields.Many2One(AccountingCustomerParty) |     customer = fields.Many2One(AccountingCustomerParty, namespace='cac') | ||||||
|     lines = fields.One2Many(InvoiceLine) |     lines = fields.One2Many(InvoiceLine, namespace='cac') | ||||||
|     legal_monetary_total = fields.Many2One(LegalMonetaryTotal) |     legal_monetary_total = fields.Many2One(LegalMonetaryTotal, namespace='cac') | ||||||
|      |      | ||||||
|     taxtotal_01 = fields.Many2One(TaxTotal) |     taxtotal_01 = fields.Many2One(TaxTotal) | ||||||
|     taxtotal_04 = fields.Many2One(TaxTotal) |     taxtotal_04 = fields.Many2One(TaxTotal) | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | import warnings | ||||||
|  |  | ||||||
| class Field: | class Field: | ||||||
|     def __set_name__(self, owner, name, virtual=False): |     def __set_name__(self, owner, name, virtual=False): | ||||||
|         self.name = name |         self.name = name | ||||||
| @@ -17,8 +19,10 @@ class Field: | |||||||
|         if name is None: |         if name is None: | ||||||
|             return |             return | ||||||
|  |  | ||||||
|         if name not in namespaces: |         #TODO(bit4bit) aunque las pruebas confirmar | ||||||
|             raise KeyError("namespace %s not found" % (name)) |         #que si se escribe el namespace que es | ||||||
|  |         #no ahi confirmacion de declaracion previa del namespace | ||||||
|  |  | ||||||
|         inst._namespace_prefix = name |         inst._namespace_prefix = name | ||||||
|  |  | ||||||
|     def _call(self, inst, method, *args): |     def _call(self, inst, method, *args): | ||||||
| @@ -27,7 +31,7 @@ class Field: | |||||||
|         if callable(call): |         if callable(call): | ||||||
|             return call(*args) |             return call(*args) | ||||||
|  |  | ||||||
|     def _create_model(self, inst, name=None, model=None, attribute=None): |     def _create_model(self, inst, name=None, model=None, attribute=None, namespace=None): | ||||||
|         try: |         try: | ||||||
|             return inst._fields[self.name] |             return inst._fields[self.name] | ||||||
|         except KeyError: |         except KeyError: | ||||||
| @@ -37,7 +41,11 @@ class Field: | |||||||
|                 obj = self.model() |                 obj = self.model() | ||||||
|             if name is not None: |             if name is not None: | ||||||
|                 obj.__name__ = name |                 obj.__name__ = name | ||||||
|             self._set_namespace(obj, self.namespace, inst.__namespace__) |  | ||||||
|  |             if namespace: | ||||||
|  |                 self._set_namespace(obj, namespace, inst.__namespace__) | ||||||
|  |             else: | ||||||
|  |                 self._set_namespace(obj, self.namespace, inst.__namespace__) | ||||||
|  |  | ||||||
|             if attribute: |             if attribute: | ||||||
|                 inst._fields[attribute] = obj |                 inst._fields[attribute] = obj | ||||||
|   | |||||||
| @@ -67,7 +67,7 @@ class One2Many(Field): | |||||||
|         assert self.name is not None |         assert self.name is not None | ||||||
|  |  | ||||||
|         def creator(attribute): |         def creator(attribute): | ||||||
|             return self._create_model(inst, name=self.field_name, model=self.model, attribute=attribute) |             return self._create_model(inst, name=self.field_name, model=self.model, attribute=attribute, namespace=self.namespace) | ||||||
|          |          | ||||||
|         if inst in self.relation: |         if inst in self.relation: | ||||||
|             return self.relation[inst] |             return self.relation[inst] | ||||||
|   | |||||||
| @@ -195,6 +195,58 @@ def test_model_with_xml_namespace_nested(): | |||||||
|     person.id = 33 |     person.id = 33 | ||||||
|     assert '<Person xmlns:facho="http://lib.facho.cyou"><facho:ID>33</facho:ID></Person>' == person.to_xml() |     assert '<Person xmlns:facho="http://lib.facho.cyou"><facho:ID>33</facho:ID></Person>' == person.to_xml() | ||||||
|  |  | ||||||
|  | def test_model_with_xml_namespace_nested_nested(): | ||||||
|  |     class ID(facho.model.Model): | ||||||
|  |         __name__ = 'ID' | ||||||
|  |          | ||||||
|  |     class Party(facho.model.Model): | ||||||
|  |         __name__ = 'Party' | ||||||
|  |  | ||||||
|  |         id = fields.Many2One(ID, namespace='party') | ||||||
|  |  | ||||||
|  |         def __default_set__(self, value): | ||||||
|  |             self.id = value | ||||||
|  |  | ||||||
|  |     class Person(facho.model.Model): | ||||||
|  |         __name__ = 'Person' | ||||||
|  |         __namespace__ = { | ||||||
|  |             'person': 'http://lib.facho.cyou', | ||||||
|  |             'party': 'http://lib.facho.cyou' | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         id = fields.Many2One(Party, namespace='person') | ||||||
|  |          | ||||||
|  |     person = Person() | ||||||
|  |     person.id = 33 | ||||||
|  |     assert '<Person xmlns:person="http://lib.facho.cyou" xmlns:party="http://lib.facho.cyou"><person:Party><party:ID>33</party:ID></person:Party></Person>' == person.to_xml() | ||||||
|  |  | ||||||
|  | def test_model_with_xml_namespace_nested_one_many(): | ||||||
|  |     class Name(facho.model.Model): | ||||||
|  |         __name__ = 'Name' | ||||||
|  |  | ||||||
|  |     class Contact(facho.model.Model): | ||||||
|  |         __name__ = 'Contact' | ||||||
|  |  | ||||||
|  |         name = fields.Many2One(Name, namespace='contact') | ||||||
|  |  | ||||||
|  |     class Person(facho.model.Model): | ||||||
|  |         __name__ = 'Person' | ||||||
|  |         __namespace__ = { | ||||||
|  |             'facho': 'http://lib.facho.cyou', | ||||||
|  |             'contact': 'http://lib.facho.cyou' | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         contacts = fields.One2Many(Contact, namespace='facho') | ||||||
|  |          | ||||||
|  |     person = Person() | ||||||
|  |     contact = person.contacts.create() | ||||||
|  |     contact.name = 'contact1' | ||||||
|  |  | ||||||
|  |     contact = person.contacts.create() | ||||||
|  |     contact.name = 'contact2' | ||||||
|  |  | ||||||
|  |     assert '<Person xmlns:facho="http://lib.facho.cyou" xmlns:contact="http://lib.facho.cyou"><facho:Contact><contact:Name>contact1</contact:Name></facho:Contact><facho:Contact><contact:Name>contact2</contact:Name></facho:Contact></Person>' == person.to_xml() | ||||||
|  |  | ||||||
| def test_field_model_with_namespace(): | def test_field_model_with_namespace(): | ||||||
|     class ID(facho.model.Model): |     class ID(facho.model.Model): | ||||||
|         __name__ = 'ID' |         __name__ = 'ID' | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user