107 lines
4.9 KiB
Python
Executable File
107 lines
4.9 KiB
Python
Executable File
from odoo import models, fields, api
|
|
|
|
class SosCaseDiaryReport(models.Model):
|
|
_name = 'sos_case_diary_report'
|
|
_description = 'Case Diary Report'
|
|
|
|
customer_name = fields.Many2one('sos_case_diary', string="Customer Name")
|
|
action_plan_date = fields.Date(string="Action Plan Date")
|
|
currency_id = fields.Many2one('res.currency', string='Currency')
|
|
current_state_value = fields.Monetary(currency_field='currency_id',string="Value(In Lakhs)")
|
|
action_plan = fields.Text(string="Action Plan")
|
|
notes = fields.Text(string="Remarks")
|
|
spenco_status = fields.Selection([('Suspects','Suspects'),('Prospects','Prospects'),('Engaged','Engaged'),('Negotiation','Negotiation'),('Commercial Order','Commercial Order')], string='Status')
|
|
status_changed_on = fields.Date(string="Status Changed On")
|
|
spenco_summary = fields.Text(string="SPENCO Summary")
|
|
reporting_to = fields.Many2one('res.users', string='Reporting To')
|
|
sales_person = fields.Many2one('res.users', string='Sales Executive')
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
create_uid = vals.get('create_uid', self.env.uid)
|
|
create_user = self.env['res.users'].browse(create_uid)
|
|
vals['reporting_to'] = create_user.reporting_to.id
|
|
return super(SosCaseDiaryReport, self).create(vals)
|
|
@api.model
|
|
def action_generate_report(self, from_date, to_date, sales_person_id=None, customer=None):
|
|
self.search([]).unlink()
|
|
domain = []
|
|
if customer:
|
|
domain.append(('ref_id.customer_name', '=', customer.customer_name))
|
|
if from_date:
|
|
domain.append(('status_changed_on', '>=', from_date))
|
|
if to_date:
|
|
domain.append(('status_changed_on', '<=', to_date))
|
|
if sales_person_id:
|
|
domain.append(('ref_id.sales_person', '=', sales_person_id))
|
|
|
|
if not domain:
|
|
sos_lines = self.env['sos_case_diary_line'].search([], order='id desc')
|
|
else:
|
|
sos_lines = self.env['sos_case_diary_line'].search(domain, order='id desc')
|
|
|
|
if sos_lines:
|
|
# Sort sos_lines by sales_person name to ensure proper grouping
|
|
sos_lines = sorted(sos_lines, key=lambda l: l.ref_id.sales_person.name if l.ref_id.sales_person else '')
|
|
|
|
created_records = []
|
|
spenco_summary_data = {
|
|
'Suspects': {'count': 0, 'total_value': 0},
|
|
'Prospects': {'count': 0, 'total_value': 0},
|
|
'Engaged': {'count': 0, 'total_value': 0},
|
|
'Negotiation': {'count': 0, 'total_value': 0},
|
|
'Commercial Order': {'count': 0, 'total_value': 0},
|
|
}
|
|
latest_lines = []
|
|
|
|
for line in sos_lines:
|
|
ref_id = line.ref_id.id
|
|
if ref_id not in latest_lines:
|
|
latest_lines.append(ref_id)
|
|
|
|
if line.spenco_status in spenco_summary_data:
|
|
spenco_summary_data[line.spenco_status]['count'] += 1
|
|
spenco_summary_data[line.spenco_status]['total_value'] += line.current_state_value or 0
|
|
|
|
record = self.create({
|
|
'customer_name': line.ref_id.id,
|
|
'sales_person': line.ref_id.sales_person.id,
|
|
'action_plan_date': line.action_plan_date,
|
|
'current_state_value': line.current_state_value,
|
|
'action_plan': line.action_plan,
|
|
'notes': line.notes,
|
|
'spenco_status': line.spenco_status,
|
|
'status_changed_on': line.status_changed_on,
|
|
})
|
|
created_records.append(record.id)
|
|
|
|
# Prepare summary text for the first record
|
|
summary_text = "\n".join(
|
|
f"{status}: Count = {data['count']}, Total Value = {data['total_value']}"
|
|
for status, data in spenco_summary_data.items()
|
|
)
|
|
|
|
if created_records:
|
|
self.browse(created_records[0]).write({'spenco_summary': summary_text})
|
|
|
|
return self.env.ref('sos_sales.action_case_diary_report').report_action(self.browse(created_records))
|
|
|
|
else:
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'message': "No Records Found",
|
|
'type': 'danger',
|
|
'sticky': False
|
|
}
|
|
}
|
|
|
|
class SosCaseDiaryReportSummary(models.Model):
|
|
_name = 'sos_case_diary_report_summary'
|
|
_description = 'Case Diary Report Summary'
|
|
|
|
session_id = fields.Char(string="Session ID", index=True, required=True)
|
|
status = fields.Selection([('Suspects','Suspects'),('Prospects','Prospects'),('Engaged','Engaged'),('Negotiation','Negotiation'),('Commercial Order','Commercial Order')], string='Status')
|
|
count = fields.Integer(string="Count")
|