Files
tryton/modules/edocument_ubl/tests/scenario_ubl_2_invoice_parse.rst
Cédric Krier 366327464b Set the company on the invoice before assigning the party
The party of the invoice must have the invoice's company in the context to
correctly set the account when calling on_change_party.

Closes #15049
(grafted from 9b78bdacf182dfa9e5ab3c5206fb8fb5adfb2868)

--HG--
branch : 8.0
2026-08-31 12:06:40 +02:00

102 lines
3.2 KiB
ReStructuredText

===================
UBL 2 Invoice Parse
===================
Imports::
>>> import datetime as dt
>>> from decimal import Decimal
>>> from proteus import Model
>>> from trytond.modules.account.tests.tools import create_chart, create_tax
>>> from trytond.modules.company.tests.tools import create_company, get_company
>>> from trytond.modules.currency.tests.tools import get_currency
>>> from trytond.tests.tools import activate_modules, assertEqual
>>> from trytond.tools import file_open
>>> cash_rounding = globals().get('cash_rounding', False)
Activate modules::
>>> modules = ['edocument_ubl', 'account_invoice', 'bank', 'purchase']
>>> if cash_rounding:
... modules.append('account_cash_rounding')
>>> config = activate_modules(modules, create_company, create_chart)
>>> Attachment = Model.get('ir.attachment')
>>> EInvoice = Model.get('edocument.ubl.invoice')
>>> Invoice = Model.get('account.invoice')
Setup company::
>>> company = get_company()
>>> company.party.name = 'Buyercompany ltd'
>>> company.party.save()
Create currency::
>>> eur = get_currency('EUR')
>>> if cash_rounding:
... eur.cash_rounding = Decimal('1')
>>> eur.save()
Create tax::
>>> tax20 = create_tax(Decimal('.2'))
>>> tax20.unece_category_code = 'S'
>>> tax20.unece_code = 'VAT'
>>> tax20.save()
>>> tax10 = create_tax(Decimal('.1'))
>>> tax10.unece_category_code = 'AA'
>>> tax10.unece_code = 'VAT'
>>> tax10.save()
>>> tax0 = create_tax(Decimal('0'))
>>> tax0.unece_category_code = 'E'
>>> tax0.unece_code = 'VAT'
>>> tax0.save()
Parse the UBL invoice::
>>> with file_open(
... 'edocument_ubl/tests/UBL-Invoice-2.1-Example.xml',
... mode='rb') as fp:
... invoice_id = EInvoice.parse(fp.read(), {**config.context, 'company': None})
>>> invoice = Invoice(invoice_id)
>>> invoice.reference
'TOSL108'
>>> assertEqual(invoice.invoice_date, dt.date(2009, 12, 15))
>>> invoice.party.name
'The Sellercompany Incorporated'
>>> invoice.invoice_address.rec_name
'The Sellercompany Incorporated, Main street 1 5467, 54321, Big city'
>>> assertEqual(invoice.company, company)
>>> assertEqual(
... invoice.total_amount,
... Decimal('1729.00') if cash_rounding else Decimal('1728.70'))
>>> invoice.tax_amount
Decimal('292.20')
>>> assertEqual(invoice.source_untaxed_amount, Decimal('1436.50'))
>>> assertEqual(invoice.source_tax_amount, Decimal('292.20'))
>>> assertEqual(
... invoice.source_total_amount,
... Decimal('1729.00') if cash_rounding else Decimal('1728.70'))
>>> len(invoice.lines)
7
>>> payment_mean, = invoice.payment_means
>>> account_number, = payment_mean.instrument.numbers
>>> account_number.number
'DK1212341234123412'
>>> assertEqual(payment_mean.instrument.owners, invoice.alternative_payees)
>>> attachments = Attachment.find([])
>>> len(attachments)
3
>>> assertEqual({a.resource for a in attachments}, {invoice})
>>> sorted((a.name, a.type) for a in attachments)
[('Drawing Doc2.pdf', 'data'), ('Framework agreement Contract321', 'data'), ('Timesheet Doc1', 'link')]