You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
6.4 KiB
140 lines
6.4 KiB
# -*- coding: utf-8 -*-
|
|
################################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright(C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
|
# Author: Shyamgeeth P.P (<https://www.cybrosys.com>)
|
|
#
|
|
# This program is free software: you can modify
|
|
# it under the terms of the GNU Affero General Public License (AGPL) as
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
# 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 for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
#
|
|
################################################################################
|
|
import json
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class SaleOrder(models.Model):
|
|
"""Sale order model inherited for adding status of payment of sales."""
|
|
_inherit = "sale.order"
|
|
|
|
payment_status = fields.Char(string="Payment Status",
|
|
compute="_compute_payment_status",
|
|
help="Field to check the payment status of the"
|
|
" sale order")
|
|
payment_details = fields.Text(string="Payment Details",
|
|
compute="_compute_payment_details",
|
|
help="Shows the payment done details"
|
|
" including date and amount")
|
|
amount_due = fields.Float(string="Amount Due",
|
|
compute='_compute_amount_due',
|
|
help="Shows the amount that in due for the "
|
|
"corresponding sale order")
|
|
invoice_state = fields.Char(string="Invoice State",
|
|
compute="_compute_invoice_state",
|
|
help="Field to check the invoice state of "
|
|
"sale order")
|
|
|
|
@api.depends('invoice_ids')
|
|
def _compute_payment_status(self):
|
|
""" The function will compute the payment status of the sale order,
|
|
if an invoice is created for the corresponding sale order.Payment
|
|
status will be either in paid,not paid,partially paid, reversed etc."""
|
|
for order in self:
|
|
order.payment_status = 'No invoice'
|
|
payment_states = order.invoice_ids. \
|
|
filtered(lambda i: i.state == 'posted').mapped('payment_state')
|
|
status_length = len(payment_states)
|
|
if status_length != 0:
|
|
if 'partial' in payment_states:
|
|
order.payment_status = 'Partially Paid'
|
|
elif 'not_paid' in payment_states and status_length == 1:
|
|
order.payment_status = 'Not Paid'
|
|
elif 'not_paid' in payment_states and order.amount_due != \
|
|
order.amount_total and status_length > 1:
|
|
order.payment_status = 'Partially Paid'
|
|
elif 'paid' in payment_states and status_length == \
|
|
payment_states.count('paid') and order.amount_due == 0:
|
|
order.payment_status = 'Paid'
|
|
elif 'paid' in payment_states and status_length == \
|
|
payment_states.count('paid') and order.amount_due != 0:
|
|
order.payment_status = 'Partially Paid'
|
|
elif 'in_payment' in payment_states and \
|
|
status_length == payment_states.count('in_payment'):
|
|
order.payment_status = 'In Payment'
|
|
elif 'reversed' in payment_states and \
|
|
status_length == payment_states.count('reversed'):
|
|
order.payment_status = 'Reversed'
|
|
else:
|
|
order.payment_status = 'No invoice'
|
|
|
|
@api.depends('invoice_ids')
|
|
def _compute_invoice_state(self):
|
|
"""The function will compute the state of the invoice ,
|
|
Once an invoice is existing in a sale order."""
|
|
for rec in self:
|
|
rec.invoice_state = 'No invoice'
|
|
for order in rec.invoice_ids:
|
|
if order.state == 'posted':
|
|
rec.invoice_state = 'posted'
|
|
elif order.state != 'posted':
|
|
rec.invoice_state = 'draft'
|
|
else:
|
|
rec.invoice_state = 'No invoice'
|
|
|
|
@api.depends('invoice_ids')
|
|
def _compute_amount_due(self):
|
|
"""The function is used to compute the amount due from the invoice and
|
|
if payment is registered."""
|
|
for rec in self:
|
|
amount_due = 0
|
|
for order in rec.invoice_ids:
|
|
amount_due = amount_due + order.amount_residual
|
|
rec.amount_due = amount_due
|
|
|
|
@api.depends('invoice_ids')
|
|
def _compute_payment_details(self):
|
|
"""Compute the payment details from invoices and added into the
|
|
sale order form view."""
|
|
for rec in self:
|
|
payment = []
|
|
rec.payment_details = False
|
|
for order in rec.invoice_ids:
|
|
if order.invoice_payments_widget != 'false':
|
|
for pay in json.loads(order.invoice_payments_widget)[
|
|
'content']:
|
|
payment.append(pay)
|
|
for order in rec.invoice_ids:
|
|
if order.invoice_payments_widget != 'false':
|
|
payment_line = json.loads(order.invoice_payments_widget)
|
|
payment_line['content'] = payment
|
|
rec.payment_details = json.dumps(payment_line)
|
|
break
|
|
|
|
def action_register_payment(self):
|
|
""" Open the account.payment.register wizard to pay the selected
|
|
journal entries.
|
|
:return: An action opening the account.payment.register wizard.
|
|
"""
|
|
self.ensure_one()
|
|
return {
|
|
'name': _('Register Payment'),
|
|
'res_model': 'account.payment.register',
|
|
'view_mode': 'form',
|
|
'context': {
|
|
'active_model': 'account.move',
|
|
'active_ids': self.invoice_ids.ids,
|
|
},
|
|
'target': 'new',
|
|
'type': 'ir.actions.act_window',
|
|
}
|
|
|