Slink/sos_inside_sales/models/sos_inside_sales_activities.py

145 lines
6.0 KiB
Python
Executable File

from odoo import models, fields, api
import re
from odoo.exceptions import ValidationError
from datetime import datetime, timedelta
class SosInsideSalesActivities(models.Model):
_name = 'sos_inside_sales_activities'
_description = 'Inside Sales executive activities log'
_rec_name="company_name"
company_name = fields.Char(string="Company Name")
entry_date = fields.Date(string="Date", default=fields.Date.today)
contact_person = fields.Char(string="Contact Person")
designation = fields.Char(string="Designation")
email = fields.Char(string="Email Id")
mobile_number = fields.Char(string="Contact Number")
location = fields.Char(string="Location")
website_url = fields.Char(string="Website URL")
vertical_domain = fields.Selection(
[
('battery_mfg', 'Battery Mfg'),
('cements', 'Cements'),
('data_centre', 'Data Centre'),
('ess', 'ESS'),
('ev', 'EV'),
('hospital', 'Hospital'),
('hotels', 'Hotels'),
('inverter_mfg', 'Inverter Mfg'),
('metal_mfg', 'Metal Mfg'),
('o_and_g', 'O & G'),
('power_distribution', 'Power Distribution'),
('power_generation', 'Power Generation'),
('processing', 'Processing'),
],
string="Domain / Industry"
)
linkedin_profile = fields.Char(string="Linkedin profile")
products = fields.Selection(
[
('BHMS 1.2V', 'BHMS 1.2V'),
('BHMS 2V', 'BHMS 2V'),
('BHMS 12V', 'BHMS 12V'),
('BMS-HV', 'BMS-HV'),
('BMS-LV 100A', 'BMS-LV 100A'),
('BMS-LV 40A', 'BMS-LV 40A'),
('SBMS 55A', 'SBMS 55A'),
('MC 250W', 'MC 250W'),
('HeartTarang', 'HeartTarang')
],
string="Product Interested In",required=True)
source = fields.Selection(
[
('website', 'Website'),
('expo', 'Expo'),
('cold_calls', 'Cold Calls'),
('linkedin', 'Linkedin')
],
string="Source")
expo_name = fields.Char(string="Expo Name")
sales_person = fields.Many2one(
'res.users',
string='Sales Executive',
default=lambda self: self.env.user,
readonly=True
)
line_ids = fields.One2many('sos_inside_sales_activities_line', 'ref_id', string="Action")
week = fields.Char(string="Week", compute="_compute_week", store=True)
reporting_to = fields.Many2one('res.users', string='Reporting To')
@api.depends('entry_date')
def _compute_week(self):
for record in self:
if record.entry_date:
entry_date = record.entry_date
start_of_week = entry_date - timedelta(days=entry_date.weekday()) # Monday
end_of_week = start_of_week + timedelta(days=6) # Sunday
# Determine week number
first_day_of_month = entry_date.replace(day=1)
week_number = ((entry_date - first_day_of_month).days // 7) + 1
# Exclude Saturdays for 2nd and 4th week
if week_number in [2, 4]:
end_of_week = start_of_week + timedelta(days=4) # Friday
record.week = f"{start_of_week.strftime('%d/%m/%Y')} to {end_of_week.strftime('%d/%m/%Y')}"
TARGET_PER_WEEK = 4
@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
if 'sales_person' not in vals:
vals['sales_person'] = self.env.user.id # Set the current user
if 'entry_date' in vals:
entry_date = fields.Date.from_string(vals['entry_date'])
start_of_week = entry_date - timedelta(days=entry_date.weekday()) # Monday
end_of_week = start_of_week + timedelta(days=6) # Sunday
first_day_of_month = entry_date.replace(day=1)
week_number = ((entry_date - first_day_of_month).days // 7) + 1
if week_number in [2, 4]:
end_of_week = start_of_week + timedelta(days=4) # Friday
week_str = f"{start_of_week.strftime('%d/%m/%Y')} to {end_of_week.strftime('%d/%m/%Y')}"
vals['week'] = week_str # Assign computed week to vals before record creation
sos_lines = self.env['sos_target_tracker'].search([
('week', '=', week_str),
('inside_sales_executive', '=', vals.get('sales_person'))
])
new_week_entry = sos_lines.weekly_entries_count + 1
if new_week_entry < self.TARGET_PER_WEEK:
remaining = self.TARGET_PER_WEEK - new_week_entry
weekly_status = f"{remaining} more to achieve this week's target."
elif new_week_entry == self.TARGET_PER_WEEK:
weekly_status = "Target achieved for this week!"
else:
weekly_status = "Well performed! Exceeded weekly target!"
if sos_lines:
sos_lines.write({'weekly_entries_count': new_week_entry,'entry_date':self.entry_date,
'weekly_status':weekly_status})
else:
self.env['sos_target_tracker'].create({
'entry_date': vals['entry_date'],
'inside_sales_executive': vals['sales_person'],
'week': week_str,
'weekly_entries_count':1
})
record = super(SosInsideSalesActivities, self).create(vals)
return record
class sos_inside_sales_activities_lines(models.Model):
_name = 'sos_inside_sales_activities_line'
_description = 'Inside Sales executive activities log lines'
ref_id = fields.Many2one('sos_inside_sales_activities', ondelete="cascade")
action_date = fields.Date(string="Action Date")
remarks = fields.Text(string="Remarks")