diff --git a/account_payment_approval/__manifest__.py b/account_payment_approval/__manifest__.py index 55464d363..c867813e9 100644 --- a/account_payment_approval/__manifest__.py +++ b/account_payment_approval/__manifest__.py @@ -32,7 +32,10 @@ 'website': "https://www.cybrosys.com", 'depends': ['account'], 'data': [ + 'security/ir.model.access.csv', + 'views/payment_approvers.xml', 'views/res_config_settings_views.xml', + 'views/account_payment_view.xml', ], 'license': 'LGPL-3', diff --git a/account_payment_approval/models/__init__.py b/account_payment_approval/models/__init__.py index ee06b56c8..49422f9f0 100644 --- a/account_payment_approval/models/__init__.py +++ b/account_payment_approval/models/__init__.py @@ -22,3 +22,5 @@ from . import account_payment from . import res_config_settings +from . import payment_approvers + diff --git a/account_payment_approval/models/account_payment.py b/account_payment_approval/models/account_payment.py index 405c33916..8aa85f317 100644 --- a/account_payment_approval/models/account_payment.py +++ b/account_payment_approval/models/account_payment.py @@ -36,32 +36,73 @@ class AccountMove(models.Model): class AccountPayment(models.Model): _inherit = "account.payment" - _inherits = {'account.move': 'move_id'} + + # _inherits = {'account.move': 'move_id'} def _check_is_approver(self): - approval = self.env['ir.config_parameter'].sudo().get_param( - 'account_payment_approval.payment_approval') - approver_id = int(self.env['ir.config_parameter'].sudo().get_param( - 'account_payment_approval.approval_user_id')) - self.is_approver = True if self.env.user.id == approver_id and approval else False + if self.env['ir.config_parameter'].sudo().get_param( + 'account_payment_approval.multi_approval'): + approval = self.env['ir.config_parameter'].sudo().get_param( + 'account_payment_approval.multi_approval') + print(approval, 'nn') + approver_id = self.env['payment.approves'].search([],order='amount') + print(approver_id, 'vvvvv') + for rec in approver_id: + print(rec.approve_user_id,'approve_user_id') + if rec.approve_user_id.id == self.env.user.id: + self.is_approver_check = True + else: + self.is_approver_check = False + if self.env['ir.config_parameter'].sudo().get_param( + 'account_payment_approval.payment_approval'): + approval = self.env['ir.config_parameter'].sudo().get_param( + 'account_payment_approval.payment_approval') + approver_id = int(self.env['ir.config_parameter'].sudo().get_param( + 'account_payment_approval.approval_user_id')) + self.is_approver_check = True if self.env.user.id == approver_id and approval else False + + is_approver_check = fields.Boolean(compute=_check_is_approver, readonly=True) - is_approver = fields.Boolean(compute=_check_is_approver, readonly=True) + is_approver = fields.Boolean() def action_post(self): - """Overwrites the _post() to validate the payment in the 'approved' stage too. - Currently Odoo allows payment posting only in draft stage. - """ + # Post the payments "normally" if no transactions are needed. + # If not, let the acquirer update the state. + validation = self._check_payment_approval() - if validation: + if validation and self.state: if self.state not in ('draft', 'approved'): raise UserError(_("Only a draft or approved payment can be posted.")) - if any(inv.state != 'posted' for inv in self.reconciled_invoice_ids): - raise ValidationError(_("The payment cannot be processed because the invoice is not open!")) - self.move_id._post(soft=False) + payments_need_tx = self.filtered( + lambda p: p.payment_token_id and not p.payment_transaction_id + ) + # creating the transaction require to access data on payment acquirers, not always accessible to users + # able to create payments + transactions = payments_need_tx.sudo()._create_payment_transaction() + + res = super(AccountPayment, self - payments_need_tx).action_post() + + for tx in transactions: # Process the transactions with a payment by token + tx._send_payment_request() + + # Post payments for issued transactions + transactions._finalize_post_processing() + payments_tx_done = payments_need_tx.filtered( + lambda p: p.payment_transaction_id.state == 'done' + ) + super(AccountPayment, payments_tx_done).action_post() + payments_tx_not_done = payments_need_tx.filtered( + lambda p: p.payment_transaction_id.state != 'done' + ) + payments_tx_not_done.action_cancel() + + return res def _check_payment_approval(self): if self.state == "draft": + second_approval = self.env['ir.config_parameter'].sudo().get_param( + 'account_payment_approval.multi_approval') first_approval = self.env['ir.config_parameter'].sudo().get_param( 'account_payment_approval.payment_approval') if first_approval: @@ -80,7 +121,48 @@ class AccountPayment(models.Model): self.write({ 'state': 'waiting_approval' }) + self.is_approver = True return False + if second_approval: + val = self.env['payment.approves'].search([], order='amount').mapped('amount') + approve_payment = self.env['payment.approves'].search([], order='amount') + for x in val: + for rec in approve_payment: + index = val.index(x) + 1 + if index ==len(val): + index = index - 1 + if self.amount > rec.amount and rec.approve_user_id.id == self.env.user.id: + self.is_approver = True + if self.amount > rec.amount and self.amount <= val[index] : + if rec.approve_user_id.id == self.env.user.id: + self.is_approver = True + payment_amount = self.amount + if rec.approval_currency_id: + if self.currency_id.id != rec.approval_currency_id.id: + currency_id = self.env['res.currency'].browse(rec.approval_currency_id.id) + payment_amount = self.currency_id._convert( + self.amount, currency_id, self.company_id, + self.date or fields.Date.today(), round=True) + if payment_amount > rec.amount: + self.write({ + 'state': 'waiting_approval' + }) + return False + else: + self.is_approver = False + self.write({ + 'state': 'waiting_approval' + }) + return False + elif self.amount < val[0]: + self.is_approver = False + return True + else: + self.write({ + 'state': 'waiting_approval' + }) + self.is_approver = False + return False return True def approve_transfer(self): @@ -90,6 +172,7 @@ class AccountPayment(models.Model): }) def reject_transfer(self): - self.write({ - 'state': 'rejected' - }) + if self.is_approver: + self.write({ + 'state': 'rejected' + }) diff --git a/account_payment_approval/models/payment_approvers.py b/account_payment_approval/models/payment_approvers.py new file mode 100644 index 000000000..14bb0c8af --- /dev/null +++ b/account_payment_approval/models/payment_approvers.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2021-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# + +from odoo import fields, models + + +class PaymentApprover(models.Model): + _name = 'payment.approves' + + approve_user_id = fields.Many2one('res.users','Approver') + amount = fields.Float('Amount',help="If amount is 0.00, All the payments go through approval") + approval_currency_id = fields.Many2one('res.currency', string='Approval Currency', + help="Converts the payment amount to this currency if chosen.") + + + + diff --git a/account_payment_approval/models/res_config_settings.py b/account_payment_approval/models/res_config_settings.py index a1f7cf040..c83a4ed43 100644 --- a/account_payment_approval/models/res_config_settings.py +++ b/account_payment_approval/models/res_config_settings.py @@ -20,7 +20,7 @@ # ############################################################################# -from odoo import fields, models +from odoo import fields, models, api class ResConfigSettings(models.TransientModel): @@ -31,7 +31,10 @@ class ResConfigSettings(models.TransientModel): account_manager_ids = user_ids.filtered(lambda l: l.has_group('account.group_account_manager')) return [('id', 'in', account_manager_ids.ids)] - payment_approval = fields.Boolean('Payment Approval', config_parameter='account_payment_approval.payment_approval') + payment_approval = fields.Boolean('Single Payment Approval', + config_parameter='account_payment_approval.payment_approval') + multi_approval = fields.Boolean('Multi Payment Approval', + config_parameter='account_payment_approval.multi_approval') approval_user_id = fields.Many2one('res.users', string="Payment Approver", required=False, domain=_get_account_manager_ids, config_parameter='account_payment_approval.approval_user_id') @@ -41,3 +44,8 @@ class ResConfigSettings(models.TransientModel): approval_currency_id = fields.Many2one('res.currency', string='Approval Currency', config_parameter='account_payment_approval.approval_currency_id', help="Converts the payment amount to this currency if chosen.") + + @api.onchange('multi_approval') + def onchange_multi_approval(self): + if self.multi_approval: + self.payment_approval = False diff --git a/account_payment_approval/security/ir.model.access.csv b/account_payment_approval/security/ir.model.access.csv new file mode 100644 index 000000000..857f51e13 --- /dev/null +++ b/account_payment_approval/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_payment_approves,payment.approves,model_payment_approves,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/account_payment_approval/static/description/images/configure.png b/account_payment_approval/static/description/images/configure.png new file mode 100644 index 000000000..1e3d5bf44 Binary files /dev/null and b/account_payment_approval/static/description/images/configure.png differ diff --git a/account_payment_approval/static/description/images/multi.png b/account_payment_approval/static/description/images/multi.png new file mode 100644 index 000000000..a5856e711 Binary files /dev/null and b/account_payment_approval/static/description/images/multi.png differ diff --git a/account_payment_approval/static/description/images/payment-approval-03.png b/account_payment_approval/static/description/images/payment-approval-03.png deleted file mode 100644 index e487c1915..000000000 Binary files a/account_payment_approval/static/description/images/payment-approval-03.png and /dev/null differ diff --git a/account_payment_approval/static/description/images/payment-approval-04.png b/account_payment_approval/static/description/images/payment-approval-04.png deleted file mode 100644 index 43f668311..000000000 Binary files a/account_payment_approval/static/description/images/payment-approval-04.png and /dev/null differ diff --git a/account_payment_approval/static/description/images/payment-approval-05.png b/account_payment_approval/static/description/images/payment-approval-05.png deleted file mode 100644 index 55d033f77..000000000 Binary files a/account_payment_approval/static/description/images/payment-approval-05.png and /dev/null differ diff --git a/account_payment_approval/static/description/images/single.png b/account_payment_approval/static/description/images/single.png new file mode 100644 index 000000000..937a7cf30 Binary files /dev/null and b/account_payment_approval/static/description/images/single.png differ diff --git a/account_payment_approval/static/description/index.html b/account_payment_approval/static/description/index.html index 896774a1d..5750da603 100644 --- a/account_payment_approval/static/description/index.html +++ b/account_payment_approval/static/description/index.html @@ -14,7 +14,8 @@

Key Highlights

    -
  • Approval stages in payments +
  • Approval stages in payments
@@ -108,7 +109,8 @@ style="float: left;">

- + Goto Settings and click on Invoicing

- - Enable Payment Approval

+ + Enable Single Payment Approval
+ src="images/single.png">
@@ -134,83 +137,91 @@ style="float: left;">

- - Fill the fields.

+ + If You want To Enable Multiple Approval Enable Multi Payment + Approval.
+ src="images/multi.png"> - - - - - - - - - - - - - - - -
    diff --git a/account_payment_approval/views/account_payment_view.xml b/account_payment_approval/views/account_payment_view.xml index 66b13f85a..f0d66e276 100644 --- a/account_payment_approval/views/account_payment_view.xml +++ b/account_payment_approval/views/account_payment_view.xml @@ -6,24 +6,30 @@ +
@@ -49,4 +61,4 @@ - + \ No newline at end of file