275 lines
8.0 KiB
PHP
275 lines
8.0 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use CodeIgniter\Model;
|
|
|
|
class LeadsModel extends Model
|
|
{
|
|
protected $table = 'leads';
|
|
protected $primaryKey = 'id';
|
|
protected $allowedFields = [
|
|
'id',
|
|
'lead_type',
|
|
'issuer',
|
|
'client_type',
|
|
'client_name',
|
|
'client_short_name',
|
|
'entity_type_id',
|
|
'client_code',
|
|
'cost_center',
|
|
'pan',
|
|
'gst',
|
|
'branch_name',
|
|
'branch_code',
|
|
'contact_person_name',
|
|
'contact_person_mobile',
|
|
'contact_person_email',
|
|
'client_id',
|
|
'client_branch_id',
|
|
'source_policy_id',
|
|
'policy_type_id',
|
|
'salse_person_id',
|
|
'insurer_id',
|
|
'insurer_branch_id',
|
|
'tpa_id',
|
|
'tpa_branch_id',
|
|
'policy_start_date',
|
|
'policy_end_date',
|
|
'no_of_lives',
|
|
'incurred_claims',
|
|
'location',
|
|
'proposed_insurer_id',
|
|
'proposed_insurer_branch_id',
|
|
'proposed_tpa_id',
|
|
'proposed_tpa_branch_id',
|
|
'proposel_data',
|
|
'status',
|
|
'notes',
|
|
'created_at',
|
|
'created_by',
|
|
'updated_at',
|
|
'updated_by',
|
|
'is_active',
|
|
'is_client_created',
|
|
|
|
'renewal_emp_count',
|
|
'renewal_dept_count',
|
|
'renewal_no_of_lives',
|
|
'incept_emp_count',
|
|
'incept_dept_count',
|
|
'incept_no_of_lives',
|
|
'exp_emp_count',
|
|
'exp_dept_count',
|
|
'exp_no_of_lives',
|
|
'file_name',
|
|
|
|
'incurred_claims_date',
|
|
'paid_claims',
|
|
'outstanding_claims',
|
|
'policy_run_days',
|
|
'premium_at_inception',
|
|
'premium_date',
|
|
'earned_premium',
|
|
'annualised_claims',
|
|
'incurred_claims_ratio',
|
|
'earned_claims_ratio',
|
|
|
|
'placement_date',
|
|
'utr_no',
|
|
'premium_amount',
|
|
'total_amount',
|
|
'cd_amount',
|
|
|
|
'total_si_at_incept',
|
|
'total_si_at_renewal',
|
|
'fin_years_claims',
|
|
|
|
'lead_form_type',
|
|
'custom_fields',
|
|
|
|
'source_policy_start_date',
|
|
'source_policy_end_date',
|
|
|
|
'payment_date',
|
|
'is_cd',
|
|
|
|
'is_installment',
|
|
'no_of_installment',
|
|
'is_policy_created',
|
|
'claim_history',
|
|
|
|
'total_lives_at_incept',
|
|
'premium_at_incept',
|
|
];
|
|
|
|
|
|
// Callbacks
|
|
protected $allowCallbacks = true;
|
|
protected $beforeInsert = ["checkAndADDCreatedByValue"];
|
|
protected $afterInsert = [];
|
|
protected $beforeUpdate = ["checkAndUpdateUpdatedByValue"];
|
|
protected $afterUpdate = [];
|
|
protected $beforeFind = [];
|
|
protected $afterFind = [];
|
|
protected $beforeDelete = [];
|
|
protected $afterDelete = [];
|
|
|
|
protected function checkAndADDCreatedByValue(array $data)
|
|
{
|
|
// Check if 'updated_by' value is null or empty
|
|
if (empty($data['data']['created_by'])) {
|
|
// Set 'updated_by' value to the current session user ID
|
|
$data['data']['created_by'] = get_session_userid();
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
protected function checkAndUpdateUpdatedByValue(array $data)
|
|
{
|
|
// Check if 'updated_by' value is null or empty
|
|
if (empty($data['data']['updated_by'])) {
|
|
// Set 'updated_by' value to the current session user ID
|
|
$data['data']['updated_by'] = get_session_userid();
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function getLeadDataForLising($where = null)
|
|
{
|
|
|
|
$data = $this->select('
|
|
leads.*,
|
|
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')
|
|
->where('leads.is_active', 1);
|
|
|
|
if (!empty($where)) {
|
|
$data->where($where);
|
|
}
|
|
|
|
return $data->orderBy('leads.id', 'desc')->findAll();
|
|
}
|
|
|
|
public function getLeadForInsertClientList($type = null, $client_id = null)
|
|
{
|
|
$query = $this->db->table('leads')
|
|
->select('leads.*, user_profiles.first_name as user_name')
|
|
->join('user_profiles', 'leads.created_by = user_profiles.id')
|
|
->where('leads.is_active', 1)
|
|
->where('leads.status', 'won')
|
|
->where("leads.proposel_data IS NOT NULL AND leads.proposel_data <> ''")
|
|
->where("(leads.is_client_created = '' OR leads.is_client_created IS NULL)")
|
|
->where("(leads.is_policy_created = '' OR leads.is_policy_created IS NULL)");
|
|
|
|
|
|
|
|
if ($type) {
|
|
$query->where('leads.lead_type', $type);
|
|
}
|
|
if ($client_id) {
|
|
$query->where('leads.client_id', $client_id);
|
|
}
|
|
|
|
$result = $query->get()->getResultArray();
|
|
return $result;
|
|
}
|
|
|
|
public function getDashData()
|
|
{
|
|
$statuses = $this->db->table('leads')
|
|
->select('status')
|
|
->where("is_active", 1)
|
|
->groupBy('status')
|
|
->get()
|
|
->getResultArray();
|
|
|
|
$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();
|
|
|
|
// 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;
|
|
}
|
|
}
|
|
$lead_data[0]['total'] = $total;
|
|
|
|
// dd($lead_data[0]);
|
|
return $lead_data[0];
|
|
}
|
|
|
|
}
|