@ -0,0 +1,53 @@ |
|||||
|
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg |
||||
|
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html |
||||
|
:alt: License: AGPL-3 |
||||
|
|
||||
|
Invoice Multi Level Approval |
||||
|
============================ |
||||
|
Enables the option for adding multiple approvals to the invoice documents |
||||
|
|
||||
|
Configuration |
||||
|
============= |
||||
|
* No additional configurations needed |
||||
|
|
||||
|
Company |
||||
|
------- |
||||
|
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
||||
|
|
||||
|
License |
||||
|
------- |
||||
|
GNU Affero General Public License v3.0 (AGPL v3) |
||||
|
(http://www.gnu.org/licenses/agpl-3.0-standalone.html) |
||||
|
|
||||
|
Credits |
||||
|
------- |
||||
|
* Developer: |
||||
|
Sayooj A O |
||||
|
(V14) Muhammed Nafih, |
||||
|
(V15) Akshay CK, |
||||
|
(V16) Sahla Sherin, |
||||
|
(V17) Jumana Haseen, |
||||
|
(V18) Busthana Shirin |
||||
|
Contact: odoo@cybrosys.com |
||||
|
|
||||
|
Contacts |
||||
|
-------- |
||||
|
* Mail Contact : odoo@cybrosys.com |
||||
|
* Website : https://cybrosys.com |
||||
|
|
||||
|
Bug Tracker |
||||
|
----------- |
||||
|
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
||||
|
|
||||
|
Maintainer |
||||
|
========== |
||||
|
.. image:: https://cybrosys.com/images/logo.png |
||||
|
:target: https://cybrosys.com |
||||
|
|
||||
|
This module is maintained by Cybrosys Technologies. |
||||
|
|
||||
|
For support and more information, please visit `Our Website <https://cybrosys.com/>`__ |
||||
|
|
||||
|
Further information |
||||
|
=================== |
||||
|
HTML Description: `<static/description/index.html>`__ |
@ -0,0 +1,22 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from . import models |
@ -0,0 +1,47 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
{ |
||||
|
'name': "Invoice Multi Level Approval", |
||||
|
'version': '18.0.1.0.0', |
||||
|
'category': 'Accounting', |
||||
|
'summary': """This module add the multiple approval option for invoice, |
||||
|
bill, refund and credit notes with single or multiple approvals""", |
||||
|
'description': """This module add the multiple approval option for invoice, |
||||
|
bill,refund and credit notes.""", |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'website': "https://www.cybrosys.com", |
||||
|
'depends': ['account'], |
||||
|
'data': [ |
||||
|
'security/invoice_multi_approval_groups.xml', |
||||
|
'security/ir.model.access.csv', |
||||
|
'data/invoice_approval_data.xml', |
||||
|
'views/invoice_approval_views.xml', |
||||
|
'views/account_move_views.xml', |
||||
|
], |
||||
|
'images': ['static/description/banner.jpg'], |
||||
|
'license': "AGPL-3", |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
'application': False, |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<!-- To make fields approve_customer_invoice and approve_vendor_bill true |
||||
|
while installing the module --> |
||||
|
<data noupdate="1"> |
||||
|
<record id="default_invoice_multi_approval_config" |
||||
|
model="invoice.approval"> |
||||
|
<field name="approve_customer_invoice">True</field> |
||||
|
<field name="invoice_approver_ids" eval="[(6, 0, [ ref('base.user_admin')])]"/> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
||||
|
|
@ -0,0 +1,6 @@ |
|||||
|
## Module <invoice_multi_approval> |
||||
|
|
||||
|
#### 11.11.2024 |
||||
|
#### Version 18.0.1.0.0 |
||||
|
##### ADD |
||||
|
- Initial commit for Invoice Multi Level Approval |
@ -0,0 +1,24 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from . import account_move |
||||
|
from . import approval_line |
||||
|
from . import invoice_approval |
@ -0,0 +1,208 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import api, fields, models |
||||
|
|
||||
|
|
||||
|
class AccountMove(models.Model): |
||||
|
"""This class inherits model account.move and adds required fields""" |
||||
|
_inherit = 'account.move' |
||||
|
|
||||
|
approval_ids = fields.One2many('approval.line', |
||||
|
'move_id', string="Lines", |
||||
|
help="Approval lines") |
||||
|
document_fully_approved = fields.Boolean(string="Document Fully Approved", |
||||
|
compute='_compute_document_fully_' |
||||
|
'approved', |
||||
|
help="Enable/disable to approve" |
||||
|
" document.") |
||||
|
check_approve_ability = fields.Boolean(string="Check Approve Ability", |
||||
|
compute='_compute_check_approve_' |
||||
|
'ability', |
||||
|
help="Enable/disable to check " |
||||
|
"approve ability.") |
||||
|
is_approved = fields.Boolean(string="Is Approved", |
||||
|
compute='_compute_is_approved', |
||||
|
help="Enable/disable to compute approved" |
||||
|
" or not.") |
||||
|
page_visibility = fields.Boolean(string="Page visibility", |
||||
|
compute='_compute_page_visibility', |
||||
|
help=" To compute page visibility.") |
||||
|
users_approved = fields.Boolean(string="Users Approved", |
||||
|
help="All the users approved the invoice") |
||||
|
|
||||
|
@api.depends('approval_ids') |
||||
|
def _compute_page_visibility(self): |
||||
|
"""Compute function for making the approval page visible/invisible""" |
||||
|
for rec in self: |
||||
|
rec.page_visibility = True if rec.approval_ids else False |
||||
|
|
||||
|
@api.onchange('partner_id') |
||||
|
def _onchange_partner_id(self): |
||||
|
"""This is the onchange function of the partner which loads the |
||||
|
persons for the approval to the approver table of the account.move""" |
||||
|
res = super(AccountMove, self)._onchange_partner_id() |
||||
|
invoice_approval_id = self.env['invoice.approval'].browse(self.env.ref( |
||||
|
'invoice_multi_approval.default_invoice_multi_approval_config').id) |
||||
|
self.approval_ids = None |
||||
|
approval_managers = self.env['res.users'].search([('groups_id', 'in', |
||||
|
self.env.ref( |
||||
|
'invoice_multi_' |
||||
|
'approval.group_approve_manager').id)]) |
||||
|
if invoice_approval_id.no_approve: |
||||
|
if approval_managers: |
||||
|
for manager in approval_managers: |
||||
|
if not manager.id in self.approval_ids.approver_id.ids: |
||||
|
vals = { |
||||
|
'approver_id': manager.id |
||||
|
} |
||||
|
self.approval_ids |= self.approval_ids.new(vals) |
||||
|
if (invoice_approval_id.approve_customer_invoice and |
||||
|
self.move_type == 'out_invoice'): |
||||
|
for user in invoice_approval_id.invoice_approver_ids: |
||||
|
if not user.id in self.approval_ids.approver_id.ids: |
||||
|
vals = { |
||||
|
'approver_id': user.id |
||||
|
} |
||||
|
self.approval_ids |= self.approval_ids.new(vals) |
||||
|
elif (invoice_approval_id.approve_vendor_bill and |
||||
|
self.move_type == 'in_invoice'): |
||||
|
for user in invoice_approval_id.bill_approver_ids: |
||||
|
if not user.id in self.approval_ids.approver_id.ids: |
||||
|
vals = { |
||||
|
'approver_id': user.id |
||||
|
} |
||||
|
self.approval_ids |= self.approval_ids.new(vals) |
||||
|
elif (invoice_approval_id.approve_customer_credit and |
||||
|
self.move_type == 'out_refund'): |
||||
|
for user in invoice_approval_id.cust_credit_approver_ids: |
||||
|
if not user.id in self.approval_ids.approver_id.ids: |
||||
|
vals = { |
||||
|
'approver_id': user.id |
||||
|
} |
||||
|
self.approval_ids |= self.approval_ids.new(vals) |
||||
|
elif (invoice_approval_id.approve_vendor_credit and |
||||
|
self.move_type == 'in_refund'): |
||||
|
for user in invoice_approval_id.vend_credit_approver_ids: |
||||
|
if not user.id in self.approval_ids.approver_id.ids: |
||||
|
vals = { |
||||
|
'approver_id': user.id |
||||
|
} |
||||
|
self.approval_ids |= self.approval_ids.new(vals) |
||||
|
return res |
||||
|
|
||||
|
@api.depends('approval_ids.approver_id') |
||||
|
def _compute_check_approve_ability(self): |
||||
|
"""This is the compute function which checks if the current |
||||
|
logged-in user is eligible for approving the document""" |
||||
|
for rec in self: |
||||
|
current_user = self.env.uid |
||||
|
if self.env.ref( |
||||
|
'invoice_multi_approval.default_invoice_multi_approval_config').approve_customer_invoice: |
||||
|
approvers_list = [approver.approver_id.id for approver in |
||||
|
rec.approval_ids] |
||||
|
rec.check_approve_ability = current_user in approvers_list |
||||
|
else: |
||||
|
rec.check_approve_ability = False |
||||
|
|
||||
|
def action_invoice_approve(self): |
||||
|
"""This is the function of the approve button also updates the approval |
||||
|
table values according to the approval of the users""" |
||||
|
self.ensure_one() |
||||
|
current_user = self.env.uid |
||||
|
for approval_id in self.approval_ids: |
||||
|
if current_user == approval_id.approver_id.id: |
||||
|
approval_id.update({'approval_status': True}) |
||||
|
invoice_approval_id = self.env['invoice.approval'].browse(self.env.ref( |
||||
|
'invoice_multi_approval.default_invoice_multi_approval_config').id) |
||||
|
approved_users = self.approval_ids.filtered( |
||||
|
lambda item: item.approval_status).approver_id.ids |
||||
|
if (invoice_approval_id.approve_customer_invoice and |
||||
|
self.move_type == 'out_invoice'): |
||||
|
approval_users = invoice_approval_id.invoice_approver_ids.ids |
||||
|
if approved_users == approval_users: |
||||
|
self.users_approved = True |
||||
|
elif (invoice_approval_id.approve_vendor_bill and |
||||
|
self.move_type == 'in_invoice'): |
||||
|
approval_users = invoice_approval_id.bill_approver_ids.ids |
||||
|
if approved_users == approval_users: |
||||
|
self.users_approved = True |
||||
|
elif (invoice_approval_id.approve_customer_credit and |
||||
|
self.move_type == 'out_refund'): |
||||
|
approval_users = invoice_approval_id.cust_credit_approver_ids.ids |
||||
|
if approved_users == approval_users: |
||||
|
self.users_approved = True |
||||
|
elif (invoice_approval_id.approve_vendor_credit and |
||||
|
self.move_type == 'in_refund'): |
||||
|
approval_users = invoice_approval_id.vend_credit_approver_ids.ids |
||||
|
if approved_users == approval_users: |
||||
|
self.users_approved = True |
||||
|
|
||||
|
def _compute_is_approved(self): |
||||
|
"""In this compute function we are verifying whether the document |
||||
|
is approved/not approved by the current logged in user""" |
||||
|
for rec in self: |
||||
|
current_user = rec.env.uid |
||||
|
if rec.invoice_line_ids and rec.approval_ids: |
||||
|
for approval_id in rec.approval_ids: |
||||
|
if current_user == approval_id.approver_id.id: |
||||
|
if approval_id.approval_status: |
||||
|
rec.is_approved = True |
||||
|
break |
||||
|
else: |
||||
|
rec.is_approved = False |
||||
|
else: |
||||
|
rec.is_approved = False |
||||
|
else: |
||||
|
rec.is_approved = False |
||||
|
|
||||
|
@api.depends('approval_ids') |
||||
|
def _compute_document_fully_approved(self): |
||||
|
"""This is the compute function which verifies whether |
||||
|
the document is completely approved or not""" |
||||
|
for rec in self: |
||||
|
length_approval_ids = len(rec.approval_ids) |
||||
|
approval_ids = rec.approval_ids |
||||
|
approve_lines = approval_ids.filtered( |
||||
|
lambda item: item.approval_status) |
||||
|
length_approve_lines = len(approve_lines) |
||||
|
rec.document_fully_approved = True \ |
||||
|
if length_approval_ids == length_approve_lines else False |
||||
|
approval_managers = self.env['res.users'].search( |
||||
|
[('groups_id', 'in', |
||||
|
self.env.ref( |
||||
|
'invoice_multi_' |
||||
|
'approval.group_approve_manager').id)]).ids |
||||
|
for approval in approve_lines: |
||||
|
if approval.approver_id.id in approval_managers: |
||||
|
rec.document_fully_approved = True |
||||
|
if rec.users_approved: |
||||
|
rec.document_fully_approved = True |
||||
|
|
||||
|
@api.model_create_multi |
||||
|
def create(self, vals_list): |
||||
|
"""Super the create function adding approvers while create account |
||||
|
move through sale /purchase |
||||
|
:param vals_list: dictionary with the detaisl of current record set |
||||
|
:return: record""" |
||||
|
res = super(AccountMove, self).create(vals_list) |
||||
|
res._onchange_partner_id() |
||||
|
return res |
@ -0,0 +1,35 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class ApprovalLine(models.Model): |
||||
|
"""This class creates a model 'approval.line' and adds fields""" |
||||
|
_name = 'approval.line' |
||||
|
_description = 'Approval Line In Move' |
||||
|
|
||||
|
move_id = fields.Many2one('account.move', |
||||
|
string="Approval lines", help="Approval line") |
||||
|
approver_id = fields.Many2one('res.users', string='Approver', |
||||
|
help="Approver of the invoice") |
||||
|
approval_status = fields.Boolean(string='Status', help="Status of" |
||||
|
"approvals") |
@ -0,0 +1,110 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import api, fields, models |
||||
|
|
||||
|
|
||||
|
class InvoiceApproval(models.Model): |
||||
|
"""This class creates a model 'invoice.approval' and adds |
||||
|
required fields""" |
||||
|
_name = 'invoice.approval' |
||||
|
_rec_name = 'name' |
||||
|
_inherit = ['mail.thread', 'mail.activity.mixin'] |
||||
|
_description = 'Invoice Approval' |
||||
|
|
||||
|
name = fields.Char(default='Approval Configuration', string="Name", |
||||
|
help="Approval configuration.") |
||||
|
approve_customer_invoice = fields.Boolean(string="Approval on" |
||||
|
" Customer Invoice", |
||||
|
help='Enable this field ' |
||||
|
'for adding the approvals ' |
||||
|
'for the customer invoice.') |
||||
|
invoice_approver_ids = fields.Many2many('res.users', |
||||
|
'invoice_id', |
||||
|
string='Invoice Approver', |
||||
|
domain=lambda self: [ |
||||
|
('groups_id', 'in', |
||||
|
self.env.ref('invoice_multi_' |
||||
|
'approval.group_approver').id)], |
||||
|
help='In this field you can add ' |
||||
|
'the approvers for the ' |
||||
|
'customer invoice.') |
||||
|
approve_vendor_bill = fields.Boolean(string="Approval on Vendor Bill", |
||||
|
help='Enable this field for adding' |
||||
|
' the approvals for the' |
||||
|
' Vendor bill.') |
||||
|
bill_approver_ids = fields.Many2many('res.users', |
||||
|
'bill_id', |
||||
|
string='Bill Approver', |
||||
|
domain=lambda self: [ |
||||
|
('groups_id', 'in', |
||||
|
self.env.ref('invoice_multi_' |
||||
|
'approval.group_approver').id)], |
||||
|
help='In this field you can add the ' |
||||
|
'approvers for the Vendor bill.') |
||||
|
approve_customer_credit = fields.Boolean(string='Approval on Customer' |
||||
|
' Refund', |
||||
|
help='Enable this field for' |
||||
|
' adding the approvals' |
||||
|
' for the customer credit ' |
||||
|
'note.') |
||||
|
cust_credit_approver_ids = fields.Many2many('res.users', |
||||
|
'cust_credit_id', |
||||
|
string='Customer Credit Note' |
||||
|
' Approver', |
||||
|
domain=lambda self: [ |
||||
|
('groups_id', 'in', |
||||
|
self.env.ref( |
||||
|
'invoice_multi_' |
||||
|
'approval.group_' |
||||
|
'approver').id)], |
||||
|
help='In this field you can add' |
||||
|
'the approvers for the' |
||||
|
' Customer credit note.') |
||||
|
approve_vendor_credit = fields.Boolean(string='Approval on Vendor Refund', |
||||
|
help='Enable this field for adding ' |
||||
|
'the approvals for the' |
||||
|
' Vendor credit note.') |
||||
|
vend_credit_approver_ids = fields.Many2many('res.users', |
||||
|
'vend_credit_id', |
||||
|
string='Vendor Credit Note' |
||||
|
' Approver', |
||||
|
domain=lambda self: [ |
||||
|
('groups_id', 'in', |
||||
|
self.env.ref( |
||||
|
'invoice_multi_' |
||||
|
'approval.group_' |
||||
|
'approver').id)], |
||||
|
help='In this field you can' |
||||
|
' add the approvers ' |
||||
|
'for the Vendor credit' |
||||
|
' note.') |
||||
|
no_approve = fields.Boolean(string='No Approval', |
||||
|
help='Approval is not needed', |
||||
|
compute="_compute_no_approve") |
||||
|
|
||||
|
@api.depends('approve_vendor_credit', 'approve_customer_invoice', |
||||
|
'approve_vendor_bill', 'approve_customer_credit') |
||||
|
def _compute_no_approve(self): |
||||
|
"""Method _compute_no_approve to compute the value to the field |
||||
|
no_approve""" |
||||
|
for rec in self: |
||||
|
rec.no_approve = True if rec.approve_customer_invoice or rec.approve_customer_credit or rec.approve_vendor_credit or rec.approve_vendor_bill else False |
@ -0,0 +1,41 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<!-- Creating Invoice Approval menu--> |
||||
|
<record model="ir.module.category" id="group_invoice_multi_approval"> |
||||
|
<field name="name">Invoice Approval</field> |
||||
|
<field name="description">Access to the invoice approval menu</field> |
||||
|
<field name="sequence">3</field> |
||||
|
</record> |
||||
|
<!-- Creating approval group Approvers--> |
||||
|
<record id="group_approver" model="res.groups"> |
||||
|
<field name="name">Approvers</field> |
||||
|
<field name="category_id" |
||||
|
ref="invoice_multi_approval.group_invoice_multi_approval"/> |
||||
|
<field name="implied_ids" |
||||
|
eval="[(4, ref('account.group_account_invoice'))]"/> |
||||
|
</record> |
||||
|
<!-- Creating approval group Approve Manager--> |
||||
|
<record id="group_approve_manager" model="res.groups"> |
||||
|
<field name="name">Approve Manager</field> |
||||
|
<field name="category_id" |
||||
|
ref="invoice_multi_approval.group_invoice_multi_approval"/> |
||||
|
<field name="implied_ids" |
||||
|
eval="[(4, ref('invoice_multi_approval.group_approver')), (4, ref('account.group_account_invoice'))]"/> |
||||
|
</record> |
||||
|
<!-- Creating Billing administrator--> |
||||
|
<record id="account.group_account_manager" model="res.groups"> |
||||
|
<field name="name">Billing Administrator</field> |
||||
|
<field name="category_id" |
||||
|
ref="base.module_category_accounting_accounting"/> |
||||
|
<field name="implied_ids" |
||||
|
eval="[(4, ref('account.group_account_invoice')), (4, ref('invoice_multi_approval.group_approve_manager'))]"/> |
||||
|
</record> |
||||
|
<!-- Creating Billing in accounts--> |
||||
|
<record id="account.group_account_invoice" model="res.groups"> |
||||
|
<field name="name">Billing</field> |
||||
|
<field name="category_id" |
||||
|
ref="base.module_category_accounting_accounting"/> |
||||
|
<field name="implied_ids" |
||||
|
eval="[(4, ref('base.group_user')),(4, ref('account.group_account_invoice'))]"/> |
||||
|
</record> |
||||
|
</odoo> |
|
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 210 KiB |
After Width: | Height: | Size: 209 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 495 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 624 B |
After Width: | Height: | Size: 136 KiB |
After Width: | Height: | Size: 214 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 929 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 542 B |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 738 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 600 B |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 462 B |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 926 B |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 7.0 KiB |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 800 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 189 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 875 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 912 KiB |
After Width: | Height: | Size: 1.3 MiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 134 KiB |
After Width: | Height: | Size: 345 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 122 KiB |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 732 KiB |
After Width: | Height: | Size: 39 KiB |
@ -0,0 +1,56 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<!-- Inherited form view of account.move model--> |
||||
|
<record id="account_move_approval_view_form" model="ir.ui.view" > |
||||
|
<field name="name">account.move.view.form.inherit.invoice.multi.approval |
||||
|
</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='invoice_user_id']" position="after"> |
||||
|
<field name="document_fully_approved" invisible="1"/> |
||||
|
<field name="check_approve_ability" invisible="1"/> |
||||
|
<field name="is_approved" invisible="1"/> |
||||
|
<field name="page_visibility" invisible="1"/> |
||||
|
<field name="approval_ids" invisible="1"/> |
||||
|
</xpath> |
||||
|
<xpath expr="//button[@name='action_post']" position="before"> |
||||
|
<button name="action_invoice_approve" class="oe_highlight" |
||||
|
string="Approve" type="object" |
||||
|
groups="invoice_multi_approval.group_approver,invoice_multi_approval.group_approve_manager" |
||||
|
invisible="move_type not in ('out_invoice', |
||||
|
'out_refund', |
||||
|
'in_invoice', 'in_refund') or check_approve_ability != True or |
||||
|
document_fully_approved ==True or is_approved == True"/> |
||||
|
</xpath> |
||||
|
<xpath expr="//button[@name='action_post'][2]" |
||||
|
position="attributes"> |
||||
|
<attribute name="invisible"> |
||||
|
document_fully_approved == False or state == 'posted' |
||||
|
</attribute> |
||||
|
</xpath> |
||||
|
<xpath expr="//page[@id='other_tab']" position="after"> |
||||
|
<page string="Approvals" name="approval_tab" |
||||
|
invisible="move_type not in ('in_invoice','out_invoice', |
||||
|
'in_refund','out_refund') and page_visibility ==False"> |
||||
|
<field name="approval_ids" mode="list" nolabel="1" |
||||
|
style="pointer-events:none;"> |
||||
|
<list string="Approval lines" |
||||
|
create="0" edit="0" delete="0"> |
||||
|
<field name="approver_id"/> |
||||
|
<field name="approval_status"/> |
||||
|
</list> |
||||
|
</field> |
||||
|
</page> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- Menu items for Approvals and Invoice approval--> |
||||
|
<menuitem id="invoice_approval_menu_root" name="Approvals" |
||||
|
parent="account.menu_finance_configuration" sequence="10" |
||||
|
groups="group_approve_manager"/> |
||||
|
<menuitem id="invoice_approval_menu_action" name="Invoice Approval" |
||||
|
parent="invoice_multi_approval.invoice_approval_menu_root" |
||||
|
action="invoice_approval_action" sequence="1" |
||||
|
groups="group_approve_manager"/> |
||||
|
</odoo> |
@ -0,0 +1,56 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<!-- Form view of invoice approval model--> |
||||
|
<record id="invoice_approval_view_form" model="ir.ui.view"> |
||||
|
<field name="name">invoice.approval.view.form</field> |
||||
|
<field name="model">invoice.approval</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form class="oe_form_configuration"> |
||||
|
<sheet> |
||||
|
<div class="oe_title oe_read_only"> |
||||
|
<h1> |
||||
|
<field name="name"/> |
||||
|
</h1> |
||||
|
</div> |
||||
|
<group> |
||||
|
<group string="Customer Configuration"> |
||||
|
<field name="approve_customer_invoice"/> |
||||
|
<field name="invoice_approver_ids" |
||||
|
widget="many2many_tags" |
||||
|
invisible="approve_customer_invoice == False" |
||||
|
required="approve_customer_invoice == True"/> |
||||
|
<field name="approve_customer_credit"/> |
||||
|
<field name="cust_credit_approver_ids" |
||||
|
widget="many2many_tags" |
||||
|
invisible="approve_customer_credit == False" |
||||
|
required="approve_customer_credit == True"/> |
||||
|
</group> |
||||
|
<group string="Vendor Configuration"> |
||||
|
<field name="approve_vendor_bill"/> |
||||
|
<field name="bill_approver_ids" |
||||
|
widget="many2many_tags" |
||||
|
invisible="approve_vendor_bill == False" |
||||
|
required="approve_vendor_bill == True"/> |
||||
|
<field name="approve_vendor_credit"/> |
||||
|
<field name="vend_credit_approver_ids" |
||||
|
widget="many2many_tags" |
||||
|
invisible="approve_vendor_credit == False" |
||||
|
required="approve_vendor_credit == True"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
<chatter/> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!--Action for invoice approval model--> |
||||
|
<record id="invoice_approval_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Invoice Multi Approval</field> |
||||
|
<field name="type">ir.actions.act_window</field> |
||||
|
<field name="res_model">invoice.approval</field> |
||||
|
<field name="res_id" |
||||
|
ref="invoice_multi_approval.default_invoice_multi_approval_config"/> |
||||
|
<field name="view_mode">form</field> |
||||
|
<field name="target">inline</field> |
||||
|
</record> |
||||
|
</odoo> |