You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
9.6 KiB
185 lines
9.6 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Gayathri V (odoo@cybrosys.com)
|
|
#
|
|
# You can modify it under the terms of the GNU AFFERO
|
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
# (AGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#############################################################################
|
|
"""Module Containing CRM lead and CheckList History Models"""
|
|
from datetime import datetime
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class CrmLead(models.Model):
|
|
"""class for checklist history models"""
|
|
_inherit = "crm.lead"
|
|
|
|
check_list_ids = fields.Many2many('stage.check.list',
|
|
domain="['&',"
|
|
" ('stage_id', '=', stage_id),"
|
|
"'|',('sales_team_id','=',"
|
|
"team_id),"
|
|
"('sales_team_id', '=', False)]",
|
|
string="Checklist", tracking=True,
|
|
help="Many2many field representing a"
|
|
" checklist associated with stage.")
|
|
check_stage_ids = fields.One2many(
|
|
related="stage_id.stage_check_list_lines_ids",
|
|
help="One2many field related to the "
|
|
"stage's check list lines.")
|
|
|
|
@api.depends('check_list_ids')
|
|
def checklist_progress(self):
|
|
"""Method for Computing CheckList progress value based on selected
|
|
checklist items """
|
|
for rec in self:
|
|
total_len = rec.env['stage.check.list']. \
|
|
search_count(['&', ('stage_id', '=', rec.stage_id.id), '|',
|
|
('sales_team_id', '=', rec.team_id.id),
|
|
('sales_team_id', '=', False)])
|
|
if total_len != 0:
|
|
check_list_len = len(rec.check_list_ids.filtered(
|
|
lambda r: r.sales_team_id == rec.team_id or not
|
|
r.sales_team_id))
|
|
rec.checklist_progress = (check_list_len * 100) / total_len
|
|
else:
|
|
rec.checklist_progress = 0
|
|
|
|
checklist_progress = fields.Float(compute=checklist_progress,
|
|
string='Progress',
|
|
default=0.0)
|
|
check_list_history_ids = fields.One2many('crm.lead.check.history',
|
|
'lead_id',
|
|
string="History", readonly=True)
|
|
|
|
def write(self, vals_set):
|
|
"""Super the write method for data validation.Here we check
|
|
Progression and regression of stages and based on checklist
|
|
completion stage progression can be blocked from here """
|
|
if 'stage_id' in vals_set.keys():
|
|
new_stage_id = self.env['crm.stage'].browse([vals_set['stage_id']])
|
|
if new_stage_id \
|
|
and self.stage_id.sequence < new_stage_id.sequence \
|
|
and not self.stage_id.is_pre_checking \
|
|
and self.stage_id.stage_check_list_lines_ids \
|
|
and int(self.checklist_progress) != 100 \
|
|
and not self.env.user. \
|
|
has_group('crm_check_approve_limiter.'
|
|
'crm_check_approve_manager'):
|
|
raise ValidationError(_(
|
|
"You cannot move this case forward until "
|
|
"all the check list items are done for "
|
|
"this "
|
|
" stage."))
|
|
self.check_list_ids = False
|
|
for item in self.stage_id.stage_check_list_lines_ids:
|
|
if item.is_stage_recover:
|
|
history = self.check_list_history_ids.search([(
|
|
'check_item_id', '=', item.id)], order='id desc',
|
|
limit=1) or False
|
|
if history and history.list_action == 'complete' \
|
|
and item not in self.check_list_ids:
|
|
self.check_list_ids += item
|
|
if 'check_list_ids' in vals_set.keys():
|
|
group_check = self.env.user.has_group('crm_check_approve_limiter.crm_check_approve_manager')
|
|
user_groups = self.env.user.groups_id
|
|
complete_operations = []
|
|
notcomplete_operations = []
|
|
for operation in vals_set['check_list_ids']:
|
|
if operation[0] == 4: # Add operation
|
|
complete_operations.append(operation[1])
|
|
elif operation[0] == 3: # Remove operation
|
|
notcomplete_operations.append(operation[1])
|
|
new_complete_ids = self.env['stage.check.list'].search([('id', 'in', complete_operations)])
|
|
new_notcomplete_ids = self.env['stage.check.list'].search([('id', 'in', notcomplete_operations)])
|
|
for ch_lst in new_complete_ids:
|
|
if (ch_lst.approve_groups_ids and not ch_lst.approve_groups_ids
|
|
.filtered(lambda f: f in user_groups) and
|
|
not group_check):
|
|
grp_string_t = '\n'.join(
|
|
map(str, ch_lst.approve_groups_ids.
|
|
mapped('full_name')))
|
|
raise ValidationError(f'Only the below specified group'
|
|
f' members can complete this task'
|
|
f' : {grp_string_t}')
|
|
for ch_lst in new_notcomplete_ids:
|
|
if (ch_lst.approve_groups_ids and not ch_lst.approve_groups_ids
|
|
.filtered(lambda f: f in user_groups) and
|
|
not group_check):
|
|
grp_string_t = '\n'.join(
|
|
map(str, ch_lst.approve_groups_ids.
|
|
mapped('full_name')))
|
|
raise ValidationError(f'Only the below specified group'
|
|
f' members can complete this task'
|
|
f' : {grp_string_t}')
|
|
if 'stage_id' not in vals_set.keys() and new_complete_ids:
|
|
for c_item in new_complete_ids:
|
|
vals = {
|
|
'lead_id': self.id,
|
|
'check_item_id': c_item.id,
|
|
'list_action': 'complete',
|
|
'change_date': datetime.now(),
|
|
'user_id': self.env.user.id,
|
|
'stage_id': self.stage_id.id
|
|
}
|
|
self.env['crm.lead.check.history'].sudo().create(vals)
|
|
if 'stage_id' not in vals_set.keys() and new_notcomplete_ids:
|
|
for c_item in new_notcomplete_ids:
|
|
vals = {
|
|
'lead_id': self.id,
|
|
'check_item_id': c_item.id,
|
|
'list_action': 'not_complete',
|
|
'change_date': datetime.now(),
|
|
'user_id': self.env.user.id,
|
|
'stage_id': self.stage_id.id
|
|
}
|
|
self.env['crm.lead.check.history'].sudo().create(vals)
|
|
res = super().write(vals_set)
|
|
return res
|
|
|
|
@api.onchange('stage_id')
|
|
def _onchange_state_id(self):
|
|
"""It performs validation checks and updates the 'check_list_ids'
|
|
field. """
|
|
old_stage_id = self._origin.stage_id
|
|
if old_stage_id.sequence < self.stage_id.sequence \
|
|
and not old_stage_id.is_pre_checking \
|
|
and old_stage_id.stage_check_list_lines_ids \
|
|
and int(self.checklist_progress) != 100 and not self.env.user. \
|
|
has_group('crm_check_approve_limiter.'
|
|
'crm_check_approve_manager'):
|
|
raise ValidationError(_("You cannot move this case forward until "
|
|
"all the check list items are done for"
|
|
" this stage."))
|
|
if old_stage_id.sequence > self.stage_id.sequence \
|
|
and self.stage_id.is_disable_regress and not self.env.user. \
|
|
has_group('crm_check_approve_limiter.'
|
|
'crm_check_approve_manager'):
|
|
raise ValidationError(_("Regression to the selected stage is "
|
|
"blocked. "
|
|
"Please contact Administrators for "
|
|
"required permission"))
|
|
self.check_list_ids = False
|
|
for item in self.stage_id.stage_check_list_lines_ids:
|
|
if item.is_stage_recover:
|
|
history = self.check_list_history_ids.search([(
|
|
'check_item_id', '=', item.id)], order='id desc',
|
|
limit=1) or False
|
|
if history and history.list_action == 'complete' and item \
|
|
not in self.check_list_ids:
|
|
self.check_list_ids += item
|
|
|