140 lines
5.7 KiB
Python
Executable File
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
|
|
}
|