select(' leads.*, lead_files.status as demography_file_status, kyc_entity_type.name as entity_type, policy_type.policy_type, user_profiles.first_name as salse_person_name, ( SELECT COUNT(*) AS qcr_count FROM rfq WHERE type = 2 AND is_active = 1 and lead_id = leads.id ) AS qcr_count, ( SELECT COUNT(*) AS rfq_count FROM rfq WHERE type = 1 AND is_active = 1 and lead_id = leads.id ) AS rfq_count ') ->join('kyc_entity_type', 'leads.entity_type_id = kyc_entity_type.id', 'left') ->join('user_profiles', 'leads.salse_person_id = user_profiles.id', 'left') ->join('policy_type', 'leads.policy_type_id = policy_type.id', 'left') ->join('lead_files', 'leads.id = lead_files.lead_id AND lead_files.type = 2 AND lead_files.is_active = 1', 'left') ->where('leads.is_active', 1); if (get_role_id() == STAFF_ROLE_ID) { $data->where('leads.created_by', get_session_userid()); } if (! empty($where)) { $data->where($where); } return $data->orderBy('leads.id', 'desc')->findAll(); } public function getLeadForInsertClientList($type = null, $client_id = null, $from = null) { $query = $this->db->table('leads') ->select('leads.*, user_profiles.first_name as user_name, policy_type.allocg, policy_type.policy_type as policy_type_name') ->join('user_profiles', 'leads.created_by = user_profiles.id') ->join('policy_type', 'leads.policy_type_id = policy_type.id', 'left') ->where('leads.is_active', 1) ->where('leads.status', 'won'); if ($from === 'update') { $query->where("(leads.is_policy_created = '' OR leads.is_policy_created IS NULL)"); if ($client_id) { $clientId = (int) $client_id; $query->groupStart() ->where('leads.client_id', $clientId) ->orWhere( "EXISTS ( SELECT 1 FROM clients c INNER JOIN client_branch cb ON cb.client_id = c.id AND cb.is_active = 1 WHERE c.id = {$clientId} AND leads.client_name = c.client_name AND leads.client_short_name = c.short_name AND leads.branch_name = cb.branch_name AND leads.branch_code = cb.branch_code )", null, false ) ->groupEnd(); } } else { $query->groupStart() ->where("(leads.is_client_created = '' OR leads.is_client_created IS NULL)") ->orWhere("(leads.is_policy_created = '' OR leads.is_policy_created IS NULL)") ->groupEnd(); if ($client_id) { $query->where('leads.client_id', $client_id); } } if ($type) { $query->whereIn('leads.lead_type', $type); } $query->groupStart() ->where("policy_type.allocg != 'EB'") ->orWhere("(policy_type.allocg = 'EB' AND leads.proposel_data IS NOT NULL AND leads.proposel_data <> '')") ->groupEnd(); $result = $query->get()->getResultArray(); return $result; } // public function getDashData() // { // $statuses = $this->db->table('leads') // ->select('status, policy_with_correction') // ->where("is_active", 1) // ->groupBy('status') // ->get() // ->getResultArray(); // $policy_with_correction_count = $this->db->table('leads') // ->where('is_active', 1) // ->where('policy_with_correction', 1) // ->countAllResults(); // $selectParts = []; // foreach ($statuses as $status) { // $s = $status['status']; // $alias = strtolower(str_replace(' ', '_', $s)); // // Count alias // $selectParts[] = "SUM(CASE WHEN status = '{$s}' THEN 1 ELSE 0 END) AS `{$alias}`"; // // IDs alias // $selectParts[] = "GROUP_CONCAT(CASE WHEN status = '{$s}' THEN leads.id ELSE NULL END) AS `{$alias}_ids`"; // } // $select = implode(", ", $selectParts); // // Start query builder // $builder = $this->db->table('leads'); // $builder->select($select); // // Auditing subquery // $subquery = "(SELECT pk, MAX(created_at) AS last_claim_status_change // FROM auditing_history // WHERE table_name = 'leads' AND field_name = 'status' // GROUP BY pk)"; // $builder->join("{$subquery} AS th", 'leads.id = th.pk', 'left'); // // Date filtering for last status change // $dateLimit = 3; // $dateThreshold = date('Y-m-d H:i:s', strtotime("-{$dateLimit} days")); // $builder->groupStart() // ->where('th.last_claim_status_change <=', $dateThreshold) // ->orWhere('th.last_claim_status_change IS NULL') // ->groupEnd(); // // Add only active // $builder->where("leads.is_active", 1); // $lead_data = $builder->get()->getResultArray(); // // dd($this->db->getLastQuery()); // // Fallback for empty results // if (empty($lead_data)) { // $lead_data[0] = ['total' => 0]; // foreach ($statuses as $status) { // $alias = strtolower(str_replace(' ', '_', $status['status'])); // $lead_data[0][$alias] = 0; // $lead_data[0]["{$alias}_ids"] = ''; // } // } // // Calculate total // $total = 0; // foreach ($lead_data[0] as $key => $value) { // // if (!str_ends_with($key, '_ids') && $key != "won") { // // $total += (int) $value; // // } // if (!str_ends_with($key, '_ids')) { // $total += (int) $value; // } // } // $total = $total + $policy_with_correction_count ?? 0; // $lead_data[0]['total'] = $total; // $lead_data[0]['policy_with_correction'] = $policy_with_correction_count; // // dd($lead_data[0]); // return $lead_data[0]; // } public function getDashData() { // Get all unique statuses $statuses = $this->db->table('leads') ->select('DISTINCT(status)') ->where('is_active', 1) ->get() ->getResultArray(); $policy_with_correction_data = $this->db->table('leads') ->select('COUNT(id) AS count, GROUP_CONCAT(id) AS ids') ->where('is_active', 1) ->where('policy_with_correction', 1) ->get() ->getRowArray(); if (empty($statuses)) { return ['total' => 0]; } // Build dynamic select fields for each status $selectParts = []; foreach ($statuses as $row) { $status = $row['status']; $alias = strtolower(str_replace(' ', '_', $status)); $selectParts[] = "SUM(CASE WHEN status = '{$status}' THEN 1 ELSE 0 END) AS `{$alias}`"; $selectParts[] = "GROUP_CONCAT(CASE WHEN status = '{$status}' THEN id END) AS `{$alias}_ids`"; } $select = implode(", ", $selectParts); // Main query $lead_data = $this->db->table('leads') ->select($select) ->where('is_active', 1) ->get() ->getRowArray(); // Calculate total $total = 0; foreach ($lead_data as $key => $val) { if (! str_ends_with($key, '_ids')) { $total += (int) $val; } } $lead_data['total'] = $total; $lead_data['policy_with_correction'] = $policy_with_correction_data['count'] ?? 0; $lead_data['policy_with_correction_ids'] = $policy_with_correction_data['ids'] ?? null; // dd($lead_data); return $lead_data; } }