clqms-be/app/Models/OrderTest/OrderTestModel.php
mahdahar bb7df6b70c feat(valueset): refactor from ID-based to name-based lookups
Complete overhaul of the valueset system to use human-readable names
instead of numeric IDs for improved maintainability and API consistency.
- PatientController: Renamed 'Gender' field to 'Sex' in validation rules
- ValuesetController: Changed API endpoints from ID-based (/:num) to name-based (/:any)
- TestsController: Refactored to use ValueSet library instead of direct valueset queries
- Added ValueSet library (app/Libraries/ValueSet.php) with static lookup methods:
  - getOptions() - returns dropdown format [{value, label}]
  - getLabel(, ) - returns label for a value
  - transformLabels(, ) - batch transform records
  - get() and getRaw() for Lookups compatibility
- Added ValueSetApiController for public valueset API endpoints
- Added ValueSet refresh endpoint (POST /api/valueset/refresh)
- Added DemoOrderController for testing order creation without auth
- 2026-01-12-000001: Convert valueset references from VID to VValue
- 2026-01-12-000002: Rename patient.Gender column to Sex
- OrderTestController: Now uses OrderTestModel with proper model pattern
- TestsController: Uses ValueSet library for all lookup operations
- ValueSetController: Simplified to use name-based lookups
- Updated all organization (account/site/workstation) dialogs and index views
- Updated specimen container dialogs and index views
- Updated tests_index.php with ValueSet integration
- Updated patient dialog form and index views
- Removed .factory/config.json and CLAUDE.md (replaced by AGENTS.md)
- Consolidated lookups in Lookups.php (removed inline valueset constants)
- Updated all test files to match new field names
- 32 modified files, 17 new files, 2 deleted files
- Net: +661 insertions, -1443 deletions (significant cleanup)
2026-01-12 16:53:41 +07:00

103 lines
3.2 KiB
PHP

<?php
namespace App\Models\OrderTest;
use App\Models\BaseModel;
class OrderTestModel extends BaseModel {
protected $table = 'ordertest';
protected $primaryKey = 'OrderID';
protected $allowedFields = [
'OrderID',
'InternalPID',
'PatVisitID',
'OrderDateTime',
'Priority',
'OrderStatus',
'OrderedBy',
'OrderingProvider',
'SiteID',
'SourceSiteID',
'DepartmentID',
'WorkstationID',
'BillingAccount',
'DelDate'
];
public function generateOrderID(string $siteCode = '00'): string {
$date = new \DateTime();
$year = $date->format('y');
$month = $date->format('m');
$day = $date->format('d');
$counter = $this->db->table('counter')
->where('CounterName', 'ORDER')
->get()
->getRow();
if (!$counter) {
$this->db->table('counter')->insert([
'CounterName' => 'ORDER',
'CounterValue' => 1
]);
$seq = 1;
} else {
$seq = $counter->CounterValue + 1;
$this->db->table('counter')
->where('CounterName', 'ORDER')
->update(['CounterValue' => $seq]);
}
$seqStr = str_pad($seq, 5, '0', STR_PAD_LEFT);
return $siteCode . $year . $month . $day . $seqStr;
}
public function createOrder(array $data): string {
$orderID = $data['OrderID'] ?? $this->generateOrderID();
$orderData = [
'OrderID' => $orderID,
'InternalPID' => $data['InternalPID'],
'PatVisitID' => $data['PatVisitID'] ?? null,
'OrderDateTime' => $data['OrderDateTime'] ?? date('Y-m-d H:i:s'),
'Priority' => $data['Priority'] ?? 'R',
'OrderStatus' => $data['OrderStatus'] ?? 'ORD',
'OrderedBy' => $data['OrderedBy'] ?? null,
'OrderingProvider' => $data['OrderingProvider'] ?? null,
'SiteID' => $data['SiteID'] ?? 1,
'SourceSiteID' => $data['SourceSiteID'] ?? 1,
'DepartmentID' => $data['DepartmentID'] ?? null,
'WorkstationID' => $data['WorkstationID'] ?? null,
'BillingAccount' => $data['BillingAccount'] ?? null,
'CreateDate' => date('Y-m-d H:i:s')
];
$this->insert($orderData);
return $orderID;
}
public function getOrder(string $orderID): ?array {
return $this->select('*')
->where('OrderID', $orderID)
->where('DelDate', null)
->get()
->getRowArray();
}
public function getOrdersByPatient(int $internalPID): array {
return $this->select('*')
->where('InternalPID', $internalPID)
->where('DelDate', null)
->orderBy('OrderDateTime', 'DESC')
->get()
->getResultArray();
}
public function updateStatus(string $orderID, string $status): bool {
return $this->where('OrderID', $orderID)->update(['OrderStatus' => $status]);
}
public function softDelete(string $orderID): bool {
return $this->where('OrderID', $orderID)->update(['DelDate' => date('Y-m-d H:i:s')]);
}
}