'required|min_length[2]|max_length[255]', 'email' => 'required|valid_email|max_length[255]', 'phone' => 'required|min_length[10]|max_length[20]', 'status' => 'in_list[New,Potential,Prospects,Non prospects]', ]; protected $validationMessages = [ 'company_name' => [ 'required' => 'Company name is required', ], 'email' => [ 'required' => 'Email is required', 'valid_email' => 'Please provide a valid email address', ], 'phone' => [ 'required' => 'Phone number is required', ], ]; protected $skipValidation = false; /** * Get lead with assigned user details */ public function getLeadWithUser($leadId) { return $this->select('actual_leads.*, user_profiles.username as assigned_to_name, user_profiles.email as assigned_to_email') ->join('user_profiles', 'user_profiles.id = actual_leads.assigned_to', 'left') ->where('actual_leads.lead_id', $leadId) ->first(); } /** * Get all leads with pagination and filters */ public function getLeadsWithFilters($filters = [], $limit = 10, $offset = 0) { $builder = $this->select('actual_leads.*, user_profiles.username as assigned_to_name') ->join('user_profiles', 'user_profiles.id = actual_leads.assigned_to', 'left'); if (!empty($filters['status'])) { $builder->where('actual_leads.status', $filters['status']); } if (!empty($filters['assigned_to'])) { $builder->where('actual_leads.assigned_to', $filters['assigned_to']); } if (!empty($filters['search'])) { $builder->groupStart() ->like('actual_leads.company_name', $filters['search']) ->orLike('actual_leads.email', $filters['search']) ->orLike('actual_leads.phone', $filters['search']) ->groupEnd(); } return [ 'data' => $builder->limit($limit, $offset)->findAll(), 'total' => $builder->countAllResults(false) ]; } /** * Get lead with all related data (contacts, activities, notes) */ public function getLeadComplete($leadId) { $lead = $this->getLeadWithUser($leadId); if (!$lead) { return null; } $contactModel = new SalesContactPersonModel(); $activityModel = new SalesActivityModel(); $noteModel = new SalesLeadNoteModel(); $lead['contact_persons'] = $contactModel->where('lead_id', $leadId)->findAll(); $lead['activities'] = $activityModel->getActivitiesByLead($leadId); $lead['notes'] = $noteModel->getNotesByLead($leadId); return $lead; } /** * Get leads statistics */ public function getLeadStats($userId = null) { $builder = $this->builder(); if ($userId) { $builder->where('assigned_to', $userId); } $stats = [ 'total' => $builder->countAllResults(false), 'new' => $builder->where('status', 'New')->countAllResults(false), 'potential' => $builder->where('status', 'Potential')->countAllResults(false), 'prospects' => $builder->where('status', 'Prospects')->countAllResults(false), 'non_prospects' => $builder->where('status', 'Non prospects')->countAllResults(false), ]; return $stats; } }