1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/sale_renting_crm/models/crm_lead.py
2024-12-10 09:04:09 +07:00

102 lines
4.6 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models, _
from odoo.osv import expression
class CrmLead(models.Model):
_inherit = "crm.lead"
rental_quotation_count = fields.Integer(
compute="_compute_rental_count", string="Number of Rental Quotations")
rental_amount_total = fields.Monetary(
compute='_compute_rental_count', string="Sum of Rental Orders",
help="Untaxed Total of Confirmed Orders", currency_field='company_currency')
rental_order_count = fields.Integer(
compute='_compute_rental_count', string="Number of Rental Orders")
rental_order_ids = fields.One2many(
"sale.order", "opportunity_id", string="Rental Orders",
domain=[("is_rental_order", "=", True)])
def _compute_rental_count(self):
for lead in self:
total = 0.0
company_currency = lead.company_currency or self.env.company.currency_id
sale_orders = lead.rental_order_ids.filtered(lambda l: l.state == 'sale')
for order in sale_orders:
total += order.currency_id._convert(
order.amount_untaxed, company_currency, order.company_id, order.date_order or fields.Date.today())
lead.rental_quotation_count = len(lead.rental_order_ids.filtered(lambda l: l.state in ["draft", "sent"]))
lead.rental_order_count = len(sale_orders)
lead.rental_amount_total = total
def _get_action_view_sale_quotation_domain(self):
# over-ride to exclude rental quotations linked to lead
action_lead_quotation_domain = super()._get_action_view_sale_quotation_domain()
return expression.AND([action_lead_quotation_domain, [("is_rental_order", "=", False)]])
def _get_lead_quotation_domain(self):
# over-ride to exclude rental quotations linked to lead
lead_quotation_domain = super()._get_lead_quotation_domain()
return expression.AND([lead_quotation_domain, [("is_rental_order", "=", False)]])
def _get_lead_sale_order_domain(self):
# over-ride to exclude rental sale orders linked to lead
lead_sale_order_domain = super()._get_lead_sale_order_domain()
return expression.AND([lead_sale_order_domain, [("is_rental_order", "=", False)]])
def action_rental_quotations_new(self):
if not self.partner_id:
return self.env["ir.actions.actions"]._for_xml_id("sale_renting_crm.crm_lead_to_rental_action")
return self.action_new_rental_quotation()
def _get_action_rental_context(self):
self.ensure_one()
rental_quotation_context = {
"search_default_opportunity_id": self.id,
"default_opportunity_id": self.id,
"default_partner_id": self.partner_id.id,
"default_team_id": self.team_id.id,
"default_campaign_id": self.campaign_id.id,
"default_medium_id": self.medium_id.id,
"default_origin": self.name,
"default_source_id": self.source_id.id,
"default_company_id": self.company_id.id or self.env.company.id,
"in_rental_app": True,
}
if self.user_id:
rental_quotation_context['default_user_id'] = self.user_id.id
return rental_quotation_context
def action_new_rental_quotation(self):
return {
"type": "ir.actions.act_window",
"name": _("Rental Orders"),
"res_model": "sale.order",
"view_mode": "form",
"views": [(self.env.ref("sale_renting.rental_order_primary_form_view").id, "form")],
"context": self._get_action_rental_context(),
}
def action_view_rental_quotation(self):
action = self.env["ir.actions.actions"]._for_xml_id("sale_renting.rental_order_action")
action.update({
'context': self._get_action_rental_context(),
'domain': [("opportunity_id", "=", self.id), ('is_rental_order', '=', True)]
})
if not self._context.get('is_rental_order'):
action['domain'].append(("state", "in", ["draft", "sent"]))
orders = self.rental_order_ids.filtered(lambda l: l.state in ("draft", "sent"))
else:
action['domain'].append(("state", "=", "sale"))
orders = self.rental_order_ids.filtered(lambda l: l.state == "sale")
if len(orders) == 1:
action.update({
'views': [(self.env.ref("sale_renting.rental_order_primary_form_view").id, "form")],
'res_id': orders.id,
})
return action