diff --git a/invoice.py b/invoice.py index 84e0118..c809a25 100644 --- a/invoice.py +++ b/invoice.py @@ -15,8 +15,7 @@ ELECTRONET_TEMPLATE_SCHEMA = 'Facturaev3_2.xsd' MODULE_PATH = os.path.dirname(os.path.abspath(__file__)) -class Invoice: - __metaclass__ = PoolMeta +class Invoice(metaclass=PoolMeta): __name__ = 'account.invoice' @classmethod @@ -38,10 +37,10 @@ class Invoice: schema_file_path = os.path.join(MODULE_PATH, ELECTRONET_TEMPLATE_SCHEMA) invoice._validate_facturae(facturae_content, schema_file_path) - invoice_facturae = facturae_content + invoice_facturae = str(facturae_content) fname = '%s/%s' % (ELECTRONET, invoice.invoice_facturae_filename.replace('.xsig', '.xml')) - with open(fname, 'w') as output_file: + with open(fname, 'w', encoding='utf-8') as output_file: output_file.write(invoice_facturae) to_write[0].append(invoice) to_write += ({'invoice_facturae': invoice_facturae},) @@ -73,8 +72,7 @@ class Invoice: self._get_content_to_render(), ).encode('utf-8') -class GenerateFacturaeStart: - __metaclass__ = PoolMeta +class GenerateFacturaeStart(metaclass=PoolMeta): __name__ = 'account.invoice.generate_facturae.start' @classmethod diff --git a/party.py b/party.py index 22a1df4..3f052f0 100644 --- a/party.py +++ b/party.py @@ -6,8 +6,7 @@ from trytond.pool import PoolMeta __all__ = ['Party'] -class Party: - __metaclass__ = PoolMeta +class Party(metaclass=PoolMeta): __name__ = 'party.party' id_electronet = fields.Char('Id Electronet') diff --git a/setup.py b/setup.py index e45349c..5a8cab2 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ import io try: from configparser import ConfigParser except ImportError: - from ConfigParser import ConfigParser + from configparser import ConfigParser MODULE2PREFIX = {} diff --git a/template_facturae_3.2.xml b/template_facturae_3.2.xml index fba923c..e46a366 100644 --- a/template_facturae_3.2.xml +++ b/template_facturae_3.2.xml @@ -7,7 +7,7 @@ EM {# As InvoiceIssuerType != TE, ThirdParty element is not generated #} - {{ ('%s%s' % (invoice.company.party.vat_code, invoice.number))[:70] }} + {{ ('%s%s' % (invoice.company.party.tax_identifier.code, invoice.number))[:70] }} 1 {{ invoice.total_amount }} @@ -39,7 +39,7 @@ {{ invoice.company.party.facturae_person_type }} R - {{ invoice.company.party.vat_code[:30] }} + {{ invoice.company.party.tax_identifier.code[:30] }} {# Optional. It could be the ID or the code #} {{ invoice.company.party.id_electronet }} @@ -62,7 +62,7 @@ {{ invoice.party.facturae_person_type }} R - {{ invoice.party.vat_code[:30] }} + {{ invoice.party.tax_identifier.code[:30] }} {# Optional. It could be the ID or the code #} {{ invoice.party.id_electronet }} diff --git a/tests/certificate.pfx b/tests/certificate.pfx new file mode 100644 index 0000000..d48112a Binary files /dev/null and b/tests/certificate.pfx differ diff --git a/tests/test_account_invoice_facturae_electronet.py b/tests/test_account_invoice_facturae_electronet.py index 0adf8e5..7800b33 100644 --- a/tests/test_account_invoice_facturae_electronet.py +++ b/tests/test_account_invoice_facturae_electronet.py @@ -1,13 +1,13 @@ -# This file is part account_invoice_facturae_electronet module for Tryton. -# The COPYRIGHT file at the top level of this repository contains -# the full copyright notices and license terms. -import unittest +# The COPYRIGHT file at the top level of this repository contains the full +# copyright notices and license terms. +# import doctest import os.path +import unittest from decimal import Decimal +import trytond.tests.test_tryton from trytond.pool import Pool from trytond.transaction import Transaction from trytond.tests.test_tryton import ModuleTestCase, with_transaction -from trytond.tests.test_tryton import suite as test_suite from trytond.modules.account.tests import get_fiscalyear, create_chart from trytond.modules.company.tests import create_company, set_company from trytond.modules.account_invoice.tests import set_invoice_sequences @@ -22,6 +22,7 @@ class AccountInvoiceFacturaeElectronetTestCase(ModuleTestCase): @with_transaction() def test_invoice_generation(self): 'Test invoice generation' + pool = Pool() Account = pool.get('account.account') FiscalYear = pool.get('account.fiscalyear') @@ -30,6 +31,7 @@ class AccountInvoiceFacturaeElectronetTestCase(ModuleTestCase): Party = pool.get('party.party') PaymentTerm = pool.get('account.invoice.payment_term') ProductUom = pool.get('product.uom') + ProductCategory = pool.get('product.category') ProductTemplate = pool.get('product.template') Product = pool.get('product.product') Tax = pool.get('account.tax') @@ -41,13 +43,13 @@ class AccountInvoiceFacturaeElectronetTestCase(ModuleTestCase): country = Country(name='Country', code='ES', code3='ESP') country.save() - subdivision = Subdivision(name='Subdivision', country=country, - code='SUB', type='area') + subdivision = Subdivision( + name='Subdivision', country=country, code='SUB', type='area') subdivision.save() company = create_company() currency = create_currency('EUR') - add_currency_rate(currency, Decimal(1.0)) + add_currency_rate(currency, 1.0) tax_identifier = PartyIdentifier() tax_identifier.type = 'eu_vat' @@ -62,6 +64,11 @@ class AccountInvoiceFacturaeElectronetTestCase(ModuleTestCase): company.party.save() company.save() + # Save certificate into company + with open(os.path.join( + CURRENT_PATH, 'certificate.pfx'), 'rb') as cert_file: + company.facturae_certificate = cert_file.read() + payment_term, = PaymentTerm.create([{ 'name': '20 days, 40 days', 'lines': [ @@ -87,14 +94,11 @@ class AccountInvoiceFacturaeElectronetTestCase(ModuleTestCase): }]) with set_company(company): + create_chart(company, tax=True) + fiscalyear = set_invoice_sequences(get_fiscalyear(company)) fiscalyear.save() FiscalYear.create_period([fiscalyear]) - create_chart(company, tax=True) - - with Transaction().set_user(0), \ - Transaction().set_context(company=company.id, user=0, - _check_access=False): payment_receivable, = PaymentType.create([{ 'name': 'Payment Receivable', @@ -107,13 +111,14 @@ class AccountInvoiceFacturaeElectronetTestCase(ModuleTestCase): tax_account, = Account.search([ ('name', '=', 'Main Tax'), ]) - vat21 = Tax() - vat21.name = vat21.description = '21% VAT' - vat21.type = 'percentage' - vat21.rate = Decimal('0.21') - vat21.invoice_account = tax_account - vat21.report_type = '05' - vat21.credit_note_account = tax_account + with Transaction().set_user(0): + vat21 = Tax() + vat21.name = vat21.description = '21% VAT' + vat21.type = 'percentage' + vat21.rate = Decimal('0.21') + vat21.invoice_account = tax_account + vat21.report_type = '05' + vat21.credit_note_account = tax_account vat21.save() @@ -161,59 +166,68 @@ class AccountInvoiceFacturaeElectronetTestCase(ModuleTestCase): }])], }]) + + account_category = ProductCategory() + account_category.name = 'Account Category' + account_category.accounting = True + account_category.account_expense = expense + account_category.account_revenue = revenue + account_category.customer_taxes = [vat21] + account_category.save() + unit, = ProductUom.search([('name', '=', 'Unit')]) template = ProductTemplate() template.name = 'product' template.default_uom = unit template.type = 'service' template.list_price = Decimal('40') - template.cost_price = Decimal('25') - template.account_expense = expense - template.account_revenue = revenue - template.customer_taxes = [vat21] + template.account_category = account_category template.save() product = Product() product.template = template product.save() - invoice = Invoice() - invoice.type = 'out' - invoice.on_change_type() - invoice.party = party - invoice.on_change_party() - invoice.payment_type = payment_receivable - invoice.payment_term = term - invoice.currency = currency - invoice.company = company + currency = create_currency('Eur') + add_currency_rate(currency, 1) - line1 = InvoiceLine() - line1.account = revenue - line1.product = product - line1.on_change_product() - line1.on_change_account() - line1.description = 'TestLine2' - line1.quantity = 5 - line1.unit_price = Decimal('40') + with Transaction().set_user(0): + invoice = Invoice() + invoice.type = 'out' + invoice.on_change_type() + invoice.party = party + invoice.on_change_party() + invoice.payment_type = payment_receivable + invoice.payment_term = term + invoice.currency = currency + invoice.company = company - line2 = InvoiceLine() - line2.account = revenue - line2.product = product - line2.on_change_product() - line2.on_change_account() - line2.description = 'TestLine2' - line2.quantity = 1 - line2.unit_price = Decimal(20) + line1 = InvoiceLine() + line1.product = product + line1.on_change_product() + line1.on_change_account() + line1.quantity = 5 + line1.unit_price = Decimal('40') - invoice.lines = [line1, line2] - invoice.on_change_lines() - invoice.save() + line2 = InvoiceLine() + line2.account = revenue + line2.on_change_account() + line2.product = product + line2.on_change_product() + line2.description = 'Test' + line2.quantity = 1 + line2.unit_price = Decimal(20) - Invoice.post([invoice]) - Invoice.generate_facturae_electronet([invoice]) + invoice.lines = [line1, line2] + invoice.on_change_lines() + + invoice.save() + Invoice.post([invoice]) + + Invoice.generate_facturae_electronet([invoice]) def suite(): - suite = test_suite() + suite = trytond.tests.test_tryton.suite() suite.addTests(unittest.TestLoader().loadTestsFromTestCase( AccountInvoiceFacturaeElectronetTestCase)) return suite