devsofttech_hms_ci4/app/Models/MedicalModel.php

92 lines
3.1 KiB
PHP

<?php
namespace App\Models;
use CodeIgniter\Model;
class MedicalModel extends Model
{
protected $DBGroup = 'default';
public function updatePurchaseStockById(int $purchaseItemId): bool
{
if ($purchaseItemId <= 0 || ! $this->db->tableExists('purchase_invoice_item')) {
return false;
}
try {
// Recompute total sold units directly from sale items if available
if ($this->db->tableExists('inv_med_item')) {
$itemFields = $this->db->getFieldNames('inv_med_item') ?? [];
$sumSql = in_array('sale_return', $itemFields, true)
? 'SUM(CASE WHEN IFNULL(sale_return,0)=1 OR IFNULL(amount,0)<0 THEN IFNULL(qty,0)*-1 ELSE IFNULL(qty,0) END) AS sold_qty'
: 'SUM(CASE WHEN IFNULL(amount,0)<0 THEN IFNULL(qty,0)*-1 ELSE IFNULL(qty,0) END) AS sold_qty';
$soldRow = $this->db->table('inv_med_item')
->select($sumSql, false)
->where('store_stock_id', $purchaseItemId)
->get()
->getRow();
$soldQty = max(0.0, (float) ($soldRow->sold_qty ?? 0));
$stockRow = $this->db->table('purchase_invoice_item')
->select('id, total_sale_unit')
->where('id', $purchaseItemId)
->get()
->getRow();
if ($stockRow) {
$currentSaleQty = (float) ($stockRow->total_sale_unit ?? 0);
if (abs($currentSaleQty - $soldQty) >= 0.00001) {
$this->db->table('purchase_invoice_item')
->where('id', $purchaseItemId)
->update(['total_sale_unit' => $soldQty]);
}
}
}
return true;
} catch (\Throwable $e) {
log_message('error', 'updatePurchaseStockById failed: ' . $e->getMessage());
return false;
}
}
public function transferSaleSsno(int $oldSsno, int $newSsno, int $qty): bool
{
if ($oldSsno <= 0 || $newSsno <= 0 || $qty <= 0) {
return false;
}
try {
if ($this->db->tableExists('inv_med_item')) {
$this->db->table('inv_med_item')
->where('store_stock_id', $oldSsno)
->limit(1)
->update(['store_stock_id' => $newSsno]);
$this->updatePurchaseStockById($oldSsno);
$this->updatePurchaseStockById($newSsno);
}
return true;
} catch (\Throwable $e) {
log_message('error', 'transferSaleSsno failed: ' . $e->getMessage());
return false;
}
}
private function clearProcedureResults(): void
{
$conn = $this->db->connID;
if (! $conn instanceof \mysqli) {
return;
}
while ($conn->more_results() && $conn->next_result()) {
$result = $conn->use_result();
if ($result instanceof \mysqli_result) {
$result->free();
}
}
}
}