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.
 
 
 
 
 

144 lines
6.8 KiB

# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import api, fields, models
class InvoiceInherit(models.Model):
"""
A class that inherits the currently existing model account.move
"""
_inherit = 'account.move'
progress_bill_title = fields.Char(string='Progress Billing Title',
help='Give a title for the progress billing')
project_id = fields.Many2one('account.analytic.account', string='Project',
copy=False,
help='Corresponding analytic account for the invoice')
total_progress_billing = fields.Float(string="Total Progress Billing",
related='project_id.total_progress_billing',
copy=False, store=True,
help='Total Progress Billing of the corresponding analytic account')
invoice_to_date = fields.Float(string="Invoice To Date",
compute='_compute_invoice_to_date',
copy=False,
store=True,
help='The amount invoiced for the analytic account till this invoice')
remaining_progress_billing = fields.Float(
string="Remaining Progress Billing",
compute='_compute_remaining_progress_billing',
copy=False, store=True,
help='The remaining amount to invoice for the analytic account')
previously_invoice = fields.Float(string="Previously Invoiced",
compute='_compute_previously_invoiced',
copy=False,
store=True,
help='How much amount previously invoiced')
previously_invoice_due = fields.Float(string="Previously Invoiced Due",
compute='_compute_previously_invoiced',
copy=False, store=True,
help='How much amount due previously invoiced')
current_invoice = fields.Float(string="Current Invoiced",
compute='_compute_current_invoiced',
copy=False,
store=True,
help='Currently how much amount invoiced')
less_paid_amount = fields.Float(string="Less Paid Amount",
compute='_compute_less_paid_amount',
copy=False,
store=True,
help='The total amount residual')
total_due = fields.Float(string="Total Due", compute='_compute_total_due',
copy=False, store=True, help='The total due')
@api.depends('project_id', 'amount_total')
def _compute_invoice_to_date(self):
"""
Computes invoice to date depending on project_id and amount_total
"""
for rec in self:
rec.invoice_to_date = 0
if rec.project_id:
invoice = self.search(
['|', ('state', 'in', ['posted']), ('payment_state', 'in', ['paid']),
('move_type', '=', 'out_invoice'),
('partner_id', '=', rec.partner_id.id),
('project_id', '=', rec.project_id.id)])
for val in invoice:
rec.invoice_to_date = rec.invoice_to_date + val.amount_total
@api.depends('total_progress_billing', 'invoice_to_date')
def _compute_remaining_progress_billing(self):
"""
Computes remaining_progress_billing depending on
total_progress_billing and invoice_to_date
"""
for rec in self:
rec.remaining_progress_billing = rec.total_progress_billing - rec.invoice_to_date
@api.depends('project_id', 'amount_total', 'amount_residual')
def _compute_previously_invoiced(self):
"""
Computes previously_invoice and previously_invoice_due depending
on project_id, amount_total and amount_residual
"""
for rec in self:
rec.previously_invoice = 0
rec.previously_invoice_due = 0
if rec.project_id:
invoice = self.search(['|', ('state', 'in', ['posted']),
('payment_state', 'in', ['paid']),
('move_type', '=', 'out_invoice'),
('partner_id', '=', rec.partner_id.id),
('project_id', '=', rec.project_id.id)])
if len(invoice) == 1:
rec.previously_invoice = 0
if len(invoice) > 1:
rec.previously_invoice = 0
for val in invoice:
if val.id != rec.id:
rec.previously_invoice += val.amount_total
rec.previously_invoice_due += val.amount_residual
@api.depends('amount_total')
def _compute_current_invoiced(self):
"""
Computes current_invoice depending on amount_total
"""
for rec in self:
rec.current_invoice = rec.amount_total
@api.depends('amount_residual')
def _compute_less_paid_amount(self):
"""
Computes less_paid_amount depending on amount_residual
"""
for rec in self:
rec.less_paid_amount = rec.amount_residual
@api.depends('less_paid_amount', 'previously_invoice', 'current_invoice')
def _compute_total_due(self):
"""
Computes total_due depending on less_paid_amount,
previously_invoice and current_invoice
"""
for rec in self:
rec.total_due = rec.previously_invoice_due + rec.less_paid_amount