Merge branch 'mig/16.0/account_invoice_change' into '16.0-test'

mig/16.0/account_invoice_change into 16.0-test

See merge request hibou-io/hibou-odoo/suite!1591
This commit is contained in:
Hibou Bot
2022-10-31 17:26:47 +00:00
8 changed files with 191 additions and 0 deletions

View File

@@ -0,0 +1 @@
from . import wizard

View File

@@ -0,0 +1,31 @@
{
'name': 'Account Invoice Change',
'author': 'Hibou Corp. <hello@hibou.io>',
'version': '16.0.1.0.0',
'category': 'Accounting',
'sequence': 95,
'summary': 'Technical foundation for changing invoices.',
'description': """
Technical foundation for changing invoices.
Creates wizard and permissions for making invoice changes that can be
handled by other individual modules.
This module implements, as examples, how to change the Salesperson and Date fields.
Abstractly, individual 'changes' should come from specific 'fields' or capability
modules that handle the consequences of changing that field in whatever state the
the invoice is currently in.
""",
'website': 'https://hibou.io/',
'depends': [
'account',
],
'data': [
'security/ir.model.access.csv',
'wizard/invoice_change_views.xml',
],
'installable': True,
'application': False,
}

View File

@@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
account_invoice_change.access_account_invoice_change,access_account_invoice_change,account_invoice_change.model_account_invoice_change,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 account_invoice_change.access_account_invoice_change access_account_invoice_change account_invoice_change.model_account_invoice_change base.group_user 1 1 1 1

View File

@@ -0,0 +1 @@
from . import test_invoice_change

View File

@@ -0,0 +1,50 @@
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
from odoo.tests import tagged
from odoo import fields
from odoo import Command
@tagged('post_install', '-at_install')
class TestInvoiceChange(AccountTestInvoicingCommon):
def test_invoice_change_basic(self):
self.account_invoice_obj = self.env['account.move']
self.payment_term = self.env.ref('account.account_payment_term_advance')
self.journalrec = self.env['account.journal'].search([('type', '=', 'sale')])[0]
self.partner3 = self.env.ref('base.res_partner_3')
self.invoice_basic = self.env['account.move'].create([{
'move_type': 'out_invoice',
'name': "Test Customer Invoice",
'invoice_payment_term_id': self.payment_term.id,
'journal_id': self.journalrec.id,
'partner_id': self.partner3.id,
'line_ids':[Command.create({
'product_id': self.product_a.id,
'quantity': 10.0,
'price_unit': 100.00,
})],
}])
self.assertEqual(self.invoice_basic.state, 'draft')
self.invoice_basic.action_post()
self.assertEqual(self.invoice_basic.state, 'posted')
self.assertEqual(self.invoice_basic.date, fields.Date.today())
self.assertEqual(self.invoice_basic.invoice_date, fields.Date.today())
# self.assertEqual(self.invoice_basic.invoice_user_id, self.account_user)
self.assertEqual(self.invoice_basic.line_ids[0].date, fields.Date.today())
ctx = {'active_model': 'account.move', 'active_ids': [self.invoice_basic.id]}
change = self.env['account.invoice.change'].with_context(ctx).create({})
self.assertEqual(change.date, self.invoice_basic.date)
self.assertEqual(change.invoice_date, self.invoice_basic.invoice_date)
self.assertEqual(change.invoice_user_id, self.invoice_basic.invoice_user_id)
change_date = '2018-01-01'
change_invoice_date = '2019-01-01'
change_user = self.env.user
change.write({'invoice_user_id': change_user.id, 'date': change_date, 'invoice_date': change_invoice_date})
change.affect_change()
self.assertEqual(str(self.invoice_basic.date), change_date)
self.assertEqual(str(self.invoice_basic.invoice_date), change_invoice_date)
self.assertEqual(self.invoice_basic.invoice_user_id, change_user)
self.assertEqual(str(self.invoice_basic.line_ids[0].date), change_date)

View File

@@ -0,0 +1 @@
from . import invoice_change

View File

@@ -0,0 +1,57 @@
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class InvoiceChangeWizard(models.TransientModel):
_name = 'account.invoice.change'
_description = 'Invoice Change'
move_id = fields.Many2one('account.move', string='Invoice', readonly=True, required=True)
move_company_id = fields.Many2one('res.company', readonly=True, related='move_id.company_id')
invoice_user_id = fields.Many2one('res.users', string='Salesperson')
date = fields.Date(string='Accounting Date')
invoice_date = fields.Date(string='Invoice Date')
@api.model
def default_get(self, fields):
rec = super(InvoiceChangeWizard, self).default_get(fields)
context = dict(self._context or {})
active_model = context.get('active_model')
active_ids = context.get('active_ids')
# Checks on context parameters
if not active_model or not active_ids:
raise UserError(
_("Programmation error: wizard action executed without active_model or active_ids in context."))
if active_model != 'account.move':
raise UserError(_(
"Programmation error: the expected model for this action is 'account.move'. The provided one is '%d'.") % active_model)
# Checks on received invoice records
invoice = self.env[active_model].browse(active_ids)
if len(invoice) != 1:
raise UserError(_("Invoice Change expects only one invoice."))
rec.update({
'move_id': invoice.id,
'invoice_user_id': invoice.invoice_user_id.id,
'date': invoice.date,
'invoice_date': invoice.invoice_date,
})
return rec
def _new_move_vals(self):
vals = {}
if self.move_id.invoice_user_id != self.invoice_user_id:
vals['invoice_user_id'] = self.invoice_user_id.id
if self.move_id.date != self.date:
vals['date'] = self.date
if self.move_id.invoice_date != self.invoice_date:
vals['invoice_date'] = self.invoice_date
return vals
def affect_change(self):
self.ensure_one()
vals = self._new_move_vals()
if vals:
self.move_id.write(vals)
return True

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="account_invoice_change_form" model="ir.ui.view">
<field name="name">Invoice Change</field>
<field name="model">account.invoice.change</field>
<field name="arch" type="xml">
<form string="Invoice Change">
<group>
<group name="group_left">
<field name="move_id" invisible="1"/>
<field name="move_company_id" invisible="1"/>
<field name="invoice_user_id"/>
<field name="invoice_date"/>
<field name="date"/>
</group>
<group name="group_right"/>
</group>
<footer>
<button name="affect_change" string="Change" type="object" class="btn-primary"/>
<button string="Cancel" class="btn-default" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="action_view_account_invoice_change" model="ir.actions.act_window">
<field name="name">Invoice Change Wizard</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.invoice.change</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record id="view_move_form_inherit" model="ir.ui.view">
<field name="name">account.move.form.inherit.invoice.change</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='state']" position="before">
<button name="%(action_view_account_invoice_change)d" string="Change"
type="action" class="btn-secondary"
attrs="{'invisible': ['|', ('state', 'in', ('sale', 'done', 'cancel')), ('move_type', 'not in', ('out_invoice', 'out_refund'))]}"
context="{'default_move_id': id}"
groups="account.group_account_manager" />
</xpath>
</field>
</record>
</odoo>