hamid hamdon
hamid hamdon

Reputation: 1

odoo Crm modification

i am trying to custom the crm module in odoo 16 where a user can't save a lead/opportunity unless he schedules a certain amount of activities (for exemple 3) the activity logique is working where you can schedule activities by clicking a button and a window will appear where we can schedule activities

here is the saving function :


class CrmLead2_0ActivityScheduler(models.TransientModel):
    _name = 'crm.lead.activity.scheduler'
    _description = 'CRM 2.0 Activity Scheduler'

    lead_id = fields.Many2one('crm.lead', string='Lead', required=True)
    activity_lines = fields.One2many('crm.lead.activity.scheduler.line', 'scheduler_id', string='Activities')

    def action_schedule_activities(self):
        activities = []
        for line in self.activity_lines:
            activities.append({
                'activity_type': line.activity_type,
                'summary': line.summary,
                'start_datetime': line.start_datetime,
                'duration': line.duration,
            })
        self.lead_id.create_activities_from_scheduler(activities)
        return {'type': 'ir.actions.act_window_close'}

fields for the activity :


class CrmLead2_0ActivitySchedulerLine(models.TransientModel):
    _name = 'crm.lead.activity.scheduler.line'
    _description = 'CRM 2.0 Activity Scheduler Line'

    scheduler_id = fields.Many2one('crm.lead.activity.scheduler', string='Scheduler')
    activity_type = fields.Char(string='Activity Type', required=True)
    summary = fields.Char(string='Summary', required=True)
    start_datetime = fields.Datetime(string='Due Date', required=True)
    duration = fields.Float(string='Duration (Hours)', required=True)

main class of lead :

from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
from datetime import timedelta

class CrmLead2_0(models.Model):

    _inherit = 'crm.lead'  # Inherit from the original CRM model
    
    activity_ids = fields.One2many('mail.activity', 'res_id', string='Activities')
    scheduled_activities = fields.Integer(string='Scheduled Activities', compute='_compute_scheduled_activities', store=True, readonly=True)
    activities_required = fields.Integer(string='Activities Required', default=3, readonly=True)
    
    # Compute the number of scheduled activities
    @api.depends('activity_ids')
    def _compute_scheduled_activities(self):
        for lead in self:
            lead.scheduled_activities = len(lead.activity_ids)

            
    # Action to open the activity scheduling form
    def action_open_activity_scheduler(self):
        return {
            'type': 'ir.actions.act_window',
            'name': 'Schedule Activities',
            'res_model': 'crm.lead.activity.scheduler',
            'view_mode': 'form',
            'target': 'new',
            'context': {'default_lead_id': self.id,},
        }

    # Method to create activities from the scheduler
    def create_activities_from_scheduler(self, activities):
        for activity in activities:
            activity_type = self.env['mail.activity.type'].search([('name', '=', activity['activity_type'])], limit=1)
            if not activity_type:
                activity_type = self.env['mail.activity.type'].create({'name': activity['activity_type']})


            #datetime of the start of the activity
            start_date = activity['start_datetime']


            #datetime of the end of the activity 
            duration = activity.get('duration', 1)
            stop_datetime = start_date + timedelta(hours=duration)
            stop_date = stop_datetime.date()

            mail_activity = self.env['mail.activity'].create({
                'activity_type_id': activity_type.id,
                'summary': activity['summary'],
                'date_deadline': stop_date,
                'user_id': self.user_id.id,
                'res_id': self.id,
                'res_model_id': self.env['ir.model']._get('crm.lead').id,
            })

            self.env['calendar.event'].create({
                'activity_ids': [(4, mail_activity.id)],
                'name': activity['summary'],
                'start': start_date,
                'stop': stop_datetime,
                'duration': activity['duration'],
                'user_id': self.user_id.id,
            })

here is how i check for the activity count :

@api.constrains('scheduled_activities')
    def _check_activities_condition(self):
        if not self.env.context.get('skip_activity_validation'):
            for lead in self:
                if lead.scheduled_activities < lead.activities_required:
                    raise ValidationError(_("You must schedule at least %s activities before saving this lead.") % lead.activities_required)
        

so i tried but whenever i click on the button "Schedule Activities" the error that i should schedule activities appears before even scheduling them any ideas how can i do that :

i tried to override create and write methods still not working

Upvotes: 0

Views: 20

Answers (0)

Related Questions