Slink/sos_sales/models/sos_case_diary_report.py

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")