from odoo import api, fields, models class CrmLead(models.Model): _inherit = "crm.lead" mcs_service_offer = fields.Selection( [ ("revenue_website_sprint", "Revenue Website Sprint"), ("growth_retainer", "Growth Retainer"), ("mvp_launch_sprint", "MVP Launch Sprint"), ("white_label_agency", "White-Label Agency Partnership"), ("other", "Other"), ], string="Service Interest", tracking=True, ) mcs_expected_monthly_revenue = fields.Monetary( string="Expected Monthly Revenue", currency_field="company_currency", tracking=True, ) mcs_one_time_project_value = fields.Monetary( string="One-Time Project Value", currency_field="company_currency", tracking=True, ) mcs_proposal_sent_date = fields.Date(string="Proposal Sent Date", tracking=True) mcs_last_contact_date = fields.Date(string="Last Contact Date", tracking=True) mcs_followup_date = fields.Date(string="Follow-Up Date", tracking=True) mcs_next_action = fields.Char(string="Next Action", tracking=True) mcs_revenue_priority = fields.Selection( [ ("existing_upsell", "Existing Client Upsell"), ("existing_referral", "Existing Client Referral"), ("canadian_client", "Canadian Client"), ("canadian_agency", "Canadian Agency Partnership"), ("warm_network", "Warm Network"), ("high_value_outbound", "High-Value Outbound"), ("india", "India Opportunity"), ("low_ticket", "Smaller Low-Ticket Retainer"), ], string="Revenue Priority", tracking=True, ) mcs_has_next_activity = fields.Boolean( string="Has Next Activity", compute="_compute_mcs_operating_flags", store=True ) mcs_missing_operating_data = fields.Boolean( string="Missing Operating Data", compute="_compute_mcs_operating_flags", store=True ) mcs_operating_notes = fields.Text(string="Operating Notes") @api.depends( "activity_ids", "mcs_next_action", "mcs_followup_date", "date_deadline", "expected_revenue", "mcs_expected_monthly_revenue", "mcs_one_time_project_value", "user_id", "type", "active", "probability", ) def _compute_mcs_operating_flags(self): for lead in self: is_open_opportunity = ( lead.active and lead.type == "opportunity" and lead.probability < 100 ) lead.mcs_has_next_activity = bool( lead.activity_ids or lead.mcs_next_action or lead.mcs_followup_date ) has_value = bool( lead.expected_revenue or lead.mcs_expected_monthly_revenue or lead.mcs_one_time_project_value ) lead.mcs_missing_operating_data = bool( is_open_opportunity and ( not lead.user_id or not lead.date_deadline or not lead.mcs_has_next_activity or not has_value ) ) def action_mcs_schedule_followup(self): todo = self.env.ref("mail.mail_activity_data_todo") today = fields.Date.context_today(self) for lead in self: if lead.activity_ids: continue lead.activity_schedule( todo.id, date_deadline=lead.mcs_followup_date or lead.date_deadline or today, summary=lead.mcs_next_action or "Follow up", user_id=lead.user_id.id or self.env.user.id, ) return True def _cron_mcs_schedule_missing_followups(self): leads = self.search( [ ("type", "=", "opportunity"), ("active", "=", True), ("probability", "<", 100), ("activity_ids", "=", False), ], limit=100, ) leads.action_mcs_schedule_followup()