From 5d68a2c2b4584958b00465e1cfd874e0a412ff40 Mon Sep 17 00:00:00 2001 From: Frederik Jaeckel Date: Fri, 10 Jan 2025 15:01:40 +0100 Subject: [PATCH] configuration: add setting for product-categories --- __init__.py | 3 +- configuration.py | 22 ++++++++- locale/de.po | 24 +++++++++ locale/en.po | 20 ++++++++ tests/document.py | 49 ++++++++++++++++++- view/document_incoming_configuration_form.xml | 2 + 6 files changed, 117 insertions(+), 3 deletions(-) diff --git a/__init__.py b/__init__.py index 6ae3e17..0a46674 100644 --- a/__init__.py +++ b/__init__.py @@ -5,11 +5,12 @@ from trytond.pool import Pool from .document import Incoming -from .configuration import Configuration +from .configuration import Configuration, ConfigProductcategoryRel def register(): Pool.register( Configuration, + ConfigProductcategoryRel, Incoming, module='document_incoming_invoice_xml', type_='model') diff --git a/configuration.py b/configuration.py index 11edd3e..5570483 100644 --- a/configuration.py +++ b/configuration.py @@ -6,7 +6,7 @@ from trytond.pool import PoolMeta -from trytond.model import fields +from trytond.model import fields, ModelSQL sel_number_target = [ @@ -29,6 +29,11 @@ class Configuration(metaclass=PoolMeta): string='Invoice number', help='Destination for the invoice number of the supplier invoice.', selection=sel_number_target) + product_category = fields.Many2Many( + string='Categories', origin='config', target='category', + help='Categories used to determine tax and accounts for a product ' + + 'on an invoice line.', + relation_name='document.incoming.confprodcat_rel') @classmethod def default_number_target(cls): @@ -58,3 +63,18 @@ class Configuration(metaclass=PoolMeta): return False # end Configuration + + +class ConfigProductcategoryRel(ModelSQL): + 'Configuration - Product Category - Relation' + __name__ = 'document.incoming.confprodcat_rel' + + config = fields.Many2One( + string='Configuration', required=True, + ondelete='CASCADE', model_name='document.incoming.configuration') + category = fields.Many2One( + string='Category', required=True, + domain=[('accounting', '=', True)], + ondelete='CASCADE', model_name='product.category') + +# end ConfigProductcategoryRel diff --git a/locale/de.po b/locale/de.po index fc05dd2..55247a1 100644 --- a/locale/de.po +++ b/locale/de.po @@ -57,3 +57,27 @@ msgstr "in das 'Referenz'-Feld" msgctxt "selection:document.incoming.configuration,number_target:" msgid "in the 'Number' field" msgstr "in das 'Nummer'-Feld" + +msgctxt "field:document.incoming.configuration,product_category:" +msgid "Categories" +msgstr "Produktkategorien" + +msgctxt "help:document.incoming.configuration,product_category:" +msgid "Categories used to determine tax and accounts for a product on an invoice line." +msgstr "Kategorien zur Ermittlung von Steuer und Konten für ein Produkt auf einer Rechnungszeile." + + +##################################### +# document.incoming.confprodcat_rel # +##################################### +msgctxt "model:document.incoming.confprodcat_rel:" +msgid "Configuration - Product Category - Relation" +msgstr "Konfiguration " + +msgctxt "field:document.incoming.confprodcat_rel,config:" +msgid "Configuration" +msgstr "konfiguration" + +msgctxt "field:document.incoming.confprodcat_rel,category:" +msgid "Category" +msgstr "Kategorie" diff --git a/locale/en.po b/locale/en.po index 8b56242..c5e6a63 100644 --- a/locale/en.po +++ b/locale/en.po @@ -50,3 +50,23 @@ msgctxt "selection:document.incoming.configuration,number_target:" msgid "in the 'Number' field" msgstr "in the 'Number' field" +msgctxt "field:document.incoming.configuration,product_category:" +msgid "Categories" +msgstr "Categories" + +msgctxt "help:document.incoming.configuration,product_category:" +msgid "Categories used to determine tax and accounts for a product on an invoice line." +msgstr "Categories used to determine tax and accounts for a product on an invoice line." + +msgctxt "model:document.incoming.confprodcat_rel:" +msgid "Configuration - Product Category - Relation" +msgstr "Configuration - Product Category - Relation" + +msgctxt "field:document.incoming.confprodcat_rel,config:" +msgid "Configuration" +msgstr "Configuration" + +msgctxt "field:document.incoming.confprodcat_rel,category:" +msgid "Category" +msgstr "Category" + diff --git a/tests/document.py b/tests/document.py index e65ce44..0992941 100644 --- a/tests/document.py +++ b/tests/document.py @@ -64,6 +64,48 @@ class DocumentTestCase(object): 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') + + p_cat, = 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])], + }]) + 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 + @with_transaction() def test_xmldoc_import_facturx(self): """ create incoming-document, load xml, detect type @@ -79,11 +121,16 @@ class DocumentTestCase(object): create_chart(company=company, tax=True) self.prep_fiscalyear(company) - config = Configuration() + product_category = self.prep_prodcat_category(company) + config = Configuration( + product_category=[product_category]) 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), 1) + self.assertEqual(config.product_category[0].name, 'Accounting') to_create = [] with open(os.path.join( diff --git a/view/document_incoming_configuration_form.xml b/view/document_incoming_configuration_form.xml index 73c241b..fcc366b 100644 --- a/view/document_incoming_configuration_form.xml +++ b/view/document_incoming_configuration_form.xml @@ -12,5 +12,7 @@