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.
 
 
 
 
 

265 lines
13 KiB

# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Jumana jabin MP (<https://www.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/>.
#
#############################################################################
import base64
from datetime import date
from odoo import fields, models
class CancellationRequest(models.Model):
"""Created new model to add new fields and function"""
_name = "cancellation.request"
_description = "Cancellation Request"
_inherit = "mail.thread"
_rec_name = 'vehicle_id'
vehicle_id = fields.Many2one('fleet.vehicle',
string="Vehicle", help="Choose vehicle "
"inorder to cancel "
"subscription",
required=True)
date = fields.Date(string="Cancellation Date", default=fields.Date.today(),
help="Date for cancellation of vehicle")
customer_id = fields.Many2one('res.partner', string="Customer",
help="Choose Customer for the cancellation "
"of vehicle", required=True)
reason = fields.Char(string="Cancellation Reason", help="Describe the "
"reason for "
"cancellation")
state = fields.Selection(selection=[('draft', 'Draft'),
('to_approve', 'To Approve'),
('approved', 'Approved')],
string='State', default='draft',
help="States of cancellation subscription")
def action_request(self):
"""Change state to to_approve"""
self.write({'state': 'to_approve'})
def action_approve(self):
"""Handle cancellation approval by manager.
This method handles the approval process for a cancellation
request in a vehicle subscription system.
It updates the cancellation state, generates invoices or refunds
based on the payment status, and sends notifications to the customer."""
self.write({'state': 'approved'})
subscription = self.env['fleet.subscription'].search(
[('vehicle_id', '=', self.vehicle_id.id),
('customer_id', '=', self.customer_id.id)])
invoice = subscription.sale_id.invoice_ids
multy_invoice = subscription.invoice_ids
product_template_id = self.env.ref(
'vehicle_subscription.product_template_vehicle_subscription_form').id
product_id = self.env['product.product'].search(
[('product_tmpl_id', '=', product_template_id)], limit=1)
if subscription.duration != 0:
per_day_price = subscription.sale_id.amount_untaxed / subscription.duration
else:
per_day_price = 0
if isinstance(self.date, date) and isinstance(subscription.start_date,
date):
invoice_duration = (self.date - subscription.start_date).days
else:
invoice_duration = 0
email_template = self.env.ref(
'vehicle_subscription.cancellation_request_mail')
template_approved = self.env.ref(
'vehicle_subscription.cancellation_approved')
refund_approved = self.env.ref(
'vehicle_subscription.cancellation_request_refund_mail')
uptodate_price = round(per_day_price * invoice_duration, 2)
paid_amount = self.env['account.move'].search(
[('id', 'in', subscription.invoice_ids.ids),
('payment_state', 'in', ['paid', 'partial'])]).mapped(
'amount_untaxed_signed')
if paid_amount:
if sum(paid_amount) == uptodate_price:
subscription.state = 'cancel'
email_values = {
'email_to': self.customer_id.email,
'email_from': self.env.user.email,
}
template_approved.send_mail(self.id, email_values=email_values,
force_send=True)
elif sum(paid_amount) < uptodate_price:
if len(invoice) == 1 or len(multy_invoice) == 1:
invoice.button_cancel()
generate_invoice = self.env['account.move'].sudo().create({
'move_type': 'out_invoice',
'partner_id': self.customer_id.id,
'invoice_date': self.date,
'invoice_line_ids': fields.Command.create([{
'product_id': product_id.id,
'name': self.vehicle_id.name,
'price_unit': (per_day_price * invoice_duration) - sum(
paid_amount),
}])
})
generate_invoice.action_post()
data_record = base64.b64encode(
self.env['ir.actions.report'].sudo()._render_qweb_pdf(
"account.account_invoices", generate_invoice.ids)[
0])
ir_values = {
'name': 'Invoice',
'type': 'binary',
'datas': data_record,
'store_fname': 'invoice.pdf',
'mimetype': 'application/pdf',
'res_model': 'account.move',
'res_id': generate_invoice.id,
}
invoice_report_attachment_id = self.env[
'ir.attachment'].sudo().create(ir_values)
email_values = {
'email_to': self.customer_id.email,
'email_from': self.env.user.email,
'attachment_ids': [invoice_report_attachment_id.id]
}
email_template.send_mail(self.id,
email_values=email_values,
force_send=True)
email_template.attachment_ids = []
subscription.invoice_ids = fields.Command.link(
generate_invoice.id)
subscription.sale_id.write({
'invoice_ids': fields.Command.link(generate_invoice.id)
})
else:
for invoice_id in multy_invoice:
invoice = self.env['account.move'].browse(
invoice_id.id)
invoice.button_cancel()
generate_invoice = self.env['account.move'].sudo().create({
'move_type': 'out_invoice',
'partner_id': self.customer_id.id,
'invoice_date': self.date,
'invoice_line_ids': fields.Command.create([{
'product_id': product_id.id,
'name': self.vehicle_id.name,
'price_unit': (per_day_price * invoice_duration) - sum(
paid_amount),
}])
})
generate_invoice.action_post()
data_record = base64.b64encode(
self.env['ir.actions.report'].sudo()._render_qweb_pdf(
"account.account_invoices", generate_invoice.ids)[
0])
ir_values = {
'name': 'Invoice',
'type': 'binary',
'datas': data_record,
'store_fname': 'invoice.pdf',
'mimetype': 'application/pdf',
'res_model': 'account.move',
'res_id': generate_invoice.id,
}
invoice_report_attachment_id = self.env[
'ir.attachment'].sudo().create(ir_values)
email_values = {
'email_to': self.customer_id.email,
'email_from': self.env.user.email,
'attachment_ids': [invoice_report_attachment_id.id]
}
email_template.send_mail(self.id,
email_values=email_values,
force_send=True)
email_template.attachment_ids = []
subscription.invoice_ids = fields.Command.link(
generate_invoice.id)
subscription.sale_id.write({
'invoice_ids': fields.Command.link(generate_invoice.id)
})
else:
generate_refund = self.env['account.move'].sudo().create({
'move_type': 'out_refund',
'invoice_date': fields.Date.today(),
'partner_id': self.customer_id.id,
'invoice_line_ids': fields.Command.create([{
'product_id': product_id.id,
'name': self.vehicle_id.name,
'price_unit': (sum(paid_amount) - uptodate_price)
}])
})
generate_refund.action_post()
subscription.refund_id = generate_refund
data_record = base64.b64encode(
self.env['ir.actions.report'].sudo()._render_qweb_pdf(
"account.account_invoices", generate_refund.ids)[0])
ir_values = {
'name': 'Invoice',
'type': 'binary',
'datas': data_record,
'store_fname': 'invoice.pdf',
'mimetype': 'application/pdf',
'res_model': 'account.move',
'res_id': generate_refund.id,
}
invoice_report_attachment_id = self.env[
'ir.attachment'].sudo().create(ir_values)
email_values = {
'email_to': self.customer_id.email,
'email_from': self.env.user.email,
'attachment_ids': [invoice_report_attachment_id.id]
}
refund_approved.send_mail(self.id, email_values=email_values,
force_send=True)
refund_approved.attachment_ids = fields.Command.clear()
else:
invoice.button_cancel()
generate_invoice = self.env['account.move'].sudo().create({
'move_type': 'out_invoice',
'partner_id': self.customer_id.id,
'invoice_date': self.date,
'invoice_line_ids': [fields.Command.create({
'product_id': product_id.id,
'name': self.vehicle_id.name,
'price_unit': per_day_price * invoice_duration,
})]
})
generate_invoice.action_post()
data_record = base64.b64encode(
self.env['ir.actions.report'].sudo()._render_qweb_pdf(
"account.account_invoices", generate_invoice.ids)[0])
ir_values = {
'name': 'Invoice',
'type': 'binary',
'datas': data_record,
'store_fname': 'invoice.pdf',
'mimetype': 'application/pdf',
'res_model': 'account.move',
'res_id': generate_invoice.id,
}
invoice_report_attachment_id = self.env[
'ir.attachment'].sudo().create(ir_values)
email_values = {
'email_to': self.customer_id.email,
'email_from': self.env.user.email,
'attachment_ids': [invoice_report_attachment_id.id]
}
email_template.send_mail(self.id, email_values=email_values,
force_send=True)
email_template.attachment_ids = []
subscription.invoice_ids = fields.Command.link(generate_invoice.id)
subscription.sale_id.write({
'invoice_ids': fields.Command.link(generate_invoice.id)
})