add Factur-X-EN16931

This commit is contained in:
Frederik Jaeckel 2025-01-22 17:26:58 +01:00
parent 4e03a1022e
commit 037ff9636a
4 changed files with 455 additions and 8 deletions

View file

@ -13,7 +13,8 @@ from trytond.exceptions import UserError
from trytond.modules.company.tests import create_company, set_company
from trytond.modules.account.tests import create_chart, get_fiscalyear
from .parsed_data import (
parsed_data_facturx_extended, parsed_data_facturx_basic)
parsed_data_facturx_extended, parsed_data_facturx_basic,
parsed_data_facturx_en16931)
def set_invoice_sequences(fiscalyear):
@ -412,4 +413,121 @@ class DocumentTestCase(object):
self.assertEqual(attachment.data, document.data)
self.assertEqual(attachment.name, 'facturx-basic.xml')
@with_transaction()
def test_xmldoc_check_xml_read_facturx_en16931(self):
""" add incoming-dcument 'facturx-en16931' in memory,
read xml into 'parsed_data'
"""
pool = Pool()
IncDocument = pool.get('document.incoming')
with open(os.path.join(
os.path.split(__file__)[0],
'facturx-en16931.xml'), 'rb') as fhdl:
xml_txt = fhdl.read()
incoming = IncDocument(data=xml_txt)
(xsdtype, funcname, xml_data) = incoming._facturx_detect_content()
self.assertEqual(xsdtype, 'Factur-X EN16931')
self.assertEqual(funcname, 'facturx_en16931')
incoming._readxml_facturx_en16931(xml_data)
self.assertEqual(
self.prep_sorted_dict(incoming.parsed_data),
parsed_data_facturx_en16931)
@with_transaction()
def test_xmldoc_import_facturx_en16931(self):
""" create incoming-document, load factur-x-en16931 xml, detect type
"""
pool = Pool()
IncDocument = pool.get('document.incoming')
Configuration = pool.get('document.incoming.configuration')
Party = pool.get('party.party')
IrAttachment = pool.get('ir.attachment')
Invoice = pool.get('account.invoice')
company = create_company('m-ds')
with set_company(company):
create_chart(company=company, tax=True)
self.prep_fiscalyear(company)
product_categories = self.prep_prodcat_category(company)
config = Configuration(
product_category=product_categories)
config.save()
self.assertEqual(config.create_supplier, True)
self.assertEqual(config.accept_other_company, False)
self.assertEqual(config.number_target, 'reference')
self.assertEqual(len(config.product_category), 3)
self.assertEqual(config.product_category[0].name, 'Accounting')
self.assertEqual(config.product_category[1].name, 'Accounting 19%')
self.assertEqual(config.product_category[2].name, 'Accounting 7%')
to_create = []
with open(os.path.join(
os.path.split(__file__)[0],
'facturx-en16931.xml'), 'rb') as fhdl:
to_create.append({
'data': fhdl.read(),
'name': 'facturx-en16931.xml',
'type': 'supplier_invoice'})
document, = IncDocument.create(to_create)
self.assertEqual(document.mime_type, 'application/xml')
self.assertEqual(document.company.id, company.id)
self.assertTrue(document.data.startswith(
b'<?xml version="1.0" encoding="UTF-8"?>\n' +
b'<rsm:CrossIndustryInvoice'))
# no supplier-party in db
self.assertEqual(
Party.search_count([('name', '=', 'Name of the Supplier')]),
0)
# no invoices
self.assertEqual(Invoice.search_count([]), 0)
config.create_supplier = True
config.accept_other_company = True
config.number_target = 'reference'
config.save()
# 'process' will queue the job to workers
IncDocument.process([document])
# run the usual call: process workers
self.prep_incomingdoc_run_worker()
# check imported invoice
invoice, = Invoice.search([])
self.assertEqual(invoice.type, 'in')
self.assertEqual(invoice.reference, 'RE2024.01234')
self.assertEqual(invoice.number, None)
self.assertEqual(invoice.invoice_date, date(2024, 6, 17))
self.assertEqual(invoice.currency.name, 'usd')
self.assertEqual(invoice.company.rec_name, 'm-ds')
self.assertEqual(invoice.description, 'Description of invoice')
self.assertEqual(
invoice.comment,
'Some notes to the customer.\n' +
'Subject=42, Goes to field comment.')
self.assertEqual(invoice.party.rec_name, 'Name of the Supplier')
self.assertEqual(invoice.account.rec_name, 'Main Payable')
self.assertEqual(document.result.__name__, 'account.invoice')
self.assertEqual(document.result.reference, 'RE2024.01234')
parsed_ori = copy.deepcopy(parsed_data_facturx_en16931)
parsed_ori['seller_party']['party'] = invoice.party.id
self.assertEqual(
self.prep_sorted_dict(document.parsed_data),
self.prep_sorted_dict(parsed_ori))
attachment, = IrAttachment.search([
('resource.party', '=', invoice.party, 'account.invoice'),
('type', '=', 'data')])
self.assertEqual(attachment.data, document.data)
self.assertEqual(attachment.name, 'facturx-en16931.xml')
# end DocumentTestCase