145 lines
6.0 KiB
Python
Executable File
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") |