devsofttech_hms_ci4/app/Models/PaymentModel.php

84 lines
2.9 KiB
PHP

<?php
namespace App\Models;
use CodeIgniter\Database\BaseConnection;
use RuntimeException;
class PaymentModel
{
private BaseConnection $db;
public function __construct(?BaseConnection $db = null)
{
$this->db = $db ?? db_connect();
}
public function insertPayment(array $data): int
{
$this->db->table('payment_history')->insert($data);
return (int) $this->db->insertID();
}
public function updatePayment(array $data, int $id): bool
{
return (bool) $this->db->table('payment_history')->where('id', $id)->update($data);
}
public function findPayment(int $id): ?array
{
return $this->db->table('payment_history')->where('id', $id)->get(1)->getRowArray();
}
public function assertEditable(array $payment): void
{
$cashStatus = strtolower(trim((string) ($payment['cash_submission_status'] ?? 'open')));
if ($cashStatus !== '' && $cashStatus !== 'open') {
throw new RuntimeException('This payment is already included in a cash submission and cannot be edited.');
}
if ((int) ($payment['cash_submission_scroll_id'] ?? 0) > 0) {
throw new RuntimeException('This payment is linked to a cash submission and cannot be edited.');
}
$bankStatus = strtolower(trim((string) ($payment['bank_reconcile_status'] ?? '')));
if ($bankStatus !== '' || (int) ($payment['bank_statement_entry_id'] ?? 0) > 0 || (int) ($payment['bank_settlement_entry_id'] ?? 0) > 0) {
throw new RuntimeException('This payment is already reconciled with the bank and cannot be edited.');
}
}
public function correctPayment(int $id, array $changes, int $updateType, string $actor, string $remark): array
{
$payment = $this->findPayment($id);
if ($payment === null) {
throw new RuntimeException('Payment record not found.');
}
$this->assertEditable($payment);
$fields = $this->db->getFieldNames('payment_history') ?? [];
$changes = array_intersect_key($changes, array_flip($fields));
if ($changes === []) {
throw new RuntimeException('No supported payment fields were provided.');
}
if (! $this->db->tableExists('payment_history_log')) {
throw new RuntimeException('Payment audit log table is unavailable.');
}
$this->db->transStart();
$this->db->table('payment_history')->where('id', $id)->update($changes);
$this->db->table('payment_history_log')->insert([
'pay_id' => $id,
'update_type' => $updateType,
'update_by' => mb_substr($actor, 0, 50),
'update_remark' => mb_substr($remark, 0, 200),
]);
$this->db->transComplete();
if (! $this->db->transStatus()) {
throw new RuntimeException('Unable to update the payment record.');
}
return $this->findPayment($id) ?? $payment;
}
}