db = db_connect();
helper(['common', 'form']);
}
public function list_req_payment()
{
return view('Invoice/payment_request_list');
}
public function getRequestTable()
{
if (! $this->request->isAJAX()) {
return $this->response->setStatusCode(400)->setBody('Invalid request');
}
$requestData = $_REQUEST;
$columns = [
0 => 'id',
1 => 'org_code',
2 => 'patient_name',
3 => 'org_date_str',
4 => 'payment_amount',
5 => 'payment_process_str',
];
$sqlAll = "select *,
date_format(payment_request_datetime,'%d-%m-%Y %h:%i:%s') as org_date_str,
(case payment_process when 0 then 'Pending' when 2 then 'Cancel' else 'Complete' end) as payment_process_str";
$sqlCount = 'Select count(*) as no_rec ';
$sqlFrom = ' from org_payment_request ';
$totalSql = $sqlCount . $sqlFrom;
$totalData = (int) ($this->db->query($totalSql)->getResult()[0]->no_rec ?? 0);
$totalFiltered = $totalData;
$sqlWhere = ' WHERE 1 = 1';
if (! empty($requestData['columns'][0]['search']['value'])) {
$idValueRaw = (string) $requestData['columns'][0]['search']['value'];
$idValue = preg_replace('/\D+/', '', $idValueRaw);
if ($idValue !== '') {
$sqlWhere .= ' AND id like "%' . (int) $idValue . '%" ';
}
}
if (! empty($requestData['columns'][1]['search']['value'])) {
$sqlWhere .= " AND org_code LIKE '%" . $requestData['columns'][1]['search']['value'] . "' ";
}
if (! empty($requestData['columns'][2]['search']['value'])) {
$sqlWhere .= " AND ( patient_name LIKE '" . $requestData['columns'][2]['search']['value'] . "%' ) ";
}
if (! empty($requestData['columns'][4]['search']['value'])) {
$sqlWhere .= " AND payment_amount LIKE '%" . $requestData['columns'][4]['search']['value'] . "%' ";
}
if (! empty($requestData['columns'][5]['search']['value'])) {
$statusValue = strtolower(trim((string) $requestData['columns'][5]['search']['value']));
if ($statusValue === 'pending') {
$sqlWhere .= ' AND payment_process = 0 ';
} elseif ($statusValue === 'cancel') {
$sqlWhere .= ' AND payment_process = 2 ';
} elseif ($statusValue === 'complete') {
$sqlWhere .= ' AND payment_process > 0 AND payment_process <> 2 ';
} else {
$sqlWhere .= " AND (case payment_process when 0 then 'Pending' when 2 then 'Cancel' else 'Complete' end) LIKE '%" . $requestData['columns'][5]['search']['value'] . "%' ";
}
}
$totalFilterSql = $sqlCount . $sqlFrom . $sqlWhere;
$totalFiltered = (int) ($this->db->query($totalFilterSql)->getResult()[0]->no_rec ?? 0);
$orderSql = ' ORDER BY ' . $columns[$requestData['order'][0]['column']] . ' ' . $requestData['order'][0]['dir']
. ' LIMIT ' . $requestData['start'] . ' ,' . $requestData['length'];
$resultSql = $sqlAll . $sqlFrom . $sqlWhere . $orderSql;
$rdata = $this->db->query($resultSql)->getResultArray();
$output = [
'draw' => (int) $requestData['draw'],
'recordsTotal' => $totalData,
'recordsFiltered' => $totalFiltered,
'data' => [],
];
foreach ($rdata as $aRow) {
$row = [];
foreach ($columns as $col) {
$row[] = $aRow[$col];
}
$output['data'][] = $row;
}
return $this->response->setJSON($output);
}
public function list_refund()
{
return view('Invoice/refund_invoice');
}
public function getRefundTable()
{
if (! $this->request->isAJAX()) {
return $this->response->setStatusCode(400)->setBody('Invalid request');
}
$requestData = $_REQUEST;
$columns = [
0 => 'id',
1 => 'refund_type_code',
2 => 'refund_type_str',
3 => 'patient_name',
4 => 'approved_datetime',
5 => 'refund_amount',
6 => 'refund_process_str',
];
$sqlAll = "select *,
(case refund_type when 1 then 'OPD' when 2 then 'Charge' when 3 then 'Org.Inv.' else 'Other' end) as refund_type_str,
(case refund_process when 0 then 'Pending' when 2 then 'Cancel' else 'Complete' end) as refund_process_str";
$sqlCount = 'Select count(*) as no_rec ';
$sqlFrom = ' from refund_order ';
$totalSql = $sqlCount . $sqlFrom;
$totalData = (int) ($this->db->query($totalSql)->getResult()[0]->no_rec ?? 0);
$totalFiltered = $totalData;
$sqlWhere = ' WHERE 1 = 1';
if (! empty($requestData['columns'][0]['search']['value'])) {
$idValueRaw = (string) $requestData['columns'][0]['search']['value'];
$idValue = preg_replace('/\D+/', '', $idValueRaw);
if ($idValue !== '') {
$sqlWhere .= ' AND id like "%' . (int) $idValue . '%" ';
}
}
if (! empty($requestData['columns'][1]['search']['value'])) {
$sqlWhere .= " AND refund_type_code LIKE '%" . $requestData['columns'][1]['search']['value'] . "%' ";
}
if (! empty($requestData['columns'][2]['search']['value'])) {
$typeValue = strtolower(trim((string) $requestData['columns'][2]['search']['value']));
if ($typeValue === 'opd') {
$sqlWhere .= ' AND refund_type = 1 ';
} elseif ($typeValue === 'charge') {
$sqlWhere .= ' AND refund_type = 2 ';
} elseif ($typeValue === 'org.inv.' || $typeValue === 'org' || $typeValue === 'org.inv') {
$sqlWhere .= ' AND refund_type = 3 ';
} else {
$sqlWhere .= " AND (case refund_type when 1 then 'OPD' when 2 then 'Charge' when 3 then 'Org.Inv.' else 'Other' end) LIKE '%" . $requestData['columns'][2]['search']['value'] . "%' ";
}
}
if (! empty($requestData['columns'][3]['search']['value'])) {
$sqlWhere .= " AND ( patient_name LIKE '%" . $requestData['columns'][3]['search']['value'] . "%') ";
}
if (! empty($requestData['columns'][5]['search']['value'])) {
$sqlWhere .= " AND refund_amount LIKE '%" . $requestData['columns'][5]['search']['value'] . "%' ";
}
if (! empty($requestData['columns'][6]['search']['value'])) {
$statusValue = strtolower(trim((string) $requestData['columns'][6]['search']['value']));
if ($statusValue === 'pending') {
$sqlWhere .= ' AND refund_process = 0 ';
} elseif ($statusValue === 'cancel') {
$sqlWhere .= ' AND refund_process = 2 ';
} elseif ($statusValue === 'complete') {
$sqlWhere .= ' AND refund_process > 0 AND refund_process <> 2 ';
} else {
$sqlWhere .= " AND (case refund_process when 0 then 'Pending' when 2 then 'Cancel' else 'Complete' end) LIKE '%" . $requestData['columns'][6]['search']['value'] . "%' ";
}
}
$totalFilterSql = $sqlCount . $sqlFrom . $sqlWhere;
$totalFiltered = (int) ($this->db->query($totalFilterSql)->getResult()[0]->no_rec ?? 0);
$orderSql = ' ORDER BY ' . $columns[$requestData['order'][0]['column']] . ' ' . $requestData['order'][0]['dir']
. ' LIMIT ' . $requestData['start'] . ' ,' . $requestData['length'];
$resultSql = $sqlAll . $sqlFrom . $sqlWhere . $orderSql;
$rdata = $this->db->query($resultSql)->getResultArray();
$output = [
'draw' => (int) $requestData['draw'],
'recordsTotal' => $totalData,
'recordsFiltered' => $totalFiltered,
'data' => [],
];
foreach ($rdata as $aRow) {
$row = [];
foreach ($columns as $col) {
$row[] = $aRow[$col];
}
$output['data'][] = $row;
}
return $this->response->setJSON($output);
}
public function refund_form(int $refundId)
{
$refundOrder = $this->db->table('refund_order')
->where('id', $refundId)
->get()
->getResult();
if (empty($refundOrder)) {
return $this->response->setBody('No Record Found');
}
return view('Invoice/refund_amount_panel', [
'refund_order' => $refundOrder,
]);
}
public function refund_process()
{
if (! $this->request->isAJAX()) {
return $this->response->setStatusCode(400)->setJSON([
'update' => 0,
'showcontent' => 'Invalid request',
]);
}
$refundId = (int) $this->request->getPost('r_id');
if ($refundId <= 0) {
return $this->response->setJSON([
'update' => 0,
'showcontent' => 'Invalid refund request',
'csrfName' => csrf_token(),
'csrfHash' => csrf_hash(),
]);
}
$refundOrder = $this->db->table('refund_order')
->where('id', $refundId)
->get()
->getResult();
if (empty($refundOrder)) {
return $this->response->setJSON([
'update' => 0,
'showcontent' => 'No Record Found',
'csrfName' => csrf_token(),
'csrfHash' => csrf_hash(),
]);
}
if ((int) $refundOrder[0]->refund_process > 0) {
return $this->response->setJSON([
'update' => 0,
'showcontent' => 'Already Done',
'csrfName' => csrf_token(),
'csrfHash' => csrf_hash(),
]);
}
$refundType = (int) ($refundOrder[0]->refund_type ?? 0);
$payofType = match ($refundType) {
1 => '1',
2 => '2',
3 => '3',
default => '0',
};
$user = auth()->user();
$userId = $user->id ?? '';
$userName = $user->username ?? $user->email ?? 'User';
$userLabel = $userName . '[' . $userId . ']';
$payData = [
'payment_mode' => '1',
'payof_type' => $payofType,
'payof_id' => $refundOrder[0]->refund_type_id,
'payof_code' => $refundOrder[0]->refund_type_code,
'credit_debit' => '1',
'amount' => $refundOrder[0]->refund_amount,
'payment_date' => date('Y-m-d H:i:s'),
'remark' => $refundOrder[0]->refund_type_reason,
'update_by' => $userLabel,
'update_by_id' => $userId,
];
$paymentModel = new PaymentModel();
$insertId = $paymentModel->insertPayment($payData);
if ($insertId <= 0) {
return $this->response->setJSON([
'update' => 0,
'showcontent' => 'Unable to process refund',
'csrfName' => csrf_token(),
'csrfHash' => csrf_hash(),
]);
}
$this->db->table('refund_order')
->where('id', $refundId)
->update([
'refund_process' => '1',
'refund_by' => $userLabel,
'refund_by_id' => $userId,
'refund_datetime' => date('Y-m-d H:i:s'),
'pay_id' => $insertId,
]);
if ($refundType === 2) {
$invoiceModel = new InvoiceModel();
$invoiceModel->updateInvoiceFinal((int) $refundOrder[0]->refund_type_id);
}
return $this->response->setJSON([
'update' => 1,
'showcontent' => 'Refund Update',
'csrfName' => csrf_token(),
'csrfHash' => csrf_hash(),
]);
}
public function payment_form(int $reqId)
{
$reqPayment = $this->db->table('org_payment_request')
->where('id', $reqId)
->get()
->getResult();
if (empty($reqPayment)) {
return $this->response->setBody('No Record Found');
}
$data['req_payment_order'] = $reqPayment;
$orgInfo = $this->db->table('organization_case_master')
->where('id', (int) $reqPayment[0]->org_id)
->get()
->getResult();
$data['org_info'] = $orgInfo;
$patientId = (int) $reqPayment[0]->patient_id;
$personInfo = $this->db->table('patient_master')
->where('id', $patientId)
->get()
->getResult();
$this->applyAge($personInfo, 'age');
$data['person_info'] = $personInfo;
$sql = "select s.id, s.pay_type, m.bank_name
from hospital_bank m join hospital_bank_payment_source s on m.id=s.bank_id";
$query = $this->db->query($sql);
$data['bank_data'] = $query->getResult();
if ((int) $reqPayment[0]->payment_process > 0) {
$printUrl = base_url('Invoice/print_org_payment_invoice') . '/' . $reqPayment[0]->id;
$showcontent = 'Amount Receipt : Print Payment Reciept ';
return $this->response->setBody($showcontent);
}
return view('Invoice/payment_req_panel', $data);
}
public function req_payment_process()
{
if (! $this->request->isAJAX()) {
return $this->response->setStatusCode(400)->setJSON([
'update' => 0,
'showcontent' => 'Invalid request',
]);
}
$mode = (string) $this->request->getPost('mode');
$amount = (float) $this->request->getPost('amount');
$reqPaymentId = (int) $this->request->getPost('req_payment_id');
$cashRemark = (string) $this->request->getPost('cash_remark');
$payBankId = (int) $this->request->getPost('cbo_pay_type');
$inputCardMac = (string) $this->request->getPost('input_card_mac');
$inputCardBank = (string) $this->request->getPost('input_card_bank');
$inputCardDigit = (string) $this->request->getPost('input_card_digit');
$inputCardTran = (string) $this->request->getPost('input_card_tran');
$reqPayment = $this->db->table('org_payment_request')
->where('id', $reqPaymentId)
->get()
->getResult();
if (empty($reqPayment)) {
return $this->response->setJSON([
'update' => 0,
'showcontent' => 'No Record Found',
'payid' => 0,
]);
}
if ((int) $reqPayment[0]->payment_process > 0) {
$printUrl = base_url('Invoice/print_org_payment_invoice') . '/' . $reqPaymentId;
$showcontent = 'Already Done : Print Invoice ';
return $this->response->setJSON([
'update' => 0,
'showcontent' => $showcontent,
'payid' => (int) ($reqPayment[0]->pay_id ?? 0),
]);
}
$user = auth()->user();
$userId = $user->id ?? '';
$userName = $user->username ?? $user->email ?? 'User';
$userLabel = $userName . '[' . $userId . ']';
$payData = [
'payment_mode' => $mode,
'payof_type' => '3',
'payof_id' => $reqPayment[0]->org_id,
'payof_code' => $reqPayment[0]->org_code,
'credit_debit' => '0',
'amount' => $reqPayment[0]->payment_amount,
'payment_date' => date('Y-m-d H:i:s'),
'remark' => $cashRemark,
'update_by' => $userLabel,
'update_by_id' => $userId,
'pay_bank_id' => $payBankId,
'card_bank' => $inputCardMac,
'card_remark' => $inputCardBank,
'cust_card' => $inputCardDigit,
'card_tran_id' => $inputCardTran,
];
$paymentModel = new PaymentModel();
$insertId = $paymentModel->insertPayment($payData);
if ($insertId > 0) {
$this->db->table('org_payment_request')
->where('id', $reqPaymentId)
->update([
'payment_process' => '1',
'payment_accept_by' => $userLabel,
'payment_accept_by_id' => $userId,
'payment_datetime' => date('Y-m-d H:i:s'),
'pay_id' => $insertId,
]);
$printUrl = base_url('Invoice/print_org_payment_invoice') . '/' . $reqPaymentId;
$showcontent = 'Amount Receipt : Print Invoice ';
return $this->response->setJSON([
'update' => 1,
'showcontent' => $showcontent,
'payid' => $insertId,
]);
}
return $this->response->setJSON([
'update' => 0,
'showcontent' => 'Unable to process payment.',
'payid' => 0,
]);
}
public function print_org_payment_invoice(int $reqId)
{
$reqPayment = $this->db->table('org_payment_request')
->where('id', $reqId)
->get()
->getResult();
if (empty($reqPayment)) {
return $this->response->setStatusCode(404)->setBody('No Record Found');
}
$data['req_payment_order'] = $reqPayment;
$orgInfo = $this->db->table('organization_case_master')
->where('id', (int) $reqPayment[0]->org_id)
->get()
->getResult();
$data['org_info'] = $orgInfo;
$patientId = (int) $reqPayment[0]->patient_id;
$patientMaster = $this->db->table('patient_master')
->where('id', $patientId)
->get()
->getResult();
$this->applyAge($patientMaster, 'age');
$data['patient_master'] = $patientMaster;
$data['req_payment_order'][0]->payment_date_str = date('d-m-Y H:i:s', strtotime($reqPayment[0]->payment_datetime ?? 'now'));
return view('Invoice/Invoice_org_payment', $data);
}
private function applyAge(array $rows, string $field = 'age'): void
{
foreach ($rows as $row) {
$row->{$field} = get_age_1(
$row->dob ?? null,
$row->age ?? '',
$row->age_in_month ?? '',
$row->estimate_dob ?? ''
);
}
}
}