271 lines
11 KiB
PHP
271 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
use CodeIgniter\RESTful\ResourceController;
|
|
use App\Models\PolicyModel;
|
|
use App\Models\EnquiryModel;
|
|
use App\Models\QuotationModel;
|
|
use App\Models\InvoiceModel;
|
|
use App\Models\InvoiceItemModel;
|
|
use App\Models\InvoiceUtrModel;
|
|
use CodeIgniter\Database\Exceptions\DataException;
|
|
|
|
class InvoiceController extends ResourceController
|
|
{
|
|
protected $PolicyModel;
|
|
protected $QuotationModel;
|
|
protected $EnquiryModel;
|
|
protected $InvoiceModel;
|
|
protected $InvoiceItemModel;
|
|
protected $InvoiceUtrModel;
|
|
protected $db;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->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']) || 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);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|