PolicyModel = new PolicyModel(); $this->QuotationModel = new QuotationModel(); $this->EnquiryModel = new EnquiryModel(); $this->InvoiceModel = new InvoiceModel(); $this->InvoiceItemModel = new InvoiceItemModel(); $this->InvoiceUtrModel = new InvoiceUtrModel(); $this->db = \Config\Database::connect(); } public function invoiceList() { try { $data = $this->InvoiceModel->select('partner_invoice.*, PB.name as broker_name, pos.name as pos_name, FORMAT(partner_invoice.invoice_amount, 2, "en_IN") AS invoice_amount_indian_format, DATE_FORMAT(partner_invoice.invoice_date, "%d-%m-%Y") AS invoice_date_ui_format') ->join('partner_brokers PB', 'PB.id = partner_invoice.broker_id', 'left') ->join('partner_pos pos', 'pos.id = partner_invoice.pos_id', 'left') ->where('partner_invoice.is_active', 1) ->orderBy('partner_invoice.id', 'DESC') ->findAll(); return $this->respond(['status' => 'success', 'code' => 200,'data' => $data ], 200); } catch (\Exception $e) { return $this->respond(['status' => 'failed', 'code' => 500, 'data' => $e->getMessage()], 500); } } public function findInvoiceWithItems() { try { $id = $this->request->getGet('id'); if (!$id) { return $this->respond(['status' => 'failed', 'code' => 400, 'data' => 'ID is required'], 400); } $invoice = $this->InvoiceModel->where('id', $id)->first(); if (!$invoice) { return $this->respond(['status' => 'failed', 'code' => 404, 'data' => 'Invoice not found'], 404); } $items = $this->InvoiceItemModel->select('partner_invoice_items.* , pp.issued_date , pe.name as customer_name , pq.premium_amount') ->join('partner_policy pp','pp.id = partner_invoice_items.policy_id ', 'left') ->join('partner_enquiry pe','pe.id = pp.enquiry_id ', 'left') ->join('partner_quotation pq','pq.id = pp.quotation_id ', 'left') ->where('partner_invoice_items.invoice_id', $id) ->where('partner_invoice_items.is_active', 1) ->findAll(); return $this->respond([ 'status' => 'success', 'code' => 200, 'data' => [ 'invoice' => $invoice, 'items' => $items ] ], 200); } catch (\Exception $e) { return $this->respond(['status' => 'failed', 'code' => 500, 'data' => $e->getMessage()], 500); } } public function createOrUpdateInvoice() { $this->db->transBegin(); try { $input = $this->request->getJSON(true); // Basic invoice data $invoiceData = [ 'invoice_no' => $input['invoice_no'] ?? '', 'invoice_amount' => $input['invoice_amount'] ?? 0, 'broker_id' => $input['broker_id'] ?? 0, 'pos_id' => $input['pos_id'] ?? 0, 'till_date' => $input['till_date'] ? date('Y-m-d', strtotime($input['till_date'])) : null, 'invoice_date' => $input['invoice_date'] ? date('Y-m-d', strtotime($input['invoice_date'])) : null, 'payout_status' => 1, 'is_active' => 1, 'updated_at' => date('Y-m-d H:i:s'), 'updated_by' => $input['updated_by'] ?? 0 ]; $invoiceId = $input['id'] ?? null; if (!$invoiceId) { $invoiceData['created_at'] = date('Y-m-d H:i:s'); $invoiceData['created_by'] = $input['created_by'] ?? 0; $invoiceId = $this->InvoiceModel->insert($invoiceData); if (!$invoiceId) { throw new DataException("Failed to create invoice"); } } else { $this->InvoiceModel->update($invoiceId, $invoiceData); } // Insert or update items if (!empty($input['items']) && is_array($input['items'])) { foreach ($input['items'] as $item) { $itemData = [ 'invoice_id' => $invoiceId, 'policy_id' => $item['policy_id'], 'policy_no' => $item['policy_no'], 'commission_amount' => $item['commission_amount'] ?? 0, 'is_active' => $item['is_active'] ?? 1, 'updated_at' => date('Y-m-d H:i:s'), 'updated_by' => $input['updated_by'] ?? 0 ]; // UPDATE (if id exists) if (!empty($item['id'])) { $this->InvoiceItemModel->update($item['id'], $itemData); }else { // INSERT (if id missing) $itemData['created_at'] = date('Y-m-d H:i:s'); $itemData['created_by'] = $input['created_by'] ?? 0; $this->InvoiceItemModel->insert($itemData); } } } if ($this->db->transStatus() === false) { $this->db->transRollback(); throw new DataException("Transaction failed"); } $this->db->transCommit(); return $this->respond([ 'status' => 'success', 'code' => 200, 'data' => ['invoice_id' => $invoiceId] ], 200); } catch (\Exception $e) { $this->db->transRollback(); return $this->respond(['status' => 'failed', 'code' => 500, 'data' => $e->getMessage()], 500); } } public function deleteInvoice() { try { $id = $this->request->getGet('id'); if (!$id) { return $this->respond(['status' => 'failed', 'code' => 400, 'data' => 'ID is required'], 400); } $this->InvoiceModel->update($id, ['is_active' => 0]); $this->InvoiceItemModel->where('invoice_id', $id)->set(['is_active' => 0])->update(); return $this->respond(['status' => 'success', 'code' => 200, 'data' => 'Invoice deleted'], 200); } catch (\Exception $e) { return $this->respond(['status' => 'failed', 'code' => 500, 'data' => $e->getMessage()], 500); } } public function getCommissionRateList() { try { $input = $this->request->getJSON(true); if (empty($input['broker_id'])) { return $this->respond([ 'status' => 'failed', 'code' => 400, 'message'=> 'broker_id is required' ], 400); } $invoice_id = isset($input['invoice_id']) ? $input['invoice_id'] : ''; // Build the main query $query = $this->PolicyModel ->select('partner_policy.policy_number as policy_no, partner_policy.id as policy_id, partner_policy.issued_date, partner_policy.commission_amount, partner_policy.insured_name as customer_name, pe.agent_id, partner_policy.premium_amount, pi.id as invoice_id, pi.invoice_no') ->join( 'partner_enquiry pe', 'pe.id = partner_policy.enquiry_id AND pe.broker_id = ' . (int)$input['broker_id'], 'left' ) ->join('partner_quotation pq', 'pq.id = partner_policy.quotation_id', 'left') ->join('partner_invoice_items pii', 'pii.policy_id = partner_policy.id', 'left') ->join('partner_invoice pi', 'pi.id = pii.invoice_id AND pi.is_active = 1', 'left') ->where('partner_policy.is_active', 1) ->where('partner_policy.commission_amount > 0') ->where('partner_policy.is_data_accuracy_checked', 1); // Apply agent_id filter (supports multiple agents) if (!empty($input['agent_id'])) { if (is_array($input['agent_id'])) { $query->whereIn('pe.agent_id', $input['agent_id']); } else { $query->where('pe.agent_id', $input['agent_id']); } } // Apply date range filters if (!empty($input['from_date'])) { $query->where('partner_policy.issued_date >=', date('Y-m-d', strtotime($input['from_date']))); } if (!empty($input['to_date'])) { $query->where('partner_policy.issued_date <=', date('Y-m-d', strtotime($input['to_date']))); } // Apply POS filter if provided if (!empty($input['pos_id'])) { $query->where('partner_policy.pos_id', $input['pos_id']); } // Filter based on invoice_id or policies not yet invoiced if (empty($invoice_id)) { $query->where('pii.policy_id IS NULL'); } else { $query->where('pi.id', $invoice_id); } $data = $query->findAll(); // Calculate total commission $total_commission = 0; foreach ($data as $policy) { $total_commission += $policy['commission_amount']; } return $this->respond([ 'status' => 'success', 'code' => 200, 'data' => $data, 'total_commission' => $total_commission, 'total_policies' => count($data) ], 200); } catch (\Exception $e) { return $this->respond([ 'status' => 'failed', 'code' => 500, 'message'=> $e->getMessage() ], 500); } } // public function getCommissionRateList() // { // try { // $input = $this->request->getJSON(true); // if (empty($input['broker_id']) || empty($input['issued_date'])) { // return $this->respond([ 'status' => 'failed', 'code' => 400, 'message'=> 'issued_date are required' ], 400); // } // $invoice_id = isset($input['invoice_id']) ? $input['invoice_id'] : ''; // $data_previous = $this->PolicyModel // ->select('partner_policy.policy_number as policy_no,partner_policy.id as policy_id , partner_policy.issued_date, partner_policy.commission_amount, pe.name as customer_name , pq.premium_amount') // ->join( // 'partner_enquiry pe', // 'pe.id = partner_policy.enquiry_id AND pe.broker_id = ' . (int)$input['broker_id'], // 'left' // ) // ->join('partner_quotation pq','pq.id = partner_policy.quotation_id ', 'left') // // ->where('partner_policy.pos_id', $input['pos_id']) // ->where('partner_policy.issued_date <=', date('Y-m-d', strtotime($input['issued_date']))) // ->where('partner_policy.is_active', 1) // ->where('partner_policy.is_data_accuracy_checked', 1) // ->findAll(); // $query = $this->PolicyModel // ->select('partner_policy.policy_number as policy_no, partner_policy.id as policy_id, partner_policy.issued_date, partner_policy.commission_amount, pe.name as customer_name, pq.premium_amount, pi.id as invoice_id, pi.invoice_no') // ->join( // 'partner_enquiry pe', // 'pe.id = partner_policy.enquiry_id AND pe.broker_id = ' . (int)$input['broker_id'], // 'left' // ) // ->join('partner_quotation pq','pq.id = partner_policy.quotation_id ', 'left') // ->join('partner_invoice_items pii', 'pii.policy_id = partner_policy.id', 'left' ) // ->join('partner_invoice pi', 'pi.id = pii.invoice_id AND pi.is_active = 1', 'left') // // ->where('partner_policy.pos_id', $input['pos_id']) // ->where('partner_policy.issued_date <=', date('Y-m-d', strtotime($input['issued_date']))) // ->where('partner_policy.is_active', 1) // ->where('partner_policy.commission_amount > 0') // ->where('partner_policy.is_data_accuracy_checked', 1); // if (empty($invoice_id)) { // $query->where('pii.policy_id IS NULL'); // } else { // $query->where('pi.id', $invoice_id); // } // $data = $query->findAll(); // return $this->respond([ // 'status' => 'success', // 'code' => 200, // 'previous' => $data_previous, // 'data' => $data // ], 200); // } catch (\Exception $e) { // return $this->respond([ // 'status' => 'failed', // 'code' => 500, // 'message'=> $e->getMessage() // ], 500); // } // } }