From 3d43dca93d8f44a990aadaa764ba9a20c0460583 Mon Sep 17 00:00:00 2001 From: sergio Date: Fri, 7 Dec 2018 17:56:56 +0100 Subject: [PATCH 01/35] [8.0] add account stamp management [FIX] clean [FIX] clean [FIX] pep8 [IMP] use tax obj instead of tax code [FIX] icon path [FIX] get product with lang context [FIX] translation [FIX] product name [FIX] compute after unlink of invoice line --- l10n_it_account_stamp/__init__.py | 4 + l10n_it_account_stamp/__openerp__.py | 37 +++++++ l10n_it_account_stamp/data/data.xml | 20 ++++ l10n_it_account_stamp/i18n/it.po | 104 ++++++++++++++++++ l10n_it_account_stamp/models/__init__.py | 6 + l10n_it_account_stamp/models/company.py | 41 +++++++ l10n_it_account_stamp/models/invoice.py | 83 ++++++++++++++ l10n_it_account_stamp/models/product.py | 27 +++++ .../static/description/icon.png | Bin 0 -> 15282 bytes l10n_it_account_stamp/views/company_view.xml | 21 ++++ l10n_it_account_stamp/views/invoice_view.xml | 42 +++++++ l10n_it_account_stamp/views/product_view.xml | 51 +++++++++ 12 files changed, 436 insertions(+) create mode 100644 l10n_it_account_stamp/__init__.py create mode 100644 l10n_it_account_stamp/__openerp__.py create mode 100644 l10n_it_account_stamp/data/data.xml create mode 100644 l10n_it_account_stamp/i18n/it.po create mode 100644 l10n_it_account_stamp/models/__init__.py create mode 100644 l10n_it_account_stamp/models/company.py create mode 100644 l10n_it_account_stamp/models/invoice.py create mode 100644 l10n_it_account_stamp/models/product.py create mode 100644 l10n_it_account_stamp/static/description/icon.png create mode 100644 l10n_it_account_stamp/views/company_view.xml create mode 100644 l10n_it_account_stamp/views/invoice_view.xml create mode 100644 l10n_it_account_stamp/views/product_view.xml diff --git a/l10n_it_account_stamp/__init__.py b/l10n_it_account_stamp/__init__.py new file mode 100644 index 000000000000..062553f5aa5a --- /dev/null +++ b/l10n_it_account_stamp/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import models diff --git a/l10n_it_account_stamp/__openerp__.py b/l10n_it_account_stamp/__openerp__.py new file mode 100644 index 000000000000..9ccff663b254 --- /dev/null +++ b/l10n_it_account_stamp/__openerp__.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Author(s): Ermanno Gnan (ermannognan@gmail.com) +# Copyright © 2018 Sergio Corato (https://efatto.it) +# Copyright © 2018 Enrico Ganzaroli (enrico.gz@gmail.com) +# Copyright © 2018 Ermanno Gnan (ermannognan@gmail.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +{ + 'name': 'Tax Stamp', + 'version': '8.0.0.0.1', + 'category': 'Localisation/Italy', + 'summary': 'Tax stamp automatic management', + 'description': """ +Tax Stamp + +Functionalities: + +- Adds tax stamp support. +- Invoices stamp lines reports: "assolvimento dell’imposta di bollo ai sensi +dell’articolo 6, comma 2, del Dm 17 giugno 2014". + +""", + 'author': 'Ermanno Gnan, Sergio Corato, Enrico Ganzaroli, ' + 'Odoo Community Association (OCA)', + 'website': 'https://odoo-community.org', + 'depends': [ + 'product', + 'account', + ], + 'data': [ + 'data/data.xml', + 'views/invoice_view.xml', + 'views/product_view.xml', + 'views/company_view.xml', + ], + 'installable': True, +} diff --git a/l10n_it_account_stamp/data/data.xml b/l10n_it_account_stamp/data/data.xml new file mode 100644 index 000000000000..f64e6d23ba16 --- /dev/null +++ b/l10n_it_account_stamp/data/data.xml @@ -0,0 +1,20 @@ + + + + + + Tax Stamp 2 euro + service + + + +Stamp duty payment under the terms of Art. 6, Subsection 2 of MEF Decree July +17, 2014 + + + + + + + + diff --git a/l10n_it_account_stamp/i18n/it.po b/l10n_it_account_stamp/i18n/it.po new file mode 100644 index 000000000000..eef113a8f947 --- /dev/null +++ b/l10n_it_account_stamp/i18n/it.po @@ -0,0 +1,104 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_it_account_stamp +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-12-12 13:29+0000\n" +"PO-Revision-Date: 2018-12-12 13:29+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_it_account_stamp +#: view:product.template:l10n_it_account_stamp.product_template_form_view_account_stamp +msgid "Accounting" +msgstr "Contabilità" + +#. module: l10n_it_account_stamp +#: view:account.invoice:l10n_it_account_stamp.invoice_form_stamp +#: view:account.invoice:l10n_it_account_stamp.invoice_supplier_form_stamp +msgid "CadetBlue:is_stamp_line==True;" +msgstr "CadetBlue:is_stamp_line==True;" + +#. module: l10n_it_account_stamp +#: model:ir.model,name:l10n_it_account_stamp.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: l10n_it_account_stamp +#: view:product.template:l10n_it_account_stamp.product_template_form_view_account_stamp +msgid "For each invoice, the base amount for each selected tax code account will be added up and used to determine the application of the account stamp." +msgstr "La base imponibile di ogni conto imposta individuato fra quelli sopra elencati verrà sommata e utilizzata, all'interno di ciascuna fattura, per determinare l'applicabilità della marca da bollo." + +#. module: l10n_it_account_stamp +#: model:ir.model,name:l10n_it_account_stamp.model_account_invoice +msgid "Invoice" +msgstr "Fattura" + +#. module: l10n_it_account_stamp +#: model:ir.model,name:l10n_it_account_stamp.model_account_invoice_line +msgid "Invoice Line" +msgstr "Righe Fattura" + +#. module: l10n_it_account_stamp +#: code:addons/l10n_it_account_stamp/models/invoice.py:51 +#, python-format +msgid "Missing account income/expense configuration for %s" +msgstr "Configurazione conti costo/ricavo mancante per %s" + +#. module: l10n_it_account_stamp +#: code:addons/l10n_it_account_stamp/models/invoice.py:25 +#, python-format +msgid "Missing tax stamp product in company settings!" +msgstr "Prodotto Marca da bollo mancante nella configurazione dell'azienda!" + +#. module: l10n_it_account_stamp +#: model:ir.model,name:l10n_it_account_stamp.model_product_template +msgid "Product Template" +msgstr "Modello Prodotto" + +#. module: l10n_it_account_stamp +#: help:account.config.settings,tax_stamp_product_id:0 +#: help:res.company,tax_stamp_product_id:0 +msgid "Product used to model DatiBollo XML element on bills." +msgstr "Prodotto usato per campo DatiBollo nell'elemento XML nelle fatture." + +#. module: l10n_it_account_stamp +#: field:product.template,stamp_apply_tax_ids:0 +msgid "Stamp taxes" +msgstr "Imposte marca da bollo" + +#. module: l10n_it_account_stamp +#: view:account.config.settings:l10n_it_account_stamp.view_account_config_settings +#: field:account.config.settings,tax_stamp_product_id:0 +#: field:res.company,tax_stamp_product_id:0 +msgid "Tax Stamp Product" +msgstr "Prodotto Marca da Bollo" + +#. module: l10n_it_account_stamp +#: view:product.template:l10n_it_account_stamp.product_template_form_view_account_stamp +msgid "Tax stamp" +msgstr "Marca da bollo" + +#. module: l10n_it_account_stamp +#: code:addons/l10n_it_account_stamp/models/product.py:17 +#, python-format +msgid "The product %s must be a stamp to set apply taxes!" +msgstr "Il prodotto deve essere una marca da bollo per poter impostare i conti imposta!" + +#. module: l10n_it_account_stamp +#: view:product.template:l10n_it_account_stamp.product_template_form_view_account_stamp +msgid "{'readonly': [('is_stamp', '=', True)]}" +msgstr "{'readonly': [('is_stamp', '=', True)]}" + +#. module: l10n_it_account_stamp +#: view:product.template:l10n_it_account_stamp.product_template_form_view_account_stamp +msgid "{'required': [('is_stamp', '=', True)]}" +msgstr "{'required': [('is_stamp', '=', True)]}" + diff --git a/l10n_it_account_stamp/models/__init__.py b/l10n_it_account_stamp/models/__init__.py new file mode 100644 index 000000000000..d4db663e7a20 --- /dev/null +++ b/l10n_it_account_stamp/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from . import invoice +from . import product +from . import company diff --git a/l10n_it_account_stamp/models/company.py b/l10n_it_account_stamp/models/company.py new file mode 100644 index 000000000000..f16417ebba72 --- /dev/null +++ b/l10n_it_account_stamp/models/company.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from openerp import fields, models, api + + +class ResCompany(models.Model): + _inherit = 'res.company' + + tax_stamp_product_id = fields.Many2one( + 'product.product', 'Tax Stamp Product', + help="Product used to model DatiBollo XML element on bills." + ) + + +class AccountConfigSettings(models.TransientModel): + _inherit = 'account.config.settings' + + tax_stamp_product_id = fields.Many2one( + related='company_id.tax_stamp_product_id', + string="Tax Stamp Product", + help="Product used to model DatiBollo XML element on bills." + ) + + @api.v7 + def onchange_company_id(self, cr, uid, ids, company_id, context=None): + res = super(AccountConfigSettings, self).onchange_company_id( + cr, uid, ids, company_id, context=context) + if company_id: + company = self.pool.get('res.company').browse( + cr, uid, company_id, context=context) + res['value'].update({ + 'tax_stamp_product_id': ( + company.tax_stamp_product_id and + company.tax_stamp_product_id.id or False + ) + }) + else: + res['value'].update({ + 'tax_stamp_product_id': False}) + return res diff --git a/l10n_it_account_stamp/models/invoice.py b/l10n_it_account_stamp/models/invoice.py new file mode 100644 index 000000000000..8d6a613e9090 --- /dev/null +++ b/l10n_it_account_stamp/models/invoice.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openerp import fields, api, models, exceptions +from openerp.tools.translate import _ + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + @api.multi + def compute_stamps(self): + invoice_line_obj = self.env['account.invoice.line'] + invoice_tax_obj = self.env['account.invoice.tax'] + for inv in self: + stamp_product_id = self.env.user.with_context( + lang=inv.partner_id.lang).company_id.tax_stamp_product_id + if not stamp_product_id: + raise exceptions.Warning( + _('Missing tax stamp product in company settings!') + ) + for l in inv.invoice_line: + if l.product_id and l.product_id.is_stamp: + l.unlink() + taxes = invoice_tax_obj.compute(inv) + tax_base_amounts = {} + for key in taxes.keys(): + tax_base_amounts[key[1]] = tax_base_amounts.get( + key[1], 0.0) + taxes[key]['base_amount'] + total_tax_base = 0.0 + for tax_code_id in tax_base_amounts.keys(): + if tax_code_id in stamp_product_id.stamp_apply_tax_ids.mapped( + 'base_code_id.id'): + total_tax_base += tax_base_amounts[tax_code_id] + taxes = stamp_product_id.taxes_id + if inv.type in ('in_invoice', 'in_refund'): + total_tax_base = total_tax_base * -1.0 + taxes = stamp_product_id.supplier_taxes_id + if inv.fiscal_position: + taxes_ids = inv.fiscal_position.map_tax(taxes) + else: + taxes_ids = taxes + + if total_tax_base >= stamp_product_id.stamp_apply_min_total_base: + if inv.type in ('out_invoice', 'out_refund'): + stamp_account = stamp_product_id.property_account_income + else: + stamp_account = stamp_product_id.property_account_expense + if not stamp_account: + raise exceptions.Warning( + _('Missing account income/expense configuration for' + ' %s') % stamp_product_id.name) + invoice_line_obj.create({ + 'invoice_id': inv.id, + 'product_id': stamp_product_id.id, + 'name': stamp_product_id.description_sale, + 'sequence': 99999, + 'account_id': stamp_account.id, + 'price_unit': stamp_product_id.list_price, + 'quantity': 1, + 'uos_id': stamp_product_id.uom_id.id, + 'invoice_line_tax_id': [ + (6, 0, taxes_ids.ids)], + 'account_analytic_id': None, + }) + + @api.multi + def button_reset_taxes(self): + self.compute_stamps() + return super(AccountInvoice, self).button_reset_taxes() + + @api.multi + def action_move_create(self): + self.compute_stamps() + return super(AccountInvoice,self).action_move_create() + + +class AccountInvoiceLine(models.Model): + _inherit = "account.invoice.line" + + is_stamp_line = fields.Boolean( + related='product_id.is_stamp', + readonly=True) diff --git a/l10n_it_account_stamp/models/product.py b/l10n_it_account_stamp/models/product.py new file mode 100644 index 000000000000..ddbf785a526f --- /dev/null +++ b/l10n_it_account_stamp/models/product.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import openerp.addons.decimal_precision as dp + +from openerp import fields, models, api, exceptions, _ + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + @api.constrains('stamp_apply_tax_ids', 'is_stamp') + def _check_stamp_apply_tax(self): + for template in self: + if template.stamp_apply_tax_ids and not template.is_stamp: + raise exceptions.ValidationError( + _("The product %s must be a stamp to set apply taxes!") + % template.name) + + stamp_apply_tax_ids = fields.Many2many( + 'account.tax', + 'product_tax_account_tax__rel', + 'product_id', 'tax_id', string='Stamp taxes') + stamp_apply_min_total_base = fields.Float( + 'Stamp apply min total base', + digits=dp.get_precision('Account')) + is_stamp = fields.Boolean('Is stamp') diff --git a/l10n_it_account_stamp/static/description/icon.png b/l10n_it_account_stamp/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..23a5ce37aa61bef63d8d141fd119ab39d483daae GIT binary patch literal 15282 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 L3Sw0vh5`Q{F+p$d literal 0 HcmV?d00001 diff --git a/l10n_it_account_stamp/views/company_view.xml b/l10n_it_account_stamp/views/company_view.xml new file mode 100644 index 000000000000..4505137279fa --- /dev/null +++ b/l10n_it_account_stamp/views/company_view.xml @@ -0,0 +1,21 @@ + + + + + view_account_config_settings + account.config.settings + + + + + + + + diff --git a/l10n_it_account_stamp/views/invoice_view.xml b/l10n_it_account_stamp/views/invoice_view.xml new file mode 100644 index 000000000000..9be0f1fb90b3 --- /dev/null +++ b/l10n_it_account_stamp/views/invoice_view.xml @@ -0,0 +1,42 @@ + + + + + + + account.invoice.form.stamp + account.invoice + + + + + + + + + CadetBlue:is_stamp_line==True; + + + + + + + + account.invoice.supplier.form.stamp + account.invoice + + + + + + + + + CadetBlue:is_stamp_line==True; + + + + + + + diff --git a/l10n_it_account_stamp/views/product_view.xml b/l10n_it_account_stamp/views/product_view.xml new file mode 100644 index 000000000000..8bb6ab847e7f --- /dev/null +++ b/l10n_it_account_stamp/views/product_view.xml @@ -0,0 +1,51 @@ + + + + + + product.template.form.inherit + product.template + + + + + + + + + + + + + + +

+ For each invoice, the base amount for each selected tax code account will be added up and used to determine the application of the account stamp. +

+
+ + + {'required': [('is_stamp', '=', True)]} + + + + {'required': [('is_stamp', '=', True)]} + + + + {'readonly': [('is_stamp', '=', True)]} + + + + {'readonly': [('is_stamp', '=', True)]} + + + + {'readonly': [('is_stamp', '=', True)]} + + +
+
+ +
+
From 020d5cfe180a15c5202b8358e6796a87a0bafd01 Mon Sep 17 00:00:00 2001 From: eLBati Date: Mon, 17 Dec 2018 17:58:58 +0100 Subject: [PATCH 02/35] porting l10n_it_account_stamp to 10 --- l10n_it_account_stamp/__init__.py | 2 +- l10n_it_account_stamp/__manifest__.py | 27 +++++++++++ l10n_it_account_stamp/__openerp__.py | 37 --------------- l10n_it_account_stamp/models/__init__.py | 2 +- l10n_it_account_stamp/models/company.py | 32 +++++-------- l10n_it_account_stamp/models/invoice.py | 50 +++++++------------- l10n_it_account_stamp/models/product.py | 7 ++- l10n_it_account_stamp/readme/DESCRIPTION.rst | 2 + l10n_it_account_stamp/views/company_view.xml | 7 +-- l10n_it_account_stamp/views/invoice_view.xml | 26 ++-------- l10n_it_account_stamp/views/product_view.xml | 26 ++-------- 11 files changed, 76 insertions(+), 142 deletions(-) create mode 100644 l10n_it_account_stamp/__manifest__.py delete mode 100644 l10n_it_account_stamp/__openerp__.py create mode 100644 l10n_it_account_stamp/readme/DESCRIPTION.rst diff --git a/l10n_it_account_stamp/__init__.py b/l10n_it_account_stamp/__init__.py index 062553f5aa5a..1375b37b1edf 100644 --- a/l10n_it_account_stamp/__init__.py +++ b/l10n_it_account_stamp/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- -# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). import models diff --git a/l10n_it_account_stamp/__manifest__.py b/l10n_it_account_stamp/__manifest__.py new file mode 100644 index 000000000000..ae5f3c1827eb --- /dev/null +++ b/l10n_it_account_stamp/__manifest__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 Sergio Corato (https://efatto.it) +# Copyright 2018 Enrico Ganzaroli (enrico.gz@gmail.com) +# Copyright 2018 Ermanno Gnan (ermannognan@gmail.com) +# Copyright 2018 Lorenzo Battistini (https://github.com/eLBati) +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +{ + 'name': 'Italian Localization - Tax Stamp', + 'version': '10.0.1.0.0', + 'category': 'Localization/Italy', + 'summary': 'Tax stamp automatic management', + 'author': 'Ermanno Gnan, Sergio Corato, Enrico Ganzaroli, ' + 'Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/l10n-italy', + 'depends': [ + 'product', + 'account', + ], + 'data': [ + 'data/data.xml', + 'views/invoice_view.xml', + 'views/product_view.xml', + 'views/company_view.xml', + ], + 'installable': True, +} diff --git a/l10n_it_account_stamp/__openerp__.py b/l10n_it_account_stamp/__openerp__.py deleted file mode 100644 index 9ccff663b254..000000000000 --- a/l10n_it_account_stamp/__openerp__.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# Author(s): Ermanno Gnan (ermannognan@gmail.com) -# Copyright © 2018 Sergio Corato (https://efatto.it) -# Copyright © 2018 Enrico Ganzaroli (enrico.gz@gmail.com) -# Copyright © 2018 Ermanno Gnan (ermannognan@gmail.com) -# License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). - -{ - 'name': 'Tax Stamp', - 'version': '8.0.0.0.1', - 'category': 'Localisation/Italy', - 'summary': 'Tax stamp automatic management', - 'description': """ -Tax Stamp - -Functionalities: - -- Adds tax stamp support. -- Invoices stamp lines reports: "assolvimento dell’imposta di bollo ai sensi -dell’articolo 6, comma 2, del Dm 17 giugno 2014". - -""", - 'author': 'Ermanno Gnan, Sergio Corato, Enrico Ganzaroli, ' - 'Odoo Community Association (OCA)', - 'website': 'https://odoo-community.org', - 'depends': [ - 'product', - 'account', - ], - 'data': [ - 'data/data.xml', - 'views/invoice_view.xml', - 'views/product_view.xml', - 'views/company_view.xml', - ], - 'installable': True, -} diff --git a/l10n_it_account_stamp/models/__init__.py b/l10n_it_account_stamp/models/__init__.py index d4db663e7a20..72eee4309f5a 100644 --- a/l10n_it_account_stamp/models/__init__.py +++ b/l10n_it_account_stamp/models/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). from . import invoice from . import product diff --git a/l10n_it_account_stamp/models/company.py b/l10n_it_account_stamp/models/company.py index f16417ebba72..dc373df4163a 100644 --- a/l10n_it_account_stamp/models/company.py +++ b/l10n_it_account_stamp/models/company.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- -# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). -from openerp import fields, models, api +from odoo import fields, models, api class ResCompany(models.Model): @@ -9,7 +9,7 @@ class ResCompany(models.Model): tax_stamp_product_id = fields.Many2one( 'product.product', 'Tax Stamp Product', - help="Product used to model DatiBollo XML element on bills." + help="Product used as Tax Stamp in customer invoices." ) @@ -19,23 +19,17 @@ class AccountConfigSettings(models.TransientModel): tax_stamp_product_id = fields.Many2one( related='company_id.tax_stamp_product_id', string="Tax Stamp Product", - help="Product used to model DatiBollo XML element on bills." + help="Product used as Tax Stamp in customer invoices." ) - @api.v7 - def onchange_company_id(self, cr, uid, ids, company_id, context=None): - res = super(AccountConfigSettings, self).onchange_company_id( - cr, uid, ids, company_id, context=context) - if company_id: - company = self.pool.get('res.company').browse( - cr, uid, company_id, context=context) - res['value'].update({ - 'tax_stamp_product_id': ( - company.tax_stamp_product_id and - company.tax_stamp_product_id.id or False - ) - }) + @api.onchange('company_id') + def onchange_company_id(self): + res = super(AccountConfigSettings, self).onchange_company_id() + if self.company_id: + company = self.company_id + self.tax_stamp_product_id = ( + company.tax_stamp_product_id and + company.tax_stamp_product_id.id or False) else: - res['value'].update({ - 'tax_stamp_product_id': False}) + self.tax_stamp_product_id = False return res diff --git a/l10n_it_account_stamp/models/invoice.py b/l10n_it_account_stamp/models/invoice.py index 8d6a613e9090..af6c74e925bc 100644 --- a/l10n_it_account_stamp/models/invoice.py +++ b/l10n_it_account_stamp/models/invoice.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). -from openerp import fields, api, models, exceptions -from openerp.tools.translate import _ +from odoo import fields, api, models, exceptions, _ class AccountInvoice(models.Model): @@ -11,41 +10,29 @@ class AccountInvoice(models.Model): @api.multi def compute_stamps(self): invoice_line_obj = self.env['account.invoice.line'] - invoice_tax_obj = self.env['account.invoice.tax'] for inv in self: + if inv.type in ('in_invoice', 'in_refund'): + continue stamp_product_id = self.env.user.with_context( - lang=inv.partner_id.lang).company_id.tax_stamp_product_id + lang=inv.partner_id.lang).company_id.tax_stamp_product_id if not stamp_product_id: raise exceptions.Warning( _('Missing tax stamp product in company settings!') ) - for l in inv.invoice_line: + for l in inv.invoice_line_ids: if l.product_id and l.product_id.is_stamp: l.unlink() - taxes = invoice_tax_obj.compute(inv) - tax_base_amounts = {} - for key in taxes.keys(): - tax_base_amounts[key[1]] = tax_base_amounts.get( - key[1], 0.0) + taxes[key]['base_amount'] total_tax_base = 0.0 - for tax_code_id in tax_base_amounts.keys(): - if tax_code_id in stamp_product_id.stamp_apply_tax_ids.mapped( - 'base_code_id.id'): - total_tax_base += tax_base_amounts[tax_code_id] - taxes = stamp_product_id.taxes_id - if inv.type in ('in_invoice', 'in_refund'): - total_tax_base = total_tax_base * -1.0 - taxes = stamp_product_id.supplier_taxes_id - if inv.fiscal_position: - taxes_ids = inv.fiscal_position.map_tax(taxes) - else: - taxes_ids = taxes + for inv_tax in inv.tax_line_ids: + if ( + inv_tax.tax_id.id in + stamp_product_id.stamp_apply_tax_ids.ids + ): + total_tax_base += inv_tax.base + taxes_ids = stamp_product_id.taxes_id if total_tax_base >= stamp_product_id.stamp_apply_min_total_base: - if inv.type in ('out_invoice', 'out_refund'): - stamp_account = stamp_product_id.property_account_income - else: - stamp_account = stamp_product_id.property_account_expense + stamp_account = stamp_product_id.property_account_income_id if not stamp_account: raise exceptions.Warning( _('Missing account income/expense configuration for' @@ -58,17 +45,12 @@ def compute_stamps(self): 'account_id': stamp_account.id, 'price_unit': stamp_product_id.list_price, 'quantity': 1, - 'uos_id': stamp_product_id.uom_id.id, - 'invoice_line_tax_id': [ + 'uom_id': stamp_product_id.uom_id.id, + 'invoice_line_tax_ids': [ (6, 0, taxes_ids.ids)], 'account_analytic_id': None, }) - @api.multi - def button_reset_taxes(self): - self.compute_stamps() - return super(AccountInvoice, self).button_reset_taxes() - @api.multi def action_move_create(self): self.compute_stamps() diff --git a/l10n_it_account_stamp/models/product.py b/l10n_it_account_stamp/models/product.py index ddbf785a526f..471c652f256a 100644 --- a/l10n_it_account_stamp/models/product.py +++ b/l10n_it_account_stamp/models/product.py @@ -1,9 +1,8 @@ # -*- coding: utf-8 -*- -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). -import openerp.addons.decimal_precision as dp - -from openerp import fields, models, api, exceptions, _ +import odoo.addons.decimal_precision as dp +from odoo import fields, models, api, exceptions, _ class ProductTemplate(models.Model): diff --git a/l10n_it_account_stamp/readme/DESCRIPTION.rst b/l10n_it_account_stamp/readme/DESCRIPTION.rst new file mode 100644 index 000000000000..69c67bb268cc --- /dev/null +++ b/l10n_it_account_stamp/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +- Adds tax stamp support. +- Invoices stamp lines reports: "assolvimento dell’imposta di bollo ai sensi dell’articolo 6, comma 2, del Dm 17 giugno 2014". diff --git a/l10n_it_account_stamp/views/company_view.xml b/l10n_it_account_stamp/views/company_view.xml index 4505137279fa..af550b4f9b59 100644 --- a/l10n_it_account_stamp/views/company_view.xml +++ b/l10n_it_account_stamp/views/company_view.xml @@ -1,5 +1,5 @@ - + view_account_config_settings @@ -11,11 +11,12 @@
-
+ diff --git a/l10n_it_account_stamp/views/invoice_view.xml b/l10n_it_account_stamp/views/invoice_view.xml index 9be0f1fb90b3..c0bea42b94c5 100644 --- a/l10n_it_account_stamp/views/invoice_view.xml +++ b/l10n_it_account_stamp/views/invoice_view.xml @@ -1,5 +1,5 @@ - + @@ -9,29 +9,11 @@ - + - - CadetBlue:is_stamp_line==True; - - - - - - - - account.invoice.supplier.form.stamp - account.invoice - - - - - - - - + CadetBlue:is_stamp_line==True; @@ -39,4 +21,4 @@ - + diff --git a/l10n_it_account_stamp/views/product_view.xml b/l10n_it_account_stamp/views/product_view.xml index 8bb6ab847e7f..2dcba0fba0ca 100644 --- a/l10n_it_account_stamp/views/product_view.xml +++ b/l10n_it_account_stamp/views/product_view.xml @@ -1,5 +1,5 @@ - + @@ -8,7 +8,7 @@ - + @@ -20,32 +20,16 @@

- For each invoice, the base amount for each selected tax code account will be added up and used to determine the application of the account stamp. + For each invoice, the base amount for each selected tax will be added up and used to determine the application of the account stamp.

- + {'required': [('is_stamp', '=', True)]} - - {'required': [('is_stamp', '=', True)]} - - - - {'readonly': [('is_stamp', '=', True)]} - - - - {'readonly': [('is_stamp', '=', True)]} - - - - {'readonly': [('is_stamp', '=', True)]} - -
-
+ From 2f2d51752ed78b896af6a0714eb8a70b5c6b6258 Mon Sep 17 00:00:00 2001 From: eLBati Date: Wed, 19 Dec 2018 17:09:02 +0100 Subject: [PATCH 03/35] REF l10n_it_account_stamp with invoice bool, add line button and journal items --- l10n_it_account_stamp/README.rst | 95 ++++ l10n_it_account_stamp/__init__.py | 2 +- l10n_it_account_stamp/__manifest__.py | 1 + l10n_it_account_stamp/models/invoice.py | 154 ++++-- l10n_it_account_stamp/readme/CONFIGURE.rst | 6 + l10n_it_account_stamp/readme/CONTRIBUTORS.rst | 4 + l10n_it_account_stamp/readme/DESCRIPTION.rst | 3 +- l10n_it_account_stamp/readme/USAGE.rst | 3 + .../static/description/index.html | 438 ++++++++++++++++++ l10n_it_account_stamp/views/invoice_view.xml | 20 + l10n_it_account_stamp/views/product_view.xml | 16 +- 11 files changed, 697 insertions(+), 45 deletions(-) create mode 100644 l10n_it_account_stamp/README.rst create mode 100644 l10n_it_account_stamp/readme/CONFIGURE.rst create mode 100644 l10n_it_account_stamp/readme/CONTRIBUTORS.rst create mode 100644 l10n_it_account_stamp/readme/USAGE.rst create mode 100644 l10n_it_account_stamp/static/description/index.html diff --git a/l10n_it_account_stamp/README.rst b/l10n_it_account_stamp/README.rst new file mode 100644 index 000000000000..8c7a268b3dc8 --- /dev/null +++ b/l10n_it_account_stamp/README.rst @@ -0,0 +1,95 @@ +================================ +Italian Localization - Tax Stamp +================================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--italy-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-italy/tree/10.0/l10n_it_account_stamp + :alt: OCA/l10n-italy +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-italy-10-0/l10n-italy-10-0-l10n_it_account_stamp + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/122/10.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module supports Italian Tax Stamp in invoices. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Go to 'Tax Stamp 2 euro' product and configure 'Stamp taxes' (exemption taxes) under 'Tax stamp' section. + +For each invoice, the base amount for each selected tax will be added up and used to determine the application of the account stamp. + +Also set income/expense accounts. +Typically income = 'Debiti per bolli' and expense = 'Valori bollati'. + +Usage +===== + +In invoice form, when applicable, click 'Add tax stamp line' button to add tax stamp as invoice line, thus charging customer. + +Otherwise, tax stamp will be anyawy accounted, without charging customer. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Ermanno Gnan +* Sergio Corato +* Enrico Ganzaroli + +Contributors +~~~~~~~~~~~~ + +* Lorenzo Battistini +* Sergio Corato +* Ermanno Gnan +* Enrico Ganzaroli + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/l10n-italy `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_it_account_stamp/__init__.py b/l10n_it_account_stamp/__init__.py index 1375b37b1edf..762c768608c4 100644 --- a/l10n_it_account_stamp/__init__.py +++ b/l10n_it_account_stamp/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). -import models +from . import models diff --git a/l10n_it_account_stamp/__manifest__.py b/l10n_it_account_stamp/__manifest__.py index ae5f3c1827eb..71eee4179d77 100644 --- a/l10n_it_account_stamp/__manifest__.py +++ b/l10n_it_account_stamp/__manifest__.py @@ -13,6 +13,7 @@ 'author': 'Ermanno Gnan, Sergio Corato, Enrico Ganzaroli, ' 'Odoo Community Association (OCA)', 'website': 'https://github.com/OCA/l10n-italy', + 'license': 'LGPL-3', 'depends': [ 'product', 'account', diff --git a/l10n_it_account_stamp/models/invoice.py b/l10n_it_account_stamp/models/invoice.py index af6c74e925bc..349ded72659c 100644 --- a/l10n_it_account_stamp/models/invoice.py +++ b/l10n_it_account_stamp/models/invoice.py @@ -6,13 +6,40 @@ class AccountInvoice(models.Model): _inherit = 'account.invoice' + tax_stamp = fields.Boolean( + "Tax Stamp", readonly=True, states={'draft': [('readonly', False)]}) + + def is_tax_stamp_applicable(self): + stamp_product_id = self.env.user.with_context( + lang=self.partner_id.lang).company_id.tax_stamp_product_id + if not stamp_product_id: + raise exceptions.Warning( + _('Missing tax stamp product in company settings!') + ) + total_tax_base = 0.0 + for inv_tax in self.tax_line_ids: + if ( + inv_tax.tax_id.id in + stamp_product_id.stamp_apply_tax_ids.ids + ): + total_tax_base += inv_tax.base + if total_tax_base >= stamp_product_id.stamp_apply_min_total_base: + return True + else: + return False + + @api.onchange('tax_line_ids') + def _onchange_tax_line_ids(self): + if self.is_tax_stamp_applicable(): + self.tax_stamp = True + else: + self.tax_stamp = False @api.multi - def compute_stamps(self): - invoice_line_obj = self.env['account.invoice.line'] + def add_tax_stamp_line(self): for inv in self: - if inv.type in ('in_invoice', 'in_refund'): - continue + if not inv.tax_stamp: + raise exceptions.Warning(_("Tax stamp is not applicable")) stamp_product_id = self.env.user.with_context( lang=inv.partner_id.lang).company_id.tax_stamp_product_id if not stamp_product_id: @@ -21,40 +48,99 @@ def compute_stamps(self): ) for l in inv.invoice_line_ids: if l.product_id and l.product_id.is_stamp: - l.unlink() - total_tax_base = 0.0 - for inv_tax in inv.tax_line_ids: - if ( - inv_tax.tax_id.id in - stamp_product_id.stamp_apply_tax_ids.ids - ): - total_tax_base += inv_tax.base - taxes_ids = stamp_product_id.taxes_id + raise exceptions.Warning(_( + "Tax stamp line %s already present. Remove it first." + ) % l.name) + stamp_account = stamp_product_id.property_account_income_id + if not stamp_account: + raise exceptions.Warning( + _('Missing account income configuration for' + ' %s') % stamp_product_id.name) + self.env['account.invoice.line'].create({ + 'invoice_id': inv.id, + 'product_id': stamp_product_id.id, + 'name': stamp_product_id.description_sale, + 'sequence': 99999, + 'account_id': stamp_account.id, + 'price_unit': stamp_product_id.list_price, + 'quantity': 1, + 'uom_id': stamp_product_id.uom_id.id, + 'invoice_line_tax_ids': [ + (6, 0, stamp_product_id.taxes_id.ids)], + 'account_analytic_id': None, + }) - if total_tax_base >= stamp_product_id.stamp_apply_min_total_base: - stamp_account = stamp_product_id.property_account_income_id - if not stamp_account: - raise exceptions.Warning( - _('Missing account income/expense configuration for' - ' %s') % stamp_product_id.name) - invoice_line_obj.create({ - 'invoice_id': inv.id, - 'product_id': stamp_product_id.id, - 'name': stamp_product_id.description_sale, - 'sequence': 99999, - 'account_id': stamp_account.id, - 'price_unit': stamp_product_id.list_price, - 'quantity': 1, - 'uom_id': stamp_product_id.uom_id.id, - 'invoice_line_tax_ids': [ - (6, 0, taxes_ids.ids)], - 'account_analytic_id': None, - }) + def is_tax_stamp_line_present(self): + for l in self.invoice_line_ids: + if l.product_id and l.product_id.is_stamp: + return True + return False + + def _build_tax_stamp_lines(self, product): + if ( + not product.property_account_income_id or + not product.property_account_expense_id + ): + raise exceptions.Warning(_( + "Product %s must have income and expense accounts" + ) % product.name) + + income_vals = { + 'name': _('Tax Stamp Income'), + 'partner_id': self.partner_id.id, + 'account_id': product.property_account_income_id.id, + 'journal_id': self.journal_id.id, + 'date': self.date_invoice, + 'debit': 0, + 'credit': product.list_price, + } + if self.type == 'out_refund': + income_vals['debit'] = product.list_price + income_vals['credit'] = 0 + + expense_vals = { + 'name': _('Tax Stamp Expense'), + 'partner_id': self.partner_id.id, + 'account_id': product.property_account_expense_id.id, + 'journal_id': self.journal_id.id, + 'date': self.date_invoice, + 'debit': product.list_price, + 'credit': 0, + } + if self.type == 'out_refund': + income_vals['debit'] = 0 + income_vals['credit'] = product.list_price + + return income_vals, expense_vals @api.multi def action_move_create(self): - self.compute_stamps() - return super(AccountInvoice,self).action_move_create() + res = super(AccountInvoice, self).action_move_create() + for inv in self: + if inv.tax_stamp and not inv.is_tax_stamp_line_present(): + if inv.move_id.state == 'posted': + posted = True + inv.move_id.state = 'draft' + line_model = self.env['account.move.line'] + stamp_product_id = self.env.user.with_context( + lang=inv.partner_id.lang).company_id.tax_stamp_product_id + if not stamp_product_id: + raise exceptions.Warning( + _('Missing tax stamp product in company settings!') + ) + income_vals, expense_vals = self._build_tax_stamp_lines( + stamp_product_id) + income_vals['move_id'] = inv.move_id.id + expense_vals['move_id'] = inv.move_id.id + line_model.with_context( + check_move_validity=False + ).create(income_vals) + line_model.with_context( + check_move_validity=False + ).create(expense_vals) + if posted: + inv.move_id.state = 'posted' + return res class AccountInvoiceLine(models.Model): diff --git a/l10n_it_account_stamp/readme/CONFIGURE.rst b/l10n_it_account_stamp/readme/CONFIGURE.rst new file mode 100644 index 000000000000..e29538ac81df --- /dev/null +++ b/l10n_it_account_stamp/readme/CONFIGURE.rst @@ -0,0 +1,6 @@ +Go to 'Tax Stamp 2 euro' product and configure 'Stamp taxes' (exemption taxes) under 'Tax stamp' section. + +For each invoice, the base amount for each selected tax will be added up and used to determine the application of the account stamp. + +Also set income/expense accounts. +Typically income = 'Debiti per bolli' and expense = 'Valori bollati'. diff --git a/l10n_it_account_stamp/readme/CONTRIBUTORS.rst b/l10n_it_account_stamp/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000000..3ac28302195d --- /dev/null +++ b/l10n_it_account_stamp/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* Lorenzo Battistini +* Sergio Corato +* Ermanno Gnan +* Enrico Ganzaroli diff --git a/l10n_it_account_stamp/readme/DESCRIPTION.rst b/l10n_it_account_stamp/readme/DESCRIPTION.rst index 69c67bb268cc..f5068f9c18e0 100644 --- a/l10n_it_account_stamp/readme/DESCRIPTION.rst +++ b/l10n_it_account_stamp/readme/DESCRIPTION.rst @@ -1,2 +1 @@ -- Adds tax stamp support. -- Invoices stamp lines reports: "assolvimento dell’imposta di bollo ai sensi dell’articolo 6, comma 2, del Dm 17 giugno 2014". +This module supports Italian Tax Stamp in invoices. diff --git a/l10n_it_account_stamp/readme/USAGE.rst b/l10n_it_account_stamp/readme/USAGE.rst new file mode 100644 index 000000000000..ec3d60073626 --- /dev/null +++ b/l10n_it_account_stamp/readme/USAGE.rst @@ -0,0 +1,3 @@ +In invoice form, when applicable, click 'Add tax stamp line' button to add tax stamp as invoice line, thus charging customer. + +Otherwise, tax stamp will be anyawy accounted, without charging customer. diff --git a/l10n_it_account_stamp/static/description/index.html b/l10n_it_account_stamp/static/description/index.html new file mode 100644 index 000000000000..24b4a4b0a50b --- /dev/null +++ b/l10n_it_account_stamp/static/description/index.html @@ -0,0 +1,438 @@ + + + + + + +Italian Localization - Tax Stamp + + + +
+

Italian Localization - Tax Stamp

+ + +

Beta License: LGPL-3 OCA/l10n-italy Translate me on Weblate Try me on Runbot

+

This module supports Italian Tax Stamp in invoices.

+

Table of contents

+ +
+

Configuration

+

Go to ‘Tax Stamp 2 euro’ product and configure ‘Stamp taxes’ (exemption taxes) under ‘Tax stamp’ section.

+

For each invoice, the base amount for each selected tax will be added up and used to determine the application of the account stamp.

+

Also set income/expense accounts. +Typically income = ‘Debiti per bolli’ and expense = ‘Valori bollati’.

+
+
+

Usage

+

In invoice form, when applicable, click ‘Add tax stamp line’ button to add tax stamp as invoice line, thus charging customer.

+

Otherwise, tax stamp will be anyawy accounted, without charging customer.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Ermanno Gnan
  • +
  • Sergio Corato
  • +
  • Enrico Ganzaroli
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/l10n-italy project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/l10n_it_account_stamp/views/invoice_view.xml b/l10n_it_account_stamp/views/invoice_view.xml index c0bea42b94c5..e1c8e9b095e3 100644 --- a/l10n_it_account_stamp/views/invoice_view.xml +++ b/l10n_it_account_stamp/views/invoice_view.xml @@ -17,6 +17,26 @@ CadetBlue:is_stamp_line==True; + + + + + +