Slink/sos_sales/report/spenco_summary_absract.py

140 lines
5.7 KiB
Python
Executable File

from odoo import models, api
from odoo.exceptions import UserError
from datetime import date, timedelta
from calendar import month_name
class WeekSummaryReport(models.AbstractModel):
_name = 'report.sos_sales.report_week_summary'
_description = 'Weekly Summary Report'
def compute_aggregated_data(self, model_name, domain, status_map):
records = self.env[model_name].search(domain)
result = {
'Opening': {'P': {'count': 0, 'value': 0.0}, 'E': {'count': 0, 'value': 0.0}, 'N': {'count': 0, 'value': 0.0}, 'CO': {'count': 0, 'value': 0.0}, 'EOV': {'count': 0,'value': 0.0}},
'Downgrade': {'P': {'count': 0, 'value': 0.0}, 'E': {'count': 0, 'value': 0.0}, 'N': {'count': 0, 'value': 0.0}, 'CO': {'count': 0, 'value': 0.0}, 'EOV': {'count': 0,'value': 0.0}},
'Upgrade': {'P': {'count': 0, 'value': 0.0}, 'E': {'count': 0, 'value': 0.0}, 'N': {'count': 0, 'value': 0.0}, 'CO': {'count': 0, 'value': 0.0}, 'EOV': {'count': 0,'value': 0.0}},
'New': {'P': {'count': 0, 'value': 0.0}, 'E': {'count': 0, 'value': 0.0}, 'N': {'count': 0, 'value': 0.0}, 'CO': {'count': 0, 'value': 0.0}, 'EOV': {'count': 0,'value': 0.0}},
'Closing': {'P': {'count': 0, 'value': 0.0}, 'E': {'count': 0, 'value': 0.0}, 'N': {'count': 0, 'value': 0.0}, 'CO': {'count': 0, 'value': 0.0}, 'EOV': {'count': 0,'value': 0.0}},
}
for rec in records:
status = rec.spenco_status
if status not in status_map:
continue
key = status_map[status]
for stage in ['Opening', 'Downgrade', 'Upgrade', 'New']:
count = getattr(rec, f'{stage.lower()}_cases_count', 0) or 0
value = getattr(rec, f'{stage.lower()}_cases_value', 0.0) or 0.0
result[stage][key]['count'] += count
result[stage][key]['value'] += value
result[stage]['EOV']['count'] += count
result[stage]['EOV']['value'] += value
for key in ['P', 'E', 'N', 'CO','EOV']:
result['Closing'][key]['count'] = (
result['Opening'][key]['count'] -
result['Downgrade'][key]['count'] -
result['Upgrade'][key]['count'] +
result['New'][key]['count']
)
result['Closing'][key]['value'] = round(
result['Opening'][key]['value'] -
result['Downgrade'][key]['value'] -
result['Upgrade'][key]['value'] +
result['New'][key]['value'],
2
)
return result
@api.model
def _get_report_values(self, docids, data=None):
# Validate input data
if not data:
raise UserError("No filter data provided for the report.")
sales_person_id = data.get('sales_person_id')
week_number = data.get('week_number')
# Calculate week range
current_date = date.today()
start_of_week = current_date - timedelta(days=current_date.weekday())
end_of_week = start_of_week + timedelta(days=5)
# Calculate month range
month_number = current_date.strftime('%B')
# Calculate quarter range
month = current_date.month
year = current_date.year
if 4 <= month <= 6:
quarter_number = "Q1"
elif 7 <= month <= 9:
quarter_number = "Q2"
elif 10 <= month <= 12:
quarter_number = "Q3"
else:
quarter_number = "Q4"
# Calculate year range
if month >= 4:
year_number = f"{year}-{year + 1}"
else:
year_number = f"{year - 1}-{year}"
sales_person_name = self.env['res.users'].browse(sales_person_id).name if sales_person_id else 'All Sales Persons'
# Build domain
domain = [('week_number', '=', week_number)]
if sales_person_id:
domain.append(('sales_executive', '=', sales_person_id))
# Aggregate data by stage and spenco_status
status_map = {
'Prospects': 'P',
'Engaged': 'E',
'Negotiation': 'N',
'Commercial Order': 'CO'
}
#week wise start
def build_domain(field_name, value):
domain = [(field_name, '=', value)]
if sales_person_id:
domain.append(('sales_executive', '=', sales_person_id))
return domain
aggregated_data_week = self.compute_aggregated_data(
'sos_spenco_summary_week_wise',
build_domain('week_number', week_number),
status_map
)
aggregated_data_month = self.compute_aggregated_data(
'sos_spenco_summary_month_wise',
build_domain('month_number', month_number),
status_map
)
aggregated_data_quarter = self.compute_aggregated_data(
'sos_spenco_summary_quarter_wise',
build_domain('quarter_number', quarter_number),
status_map
)
aggregated_data_year = self.compute_aggregated_data(
'sos_spenco_summary_year_wise',
build_domain('year', year_number),
status_map
)
# Return values for the report template
return {
'doc_ids': docids or [],
'doc_model': 'sos_spenco_summary_week_wise',
'aggregated_data': aggregated_data_week,
'aggregated_data_month': aggregated_data_month,
'aggregated_data_quarter': aggregated_data_quarter,
'aggregated_data_year':aggregated_data_year,
'week_number': week_number,
'month_number':month_number,
'quarter_number':quarter_number,
'year_number':year_number,
'sales_person_name': sales_person_name
}