From 88083f7b3bca4dd5fb6199d97ffa69496a584170 Mon Sep 17 00:00:00 2001 From: Luc De Meyer Date: Tue, 12 Nov 2019 20:56:22 +0100 Subject: [PATCH] [11.0][ADD]account_supplier_invoice_check_duplicates --- .../README.rst | 29 ++++++++ .../__init__.py | 1 + .../__manifest__.py | 23 ++++++ .../models/__init__.py | 1 + .../models/account_invoice.py | 69 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 17495 bytes .../views/account_invoice_views.xml | 15 ++++ 7 files changed, 138 insertions(+) create mode 100644 account_supplier_invoice_check_duplicates/README.rst create mode 100644 account_supplier_invoice_check_duplicates/__init__.py create mode 100644 account_supplier_invoice_check_duplicates/__manifest__.py create mode 100644 account_supplier_invoice_check_duplicates/models/__init__.py create mode 100644 account_supplier_invoice_check_duplicates/models/account_invoice.py create mode 100644 account_supplier_invoice_check_duplicates/static/description/icon.png create mode 100644 account_supplier_invoice_check_duplicates/views/account_invoice_views.xml diff --git a/account_supplier_invoice_check_duplicates/README.rst b/account_supplier_invoice_check_duplicates/README.rst new file mode 100644 index 00000000..7a3ee19b --- /dev/null +++ b/account_supplier_invoice_check_duplicates/README.rst @@ -0,0 +1,29 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +==================================== +Supplier Invoices - Check duplicates +==================================== + +This module adds logic to prevent entering two times the same supplier invoice. + +By default a duplicate is detected when there is already an open or paid invoice +with + +- same supplier +- same supplier invoice number + +In case no supplier invoice number has been encoded extra checks are added to detect duplicates : + +- same date +- same amount + +This logic can be customized via the _get_dup_domain method. + +The duplicate checking can be bypassed via the 'Force Encoding' flag. + +Known issues / Roadmap +====================== + +- Align this module with the OCA 'account_invoice_supplier_ref_unique' module. diff --git a/account_supplier_invoice_check_duplicates/__init__.py b/account_supplier_invoice_check_duplicates/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/account_supplier_invoice_check_duplicates/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/account_supplier_invoice_check_duplicates/__manifest__.py b/account_supplier_invoice_check_duplicates/__manifest__.py new file mode 100644 index 00000000..7826761d --- /dev/null +++ b/account_supplier_invoice_check_duplicates/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2009-2019 Noviat. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Supplier Invoice - Check Duplicates', + 'version': '11.0.1.0.0', + 'category': 'Accounting & Finance', + 'website': 'https://www.noviat.com', + 'author': 'Noviat', + 'license': 'AGPL-3', + 'complexity': 'normal', + 'summary': 'Supplier Invoice - Check Duplicates', + 'data': [ + 'views/account_invoice_views.xml', + ], + 'depends': [ + 'account_supplier_invoice_number', + ], + 'excludes': [ + 'account_invoice_supplier_ref_unique', + ], + 'installable': True, +} diff --git a/account_supplier_invoice_check_duplicates/models/__init__.py b/account_supplier_invoice_check_duplicates/models/__init__.py new file mode 100644 index 00000000..8e072db8 --- /dev/null +++ b/account_supplier_invoice_check_duplicates/models/__init__.py @@ -0,0 +1 @@ +from . import account_invoice diff --git a/account_supplier_invoice_check_duplicates/models/account_invoice.py b/account_supplier_invoice_check_duplicates/models/account_invoice.py new file mode 100644 index 00000000..fdb65f69 --- /dev/null +++ b/account_supplier_invoice_check_duplicates/models/account_invoice.py @@ -0,0 +1,69 @@ +# Copyright 2009-2019 Noviat. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models, _ +from odoo.exceptions import UserError + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + force_encoding = fields.Boolean( + string='Force Encoding', + readonly=True, states={'draft': [('readonly', False)]}, + help="Accept the encoding of this invoice although " + "it looks like a duplicate.") + + def _check_duplicate_supplier_reference(self): + """ + Replace the standard addons _check_duplicate_supplier_reference + since this one is too restrictive (blocking) for certain use cases. + """ + for invoice in self: + if invoice.type in ('in_invoice', 'in_refund') \ + and not invoice.force_encoding: + invoice._check_si_duplicate() + + def _get_dup_domain(self): + """ + Override this method to customize customer specific + duplicate check query. + """ + return [ + ('type', '=', self.type), + ('commercial_partner_id', '=', self.commercial_partner_id.id), + ('state', 'in', ['open', 'paid']), + ('company_id', '=', self.company_id.id), + ('id', '!=', self.id)] + + def _get_dup_domain_extra(self): + """ + Extra search term to detect duplicates in case no + supplier_invoice_number has been specified. + """ + return [('date_invoice', '=', self.date_invoice), + ('amount_total', '=', self.amount_total)] + + def _get_dup(self): + """ + Override this method to customize customer specific + duplicate check logic + """ + # find duplicates by date, amount + domain = self._get_dup_domain() + # add supplier invoice number + if self.supplier_invoice_number: + dom_dups = domain + [ + ('supplier_invoice_number', 'ilike', + self.supplier_invoice_number)] + else: + dom_dups = domain + self._get_dup_domain_extra() + return self.search(dom_dups) + + def _check_si_duplicate(self): + dups = self._get_dup() + if dups: + raise UserError(_( + "This Supplier Invoice has already been encoded !" + "\nDuplicate Invoice: %s") + % ', '.join([x.number for x in dups])) diff --git a/account_supplier_invoice_check_duplicates/static/description/icon.png b/account_supplier_invoice_check_duplicates/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..32740c0cc5a5dac8166d897c827a9aa75a94d276 GIT binary patch literal 17495 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 + + + + account.invoice.supplier.form.inherit + account.invoice + + + + + + + + +