# -*- coding: utf-8 -*- # This file is part of the edocument-module for Tryton from m-ds.de. # The COPYRIGHT file at the top level of this repository contains the # full copyright notices and license terms. from lxml import etree import os from unittest.mock import Mock from decimal import Decimal from datetime import date from trytond.tests.test_tryton import ModuleTestCase, with_transaction from trytond.pool import Pool from trytond.modules.edocument_uncefact.tests.test_edocument_uncefact import \ get_invoice from trytond.modules.company.tests import create_company, set_company from trytond.exceptions import UserError class EdocTestCase(ModuleTestCase): 'Test e-rechnung module' module = 'edocument_xrechnung' @with_transaction() def test_xrechn_bank_account_owned(self): """ check field 'company_owned' on bank.account.number """ pool = Pool() BankAccount = pool.get('bank.account') AccountNumber = pool.get('bank.account.number') Bank = pool.get('bank') Party = pool.get('party.party') company = create_company() with set_company(company): bank_party, = Party.create([{ 'name': 'Bank 123', 'addresses': [('create', [{}])]}]) customer_party, = Party.create([{ 'name': 'Someone', 'addresses': [('create', [{}])]}]) bank, = Bank.create([{'party': bank_party.id}]) acc_company, acc_other, = BankAccount.create([ { 'bank': bank.id, 'owners': [('add', [company.party.id])], 'numbers': [('create', [ {'type': 'iban', 'number': 'DE02300209000106531065'}])] }, { 'bank': bank.id, 'owners': [('add', [customer_party.id])], 'numbers': [('create', [ {'type': 'iban', 'number': 'DE02200505501015871393'}])] }]) self.assertEqual(len(acc_company.numbers), 1) self.assertEqual(acc_company.numbers[0].company_owned, True) self.assertEqual(len(acc_other.numbers), 1) self.assertEqual(acc_other.numbers[0].company_owned, False) company_numbers = AccountNumber.search( [('company_owned', '=', True)]) self.assertEqual(len(company_numbers), 1) self.assertEqual(company_numbers[0].id, acc_company.numbers[0].id) other_numbers = AccountNumber.search( [('company_owned', '=', False)]) self.assertEqual(len(other_numbers), 1) self.assertEqual(other_numbers[0].id, acc_other.numbers[0].id) @with_transaction() def test_xrechn_check_validator(self): """ check validation of optional route-id """ Party = Pool().get('party.party') party, = Party.create([{'name': 'P1'}]) self.assertEqual(party.xrechnung_routeid, False) Party.write(*[ [party], { 'xrechnung_routeid': True, 'identifiers': [('create', [{ 'type': 'edoc_route_id', 'code': '1234'}])]}]) self.assertEqual(party.xrechnung_routeid, True) self.assertEqual(party.get_xrechnung_route_id(), '1234') self.assertRaisesRegex( UserError, "No XRechnung routing ID is stored for the party 'P1'.", Party.write, *[ [party], {'identifiers': [('delete', [party.identifiers[0].id])]}] ) @with_transaction() def test_xrechn_export_facturx(self): """ run export - factur-x """ pool = Pool() Template = pool.get('edocument.facturxext.invoice') Identifier = pool.get('party.identifier') Party = pool.get('party.party') Bank = pool.get('bank') BankAccount = pool.get('bank.account') BankNumber = pool.get('bank.account.number') invoice = get_invoice() invoice.party.get_xrechnung_route_id = Mock( return_value='xrechn-route-id-123') invoice.company.party.bank_accounts = [ Mock( spec=BankAccount, currency=invoice.currency, bank=Mock(spec=Bank, party=Mock(spec=Party, name='Bank')), owners=[invoice.company.party], numbers=[Mock(spec=BankNumber, type='other', number='123456')], )] invoice.description = 'description of invoice' invoice.comment = 'note line 1\nnote line 2' invoice.taxes[0].tax.rate = Decimal('0.1') invoice.identifiers = [ Mock( spec=Identifier, type='edoc_route_id', code='xrechn-route-id-123') ] template = Template(invoice) schema_file = os.path.join( os.path.dirname(__file__), 'Factur-X_1.07.2_EXTENDED', 'Factur-X_1.07.2_EXTENDED.xsd') invoice_string = template.render('Factur-X-1.07.2-extended') invoice_xml = etree.fromstring(invoice_string) schema = etree.XMLSchema(etree.parse(schema_file)) schema.assertValid(invoice_xml) @with_transaction() def test_xrechn_export_xml_invoice(self): """ run export - invoice """ pool = Pool() Template = pool.get('edocument.xrechnung.invoice') Identifier = pool.get('party.identifier') Party = pool.get('party.party') Bank = pool.get('bank') BankAccount = pool.get('bank.account') BankNumber = pool.get('bank.account.number') invoice = get_invoice() invoice.party.get_xrechnung_route_id = Mock( return_value='xrechn-route-id-123') invoice.company.party.bank_accounts = [ Mock( spec=BankAccount, currency=invoice.currency, bank=Mock(spec=Bank, party=Mock(spec=Party, name='Bank')), owners=[invoice.company.party], numbers=[Mock(spec=BankNumber, type='other', number='123456')], )] invoice.description = 'description of invoice' invoice.comment = 'note line 1\nnote line 2' invoice.taxes[0].tax.rate = Decimal('0.1') invoice.identifiers = [ Mock( spec=Identifier, type='edoc_route_id', code='xrechn-route-id-123') ] template = Template(invoice) schema_file = os.path.join( os.path.dirname(__file__), 'os-UBL-2.1', 'xsd', 'maindoc', 'UBL-Invoice-2.1.xsd') for x in ['XRechnung-2.2', 'XRechnung-2.3', 'XRechnung-3.0']: invoice_string = template.render(x) invoice_xml = etree.fromstring(invoice_string) schema = etree.XMLSchema(etree.parse(schema_file)) schema.assertValid(invoice_xml) @with_transaction() def test_xrechn_export_xml_creditnote(self): """ run export - creditnote """ pool = Pool() Template = pool.get('edocument.xrechnung.invoice') Identifier = pool.get('party.identifier') Party = pool.get('party.party') Bank = pool.get('bank') BankAccount = pool.get('bank.account') BankNumber = pool.get('bank.account.number') invoice = get_invoice() # credit note invoice.lines[0].quantity = -1 invoice.lines[0].amount = Decimal('-100.0') invoice.taxes[0].base = Decimal('-100.0') invoice.taxes[0].amount = Decimal('-10.0') invoice.untaxed_amount = Decimal('-100.0') invoice.tax_amount = Decimal('-10.0') invoice.total_amount = Decimal('-110.0') invoice.lines_to_pay[0].debit = Decimal('-110.0') invoice.party.get_xrechnung_route_id = Mock( return_value='xrechn-route-id-123') invoice.company.party.bank_accounts = [ Mock( spec=BankAccount, currency=invoice.currency, bank=Mock(spec=Bank, party=Mock(spec=Party, name='Bank')), owners=[invoice.company.party], numbers=[Mock(spec=BankNumber, type='other', number='123456')], )] invoice.description = 'description of invoice' invoice.comment = 'note line 1\nnote line 2' invoice.taxes[0].tax.rate = Decimal('0.1') invoice.identifiers = [ Mock( spec=Identifier, type='edoc_route_id', code='xrechn-route-id-123') ] template = Template(invoice) schema_file = os.path.join( os.path.dirname(__file__), 'os-UBL-2.1', 'xsd', 'maindoc', 'UBL-CreditNote-2.1.xsd') for x in ['XRechnung-2.2', 'XRechnung-2.3', 'XRechnung-3.0']: invoice_string = template.render(x) invoice_xml = etree.fromstring(invoice_string) schema = etree.XMLSchema(etree.parse(schema_file)) schema.assertValid(invoice_xml) # invoice_string = template.render('XRechnung-2.2') # with open('xrechnung-test-creditnote.xml', 'wt') as fhdl: # fhdl.write(invoice_string.decode('utf8')) # end EdocTestCase del ModuleTestCase