nhance_partner_be/app/Controllers/InvoiceController.php
2025-12-18 09:31:53 +05:30

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);
}
}
}