@ -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> |