[12.0][MIG] account_invoice_update_wizard
This commit is contained in:
39
account_invoice_update_wizard/README.rst
Normal file
39
account_invoice_update_wizard/README.rst
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||||
|
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
|
||||||
|
Account Invoice Update Wizard
|
||||||
|
=============================
|
||||||
|
|
||||||
|
This module adds a button *Update Invoice* on Customer and Supplier invoices in
|
||||||
|
Open or Paid state. This button starts a wizard which allows the user to update
|
||||||
|
non-legal fields of the invoice:
|
||||||
|
|
||||||
|
* Source Document
|
||||||
|
* Reference/Description
|
||||||
|
* Payment terms (update allowed only to a payment term with same number of terms
|
||||||
|
of the same amount and on invoices without any payment)
|
||||||
|
* Bank Account
|
||||||
|
* Salesman
|
||||||
|
* Notes
|
||||||
|
* Description of invoice lines
|
||||||
|
* Analytic account
|
||||||
|
* Analytic tags
|
||||||
|
|
||||||
|
Bug Tracker
|
||||||
|
===========
|
||||||
|
|
||||||
|
Bugs are tracked on `GitHub Issues
|
||||||
|
<https://github.com/akretion/odoo-usability/issues>`_. In case of trouble, please
|
||||||
|
check there if your issue has already been reported. If you spotted it first,
|
||||||
|
help us smash it by providing detailed and welcomed feedback.
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
* Florian da Costa <florian.dacosta@akretion.com>
|
||||||
|
* Matthieu Dietrich <matthieu.dietrich@camptocamp.com>
|
||||||
|
* Yannick Vaucher <yannick.vaucher@camptocamp.com>
|
||||||
|
* Mykhailo Panarin <m.panarin@mobilunity.com>
|
||||||
|
* Artem Kostyuk <a.kostyuk@mobilunity.com>
|
||||||
@@ -1,34 +1,19 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
# Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||||
# Copyright 2018 Camptocamp
|
# Copyright 2019 Camptocamp
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Account Invoice Update Wizard',
|
'name': 'Account Invoice Update Wizard',
|
||||||
'version': '8.0.1.0.0',
|
'version': '12.0.1.0.0',
|
||||||
'category': 'Accounting & Finance',
|
'category': 'Accounting & Finance',
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'summary': 'Wizard to update non-legal fields of an open/paid invoice',
|
'summary': 'Wizard to update non-legal fields of an open/paid invoice',
|
||||||
'description': """
|
|
||||||
Account Invoice Update Wizard
|
|
||||||
=============================
|
|
||||||
|
|
||||||
This module adds a button *Update Invoice* on Customer and Supplier invoices in Open or Paid state. This button starts a wizard which allows the user to update non-legal fields of the invoice:
|
|
||||||
|
|
||||||
* Source Document
|
|
||||||
* Reference/Description
|
|
||||||
* Payment terms (update allowed only to a payment term with same number of terms of the same amount and on invoices without any payment)
|
|
||||||
* Bank Account
|
|
||||||
* Salesman
|
|
||||||
* Notes
|
|
||||||
* Description of invoice lines
|
|
||||||
* Analytic account
|
|
||||||
* Analytic tags
|
|
||||||
|
|
||||||
""",
|
|
||||||
'author': 'Akretion',
|
'author': 'Akretion',
|
||||||
'website': 'http://www.akretion.com',
|
'website': 'https://github.com/akretion/odoo-usability',
|
||||||
'depends': ['account'],
|
'depends': [
|
||||||
|
'account'
|
||||||
|
],
|
||||||
'data': [
|
'data': [
|
||||||
'wizard/account_invoice_update_view.xml',
|
'wizard/account_invoice_update_view.xml',
|
||||||
'views/account_invoice.xml',
|
'views/account_invoice.xml',
|
||||||
|
|||||||
@@ -1,46 +1,46 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# Copyright 2019 Camptocamp
|
||||||
# Copyright 2018 Camptocamp
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo.tests.common import TransactionCase
|
from odoo.tests.common import SavepointCase
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
class TestAccountInvoiceUpdateWizard(TransactionCase):
|
class TestAccountInvoiceUpdateWizard(SavepointCase):
|
||||||
|
|
||||||
def setUp(self):
|
@classmethod
|
||||||
super(TestAccountInvoiceUpdateWizard, self).setUp()
|
def setUpClass(cls):
|
||||||
self.customer12 = self.env.ref('base.res_partner_12')
|
super().setUpClass()
|
||||||
self.product16 = self.env.ref('product.product_product_16')
|
cls.customer12 = cls.env.ref('base.res_partner_12')
|
||||||
self.product24 = self.env.ref('product.product_product_24')
|
cls.product16 = cls.env.ref('product.product_product_16')
|
||||||
uom_unit = self.env.ref('product.product_uom_categ_unit')
|
cls.product24 = cls.env.ref('product.product_product_24')
|
||||||
|
uom_unit = cls.env.ref('uom.product_uom_categ_unit')
|
||||||
|
|
||||||
self.invoice1 = self.env['account.invoice'].create({
|
cls.invoice1 = cls.env['account.invoice'].create({
|
||||||
'name': 'Test invoice',
|
'name': 'Test invoice',
|
||||||
'partner_id': self.customer12.id,
|
'partner_id': cls.customer12.id,
|
||||||
})
|
})
|
||||||
self.inv_line1 = self.env['account.invoice.line'].create({
|
cls.inv_line1 = cls.env['account.invoice.line'].create({
|
||||||
'invoice_id': self.invoice1.id,
|
'invoice_id': cls.invoice1.id,
|
||||||
'name': "Line1",
|
'name': "Line1",
|
||||||
'product_id': self.product16.id,
|
'product_id': cls.product16.id,
|
||||||
'product_uom_id': uom_unit.id,
|
'product_uom_id': uom_unit.id,
|
||||||
'account_id': self.invoice1.account_id.id,
|
'account_id': cls.invoice1.account_id.id,
|
||||||
'price_unit': 42.0,
|
'price_unit': 42.0,
|
||||||
})
|
})
|
||||||
self.inv_line2 = self.env['account.invoice.line'].create({
|
cls.inv_line2 = cls.env['account.invoice.line'].create({
|
||||||
'invoice_id': self.invoice1.id,
|
'invoice_id': cls.invoice1.id,
|
||||||
'name': "Line2",
|
'name': "Line2",
|
||||||
'product_id': self.product24.id,
|
'product_id': cls.product24.id,
|
||||||
'product_uom_id': uom_unit.id,
|
'product_uom_id': uom_unit.id,
|
||||||
'account_id': self.invoice1.account_id.id,
|
'account_id': cls.invoice1.account_id.id,
|
||||||
'price_unit': 1111.1,
|
'price_unit': 1111.1,
|
||||||
})
|
})
|
||||||
|
|
||||||
self.aa1 = self.env.ref('analytic.analytic_partners_camp_to_camp')
|
cls.aa1 = cls.env.ref('analytic.analytic_partners_camp_to_camp')
|
||||||
self.aa2 = self.env.ref('analytic.analytic_nebula')
|
cls.aa2 = cls.env.ref('analytic.analytic_nebula')
|
||||||
self.atag1 = self.env.ref('analytic.tag_contract')
|
cls.atag1 = cls.env.ref('analytic.tag_contract')
|
||||||
self.atag2 = self.env['account.analytic.tag'].create({
|
cls.atag2 = cls.env['account.analytic.tag'].create({
|
||||||
'name': u'の',
|
'name': 'の',
|
||||||
})
|
})
|
||||||
|
|
||||||
def create_wizard(self):
|
def create_wizard(self):
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
<field name="model">account.invoice</field>
|
<field name="model">account.invoice</field>
|
||||||
<field name="inherit_id" ref="account.invoice_supplier_form"/>
|
<field name="inherit_id" ref="account.invoice_supplier_form"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<button name="action_invoice_cancel" position="before">
|
<button name="action_invoice_draft" position="before">
|
||||||
<button name="%(account_invoice_update_action)d" type="action" string="Update Invoice" states="open,paid" groups="account.group_account_invoice"/>
|
<button name="%(account_invoice_update_action)d" type="action" string="Update Invoice" states="open,paid" groups="account.group_account_invoice"/>
|
||||||
</button>
|
</button>
|
||||||
</field>
|
</field>
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
<field name="model">account.invoice</field>
|
<field name="model">account.invoice</field>
|
||||||
<field name="inherit_id" ref="account.invoice_form"/>
|
<field name="inherit_id" ref="account.invoice_form"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<button name="action_invoice_cancel" position="before">
|
<button name="action_invoice_draft" position="before">
|
||||||
<button name="%(account_invoice_update_action)d" type="action" string="Update Invoice" states="open,paid" groups="account.group_account_invoice"/>
|
<button name="%(account_invoice_update_action)d" type="action" string="Update Invoice" states="open,paid" groups="account.group_account_invoice"/>
|
||||||
</button>
|
</button>
|
||||||
</field>
|
</field>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||||
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
# Copyright 2019 Camptocamp
|
||||||
# Copyright 2018 Camptocamp
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import models, fields, api, _
|
from odoo import models, fields, api, _
|
||||||
@@ -58,7 +57,7 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
'price_subtotal': line.price_subtotal,
|
'price_subtotal': line.price_subtotal,
|
||||||
'account_analytic_id': line.account_analytic_id.id,
|
'account_analytic_id': line.account_analytic_id.id,
|
||||||
'analytic_tag_ids': aa_tags,
|
'analytic_tag_ids': aa_tags,
|
||||||
}])
|
}])
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
@@ -141,7 +140,7 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
# be grouped unless journal.group_invoice_line is True
|
# be grouped unless journal.group_invoice_line is True
|
||||||
inv_line = self.invoice_id.invoice_line_ids.filtered(
|
inv_line = self.invoice_id.invoice_line_ids.filtered(
|
||||||
lambda rec: rec.product_id == move_line.product_id)
|
lambda rec: rec.product_id == move_line.product_id)
|
||||||
if len(inv_line) <> 1:
|
if len(inv_line) != 1:
|
||||||
raise UserError(
|
raise UserError(
|
||||||
"Cannot match a single invoice line to move line %s" %
|
"Cannot match a single invoice line to move line %s" %
|
||||||
move_line.name)
|
move_line.name)
|
||||||
@@ -221,7 +220,7 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
mlines[amount].append(line)
|
mlines[amount].append(line)
|
||||||
else:
|
else:
|
||||||
mlines[amount] = [line]
|
mlines[amount] = [line]
|
||||||
for iamount, lines in mlines.iteritems():
|
for iamount, lines in mlines.items():
|
||||||
if len(lines) != len(new_pterm.get(iamount, [])):
|
if len(lines) != len(new_pterm.get(iamount, [])):
|
||||||
raise UserError(_(
|
raise UserError(_(
|
||||||
"The original payment term '%s' doesn't have the "
|
"The original payment term '%s' doesn't have the "
|
||||||
@@ -282,7 +281,7 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
updated = True
|
updated = True
|
||||||
line.invoice_line_id.write(ilvals)
|
line.invoice_line_id.write(ilvals)
|
||||||
if updated:
|
if updated:
|
||||||
inv.message_post(_(
|
inv.message_post(body=_(
|
||||||
'Non-legal fields of invoice updated via the Invoice Update '
|
'Non-legal fields of invoice updated via the Invoice Update '
|
||||||
'wizard.'))
|
'wizard.'))
|
||||||
return True
|
return True
|
||||||
|
|||||||
Reference in New Issue
Block a user