# -*- coding: utf-8 -*- # This file is part of the document-incoming-invoice-xml-module # from m-ds for Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. import os.path import copy from decimal import Decimal from datetime import date from trytond.tests.test_tryton import with_transaction from trytond.pool import Pool 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_en16931) def set_invoice_sequences(fiscalyear): pool = Pool() Sequence = pool.get('ir.sequence.strict') SequenceType = pool.get('ir.sequence.type') InvoiceSequence = pool.get('account.fiscalyear.invoice_sequence') ModelData = pool.get('ir.model.data') sequence = Sequence( name=fiscalyear.name, sequence_type=SequenceType(ModelData.get_id( 'account_invoice', 'sequence_type_account_invoice')), company=fiscalyear.company, ) sequence.save() fiscalyear.invoice_sequences = [] invoice_sequence = InvoiceSequence() invoice_sequence.fiscalyear = fiscalyear invoice_sequence.in_invoice_sequence = sequence invoice_sequence.in_credit_note_sequence = sequence invoice_sequence.out_invoice_sequence = sequence invoice_sequence.out_credit_note_sequence = sequence invoice_sequence.save() return fiscalyear class DocumentTestCase(object): """ check import of xml + pdf files """ def prep_sorted_dict(self, data): """ sort dict by keys, konvert tuple to list to revert changes by self.parsed_data Args: data (dict): dict-data """ return { k: ( self.prep_sorted_dict(v) if isinstance(v, dict) else list(v) if isinstance(v, tuple) else v) for k, v in sorted(data.items(), key=lambda item: item[0])} def prep_incomingdoc_run_worker(self): """ run tasks from queue """ Queue = Pool().get('ir.queue') while True: tasks = Queue.search([]) if not tasks: break for task in tasks: task.run() Queue.delete(tasks) def prep_fiscalyear(self, company1): """ prepare fiscal year, sequences... """ pool = Pool() FiscalYear = pool.get('account.fiscalyear') fisc_year = get_fiscalyear(company1, today=date(2025, 1, 15)) set_invoice_sequences(fisc_year) fisc_year.save() FiscalYear.create_period([fisc_year]) def prep_prodcat_category(self, company): """ create product category """ pool = Pool() ProdCat = pool.get('product.category') Account = pool.get('account.account') Tax = pool.get('account.tax') # get accounts expense/revenue acc_exp, acc_rev, acc_tax, = Account.search([ ('name', 'in', ['Main Revenue', 'Main Expense', 'Main Tax']) ], order=[('name', 'ASC')]) self.assertEqual(acc_exp.name, 'Main Expense') self.assertEqual(acc_rev.name, 'Main Revenue') self.assertEqual(acc_tax.name, 'Main Tax') # check tax tax, = Tax.search([]) self.assertEqual(tax.name, '20% VAT') self.assertEqual(tax.invoice_account.name, 'Main Tax') self.assertEqual(tax.credit_note_account.name, 'Main Tax') tax_19, = Tax.copy([tax], { 'name': '19% VAT', 'rate': Decimal('0.19')}) tax_7, = Tax.copy([tax], { 'name': '7% VAT', 'rate': Decimal('0.07')}) p_cat, p_cat_19, tax_7, = ProdCat.create([{ 'name': 'Accounting', 'accounting': True, 'account_parent': False, 'account_expense': acc_exp.id, 'account_revenue': acc_rev.id, 'taxes_parent': False, 'customer_taxes': [('add', [tax.id])], 'supplier_taxes': [('add', [tax.id])], }, { 'name': 'Accounting 19%', 'accounting': True, 'account_parent': False, 'account_expense': acc_exp.id, 'account_revenue': acc_rev.id, 'taxes_parent': False, 'customer_taxes': [('add', [tax_19.id])], 'supplier_taxes': [('add', [tax_19.id])], }, { 'name': 'Accounting 7%', 'accounting': True, 'account_parent': False, 'account_expense': acc_exp.id, 'account_revenue': acc_rev.id, 'taxes_parent': False, 'customer_taxes': [('add', [tax_7.id])], 'supplier_taxes': [('add', [tax_7.id])], }]) self.assertEqual(p_cat.name, 'Accounting') self.assertEqual(p_cat.accounting, True) self.assertEqual(p_cat.account_parent, False) self.assertEqual(p_cat.taxes_parent, False) self.assertEqual(p_cat.account_expense.name, 'Main Expense') self.assertEqual(p_cat.account_revenue.name, 'Main Revenue') self.assertEqual(p_cat.customer_taxes[0].name, '20% VAT') self.assertEqual(p_cat.supplier_taxes[0].name, '20% VAT') return [p_cat, p_cat_19, tax_7] @with_transaction() def test_xmldoc_check_xml_read_facturx_extended(self): """ add incoming-dcument 'factur-x-extended' 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-extended.xml'), 'rb') as fhdl: xml_txt = fhdl.read() incoming = IncDocument(data=xml_txt, name='facturx-extended.xml') (xsdtype, funcname, xml_data) = incoming._facturx_detect_content() self.assertEqual(xsdtype, 'Factur-X extended') self.assertEqual(funcname, 'facturx_extended') incoming._readxml_facturx_extended(xml_data) self.assertEqual( self.prep_sorted_dict(incoming.parsed_data), parsed_data_facturx_extended) @with_transaction() def test_xmldoc_import_facturx_extended(self): """ create incoming-document, load factur-x-extended 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') 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-extended.xml'), 'rb') as fhdl: to_create.append({ 'data': fhdl.read(), 'name': 'facturx-extended.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'\n' + b'\n' + b'\n' + b'