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.
105 lines
4.0 KiB
105 lines
4.0 KiB
# -*- coding: utf-8 -*-
|
|
###############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Anfas Faisal K (odoo@cybrosys.com)
|
|
#
|
|
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
|
|
# It is forbidden to publish, distribute, sublicense, or sell copies of the
|
|
# Software or modified copies of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
|
|
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
|
|
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
# DEALINGS IN THE SOFTWARE.
|
|
#
|
|
###############################################################################
|
|
from datetime import date
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class RentalPaymentPlan(models.Model):
|
|
"""
|
|
Model for managing rental payment plans associated with fleet rental
|
|
contracts.
|
|
"""
|
|
_name = 'rental.payment.plan'
|
|
_description = 'Rental Payment Plan'
|
|
|
|
contract_id = fields.Many2one(
|
|
'fleet.rental.contract', string='Rental Contract',
|
|
ondelete='cascade')
|
|
invoice_item_id = fields.Many2one('product.product',
|
|
string='Invoice Item', )
|
|
payment_date = fields.Date(string='Payment Date' )
|
|
payment_amount = fields.Float(
|
|
string='Payment Amount',
|
|
help='Amount to be paid based on the invoice item.')
|
|
invoice_id = fields.Many2one('account.move', string='Invoice',
|
|
readonly=True)
|
|
payment_state = fields.Selection(
|
|
[
|
|
('not_paid', 'Not Paid'),
|
|
('in_payment', 'In Payment'),
|
|
('paid', 'Paid'),
|
|
('partial', 'Partially Paid'),
|
|
('reversed', 'Reversed'),
|
|
('invoicing_legacy', 'Invoicing App Legacy'),
|
|
], compute='_compute_payment_state',
|
|
string='Payment State')
|
|
is_invoiced = fields.Boolean(string="Invoice Button", help="Invoiced")
|
|
|
|
@api.depends('invoice_id.payment_state')
|
|
def _compute_payment_state(self):
|
|
"""
|
|
Computes the payment state based on the associated invoice's
|
|
payment state.
|
|
"""
|
|
for record in self:
|
|
if record.invoice_id:
|
|
record.payment_state = record.invoice_id.payment_state
|
|
else:
|
|
record.payment_state = 'not_paid'
|
|
|
|
def action_create_invoice(self):
|
|
"""
|
|
Creates an invoice for the payment plan.
|
|
"""
|
|
self.ensure_one()
|
|
invoice_vals = {
|
|
'partner_id': self.contract_id.customer_id.id,
|
|
'move_type': 'out_invoice',
|
|
'invoice_date': self.payment_date,
|
|
'vehicle_rental_id': self.contract_id.id,
|
|
'invoice_line_ids': [(0, 0, {
|
|
'product_id': self.invoice_item_id.id,
|
|
'name': self.invoice_item_id.name,
|
|
'quantity': 1,
|
|
'price_unit': self.payment_amount,
|
|
})],
|
|
}
|
|
invoice = self.env['account.move'].create(invoice_vals)
|
|
invoice.action_post()
|
|
self.invoice_id = invoice.id
|
|
self.is_invoiced = True
|
|
return invoice
|
|
|
|
@api.model
|
|
def _schedule_auto_invoice_checker(self):
|
|
"""
|
|
Scheduled action to automatically generate invoices for rental payment
|
|
plans where the payment date is today. Searches for payment plans with
|
|
today's date and no associated invoice, and generates invoices for them.
|
|
"""
|
|
today = date.today()
|
|
payment_plans = self.search([
|
|
('payment_date', '=', today),
|
|
('invoice_id', '=', False)
|
|
])
|
|
for plan in payment_plans:
|
|
plan.action_create_invoice()
|
|
|