Hello,
according to my accountant we always need an invoice address on an invoice ;-).
Some colleagues "always" forget that - that is why:
We need an additional check in Odoo 16 CE.
An invoice can only be confirmed if the invoice address is complete: postcode, city, street, but also email.
When Confirm is clicked, a pop-up or warning should appear.
Standard users receive a warning that the address is incomplete. There should be a note/promt to complete it or to contact a user from the Chief Accounting group. These users should be listed with their real names.
Users from the Chief Accounting group should see a pop-up with a warning similar to the one above: However, there should be 2 buttons: 1 button for "Go back" and 1 button for "OK confirm anyway".
- Question: is there an option / a tickbox I do not know to achieve that behaviour (or similar) out of the standard?
- Can someone check the module I tried to write with the help of an AI (sorry, I do not have the knowledge for that)?
structure:
/ ├── __init__.py ├── __manifest__.py ├── models/ │ ├── __init__.py │ └── account_move.py └── views/ └── account_move_views.xml
files:
__init__.py
from . import models
__manifest__.py
{ 'name': 'Invoice Address Validation', 'version': '1.0', 'category': 'Accounting', 'summary': 'Verhindert das Bestätigen von Rechnungen bei unvollständiger Rechnungsadresse', 'author': 'Dein Name', 'depends': ['account'], 'data': [ 'views/account_move_views.xml', ], 'installable': True, 'application': False, }
models/__init__.py
from . import account_move
from . import warning_wizard
models/account_move.py
from odoo import models, fields, api, _
from odoo.exceptions import UserError
class AccountMove(models.Model):
_inherit = 'account.move'
@api.constrains('partner_id')
def _check_invoice_address(self):
for move in self:
if move.move_type == 'out_invoice': # Nur für Kundenrechnungen
if not move.partner_id.street or not move.partner_id.zip or not move.partner_id.city or not move.partner_id.email:
# Fehler für Standard-User (keine Manager)
if not self.env.user.has_group('account.group_account_manager'):
accounting_managers = self.env['res.users'].search([('groups_id', 'in', self.env.ref('account.group_account_manager').id)])
managers_names = ', '.join([user.name for user in accounting_managers])
raise UserError(_('Die Rechnungsadresse ist unvollständig. Bitte fügen Sie die fehlenden Informationen hinzu oder kontaktieren Sie einen Accounting Manager: %s') % managers_names)
def action_post(self):
for move in self:
if move.move_type == 'out_invoice': # Nur für Kundenrechnungen
if not move.partner_id.street or not move.partner_id.zip or not move.partner_id.city or not move.partner_id.email:
if self.env.user.has_group('account.group_account_manager'):
# Pop-up für Accounting Manager
return {
'type': 'ir.actions.act_window',
'name': 'Adresse unvollständig',
'res_model': 'warning.wizard',
'view_mode': 'form',
'view_id': self.env.ref('your_module_name.warning_wizard_view_form').id,
'target': 'new',
}
else:
# Fehlermeldung für Standard-User
accounting_managers = self.env['res.users'].search([('groups_id', 'in', self.env.ref('account.group_account_manager').id)])
managers_names = ', '.join([user.name for user in accounting_managers])
raise UserError(_('Die Rechnungsadresse ist unvollständig. Bitte fügen Sie die fehlenden Informationen hinzu oder kontaktieren Sie einen Accounting Manager: %s') % managers_names)
# Wenn alles in Ordnung ist, den Super-Aufruf nutzen, um fortzufahren
return super(AccountMove, self).action_post()
models/warning_wizard.py
from odoo import models, fields
class WarningWizard(models.TransientModel):
_name = 'warning.wizard'
_description = 'Warnung für unvollständige Adresse'
message = fields.Text(string="Warnung", readonly=True, default="Die Rechnungsadresse ist unvollständig. Möchten Sie die Rechnung trotzdem bestätigen?")
def action_confirm(self):
# Rechnung trotzdem bestätigen
active_id = self.env.context.get('active_id')
if active_id:
invoice = self.env['account.move'].browse(active_id)
invoice._post(soft=False) # Rechnung bestätigen
return {'type': 'ir.actions.act_window_close'}
def action_cancel(self):
# Abbrechen
return {'type': 'ir.actions.act_window_close'}
views/account_move_views.xml
(Uups - I can not insert the text / xml - it disappears...)
I can Install the modul but it does not work.
Frist test as a member of the chief accountant group gives me the error (hopefully the important lines):
...stuck ... :-( I do not know, what I changed the last minutes...
Looking forward to get help.
Maybe someone knows an app from the app stor that solves the expectation.
Thanks