From 4aad7d331aad083e3bdce3f9491c60950a475c83 Mon Sep 17 00:00:00 2001 From: mahdahar <89adham@gmail.com> Date: Mon, 20 Apr 2026 13:48:18 +0700 Subject: [PATCH] feat(ordertest): add PVADTID filter support and sync order API docs - Add PVADTID query param handling in OrderTestController::index() (supports both PVADTID and pvadtid, with numeric casting). - Extend OrderTestModel::getOrdersByPatient() with optional PVADTID filtering. - Apply PVADTID filtering to general order listing queries. - Update public/paths/orders.yaml to document PVADTID on GET /api/ordertest. - Regenerate public/api-docs.bundled.yaml to keep OpenAPI bundle in sync. --- app/Controllers/OrderTestController.php | 74 +- app/Models/OrderTest/OrderTestModel.php | 102 +- public/api-docs.bundled.yaml | 17623 +++++++++++----------- public/paths/orders.yaml | 149 +- 4 files changed, 8986 insertions(+), 8962 deletions(-) diff --git a/app/Controllers/OrderTestController.php b/app/Controllers/OrderTestController.php index e312100..8c36f00 100755 --- a/app/Controllers/OrderTestController.php +++ b/app/Controllers/OrderTestController.php @@ -4,9 +4,9 @@ namespace App\Controllers; use App\Traits\ResponseTrait; use CodeIgniter\Controller; use App\Libraries\ValueSet; -use App\Models\OrderTest\OrderTestModel; -use App\Models\Patient\PatientModel; -use App\Models\PatVisit\PatVisitModel; +use App\Models\OrderTest\OrderTestModel; +use App\Models\Patient\PatientModel; +use App\Models\PatVisit\PatVisitModel; class OrderTestController extends Controller { use ResponseTrait; @@ -29,14 +29,22 @@ class OrderTestController extends Controller { public function index() { $internalPID = $this->request->getVar('InternalPID'); + $pvadtid = $this->request->getVar('PVADTID') ?? $this->request->getVar('pvadtid'); + $pvadtid = is_numeric($pvadtid) ? (int) $pvadtid : null; $includeDetails = $this->request->getVar('include') === 'details'; try { if ($internalPID) { - $rows = $this->model->getOrdersByPatient($internalPID); + $rows = $this->model->getOrdersByPatient((int) $internalPID, $pvadtid); } else { - $rows = $this->db->table('ordertest') - ->where('DelDate', null) + $builder = $this->db->table('ordertest') + ->where('DelDate', null); + + if ($pvadtid !== null) { + $builder->where('PVADTID', $pvadtid); + } + + $rows = $builder ->orderBy('TrnDate', 'DESC') ->get() ->getResultArray(); @@ -179,35 +187,35 @@ class OrderTestController extends Controller { $order['Specimens'] = $this->getOrderSpecimens($order['InternalOID']); $order['Tests'] = $this->getOrderTests($order['InternalOID']); - // Rule engine triggers are fired at the test/result level (test_created, result_updated) - - return $this->respondCreated([ - 'status' => 'success', - 'message' => 'Order created successfully', - 'data' => $order - ], 201); + // Rule engine triggers are fired at the test/result level (test_created, result_updated) + + return $this->respondCreated([ + 'status' => 'success', + 'message' => 'Order created successfully', + 'data' => $order + ], 201); } catch (\Exception $e) { return $this->failServerError('Something went wrong: ' . $e->getMessage()); } } - public function update($OrderID = null) { - $input = $this->request->getJSON(true); - - if ($OrderID === null || $OrderID === '') { - return $this->failValidationErrors(['OrderID' => 'OrderID is required']); - } - - if (isset($input['OrderID']) && (string) $input['OrderID'] !== (string) $OrderID) { - return $this->failValidationErrors(['OrderID' => 'OrderID in URL does not match body']); - } - - try { - $input['OrderID'] = $OrderID; - $order = $this->model->getOrder($OrderID); - if (!$order) { - return $this->failNotFound('Order not found'); - } + public function update($OrderID = null) { + $input = $this->request->getJSON(true); + + if ($OrderID === null || $OrderID === '') { + return $this->failValidationErrors(['OrderID' => 'OrderID is required']); + } + + if (isset($input['OrderID']) && (string) $input['OrderID'] !== (string) $OrderID) { + return $this->failValidationErrors(['OrderID' => 'OrderID in URL does not match body']); + } + + try { + $input['OrderID'] = $OrderID; + $order = $this->model->getOrder($OrderID); + if (!$order) { + return $this->failNotFound('Order not found'); + } $updateData = []; if (isset($input['Priority'])) $updateData['Priority'] = $input['Priority']; @@ -220,9 +228,9 @@ class OrderTestController extends Controller { $this->model->update($order['InternalOID'], $updateData); } - $updatedOrder = $this->model->getOrder($OrderID); - $updatedOrder['Specimens'] = $this->getOrderSpecimens($updatedOrder['InternalOID']); - $updatedOrder['Tests'] = $this->getOrderTests($updatedOrder['InternalOID']); + $updatedOrder = $this->model->getOrder($OrderID); + $updatedOrder['Specimens'] = $this->getOrderSpecimens($updatedOrder['InternalOID']); + $updatedOrder['Tests'] = $this->getOrderTests($updatedOrder['InternalOID']); return $this->respond([ 'status' => 'success', diff --git a/app/Models/OrderTest/OrderTestModel.php b/app/Models/OrderTest/OrderTestModel.php index 18b52a1..0a392e9 100755 --- a/app/Models/OrderTest/OrderTestModel.php +++ b/app/Models/OrderTest/OrderTestModel.php @@ -161,25 +161,25 @@ class OrderTestModel extends BaseModel { } } - // Insert unique tests into patres with specimen links - if (!empty($testToOrder)) { - $resModel = new \App\Models\PatResultModel(); - $patientModel = new \App\Models\Patient\PatientModel(); - $patient = $patientModel->find((int) $data['InternalPID']); - $age = null; - if (is_array($patient) && !empty($patient['Birthdate'])) { - try { - $birthdate = new \DateTime((string) $patient['Birthdate']); - $age = (new \DateTime())->diff($birthdate)->y; - } catch (\Throwable $e) { - $age = null; - } - } - - $ruleEngine = new \App\Services\RuleEngineService(); - - foreach ($testToOrder as $tid => $tinfo) { - $specimenInfo = $specimenConDefMap[$tid] ?? null; + // Insert unique tests into patres with specimen links + if (!empty($testToOrder)) { + $resModel = new \App\Models\PatResultModel(); + $patientModel = new \App\Models\Patient\PatientModel(); + $patient = $patientModel->find((int) $data['InternalPID']); + $age = null; + if (is_array($patient) && !empty($patient['Birthdate'])) { + try { + $birthdate = new \DateTime((string) $patient['Birthdate']); + $age = (new \DateTime())->diff($birthdate)->y; + } catch (\Throwable $e) { + $age = null; + } + } + + $ruleEngine = new \App\Services\RuleEngineService(); + + foreach ($testToOrder as $tid => $tinfo) { + $specimenInfo = $specimenConDefMap[$tid] ?? null; $patResData = [ 'OrderID' => $internalOID, @@ -191,32 +191,32 @@ class OrderTestModel extends BaseModel { 'CreateDate' => date('Y-m-d H:i:s') ]; - if ($specimenInfo) { - $patResData['InternalSID'] = $specimenInfo['InternalSID']; - } - - $resModel->insert($patResData); - - // Fire test_created rules after the test row is persisted - try { - $ruleEngine->run('test_created', [ - 'order' => [ - 'InternalOID' => $internalOID, - 'Priority' => $orderData['Priority'] ?? 'R', - 'TestSiteID' => $tid, - ], - 'patient' => [ - 'Sex' => is_array($patient) ? ($patient['Sex'] ?? null) : null, - ], - 'age' => $age, - 'testSiteID' => $tid, - ]); - } catch (\Throwable $e) { - log_message('error', 'OrderTestModel::createOrder rule engine error: ' . $e->getMessage()); - } - } - } - } + if ($specimenInfo) { + $patResData['InternalSID'] = $specimenInfo['InternalSID']; + } + + $resModel->insert($patResData); + + // Fire test_created rules after the test row is persisted + try { + $ruleEngine->run('test_created', [ + 'order' => [ + 'InternalOID' => $internalOID, + 'Priority' => $orderData['Priority'] ?? 'R', + 'TestSiteID' => $tid, + ], + 'patient' => [ + 'Sex' => is_array($patient) ? ($patient['Sex'] ?? null) : null, + ], + 'age' => $age, + 'testSiteID' => $tid, + ]); + } catch (\Throwable $e) { + log_message('error', 'OrderTestModel::createOrder rule engine error: ' . $e->getMessage()); + } + } + } + } $this->db->transComplete(); @@ -299,10 +299,16 @@ class OrderTestModel extends BaseModel { ->getRowArray(); } - public function getOrdersByPatient(int $internalPID): array { - return $this->select('*') + public function getOrdersByPatient(int $internalPID, ?int $pvadtid = null): array { + $builder = $this->select('*') ->where('InternalPID', $internalPID) - ->where('DelDate', null) + ->where('DelDate', null); + + if ($pvadtid !== null) { + $builder->where('PVADTID', $pvadtid); + } + + return $builder ->orderBy('TrnDate', 'DESC') ->get() ->getResultArray(); diff --git a/public/api-docs.bundled.yaml b/public/api-docs.bundled.yaml index d3cb92a..7d5208d 100755 --- a/public/api-docs.bundled.yaml +++ b/public/api-docs.bundled.yaml @@ -1,8809 +1,8814 @@ -openapi: 3.1.0 -info: - title: CLQMS - Clinical Laboratory Quality Management System API - description: | - API for Clinical Laboratory Quality Management System supporting patient management, - specimen tracking, test ordering, instrument integration, and laboratory operations. - - **IMPORTANT:** For OpenAPI tools (Swagger UI, Redoc, Postman, etc.), use the bundled file: - `api-docs.bundled.yaml` which contains all paths and schemas merged into one file. - - This file (api-docs.yaml) contains schema references and is meant for development. - The paths are defined in separate files in the `paths/` directory. - version: 1.0.0 - contact: - name: CLQMS API Support - license: - name: Proprietary -servers: - - url: http://localhost/clqms01/ - description: Local development server - - url: https://clqms01-api.services-summit.my.id/ - description: Production server -tags: - - name: Authentication - description: User authentication and session management - - name: Patient - description: Patient registration and management - - name: Patient Visit - description: Patient visit/encounter management - - name: Organization - description: Organization structure (accounts, sites, disciplines, departments, workstations) - - name: Location - description: Location management (rooms, wards, buildings) - - name: Equipment - description: Laboratory equipment and instrument management - - name: Specimen - description: Specimen and container management - - name: Test - description: Test definitions and test catalog - - name: Rule - description: Rule engine - rules can be linked to multiple tests via testrule mapping table - - name: Calculation - description: Lightweight calculator endpoint for retrieving computed values by code or name - - name: Order - description: Laboratory order management - - name: Result - description: Patient results reporting with auto-validation - - name: Report - description: Lab report generation (HTML view) - - name: Edge API - description: Instrument integration endpoints - - name: Contact - description: Contact management (doctors, practitioners, etc.) - - name: ValueSet - description: Value set definitions and items - - name: User - description: User management and administration - - name: Demo - description: Demo/test endpoints (no authentication) - - name: Audit - description: Audit log retrieval and filtering -paths: - /api/audit-logs: - get: - tags: - - Audit - summary: Retrieve audit log entries for a table - security: - - bearerAuth: [] - parameters: - - name: table - in: query - required: true - schema: - type: string - description: Table alias for the audit data (logpatient, logorder, logmaster, logsystem) - - name: rec_id - in: query - schema: - type: string - description: Primary record identifier (RecID) to filter audit rows - - name: event_id - in: query - schema: - type: string - description: Canonical EventID (case insensitive) - - name: activity_id - in: query - schema: - type: string - description: Canonical ActivityID (case insensitive) - - name: from - in: query - schema: - type: string - format: date-time - description: Lower bound for LogDate inclusive - - name: to - in: query - schema: - type: string - format: date-time - description: Upper bound for LogDate inclusive - - name: search - in: query - schema: - type: string - description: Search term that matches user, reason, field names, or values - - name: page - in: query - schema: - type: integer - default: 1 - description: Page number - - name: perPage - in: query - schema: - type: integer - default: 20 - description: Items per page (max 100) - responses: - '200': - description: Audit log results - content: - application/json: - schema: - $ref: '#/components/schemas/AuditLogsEnvelope' - '400': - description: Validation failure (missing table or invalid filters) - content: - application/json: - schema: - $ref: '#/components/schemas/AuditLogsErrorResponse' - '500': - description: Internal error when retrieving audit logs - content: - application/json: - schema: - $ref: '#/components/schemas/AuditLogsErrorResponse' - /api/auth/login: - post: - tags: - - Authentication - summary: User login - description: Authenticate user and receive JWT token via HTTP-only cookie - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/LoginRequest' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/LoginRequest' - responses: - '200': - description: Login successful - headers: - Set-Cookie: - description: JWT token in HTTP-only cookie - schema: - type: string - content: - application/json: - schema: - $ref: '#/components/schemas/LoginResponse' - '400': - description: Missing username - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - '401': - description: Invalid credentials - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - /api/auth/logout: - post: - tags: - - Authentication - summary: User logout - description: Clear JWT token cookie - security: - - bearerAuth: [] - responses: - '200': - description: Logout successful - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - /api/auth/check: - get: - tags: - - Authentication - summary: Check authentication status - security: - - bearerAuth: [] - - cookieAuth: [] - responses: - '200': - description: Authenticated - content: - application/json: - schema: - type: object - properties: - authenticated: - type: boolean - user: - type: object - '401': - description: Not authenticated - /api/auth/register: - post: - tags: - - Authentication - summary: Register new user - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/RegisterRequest' - responses: - '201': - description: User created - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - /api/auth/change_pass: - post: - tags: - - Authentication - summary: Change password - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - current_password - - new_password - properties: - current_password: - type: string - format: password - new_password: - type: string - format: password - responses: - '200': - description: Password changed successfully - /v2/auth/login: - post: - tags: - - Authentication - summary: V2 User login - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/LoginRequest' - responses: - '200': - description: Login successful - content: - application/json: - schema: - $ref: '#/components/schemas/LoginResponse' - /v2/auth/logout: - post: - tags: - - Authentication - summary: V2 User logout - responses: - '200': - description: Logout successful - /v2/auth/check: - get: - tags: - - Authentication - summary: V2 Check authentication - responses: - '200': - description: Auth check result - /v2/auth/register: - post: - tags: - - Authentication - summary: V2 Register new user - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/RegisterRequest' - responses: - '201': - description: User created - /api/calc/testcode/{codeOrName}: - post: - tags: - - Calculation - summary: Evaluate a configured calculation by test code or name and return the raw result map. - security: [] - parameters: - - name: codeOrName - in: path - required: true - schema: - type: string - description: TestSiteCode or TestSiteName of the calculated test (case-insensitive). - requestBody: - required: true - content: - application/json: - schema: - type: object - description: Key-value pairs where keys match member tests used in the formula. - additionalProperties: - type: number - example: - TBIL: 5 - DBIL: 3 - responses: - '200': - description: Returns a single key/value pair with the canonical TestSiteCode or an empty object when the calculation is incomplete or missing. - content: - application/json: - schema: - type: object - examples: - success: - value: - IBIL: 2 - incomplete: - value: {} - /api/calc/testsite/{testSiteID}: - post: - tags: - - Calculation - summary: Evaluate a calculation defined for a test site and return a structured result. - security: [] - parameters: - - name: testSiteID - in: path - required: true - schema: - type: integer - description: Identifier for the test site whose definition should be evaluated. - requestBody: - required: true - content: - application/json: - schema: - type: object - description: Variable assignments required by the test site formula. - additionalProperties: - type: number - example: - result: 85 - gender: female - age: 30 - responses: - '200': - description: Returns the calculated result, testSiteID, formula code, and echoed variables. - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - data: - type: object - properties: - result: - type: number - testSiteID: - type: integer - formula: - type: string - variables: - type: object - additionalProperties: - type: number - examples: - success: - value: - status: success - data: - result: 92.4 - testSiteID: 123 - formula: '{result} * {factor} + {age}' - variables: - result: 85 - gender: female - age: 30 - '404': - description: No calculation defined for the requested test site. - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: failed - message: - type: string - example: No calculation defined for this test site - /api/contact: - get: - tags: - - Contact - summary: List contacts - security: - - bearerAuth: [] - parameters: - - name: ContactName - in: query - schema: - type: string - description: Filter by contact name (searches in NameFirst and NameLast) - - name: Specialty - in: query - schema: - type: string - description: Filter by medical specialty code - responses: - '200': - description: List of contacts - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/Contact' - post: - tags: - - Contact - summary: Create new contact - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - NameFirst - properties: - NameFirst: - type: string - description: First name - NameLast: - type: string - description: Last name - Title: - type: string - description: Title (e.g., Dr, Mr, Mrs) - Initial: - type: string - description: Middle initial - Birthdate: - type: string - format: date-time - description: Date of birth - EmailAddress1: - type: string - format: email - description: Primary email address - EmailAddress2: - type: string - format: email - description: Secondary email address - Phone: - type: string - description: Primary phone number - MobilePhone1: - type: string - description: Primary mobile number - MobilePhone2: - type: string - description: Secondary mobile number - Specialty: - type: string - description: Medical specialty code - SubSpecialty: - type: string - description: Sub-specialty code - responses: - '201': - description: Contact created successfully - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - '422': - description: Validation error - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - delete: - tags: - - Contact - summary: Delete contact - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - ContactID - properties: - ContactID: - type: integer - description: Contact ID to delete - responses: - '200': - description: Contact deleted successfully - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - /api/contact/{id}: - get: - tags: - - Contact - summary: Get contact by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Contact ID - responses: - '200': - description: Contact details - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/Contact' - patch: - tags: - - Contact - summary: Update contact - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Contact ID to update - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - NameFirst - properties: - NameFirst: - type: string - description: First name - NameLast: - type: string - description: Last name - Title: - type: string - description: Title (e.g., Dr, Mr, Mrs) - Initial: - type: string - description: Middle initial - Birthdate: - type: string - format: date-time - description: Date of birth - EmailAddress1: - type: string - format: email - description: Primary email address - EmailAddress2: - type: string - format: email - description: Secondary email address - Phone: - type: string - description: Primary phone number - MobilePhone1: - type: string - description: Primary mobile number - MobilePhone2: - type: string - description: Secondary mobile number - Specialty: - type: string - description: Medical specialty code - SubSpecialty: - type: string - description: Sub-specialty code - Details: - description: | - Detail payload supports either a flat array of new rows (legacy format) - or an operations object with `created`, `edited`, and `deleted` arrays. - oneOf: - - $ref: '#/components/schemas/ContactDetailOperations' - - type: array - description: Legacy format for replacing details with new rows only - items: - $ref: '#/components/schemas/ContactDetail' - responses: - '201': - description: Contact updated successfully - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - '422': - description: Validation error - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - /api/demo/hello: - get: - tags: - - Demo - summary: Hello world endpoint - description: Simple test endpoint that returns a greeting message - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: Hello, World! - /api/demo/ping: - get: - tags: - - Demo - summary: Ping endpoint - description: Health check endpoint to verify API is running - responses: - '200': - description: API is running - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: pong - timestamp: - type: string - format: date-time - /api/edge/result: - post: - tags: - - Edge API - summary: Receive results from instrument (tiny-edge) - description: | - Receives instrument results and stores them in the edgeres table for processing. - This endpoint is typically called by the tiny-edge middleware connected to laboratory analyzers. - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/EdgeResultRequest' - responses: - '201': - description: Result received and queued - content: - application/json: - schema: - $ref: '#/components/schemas/EdgeResultResponse' - '400': - description: Invalid JSON payload - /api/edge/order: - get: - tags: - - Edge API - summary: Fetch pending orders for instruments - description: Returns orders that need to be sent to laboratory instruments for testing - parameters: - - name: instrument_id - in: query - schema: - type: string - description: Filter by instrument - - name: status - in: query - schema: - type: string - enum: - - pending - - acknowledged - description: Filter by status - responses: - '200': - description: List of orders - content: - application/json: - schema: - type: object - properties: - status: - type: string - data: - type: array - items: - $ref: '#/components/schemas/EdgeOrder' - /api/edge/order/{orderId}/ack: - post: - tags: - - Edge API - summary: Acknowledge order delivery - description: Mark order as acknowledged by the instrument - parameters: - - name: orderId - in: path - required: true - schema: - type: integer - description: Edge order ID - responses: - '200': - description: Order acknowledged - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - /api/edge/status: - post: - tags: - - Edge API - summary: Log instrument status update - description: Receive status updates from laboratory instruments - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - instrument_id - - status - properties: - instrument_id: - type: string - status: - type: string - enum: - - online - - offline - - error - - maintenance - message: - type: string - timestamp: - type: string - format: date-time - responses: - '200': - description: Status logged - /api/equipmentlist: - get: - tags: - - Equipment - summary: List equipment - description: Get list of equipment with optional filters - security: - - bearerAuth: [] - parameters: - - name: IEID - in: query - schema: - type: string - description: Filter by IEID - - name: InstrumentName - in: query - schema: - type: string - description: Filter by instrument name - - name: DepartmentID - in: query - schema: - type: integer - description: Filter by department ID - - name: WorkstationID - in: query - schema: - type: integer - description: Filter by workstation ID - - name: Enable - in: query - schema: - type: integer - enum: - - 0 - - 1 - description: Filter by enable status - responses: - '200': - description: List of equipment - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/EquipmentList' - post: - tags: - - Equipment - summary: Create equipment - description: Create a new equipment entry - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - IEID - - DepartmentID - - Enable - - EquipmentRole - properties: - IEID: - type: string - maxLength: 50 - DepartmentID: - type: integer - InstrumentID: - type: string - maxLength: 150 - InstrumentName: - type: string - maxLength: 150 - WorkstationID: - type: integer - Enable: - type: integer - enum: - - 0 - - 1 - EquipmentRole: - type: string - maxLength: 1 - responses: - '201': - description: Equipment created - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: integer - delete: - tags: - - Equipment - summary: Delete equipment - description: Soft delete an equipment entry - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - EID - properties: - EID: - type: integer - responses: - '200': - description: Equipment deleted - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - /api/equipmentlist/{id}: - get: - tags: - - Equipment - summary: Get equipment by ID - description: Get a single equipment entry by its EID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Equipment ID - responses: - '200': - description: Equipment details - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/EquipmentList' - patch: - tags: - - Equipment - summary: Update equipment - description: Update an existing equipment entry - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Equipment ID - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - IEID: - type: string - maxLength: 50 - DepartmentID: - type: integer - InstrumentID: - type: string - maxLength: 150 - InstrumentName: - type: string - maxLength: 150 - WorkstationID: - type: integer - Enable: - type: integer - enum: - - 0 - - 1 - EquipmentRole: - type: string - maxLength: 1 - responses: - '200': - description: Equipment updated - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: integer - /api/location: - get: - tags: - - Location - summary: List locations - security: - - bearerAuth: [] - parameters: - - name: LocCode - in: query - schema: - type: string - description: Filter by location code - - name: LocName - in: query - schema: - type: string - description: Filter by location name (searches in LocFull) - responses: - '200': - description: List of locations - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/Location' - post: - tags: - - Location - summary: Create location - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - LocCode - - LocFull - properties: - SiteID: - type: integer - description: Reference to site - LocCode: - type: string - maxLength: 6 - description: Location code (short identifier) - Parent: - type: integer - nullable: true - description: Parent location ID for hierarchical locations - LocFull: - type: string - maxLength: 255 - description: Full location name - Description: - type: string - maxLength: 255 - description: Location description - LocType: - type: string - description: Location type code (e.g., ROOM, WARD, BUILDING) - responses: - '201': - description: Location created successfully - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - '422': - description: Validation error - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - delete: - tags: - - Location - summary: Delete location - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - LocationID - properties: - LocationID: - type: integer - description: Location ID to delete - responses: - '200': - description: Location deleted successfully - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - /api/location/{id}: - get: - tags: - - Location - summary: Get location by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Location ID - responses: - '200': - description: Location details - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/Location' - patch: - tags: - - Location - summary: Update location - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Location ID to update - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - SiteID: - type: integer - description: Reference to site - LocCode: - type: string - maxLength: 6 - description: Location code (short identifier) - Parent: - type: integer - nullable: true - description: Parent location ID for hierarchical locations - LocFull: - type: string - maxLength: 255 - description: Full location name - Description: - type: string - maxLength: 255 - description: Location description - LocType: - type: string - description: Location type code (e.g., ROOM, WARD, BUILDING) - responses: - '201': - description: Location updated successfully - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - '422': - description: Validation error - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - /api/ordertest: - get: - tags: - - Order - summary: List orders - security: - - bearerAuth: [] - parameters: - - name: page - in: query - schema: - type: integer - - name: perPage - in: query - schema: - type: integer - - name: InternalPID - in: query - schema: - type: integer - description: Filter by internal patient ID - - name: OrderStatus - in: query - schema: - type: string - enum: - - ORD - - SCH - - ANA - - VER - - REV - - REP - description: | - ORD: Ordered - SCH: Scheduled - ANA: Analysis - VER: Verified - REV: Reviewed - REP: Reported - responses: - '200': - description: List of orders - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/OrderTestList' - post: - tags: - - Order - summary: Create order with specimens and tests - description: Creates an order with associated specimens and patres records. Tests are grouped by container type to minimize specimen creation. - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - InternalPID - - Tests - properties: - OrderID: - type: string - description: Optional custom order ID (auto-generated if not provided) - InternalPID: - type: integer - description: Patient internal ID - PatVisitID: - type: integer - description: Visit ID - SiteID: - type: integer - default: 1 - PlacerID: - type: string - Priority: - type: string - enum: - - R - - S - - U - default: R - description: | - R: Routine - S: Stat - U: Urgent - ReqApp: - type: string - description: Requesting application - Comment: - type: string - Tests: - type: array - items: - type: object - required: - - TestSiteID - properties: - TestSiteID: - type: integer - description: Test definition site ID - TestID: - type: integer - description: Alias for TestSiteID - responses: - '201': - description: Order created successfully with specimens and tests - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - data: - $ref: '#/components/schemas/OrderTest' - '400': - description: Validation error - '500': - description: Server error - delete: - tags: - - Order - summary: Delete order - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - OrderID - properties: - OrderID: - type: string - responses: - '200': - description: Order deleted - /api/ordertest/status: - post: - tags: - - Order - summary: Update order status - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - OrderID - - OrderStatus - properties: - OrderID: - type: string - OrderStatus: - type: string - enum: - - ORD - - SCH - - ANA - - VER - - REV - - REP - description: | - ORD: Ordered - SCH: Scheduled - ANA: Analysis - VER: Verified - REV: Reviewed - REP: Reported - responses: - '200': - description: Order status updated - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/OrderTest' - /api/ordertest/{id}: - get: - tags: - - Order - summary: Get order by ID - description: Returns order details with associated specimens and tests - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: string - description: Order ID (e.g., 0025030300001) - responses: - '200': - description: Order details with specimens and tests - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/OrderTest' - patch: - tags: - - Order - summary: Update order - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: string - description: Order ID - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - Priority: - type: string - enum: - - R - - S - - U - OrderStatus: - type: string - enum: - - ORD - - SCH - - ANA - - VER - - REV - - REP - OrderingProvider: - type: string - DepartmentID: - type: integer - WorkstationID: - type: integer - responses: - '200': - description: Order updated - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/OrderTest' - /api/organization/account: - get: - tags: - - Organization - summary: List accounts - security: - - bearerAuth: [] - responses: - '200': - description: List of accounts - post: - tags: - - Organization - summary: Create account - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/Account' - responses: - '201': - description: Account created - delete: - tags: - - Organization - summary: Delete account - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - AccountID - properties: - AccountID: - type: integer - responses: - '200': - description: Account deleted - /api/organization/account/{id}: - get: - tags: - - Organization - summary: Get account by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Account details - content: - application/json: - schema: - $ref: '#/components/schemas/Account' - patch: - tags: - - Organization - summary: Update account - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - AccountName: - type: string - Parent: - type: integer - responses: - '200': - description: Account updated - /api/organization/site: - get: - tags: - - Organization - summary: List sites - security: - - bearerAuth: [] - responses: - '200': - description: List of sites - post: - tags: - - Organization - summary: Create site - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/Site' - responses: - '201': - description: Site created - delete: - tags: - - Organization - summary: Delete site - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - id - properties: - id: - type: integer - responses: - '200': - description: Site deleted - /api/organization/site/{id}: - get: - tags: - - Organization - summary: Get site by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Site details - patch: - tags: - - Organization - summary: Update site - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - SiteName: - type: string - SiteCode: - type: string - AccountID: - type: integer - responses: - '200': - description: Site updated - /api/organization/discipline: - get: - tags: - - Organization - summary: List disciplines - security: - - bearerAuth: [] - responses: - '200': - description: List of disciplines - post: - tags: - - Organization - summary: Create discipline - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/Discipline' - responses: - '201': - description: Discipline created - delete: - tags: - - Organization - summary: Delete discipline - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - id - properties: - id: - type: integer - responses: - '200': - description: Discipline deleted - /api/organization/discipline/{id}: - get: - tags: - - Organization - summary: Get discipline by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Discipline details - patch: - tags: - - Organization - summary: Update discipline - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - DisciplineName: - type: string - DisciplineCode: - type: string - SeqScr: - type: integer - description: Display order on screen - SeqRpt: - type: integer - description: Display order in reports - responses: - '200': - description: Discipline updated - /api/organization/department: - get: - tags: - - Organization - summary: List departments - security: - - bearerAuth: [] - responses: - '200': - description: List of departments - post: - tags: - - Organization - summary: Create department - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/Department' - responses: - '201': - description: Department created - delete: - tags: - - Organization - summary: Delete department - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - id - properties: - id: - type: integer - responses: - '200': - description: Department deleted - /api/organization/department/{id}: - get: - tags: - - Organization - summary: Get department by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Department details - patch: - tags: - - Organization - summary: Update department - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - DeptName: - type: string - DeptCode: - type: string - SiteID: - type: integer - responses: - '200': - description: Department updated - /api/organization/workstation: - get: - tags: - - Organization - summary: List workstations - security: - - bearerAuth: [] - responses: - '200': - description: List of workstations - post: - tags: - - Organization - summary: Create workstation - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/Workstation' - responses: - '201': - description: Workstation created - delete: - tags: - - Organization - summary: Delete workstation - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - id - properties: - id: - type: integer - responses: - '200': - description: Workstation deleted - /api/organization/workstation/{id}: - get: - tags: - - Organization - summary: Get workstation by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Workstation details - patch: - tags: - - Organization - summary: Update workstation - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - WorkstationName: - type: string - WorkstationCode: - type: string - SiteID: - type: integer - DepartmentID: - type: integer - responses: - '200': - description: Workstation updated - /api/organization/hostapp: - get: - tags: - - Organization - summary: List host applications - security: - - bearerAuth: [] - parameters: - - name: HostAppID - in: query - schema: - type: string - - name: HostAppName - in: query - schema: - type: string - responses: - '200': - description: List of host applications - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/HostApp' - post: - tags: - - Organization - summary: Create host application - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/HostApp' - responses: - '201': - description: Host application created - delete: - tags: - - Organization - summary: Delete host application (soft delete) - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - HostAppID - properties: - HostAppID: - type: string - responses: - '200': - description: Host application deleted - /api/organization/hostapp/{id}: - get: - tags: - - Organization - summary: Get host application by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: string - responses: - '200': - description: Host application details - content: - application/json: - schema: - $ref: '#/components/schemas/HostApp' - patch: - tags: - - Organization - summary: Update host application - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: string - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - HostAppName: - type: string - SiteID: - type: integer - responses: - '200': - description: Host application updated - /api/organization/hostcompara: - get: - tags: - - Organization - summary: List host communication parameters - security: - - bearerAuth: [] - parameters: - - name: HostAppID - in: query - schema: - type: string - - name: HostIP - in: query - schema: - type: string - responses: - '200': - description: List of host communication parameters - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/HostComPara' - post: - tags: - - Organization - summary: Create host communication parameters - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/HostComPara' - responses: - '201': - description: Host communication parameters created - delete: - tags: - - Organization - summary: Delete host communication parameters (soft delete) - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - HostAppID - properties: - HostAppID: - type: string - responses: - '200': - description: Host communication parameters deleted - /api/organization/hostcompara/{id}: - get: - tags: - - Organization - summary: Get host communication parameters by HostAppID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: string - responses: - '200': - description: Host communication parameters details - content: - application/json: - schema: - $ref: '#/components/schemas/HostComPara' - patch: - tags: - - Organization - summary: Update host communication parameters - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: string - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - HostIP: - type: string - HostPort: - type: string - HostPwd: - type: string - responses: - '200': - description: Host communication parameters updated - /api/organization/codingsys: - get: - tags: - - Organization - summary: List coding systems - security: - - bearerAuth: [] - parameters: - - name: CodingSysAbb - in: query - schema: - type: string - - name: FullText - in: query - schema: - type: string - responses: - '200': - description: List of coding systems - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/CodingSys' - post: - tags: - - Organization - summary: Create coding system - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CodingSys' - responses: - '201': - description: Coding system created - delete: - tags: - - Organization - summary: Delete coding system (soft delete) - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - CodingSysID - properties: - CodingSysID: - type: integer - responses: - '200': - description: Coding system deleted - /api/organization/codingsys/{id}: - get: - tags: - - Organization - summary: Get coding system by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Coding system details - content: - application/json: - schema: - $ref: '#/components/schemas/CodingSys' - patch: - tags: - - Organization - summary: Update coding system - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - CodingSysAbb: - type: string - FullText: - type: string - Description: - type: string - responses: - '200': - description: Coding system updated - /api/patvisit: - get: - tags: - - Patient Visit - summary: List patient visits - security: - - bearerAuth: [] - parameters: - - name: InternalPID - in: query - schema: - type: integer - description: Filter by internal patient ID (exact match) - - name: PVID - in: query - schema: - type: string - description: Filter by visit ID (partial match) - - name: PatientID - in: query - schema: - type: string - description: Filter by patient ID (partial match) - - name: PatientName - in: query - schema: - type: string - description: Search by patient name (searches in both first and last name) - - name: CreateDateFrom - in: query - schema: - type: string - format: date-time - description: Filter visits created on or after this date - - name: CreateDateTo - in: query - schema: - type: string - format: date-time - description: Filter visits created on or before this date - - name: page - in: query - schema: - type: integer - - name: perPage - in: query - schema: - type: integer - responses: - '200': - description: List of patient visits - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/PatientVisit' - total: - type: integer - description: Total number of records - page: - type: integer - description: Current page number - per_page: - type: integer - description: Number of records per page - post: - tags: - - Patient Visit - summary: Create patient visit - description: | - Creates a new patient visit. PVID is auto-generated with 'DV' prefix if not provided. - Can optionally include PatDiag (diagnosis) and PatVisitADT (ADT information). - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - InternalPID - properties: - PVID: - type: string - description: Visit ID (auto-generated with DV prefix if not provided) - InternalPID: - type: integer - description: Patient ID (required) - EpisodeID: - type: string - description: Episode identifier - SiteID: - type: integer - description: Site reference - PatDiag: - type: object - description: Optional diagnosis information - properties: - DiagCode: - type: string - Diagnosis: - type: string - PatVisitADT: - type: object - description: Optional ADT information - properties: - ADTCode: - type: string - enum: - - A01 - - A02 - - A03 - - A04 - - A08 - LocationID: - type: integer - AttDoc: - type: integer - RefDoc: - type: integer - AdmDoc: - type: integer - CnsDoc: - type: integer - responses: - '201': - description: Visit created successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: object - properties: - PVID: - type: string - InternalPVID: - type: integer - delete: - tags: - - Patient Visit - summary: Delete patient visit - security: - - bearerAuth: [] - responses: - '200': - description: Visit deleted successfully - /api/patvisit/{id}: - get: - tags: - - Patient Visit - summary: Get visit by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: string - description: PVID (visit identifier like DV00001) - responses: - '200': - description: Visit details - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/PatientVisit' - patch: - tags: - - Patient Visit - summary: Update patient visit - description: | - Updates an existing patient visit. InternalPVID is required. - Can update main visit data, PatDiag, and add new PatVisitADT records. - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Internal visit ID (InternalPVID) - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - PVID: - type: string - InternalPID: - type: integer - EpisodeID: - type: string - SiteID: - type: integer - PatDiag: - type: object - description: Diagnosis information (will update if exists) - properties: - DiagCode: - type: string - Diagnosis: - type: string - PatVisitADT: - type: array - description: Array of ADT records to add (new records only) - items: - type: object - properties: - ADTCode: - type: string - enum: - - A01 - - A02 - - A03 - - A04 - - A08 - LocationID: - type: integer - AttDoc: - type: integer - RefDoc: - type: integer - AdmDoc: - type: integer - CnsDoc: - type: integer - sequence: - type: integer - description: Used for ordering multiple ADT records - responses: - '200': - description: Visit updated successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: object - properties: - PVID: - type: string - InternalPVID: - type: integer - /api/patvisit/patient/{patientId}: - get: - tags: - - Patient Visit - summary: Get visits by patient ID - security: - - bearerAuth: [] - parameters: - - name: patientId - in: path - required: true - schema: - type: integer - description: Internal Patient ID (InternalPID) - responses: - '200': - description: Patient visits list - content: - application/json: - schema: - type: object - properties: - status: - type: string - data: - type: array - items: - $ref: '#/components/schemas/PatientVisit' - /api/patvisitadt: - post: - tags: - - Patient Visit - summary: Create ADT record - description: Create a new Admission/Discharge/Transfer record - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/PatVisitADT' - responses: - '201': - description: ADT record created successfully - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - delete: - tags: - - Patient Visit - summary: Delete ADT visit (soft delete) - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - PVADTID - properties: - PVADTID: - type: integer - description: ADT record ID to delete - responses: - '200': - description: ADT visit deleted successfully - /api/patvisitadt/visit/{visitId}: - get: - tags: - - Patient Visit - summary: Get ADT history by visit ID - description: Retrieve the complete Admission/Discharge/Transfer history for a visit, including all locations and doctors - security: - - bearerAuth: [] - parameters: - - name: visitId - in: path - required: true - schema: - type: integer - description: Internal Visit ID (InternalPVID) - responses: - '200': - description: ADT history retrieved successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: ADT history retrieved - data: - type: array - items: - type: object - properties: - PVADTID: - type: integer - InternalPVID: - type: integer - ADTCode: - type: string - enum: - - A01 - - A02 - - A03 - - A04 - - A08 - LocationID: - type: integer - LocationName: - type: string - AttDoc: - type: integer - AttDocFirstName: - type: string - AttDocLastName: - type: string - RefDoc: - type: integer - RefDocFirstName: - type: string - RefDocLastName: - type: string - AdmDoc: - type: integer - AdmDocFirstName: - type: string - AdmDocLastName: - type: string - CnsDoc: - type: integer - CnsDocFirstName: - type: string - CnsDocLastName: - type: string - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - /api/patvisitadt/{id}: - get: - tags: - - Patient Visit - summary: Get ADT record by ID - description: Retrieve a single ADT record by its ID, including location and doctor details - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: ADT record ID (PVADTID) - responses: - '200': - description: ADT record retrieved successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: ADT record retrieved - data: - type: object - properties: - PVADTID: - type: integer - InternalPVID: - type: integer - ADTCode: - type: string - enum: - - A01 - - A02 - - A03 - - A04 - - A08 - LocationID: - type: integer - LocationName: - type: string - AttDoc: - type: integer - AttDocFirstName: - type: string - AttDocLastName: - type: string - RefDoc: - type: integer - RefDocFirstName: - type: string - RefDocLastName: - type: string - AdmDoc: - type: integer - AdmDocFirstName: - type: string - AdmDocLastName: - type: string - CnsDoc: - type: integer - CnsDocFirstName: - type: string - CnsDocLastName: - type: string - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - patch: - tags: - - Patient Visit - summary: Update ADT record - description: Update an existing ADT record - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: ADT record ID (PVADTID) - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/PatVisitADT' - responses: - '200': - description: ADT record updated successfully - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - /api/patient: - get: - tags: - - Patient - summary: List patients - security: - - bearerAuth: [] - parameters: - - name: page - in: query - schema: - type: integer - default: 1 - - name: perPage - in: query - schema: - type: integer - default: 20 - - name: InternalPID - in: query - schema: - type: integer - description: Filter by internal patient ID - - name: PatientID - in: query - schema: - type: string - description: Filter by patient ID - - name: Name - in: query - schema: - type: string - description: Search by patient name - - name: Birthdate - in: query - schema: - type: string - format: date - description: Filter by birthdate (YYYY-MM-DD) - responses: - '200': - description: List of patients - content: - application/json: - schema: - $ref: '#/components/schemas/PatientListResponse' - post: - tags: - - Patient - summary: Create new patient - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/Patient' - responses: - '201': - description: Patient created successfully - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - '422': - description: Validation error - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - delete: - tags: - - Patient - summary: Delete patient (soft delete) - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - InternalPID - properties: - InternalPID: - type: integer - description: Internal patient record ID - responses: - '200': - description: Patient deleted successfully - /api/patient/check: - get: - tags: - - Patient - summary: Check if patient exists - security: - - bearerAuth: [] - parameters: - - name: PatientID - in: query - schema: - type: string - description: Patient ID to check - - name: EmailAddress - in: query - schema: - type: string - format: email - description: Email address to check - - name: Phone - in: query - schema: - type: string - description: Phone number to check - responses: - '200': - description: Patient check result - content: - application/json: - schema: - type: object - properties: - exists: - type: boolean - data: - $ref: '#/components/schemas/Patient' - /api/patient/{id}: - get: - tags: - - Patient - summary: Get patient by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Internal patient record ID - responses: - '200': - description: Patient details - content: - application/json: - schema: - type: object - properties: - status: - type: string - data: - $ref: '#/components/schemas/Patient' - patch: - tags: - - Patient - summary: Partially update patient - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Internal patient record ID - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/PatientPatch' - responses: - '200': - description: Patient updated successfully - '400': - description: Validation error - '404': - description: Patient not found - /api/report/{orderID}: - get: - tags: - - Report - summary: Generate lab report - description: Generate an HTML lab report for a specific order. Returns HTML content that can be viewed in browser or printed to PDF. - security: - - bearerAuth: [] - parameters: - - name: orderID - in: path - required: true - schema: - type: integer - description: Internal Order ID - responses: - '200': - description: HTML lab report - content: - text/html: - schema: - type: string - description: HTML content of the lab report - '404': - description: Order or patient not found - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - '500': - description: Failed to generate report - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - /api/result: - get: - tags: - - Result - summary: List results - description: Retrieve patient test results with optional filters by order or patient - security: - - bearerAuth: [] - parameters: - - name: order_id - in: query - schema: - type: integer - description: Filter by internal order ID - - name: patient_id - in: query - schema: - type: integer - description: Filter by internal patient ID (returns cumulative results) - - name: page - in: query - schema: - type: integer - default: 1 - description: Page number for pagination - - name: per_page - in: query - schema: - type: integer - default: 20 - description: Number of results per page - responses: - '200': - description: List of results - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - data: - type: array - items: - type: object - properties: - ResultID: - type: integer - OrderID: - type: integer - TestSiteID: - type: integer - TestSiteCode: - type: string - Result: - type: string - nullable: true - ResultDateTime: - type: string - format: date-time - RefNumID: - type: integer - nullable: true - RefTxtID: - type: integer - nullable: true - CreateDate: - type: string - format: date-time - TestSiteName: - type: string - nullable: true - Unit1: - type: string - nullable: true - Unit2: - type: string - nullable: true - Low: - type: number - nullable: true - High: - type: number - nullable: true - LowSign: - type: string - nullable: true - HighSign: - type: string - nullable: true - RefDisplay: - type: string - nullable: true - /api/result/{id}: - get: - tags: - - Result - summary: Get result by ID - description: Retrieve a specific result entry with all related data - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Result ID - responses: - '200': - description: Result details - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - data: - type: object - properties: - ResultID: - type: integer - SiteID: - type: integer - OrderID: - type: integer - InternalSID: - type: integer - SID: - type: string - SampleID: - type: string - TestSiteID: - type: integer - TestSiteCode: - type: string - AspCnt: - type: integer - Result: - type: string - nullable: true - SampleType: - type: string - nullable: true - ResultDateTime: - type: string - format: date-time - WorkstationID: - type: integer - nullable: true - EquipmentID: - type: integer - nullable: true - RefNumID: - type: integer - nullable: true - RefTxtID: - type: integer - nullable: true - CreateDate: - type: string - format: date-time - TestSiteName: - type: string - nullable: true - Unit1: - type: string - nullable: true - Unit2: - type: string - nullable: true - Low: - type: number - nullable: true - High: - type: number - nullable: true - LowSign: - type: string - nullable: true - HighSign: - type: string - nullable: true - RefDisplay: - type: string - nullable: true - OrderNumber: - type: string - nullable: true - InternalPID: - type: integer - '404': - description: Result not found - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - patch: - tags: - - Result - summary: Update result - description: Update a result value with automatic validation against reference ranges. Returns calculated flag (L/H) in response but does not store it. - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Result ID - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - Result: - type: string - description: The result value - RefNumID: - type: integer - description: Reference range ID to validate against - SampleType: - type: string - nullable: true - WorkstationID: - type: integer - nullable: true - EquipmentID: - type: integer - nullable: true - responses: - '200': - description: Result updated successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - data: - type: object - properties: - result: - type: object - flag: - type: string - nullable: true - enum: - - L - - H - description: Calculated flag - L for Low, H for High, null for normal - '400': - description: Validation failed - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - '404': - description: Result not found - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - delete: - tags: - - Result - summary: Delete result - description: Soft delete a result entry by setting DelDate - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Result ID - responses: - '200': - description: Result deleted successfully - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessResponse' - '404': - description: Result not found - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - /api/rule: - get: - tags: - - Rule - summary: List rules - security: - - bearerAuth: [] - parameters: - - name: EventCode - in: query - schema: - type: string - description: Filter by event code - - name: TestSiteID - in: query - schema: - type: integer - description: Filter by TestSiteID (returns rules linked to this test). Rules are only returned when attached to tests. - - name: search - in: query - schema: - type: string - description: Search by rule code or name - responses: - '200': - description: List of rules - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/RuleDef' - post: - tags: - - Rule - summary: Create rule - description: | - Create a new rule. Rules must be linked to at least one test via TestSiteIDs. - A single rule can be linked to multiple tests. Rules are active only when attached to tests. - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - RuleCode: - type: string - example: AUTO_SET_RESULT - RuleName: - type: string - example: Automatically Set Result - Description: - type: string - EventCode: - type: string - example: test_created - TestSiteIDs: - type: array - items: - type: integer - description: Array of TestSiteIDs to link this rule to (required) - example: - - 1 - - 2 - - 3 - ConditionExpr: - type: string - nullable: true - description: Raw DSL expression. Compile it first and persist the compiled JSON in ConditionExprCompiled. - example: if(sex('M'); result_set(0.5); result_set(0.6)) - ConditionExprCompiled: - type: string - nullable: true - description: Compiled JSON payload from POST /api/rule/compile - required: - - RuleCode - - RuleName - - EventCode - - TestSiteIDs - responses: - '201': - description: Rule created - /api/rule/{id}: - get: - tags: - - Rule - summary: Get rule with linked tests - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: RuleID - responses: - '200': - description: Rule details with linked test sites - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/RuleWithDetails' - '404': - description: Rule not found - patch: - tags: - - Rule - summary: Update rule - description: | - Update a rule. TestSiteIDs can be provided to update which tests the rule is linked to. - Tests not in the new list will be unlinked, and new tests will be linked. - Rules are active only when attached to tests. - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: RuleID - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - RuleCode: - type: string - RuleName: - type: string - Description: - type: string - EventCode: - type: string - TestSiteIDs: - type: array - items: - type: integer - description: Array of TestSiteIDs to link this rule to - ConditionExpr: - type: string - nullable: true - responses: - '200': - description: Rule updated - '404': - description: Rule not found - delete: - tags: - - Rule - summary: Soft delete rule - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: RuleID - responses: - '200': - description: Rule deleted - '404': - description: Rule not found - /api/rule/validate: - post: - tags: - - Rule - summary: Validate/evaluate an expression - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - expr: - type: string - context: - type: object - additionalProperties: true - required: - - expr - responses: - '200': - description: Validation result - /api/rule/compile: - post: - tags: - - Rule - summary: Compile DSL expression to engine-compatible structure - description: | - Compile a DSL expression to the engine-compatible JSON structure. - Frontend calls this when user clicks "Compile" button. - Returns compiled structure that can be saved to ConditionExprCompiled field. - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - expr: - type: string - description: Raw DSL expression - example: if(sex('M'); result_set(0.5); result_set(0.6)) - required: - - expr - responses: - '200': - description: Compilation successful - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - data: - type: object - properties: - raw: - type: string - description: Original DSL expression - compiled: - type: object - description: Parsed structure with conditionExpr, valueExpr, then, else - conditionExprCompiled: - type: string - description: JSON string to save to ConditionExprCompiled field - '400': - description: Compilation failed (invalid syntax) - /api/specimen: - get: - tags: - - Specimen - summary: List specimens - security: - - bearerAuth: [] - responses: - '200': - description: List of specimens - post: - tags: - - Specimen - summary: Create specimen - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/Specimen' - responses: - '201': - description: Specimen created - /api/specimen/{id}: - get: - tags: - - Specimen - summary: Get specimen by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Specimen details - patch: - tags: - - Specimen - summary: Update specimen - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Specimen ID (SID) - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/Specimen' - responses: - '200': - description: Specimen updated - delete: - tags: - - Specimen - summary: Delete specimen (soft delete) - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Specimen ID (SID) - responses: - '200': - description: Specimen deleted successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: Specimen deleted successfully - data: - type: object - properties: - SID: - type: integer - '404': - description: Specimen not found - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: failed - message: - type: string - example: Specimen not found - data: - type: null - '500': - description: Server error - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: failed - message: - type: string - example: Failed to delete specimen - data: - type: null - /api/specimen/container: - get: - tags: - - Specimen - summary: List container definitions - security: - - bearerAuth: [] - responses: - '200': - description: List of container definitions - post: - tags: - - Specimen - summary: Create container definition - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerDef' - responses: - '201': - description: Container definition created - /api/specimen/container/{id}: - get: - tags: - - Specimen - summary: Get container definition by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Container definition details - patch: - tags: - - Specimen - summary: Update container definition - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Container definition ID (ConDefID) - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerDef' - responses: - '200': - description: Container definition updated - /api/specimen/containerdef: - get: - tags: - - Specimen - summary: List container definitions (alias) - security: - - bearerAuth: [] - responses: - '200': - description: List of container definitions - post: - tags: - - Specimen - summary: Create container definition (alias) - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerDef' - responses: - '201': - description: Container definition created - /api/specimen/containerdef/{id}: - patch: - tags: - - Specimen - summary: Update container definition (alias) - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Container definition ID (ConDefID) - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerDef' - responses: - '200': - description: Container definition updated - /api/specimen/prep: - get: - tags: - - Specimen - summary: List specimen preparations - security: - - bearerAuth: [] - responses: - '200': - description: List of specimen preparations - post: - tags: - - Specimen - summary: Create specimen preparation - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/SpecimenPrep' - responses: - '201': - description: Specimen preparation created - /api/specimen/prep/{id}: - get: - tags: - - Specimen - summary: Get specimen preparation by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Specimen preparation details - patch: - tags: - - Specimen - summary: Update specimen preparation - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Specimen preparation ID (SpcPrpID) - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/SpecimenPrep' - responses: - '200': - description: Specimen preparation updated - /api/specimen/status: - get: - tags: - - Specimen - summary: List specimen statuses - security: - - bearerAuth: [] - responses: - '200': - description: List of specimen statuses - post: - tags: - - Specimen - summary: Create specimen status - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/SpecimenStatus' - responses: - '201': - description: Specimen status created - /api/specimen/status/{id}: - get: - tags: - - Specimen - summary: Get specimen status by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Specimen status details - patch: - tags: - - Specimen - summary: Update specimen status - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Specimen status ID (SpcStaID) - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/SpecimenStatus' - responses: - '200': - description: Specimen status updated - /api/specimen/collection: - get: - tags: - - Specimen - summary: List specimen collection methods - security: - - bearerAuth: [] - responses: - '200': - description: List of collection methods - post: - tags: - - Specimen - summary: Create specimen collection method - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/SpecimenCollection' - responses: - '201': - description: Collection method created - /api/specimen/collection/{id}: - get: - tags: - - Specimen - summary: Get specimen collection method by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: Collection method details - patch: - tags: - - Specimen - summary: Update specimen collection method - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Specimen collection ID (SpcColID) - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/SpecimenCollection' - responses: - '200': - description: Collection method updated - /api/test/testmap: - get: - tags: - - Test - summary: List all test mappings - security: - - bearerAuth: [] - parameters: - - name: host - in: query - required: false - schema: - type: string - description: Filter by host name, type, or ID - - name: client - in: query - required: false - schema: - type: string - description: Filter by client name, type, or ID - responses: - '200': - description: List of test mappings - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - data: - type: array - items: - type: object - properties: - TestMapID: - type: integer - HostType: - type: string - HostID: - type: string - HostName: - type: string - ClientType: - type: string - ClientID: - type: string - ClientName: - type: string - post: - tags: - - Test - summary: Create test mapping (header only) - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - HostType: - type: string - description: Host type code - HostID: - type: string - description: Host identifier - ClientType: - type: string - description: Client type code - ClientID: - type: string - description: Client identifier - details: - type: array - description: Optional detail records to create alongside the header - items: - type: object - properties: - HostTestCode: - type: string - HostTestName: - type: string - ConDefID: - type: integer - ClientTestCode: - type: string - ClientTestName: - type: string - responses: - '201': - description: Test mapping created - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - data: - type: integer - description: Created TestMapID - delete: - tags: - - Test - summary: Soft delete test mapping (cascades to details) - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - TestMapID: - type: integer - description: Test Map ID to delete (required) - required: - - TestMapID - responses: - '200': - description: Test mapping deleted successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - data: - type: integer - description: Deleted TestMapID - '404': - description: Test mapping not found or already deleted - /api/test/testmap/{id}: - get: - tags: - - Test - summary: Get test mapping by ID with details - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Test Map ID - responses: - '200': - description: Test mapping details with nested detail records - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/TestMap' - '404': - description: Test mapping not found - patch: - tags: - - Test - summary: Update test mapping - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Test Map ID - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - HostType: - type: string - HostID: - type: string - ClientType: - type: string - ClientID: - type: string - details: - description: | - Detail payload supports either a flat array/object (treated as new rows) - or an operations object with `created`, `edited`, and `deleted` arrays. - oneOf: - - type: object - properties: - created: - type: array - description: New detail records to insert - items: - type: object - properties: - HostTestCode: - type: string - HostTestName: - type: string - ConDefID: - type: integer - ClientTestCode: - type: string - ClientTestName: - type: string - edited: - type: array - description: Existing detail records to update - items: - type: object - properties: - TestMapDetailID: - type: integer - HostTestCode: - type: string - HostTestName: - type: string - ConDefID: - type: integer - ClientTestCode: - type: string - ClientTestName: - type: string - deleted: - type: array - description: TestMapDetailIDs to soft delete - items: - type: integer - - type: array - description: Shortcut format for creating new details only - items: - type: object - properties: - HostTestCode: - type: string - HostTestName: - type: string - ConDefID: - type: integer - ClientTestCode: - type: string - ClientTestName: - type: string - - type: object - description: Shortcut format for creating a single new detail - properties: - HostTestCode: - type: string - HostTestName: - type: string - ConDefID: - type: integer - ClientTestCode: - type: string - ClientTestName: - type: string - responses: - '200': - description: Test mapping updated - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - data: - type: integer - description: Updated TestMapID - /api/test/testmap/by-testcode/{testCode}: - get: - tags: - - Test - summary: Get test mappings by test code with details - security: - - bearerAuth: [] - parameters: - - name: testCode - in: path - required: true - schema: - type: string - description: Test Code (matches HostTestCode or ClientTestCode) - responses: - '200': - description: List of test mappings with details for the test code - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/TestMap' - /api/test/testmap/detail: - get: - tags: - - Test - summary: List test mapping details - security: - - bearerAuth: [] - parameters: - - name: TestMapID - in: query - schema: - type: integer - description: Filter by TestMapID - responses: - '200': - description: List of test mapping details - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/TestMapDetail' - post: - tags: - - Test - summary: Create test mapping detail - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - TestMapID: - type: integer - description: Test Map ID (required) - HostTestCode: - type: string - HostTestName: - type: string - ConDefID: - type: integer - ClientTestCode: - type: string - ClientTestName: - type: string - required: - - TestMapID - responses: - '201': - description: Test mapping detail created - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: integer - description: Created TestMapDetailID - delete: - tags: - - Test - summary: Soft delete test mapping detail - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - TestMapDetailID: - type: integer - description: Test Map Detail ID to delete (required) - required: - - TestMapDetailID - responses: - '200': - description: Test mapping detail deleted - /api/test/testmap/detail/{id}: - get: - tags: - - Test - summary: Get test mapping detail by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Test Map Detail ID - responses: - '200': - description: Test mapping detail - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/TestMapDetail' - patch: - tags: - - Test - summary: Update test mapping detail - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Test Map Detail ID - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - TestMapID: - type: integer - HostTestCode: - type: string - HostTestName: - type: string - ConDefID: - type: integer - ClientTestCode: - type: string - ClientTestName: - type: string - responses: - '200': - description: Test mapping detail updated - /api/test/testmap/detail/by-testmap/{testMapID}: - get: - tags: - - Test - summary: Get test mapping details by test map ID - security: - - bearerAuth: [] - parameters: - - name: testMapID - in: path - required: true - schema: - type: integer - description: Test Map ID - responses: - '200': - description: List of test mapping details - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/TestMapDetail' - /api/test/testmap/detail/batch: - post: - tags: - - Test - summary: Batch create test mapping details - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: array - items: - type: object - properties: - TestMapID: - type: integer - HostTestCode: - type: string - HostTestName: - type: string - ConDefID: - type: integer - ClientTestCode: - type: string - ClientTestName: - type: string - responses: - '200': - description: Batch create results - patch: - tags: - - Test - summary: Batch update test mapping details - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: array - items: - type: object - properties: - TestMapDetailID: - type: integer - TestMapID: - type: integer - HostTestCode: - type: string - HostTestName: - type: string - ConDefID: - type: integer - ClientTestCode: - type: string - ClientTestName: - type: string - responses: - '200': - description: Batch update results - delete: - tags: - - Test - summary: Batch delete test mapping details - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: array - items: - type: integer - description: TestMapDetailIDs to delete - responses: - '200': - description: Batch delete results - /api/test: - get: - tags: - - Test - summary: List test definitions - security: - - bearerAuth: [] - parameters: - - name: page - in: query - schema: - type: integer - default: 1 - description: Page number for pagination - - name: perPage - in: query - schema: - type: integer - default: 20 - description: Number of items per page - - name: SiteID - in: query - schema: - type: integer - description: Filter by site ID - - name: TestType - in: query - schema: - type: string - enum: - - TEST - - PARAM - - CALC - - GROUP - - TITLE - description: Filter by test type - - name: isVisibleScr - in: query - schema: - type: integer - enum: - - 0 - - 1 - description: Filter by screen visibility (0=hidden, 1=visible) - - name: isVisibleRpt - in: query - schema: - type: integer - enum: - - 0 - - 1 - description: Filter by report visibility (0=hidden, 1=visible) - - name: search - in: query - schema: - type: string - description: Search by test code or name - responses: - '200': - description: List of test definitions - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - type: array - items: - $ref: '#/components/schemas/TestDefinitionListItem' - pagination: - type: object - properties: - total: - type: integer - description: Total number of records matching the query - examples: - list_flat: - summary: Flat list response from testdefsite - value: - status: success - message: Data fetched successfully - data: - - TestSiteID: 21 - TestSiteCode: GLU - TestSiteName: Glucose - TestType: TEST - SeqScr: 11 - SeqRpt: 11 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - StartDate: '2026-01-01 00:00:00' - EndDate: null - DisciplineID: 2 - DepartmentID: 2 - DisciplineName: Clinical Chemistry - DepartmentName: Laboratory - - TestSiteID: 22 - TestSiteCode: CREA - TestSiteName: Creatinine - TestType: TEST - SeqScr: 12 - SeqRpt: 12 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - StartDate: '2026-01-01 00:00:00' - EndDate: null - DisciplineID: 2 - DepartmentID: 2 - DisciplineName: Clinical Chemistry - DepartmentName: Laboratory - post: - tags: - - Test - summary: Create test definition - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - SiteID: - type: integer - description: Site ID (required) - TestSiteCode: - type: string - description: Test code (required) - TestSiteName: - type: string - description: Test name (required) - TestType: - type: string - enum: - - TEST - - PARAM - - CALC - - GROUP - - TITLE - description: Test type (required) - Description: - type: string - DisciplineID: - type: integer - DepartmentID: - type: integer - ResultType: - type: string - enum: - - NMRIC - - RANGE - - TEXT - - VSET - - NORES - RefType: - type: string - enum: - - RANGE - - THOLD - - VSET - - TEXT - - NOREF - VSet: - type: integer - ReqQty: - type: number - format: decimal - ReqQtyUnit: - type: string - Unit1: - type: string - Factor: - type: number - format: decimal - Unit2: - type: string - Decimal: - type: integer - CollReq: - type: string - Method: - type: string - ExpectedTAT: - type: integer - SeqScr: - type: integer - SeqRpt: - type: integer - IndentLeft: - type: integer - FontStyle: - type: string - isVisibleScr: - type: integer - isVisibleRpt: - type: integer - isCountStat: - type: integer - testdefcal: - type: object - description: Calculated test metadata persisted in the `testdefcal` table. - properties: - FormulaCode: - type: string - description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}") - testdefgrp: - type: object - description: Group definition wrapper for CALC/GROUP member assignments. - properties: - members: - type: array - description: Array of member TestSiteIDs for CALC/GROUP definitions. - items: - type: object - properties: - TestSiteID: - type: integer - description: Foreign key referencing the member test's TestSiteID. - required: - - TestSiteID - refnum: - type: array - items: - type: object - reftxt: - type: array - items: - type: object - testmap: - type: array - items: - type: object - properties: - HostType: - type: string - HostID: - type: string - HostTestCode: - type: string - HostTestName: - type: string - ClientType: - type: string - ClientID: - type: string - ClientTestCode: - type: string - ClientTestName: - type: string - ConDefID: - type: integer - nullable: true - required: - - SiteID - - TestSiteCode - - TestSiteName - - TestType - examples: - TEST_no_ref: - summary: Technical test without reference or map - value: - SiteID: 1 - TestSiteCode: TEST_NREF - TestSiteName: Numeric Test - TestType: TEST - SeqScr: 500 - SeqRpt: 500 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - DisciplineID: 2 - DepartmentID: 2 - Unit1: mg/dL - Method: CBC Analyzer - PARAM_no_ref: - summary: Parameter without reference or map - value: - SiteID: 1 - TestSiteCode: PARAM_NRF - TestSiteName: Clinical Parameter - TestType: PARAM - SeqScr: 10 - SeqRpt: 10 - isVisibleScr: 1 - isVisibleRpt: 0 - isCountStat: 0 - DisciplineID: 10 - DepartmentID: 0 - Unit1: cm - Method: Manual entry - TEST_range_single: - summary: Technical test with numeric range reference (single) - value: - SiteID: 1 - TestSiteCode: TEST_RANGE - TestSiteName: Glucose Range - TestType: TEST - SeqScr: 105 - SeqRpt: 105 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - refnum: - - NumRefType: NMRC - RangeType: REF - Sex: '2' - LowSign: GE - Low: 70 - HighSign: LE - High: 100 - AgeStart: 6570 - AgeEnd: 36135 - Flag: 'N' - DisciplineID: 2 - DepartmentID: 2 - ResultType: NMRIC - RefType: RANGE - Unit1: mg/dL - Method: Hexokinase - TEST_range_multiple_map: - summary: Numeric reference with multiple ranges and test map - value: - SiteID: 1 - TestSiteCode: TEST_RMAP - TestSiteName: Glucose Panic Range - TestType: TEST - SeqScr: 110 - SeqRpt: 110 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - refnum: - - NumRefType: NMRC - RangeType: REF - Sex: '2' - LowSign: GE - Low: 70 - HighSign: LE - High: 100 - AgeStart: 6570 - AgeEnd: 36135 - Flag: 'N' - - NumRefType: NMRC - RangeType: REF - Sex: '1' - LowSign: '>' - Low: 75 - HighSign: < - High: 105 - AgeStart: 6570 - AgeEnd: 36135 - Flag: 'N' - testmap: - - HostType: SITE - HostID: '1' - HostTestCode: GLU - HostTestName: Glucose - ClientType: WST - ClientID: '1' - ClientTestCode: GLU_C - ClientTestName: Glucose Client - ConDefID: 1 - - HostType: SITE - HostID: '1' - HostTestCode: CREA - HostTestName: Creatinine - ClientType: WST - ClientID: '1' - ClientTestCode: CREA_C - ClientTestName: Creatinine Client - ConDefID: 2 - - HostType: WST - HostID: '3' - HostTestCode: HB - HostTestName: Hemoglobin - ClientType: INST - ClientID: '2' - ClientTestCode: HB_C - ClientTestName: Hemoglobin Client - ConDefID: 3 - DisciplineID: 2 - DepartmentID: 2 - ResultType: NMRIC - RefType: RANGE - Unit1: mg/dL - Method: Hexokinase - TEST_threshold: - summary: Technical test with threshold reference - value: - SiteID: 1 - TestSiteCode: TEST_THLD - TestSiteName: Sodium Threshold - TestType: TEST - SeqScr: 115 - SeqRpt: 115 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - refnum: - - NumRefType: THOLD - RangeType: PANIC - Sex: '2' - LowSign: LT - Low: 120 - AgeStart: 0 - AgeEnd: 45625 - Flag: H - DisciplineID: 2 - DepartmentID: 2 - ResultType: NMRIC - RefType: THOLD - Unit1: mmol/L - Method: Auto Analyzer - TEST_threshold_map: - summary: Threshold reference plus test map - value: - SiteID: 1 - TestSiteCode: TEST_TMAP - TestSiteName: Potassium Panic - TestType: TEST - SeqScr: 120 - SeqRpt: 120 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - refnum: - - NumRefType: THOLD - RangeType: PANIC - Sex: '2' - LowSign: LT - Low: 120 - AgeStart: 0 - AgeEnd: 45625 - Flag: H - - NumRefType: THOLD - RangeType: PANIC - Sex: '1' - LowSign: < - Low: 121 - AgeStart: 0 - AgeEnd: 45625 - Flag: H - testmap: - - HostType: SITE - HostID: '1' - ClientType: WST - ClientID: '1' - details: - - HostTestCode: HB - HostTestName: Hemoglobin - ConDefID: 3 - ClientTestCode: HB_C - ClientTestName: Hemoglobin Client - - HostTestCode: GLU - HostTestName: Glucose - ConDefID: 1 - ClientTestCode: GLU_C - ClientTestName: Glucose Client - DisciplineID: 2 - DepartmentID: 2 - ResultType: NMRIC - RefType: THOLD - Unit1: mmol/L - Method: Auto Analyzer - TEST_text: - summary: Technical test with text reference - value: - SiteID: 1 - TestSiteCode: TEST_TEXT - TestSiteName: Disease Stage - TestType: TEST - SeqScr: 130 - SeqRpt: 130 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - reftxt: - - SpcType: GEN - TxtRefType: TEXT - Sex: '2' - AgeStart: 6570 - AgeEnd: 36135 - RefTxt: NORM=Normal;HIGH=High - Flag: 'N' - DisciplineID: 1 - DepartmentID: 1 - ResultType: TEXT - RefType: TEXT - Method: Morphology - TEST_text_map: - summary: Text reference plus test map - value: - SiteID: 1 - TestSiteCode: TEST_TXM - TestSiteName: Disease Stage (Map) - TestType: TEST - SeqScr: 135 - SeqRpt: 135 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - reftxt: - - SpcType: GEN - TxtRefType: TEXT - Sex: '2' - AgeStart: 6570 - AgeEnd: 36135 - RefTxt: NORM=Normal - Flag: 'N' - - SpcType: GEN - TxtRefType: TEXT - Sex: '1' - AgeStart: 6570 - AgeEnd: 36135 - RefTxt: ABN=Abnormal - Flag: 'N' - testmap: - - HostType: SITE - HostID: '1' - ClientType: WST - ClientID: '1' - details: - - HostTestCode: STAGE - HostTestName: Disease Stage - ConDefID: 4 - ClientTestCode: STAGE_C - ClientTestName: Disease Stage Client - DisciplineID: 1 - DepartmentID: 1 - ResultType: TEXT - RefType: TEXT - TEST_valueset: - summary: Technical test using a value set result - value: - SiteID: 1 - TestSiteCode: TEST_VSET - TestSiteName: Urine Color - TestType: TEST - SeqScr: 140 - SeqRpt: 140 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - reftxt: - - SpcType: GEN - TxtRefType: VSET - Sex: '2' - AgeStart: 0 - AgeEnd: 43800 - RefTxt: NORM=Normal;MACRO=Macro - Flag: 'N' - DisciplineID: 4 - DepartmentID: 4 - ResultType: VSET - RefType: VSET - Method: Visual - TEST_valueset_map: - summary: Value set reference with test map - value: - SiteID: 1 - TestSiteCode: TEST_VMAP - TestSiteName: Urine Color (Map) - TestType: TEST - SeqScr: 145 - SeqRpt: 145 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - reftxt: - - SpcType: GEN - TxtRefType: VSET - Sex: '2' - AgeStart: 0 - AgeEnd: 43800 - RefTxt: NORM=Normal;ABN=Abnormal - Flag: 'N' - testmap: - - HostType: SITE - HostID: '1' - ClientType: WST - ClientID: '8' - details: - - HostTestCode: UCOLOR - HostTestName: Urine Color - ConDefID: 12 - ClientTestCode: UCOLOR_C - ClientTestName: Urine Color Client - DisciplineID: 4 - DepartmentID: 4 - ResultType: VSET - RefType: VSET - TEST_valueset_map_no_reftxt: - summary: Value set result with mapping but without explicit text reference entries - value: - SiteID: 1 - TestSiteCode: TEST_VSETM - TestSiteName: Urine Result Map - TestType: TEST - SeqScr: 150 - SeqRpt: 150 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - testmap: - - HostType: SITE - HostID: '1' - ClientType: WST - ClientID: '8' - details: - - HostTestCode: UGLUC - HostTestName: Urine Glucose - ConDefID: 12 - ClientTestCode: UGLUC_C - ClientTestName: Urine Glucose Client - DisciplineID: 4 - DepartmentID: 4 - ResultType: VSET - RefType: VSET - CALC_basic: - summary: Calculated test with members (no references) - value: - SiteID: 1 - TestSiteCode: CALC_BASE - TestSiteName: Estimated GFR - TestType: CALC - SeqScr: 190 - SeqRpt: 190 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 0 - DisciplineID: 2 - DepartmentID: 2 - testdefcal: - FormulaCode: CKD_EPI(CREA,AGE,GENDER) - testdefgrp: - members: - - TestSiteID: 21 - - TestSiteID: 22 - CALC_full: - summary: Calculated test with numeric reference ranges and map - value: - SiteID: 1 - TestSiteCode: CALC_FULL - TestSiteName: Estimated GFR (Map) - TestType: CALC - SeqScr: 195 - SeqRpt: 195 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 0 - refnum: - - NumRefType: NMRC - RangeType: REF - Sex: '2' - LowSign: GE - Low: 10 - HighSign: LE - High: 20 - AgeStart: 6570 - AgeEnd: 43800 - Flag: 'N' - testmap: - - HostType: SITE - HostID: '1' - ClientType: WST - ClientID: '3' - details: - - HostTestCode: EGFR - HostTestName: eGFR - ConDefID: 1 - ClientTestCode: EGFR_C - ClientTestName: eGFR Client - DisciplineID: 2 - DepartmentID: 2 - testdefcal: - FormulaCode: CKD_EPI(CREA,AGE,GENDER) - testdefgrp: - members: - - TestSiteID: 21 - - TestSiteID: 22 - GROUP_with_members: - summary: Group/profile test with members and mapping - value: - SiteID: 1 - TestSiteCode: GROUP_PNL - TestSiteName: Lipid Profile - TestType: GROUP - SeqScr: 10 - SeqRpt: 10 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - testmap: - - HostType: SITE - HostID: '1' - ClientType: WST - ClientID: '3' - details: - - HostTestCode: LIPID - HostTestName: Lipid Profile - ConDefID: 1 - ClientTestCode: LIPID_C - ClientTestName: Lipid Client - testdefgrp: - members: - - TestSiteID: 169 - - TestSiteID: 170 - responses: - '201': - description: Test definition created - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: created - message: - type: string - data: - type: object - properties: - TestSiteId: - type: integer - '400': - description: Validation error (e.g., invalid member TestSiteID) - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: failed - message: - type: string - example: 'Invalid member TestSiteID(s): 185, 186. Make sure to use TestSiteID, not SeqScr or other values.' - /api/test/{id}: - get: - tags: - - Test - summary: Get test definition by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Test Site ID - responses: - '200': - description: Test definition details - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/TestDefinition' - '404': - description: Test not found - patch: - tags: - - Test - summary: Update test definition - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Test Site ID - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - TestSiteID: - type: integer - description: Test Site ID (required) - TestSiteCode: - type: string - TestSiteName: - type: string - TestType: - type: string - enum: - - TEST - - PARAM - - CALC - - GROUP - - TITLE - Description: - type: string - DisciplineID: - type: integer - DepartmentID: - type: integer - ResultType: - type: string - enum: - - NMRIC - - RANGE - - TEXT - - VSET - - NORES - RefType: - type: string - enum: - - RANGE - - THOLD - - VSET - - TEXT - - NOREF - VSet: - type: integer - ReqQty: - type: number - format: decimal - ReqQtyUnit: - type: string - Unit1: - type: string - Factor: - type: number - format: decimal - Unit2: - type: string - Decimal: - type: integer - CollReq: - type: string - Method: - type: string - ExpectedTAT: - type: integer - SeqScr: - type: integer - SeqRpt: - type: integer - IndentLeft: - type: integer - FontStyle: - type: string - isVisibleScr: - type: integer - isVisibleRpt: - type: integer - isCountStat: - type: integer - testdefcal: - type: object - description: Calculated test metadata persisted in the `testdefcal` table. - properties: - FormulaCode: - type: string - description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}") - testdefgrp: - type: object - description: Group definition wrapper for CALC/GROUP member assignments. - properties: - members: - type: array - description: Array of member TestSiteIDs for CALC/GROUP definitions. - items: - type: object - properties: - TestSiteID: - type: integer - description: Foreign key referencing the member test's TestSiteID. - required: - - TestSiteID - refnum: - type: array - items: - type: object - reftxt: - type: array - items: - type: object - testmap: - type: array - items: - type: object - properties: - HostType: - type: string - HostID: - type: string - HostTestCode: - type: string - HostTestName: - type: string - ClientType: - type: string - ClientID: - type: string - ClientTestCode: - type: string - ClientTestName: - type: string - ConDefID: - type: integer - nullable: true - required: - - TestSiteID - responses: - '200': - description: Test definition updated - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - data: - type: object - properties: - TestSiteId: - type: integer - '400': - description: Validation error (e.g., invalid member TestSiteID) - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: failed - message: - type: string - example: 'Invalid member TestSiteID(s): 185, 186. Make sure to use TestSiteID, not SeqScr or other values.' - delete: - tags: - - Test - summary: Soft delete test definition - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: Test Site ID to delete - requestBody: - content: - application/json: - schema: - type: object - properties: - TestSiteID: - type: integer - description: Optional - can be provided in body instead of path - responses: - '200': - description: Test disabled successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - data: - type: object - properties: - TestSiteId: - type: integer - EndDate: - type: string - format: date-time - '404': - description: Test not found - '422': - description: Test already disabled - /api/user: - get: - tags: - - User - summary: List users with pagination and search - security: - - bearerAuth: [] - parameters: - - name: page - in: query - schema: - type: integer - default: 1 - description: Page number - - name: per_page - in: query - schema: - type: integer - default: 20 - description: Items per page - - name: search - in: query - schema: - type: string - description: Search term for username, email, or name - responses: - '200': - description: List of users with pagination - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: Users retrieved successfully - data: - type: object - properties: - users: - type: array - items: - $ref: '#/components/schemas/User' - pagination: - type: object - properties: - current_page: - type: integer - per_page: - type: integer - total: - type: integer - total_pages: - type: integer - '500': - description: Server error - post: - tags: - - User - summary: Create new user - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/UserCreate' - responses: - '201': - description: User created successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: User created successfully - data: - type: object - properties: - UserID: - type: integer - Username: - type: string - Email: - type: string - '400': - description: Validation failed - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: failed - message: - type: string - example: Validation failed - data: - type: object - '500': - description: Server error - /api/user/{id}: - get: - tags: - - User - summary: Get user by ID - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: User ID - responses: - '200': - description: User details - content: - application/json: - schema: - $ref: '#/components/schemas/User' - '404': - description: User not found - '500': - description: Server error - patch: - tags: - - User - summary: Update existing user - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: User ID - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/UserUpdate' - responses: - '200': - description: User updated successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: User updated successfully - data: - type: object - properties: - UserID: - type: integer - updated_fields: - type: array - items: - type: string - '400': - description: UserID is required - '404': - description: User not found - '500': - description: Server error - delete: - tags: - - User - summary: Delete user (soft delete) - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - description: User ID - responses: - '200': - description: User deleted successfully - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: User deleted successfully - data: - type: object - properties: - UserID: - type: integer - '404': - description: User not found - '500': - description: Server error - /api/valueset: - get: - tags: - - ValueSet - summary: List lib value sets - description: List all library/system value sets from JSON files with item counts. Returns an array of objects with value, label, and count properties. - security: - - bearerAuth: [] - parameters: - - name: search - in: query - schema: - type: string - description: Optional search term to filter value set names or labels - responses: - '200': - description: List of lib value sets with item counts - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - data: - type: array - items: - $ref: '#/components/schemas/ValueSetListItem' - example: - - value: sex - label: Sex - count: 3 - - value: marital_status - label: Marital Status - count: 6 - - value: order_status - label: Order Status - count: 6 - /api/valueset/{key}: - get: - tags: - - ValueSet - summary: Get lib value set by key - description: | - Get a specific library/system value set from JSON files. - - **Available value set keys:** - - `activity_result` - Activity Result - - `additive` - Additive - - `adt_event` - ADT Event - - `area_class` - Area Class - - `body_site` - Body Site - - `collection_method` - Collection Method - - `container_cap_color` - Container Cap Color - - `container_class` - Container Class - - `container_size` - Container Size - - `country` - Country - - `death_indicator` - Death Indicator - - `did_type` - DID Type - - `enable_disable` - Enable/Disable - - `entity_type` - Entity Type - - `ethnic` - Ethnic - - `fasting_status` - Fasting Status - - `formula_language` - Formula Language - - `generate_by` - Generate By - - `identifier_type` - Identifier Type - - `location_type` - Location Type - - `marital_status` - Marital Status - - `math_sign` - Math Sign - - `numeric_ref_type` - Numeric Reference Type - - `operation` - Operation (CRUD) - - `order_priority` - Order Priority - - `order_status` - Order Status - - `race` - Race (Ethnicity) - - `range_type` - Range Type - - `reference_type` - Reference Type - - `religion` - Religion - - `requested_entity` - Requested Entity - - `result_type` - Result Type - - `result_unit` - Result Unit - - `sex` - Sex - - `site_class` - Site Class - - `site_type` - Site Type - - `specimen_activity` - Specimen Activity - - `specimen_condition` - Specimen Condition - - `specimen_role` - Specimen Role - - `specimen_status` - Specimen Status - - `specimen_type` - Specimen Type - - `test_activity` - Test Activity - - `test_type` - Test Type - - `text_ref_type` - Text Reference Type - - `unit` - Unit - - `v_category` - VCategory - - `ws_type` - Workstation Type - security: - - bearerAuth: [] - parameters: - - name: key - in: path - required: true - schema: - type: string - enum: - - activity_result - - additive - - adt_event - - area_class - - body_site - - collection_method - - container_cap_color - - container_class - - container_size - - country - - death_indicator - - did_type - - enable_disable - - entity_type - - ethnic - - fasting_status - - formula_language - - generate_by - - identifier_type - - location_type - - marital_status - - math_sign - - numeric_ref_type - - operation - - order_priority - - order_status - - race - - range_type - - reference_type - - religion - - requested_entity - - result_type - - result_unit - - sex - - site_class - - site_type - - specimen_activity - - specimen_condition - - specimen_role - - specimen_status - - specimen_type - - test_activity - - test_type - - text_ref_type - - unit - - v_category - - ws_type - description: Value set key name - responses: - '200': - description: Lib value set details - content: - application/json: - schema: - type: object - properties: - status: - type: string - data: - type: array - items: - $ref: '#/components/schemas/ValueSetLibItem' - /api/valueset/refresh: - post: - tags: - - ValueSet - summary: Refresh lib ValueSet cache - description: Clear and reload the library/system ValueSet cache from JSON files. Call this after modifying JSON files in app/Libraries/Data/. - security: - - bearerAuth: [] - responses: - '200': - description: Lib ValueSet cache refreshed - content: - application/json: - schema: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: Cache cleared - /api/valueset/user/items: - get: - tags: - - ValueSet - summary: List user value set items - description: List value set items from database (user-defined) - security: - - bearerAuth: [] - parameters: - - name: VSetID - in: query - schema: - type: integer - description: Filter by ValueSet ID - - name: search - in: query - schema: - type: string - description: Search term to filter by VValue, VDesc, or VSName - - name: param - in: query - schema: - type: string - description: Alternative search parameter (alias for search) - responses: - '200': - description: List of user value set items - content: - application/json: - schema: - type: object - properties: - status: - type: string - data: - type: array - items: - $ref: '#/components/schemas/ValueSetItem' - post: - tags: - - ValueSet - summary: Create user value set item - description: Create value set item in database (user-defined) - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - VSetID - properties: - SiteID: - type: integer - description: Site reference (default 1) - VSetID: - type: integer - description: Reference to value set definition (required) - VOrder: - type: integer - description: Display order (default 0) - VValue: - type: string - description: The value code - VDesc: - type: string - description: The display description/label - responses: - '201': - description: User value set item created - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/ValueSetItem' - /api/valueset/user/items/{id}: - get: - tags: - - ValueSet - summary: Get user value set item by ID - description: Get value set item from database (user-defined) - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: User value set item details - content: - application/json: - schema: - type: object - properties: - status: - type: string - data: - $ref: '#/components/schemas/ValueSetItem' - put: - tags: - - ValueSet - summary: Update user value set item - description: Update value set item in database (user-defined) - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - SiteID: - type: integer - description: Site reference - VSetID: - type: integer - description: Reference to value set definition - VOrder: - type: integer - description: Display order - VValue: - type: string - description: The value code - VDesc: - type: string - description: The display description/label - responses: - '200': - description: User value set item updated - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/ValueSetItem' - delete: - tags: - - ValueSet - summary: Delete user value set item - description: Delete value set item from database (user-defined) - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: User value set item deleted - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - /api/valueset/user/def: - get: - tags: - - ValueSet - summary: List user value set definitions - description: List value set definitions from database (user-defined) - security: - - bearerAuth: [] - parameters: - - name: search - in: query - schema: - type: string - description: Optional search term to filter definitions - - name: page - in: query - schema: - type: integer - default: 1 - description: Page number for pagination - - name: limit - in: query - schema: - type: integer - default: 100 - description: Number of items per page - responses: - '200': - description: List of user value set definitions - content: - application/json: - schema: - type: object - properties: - status: - type: string - data: - type: array - items: - $ref: '#/components/schemas/ValueSetDef' - meta: - type: object - properties: - total: - type: integer - page: - type: integer - limit: - type: integer - post: - tags: - - ValueSet - summary: Create user value set definition - description: Create value set definition in database (user-defined) - security: - - bearerAuth: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - SiteID: - type: integer - description: Site reference (default 1) - VSName: - type: string - description: Value set name - VSDesc: - type: string - description: Value set description - responses: - '201': - description: User value set definition created - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/ValueSetDef' - /api/valueset/user/def/{id}: - get: - tags: - - ValueSet - summary: Get user value set definition by ID - description: Get value set definition from database (user-defined) - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: User value set definition details - content: - application/json: - schema: - type: object - properties: - status: - type: string - data: - $ref: '#/components/schemas/ValueSetDef' - put: - tags: - - ValueSet - summary: Update user value set definition - description: Update value set definition in database (user-defined) - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - SiteID: - type: integer - description: Site reference - VSName: - type: string - description: Value set name - VSDesc: - type: string - description: Value set description - responses: - '200': - description: User value set definition updated - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/ValueSetDef' - delete: - tags: - - ValueSet - summary: Delete user value set definition - description: Delete value set definition from database (user-defined) - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - '200': - description: User value set definition deleted - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string -components: - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT - description: JWT token from login endpoint - cookieAuth: - type: apiKey - in: cookie - name: token - description: JWT token stored in HTTP-only cookie - schemas: - SuccessResponse: - type: object - properties: - status: - type: string - example: success - message: - type: string - code: - type: integer - example: 200 - ErrorResponse: - type: object - properties: - status: - type: string - example: error - message: - type: string - errors: - type: object - DashboardSummary: - type: object - properties: - pendingOrders: - type: integer - todayResults: - type: integer - criticalResults: - type: integer - activePatients: - type: integer - LoginRequest: - type: object - required: - - username - - password - properties: - username: - type: string - example: labuser01 - password: - type: string - format: password - example: secret123 - LoginResponse: - type: object - properties: - status: - type: string - example: success - code: - type: integer - example: 200 - message: - type: string - example: Login successful - RegisterRequest: - type: object - required: - - username - - password - - email - properties: - username: - type: string - password: - type: string - format: password - email: - type: string - format: email - full_name: - type: string - Patient: - type: object - required: - - PatientID - - Sex - - NameFirst - - Birthdate - properties: - PatientID: - type: string - maxLength: 30 - pattern: ^[A-Za-z0-9]+$ - description: Internal patient identifier - AlternatePID: - type: string - maxLength: 30 - pattern: ^[A-Za-z0-9]+$ - Prefix: - type: string - maxLength: 10 - enum: - - Mr - - Mrs - - Ms - - Dr - - Prof - Sex: - type: string - enum: - - '1' - - '2' - description: '1: Female, 2: Male' - NameFirst: - type: string - minLength: 1 - maxLength: 60 - pattern: ^[A-Za-z'\. ]+$ - NameMiddle: - type: string - minLength: 1 - maxLength: 60 - NameMaiden: - type: string - minLength: 1 - maxLength: 60 - NameLast: - type: string - minLength: 1 - maxLength: 60 - Suffix: - type: string - maxLength: 10 - Birthdate: - type: string - format: date-time - description: ISO 8601 UTC datetime - PlaceOfBirth: - type: string - maxLength: 100 - Citizenship: - type: string - maxLength: 100 - Street_1: - type: string - maxLength: 255 - Street_2: - type: string - maxLength: 255 - Street_3: - type: string - maxLength: 255 - ZIP: - type: string - maxLength: 10 - pattern: ^[0-9]+$ - Phone: - type: string - pattern: ^\+?[0-9]{8,15}$ - MobilePhone: - type: string - pattern: ^\+?[0-9]{8,15}$ - EmailAddress1: - type: string - format: email - maxLength: 100 - EmailAddress2: - type: string - format: email - maxLength: 100 - PatIdt: - $ref: '#/components/schemas/PatientIdentifier' - LinkTo: - type: array - description: Array of linked patient references - items: - $ref: '#/components/schemas/LinkedPatient' - Custodian: - $ref: '#/components/schemas/Custodian' - isDead: - type: string - enum: - - '0' - - '1' - description: '0: No (alive), 1: Yes (deceased)' - TimeOfDeath: - type: string - format: date-time - description: ISO 8601 UTC datetime of death - PatCom: - type: string - description: Patient comment/notes - PatAtt: - type: array - description: Patient address entries - items: - $ref: '#/components/schemas/PatAttEntry' - Province: - type: integer - description: Province AreaGeoID (foreign key to areageo table) - ProvinceLabel: - type: string - description: Province name (resolved from areageo) - City: - type: integer - description: City AreaGeoID (foreign key to areageo table) - CityLabel: - type: string - description: City name (resolved from areageo) - Country: - type: string - maxLength: 10 - description: Country ISO 3-letter code (e.g., IDN, USA) - CountryLabel: - type: string - description: Country name (resolved from valueset) - Race: - type: string - maxLength: 100 - MaritalStatus: - type: string - enum: - - A - - B - - D - - M - - S - - W - description: 'A: Annulled, B: Separated, D: Divorced, M: Married, S: Single, W: Widowed' - Religion: - type: string - maxLength: 100 - Ethnic: - type: string - maxLength: 100 - PatientIdentifier: - type: object - properties: - IdentifierType: - type: string - enum: - - KTP - - PASS - - SSN - - SIM - - KTAS - description: | - KTP: 16 digit numeric - PASS: alphanumeric max 9 - SSN: 9 digit numeric - SIM: 19-20 digit numeric - KTAS: 11 digit numeric - Identifier: - type: string - maxLength: 255 - LinkedPatient: - type: object - description: Linked patient reference - properties: - InternalPID: - type: integer - description: Internal patient ID of the linked patient - PatientID: - type: string - description: Patient ID of the linked patient - Custodian: - type: object - description: Patient custodian/guardian - properties: - InternalPID: - type: integer - description: Internal patient ID of the custodian - PatientID: - type: string - description: Patient ID of the custodian - PatAttEntry: - type: object - description: Patient address/attorney entry - properties: - Address: - type: string - description: Address text - PatientListResponse: - type: object - properties: - status: - type: string - example: success - data: - type: array - items: - $ref: '#/components/schemas/Patient' - pagination: - type: object - properties: - page: - type: integer - perPage: - type: integer - total: - type: integer - PatientVisit: - type: object - properties: - InternalPVID: - type: integer - description: Primary key (auto-generated) - PVID: - type: string - description: Visit ID (auto-generated with DV prefix if not provided) - InternalPID: - type: integer - description: Reference to patient - EpisodeID: - type: string - description: Episode identifier - SiteID: - type: integer - description: Site reference - LastLocation: - type: string - description: Full name of the last/current location from patvisitadt - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - ArchivedDate: - type: string - format: date-time - DelDate: - type: string - format: date-time - PatDiag: - type: object - description: Diagnosis information (optional) - properties: - DiagCode: - type: string - Diagnosis: - type: string - PatVisitADT: - type: object - description: ADT (Admission/Discharge/Transfer) information (optional) - properties: - ADTCode: - type: string - enum: - - A01 - - A02 - - A03 - - A04 - - A08 - LocationID: - type: integer - AttDoc: - type: integer - description: Attending physician ContactID - RefDoc: - type: integer - description: Referring physician ContactID - AdmDoc: - type: integer - description: Admitting physician ContactID - CnsDoc: - type: integer - description: Consulting physician ContactID - PatVisitADT: - type: object - properties: - PVADTID: - type: integer - description: Primary key (auto-generated) - InternalPVID: - type: integer - description: Reference to patient visit - ADTCode: - type: string - enum: - - A01 - - A02 - - A03 - - A04 - - A08 - description: | - A01: Admit - A02: Transfer - A03: Discharge - A04: Register - A08: Update - LocationID: - type: integer - description: Location/ward reference - AttDoc: - type: integer - description: Attending physician ContactID - RefDoc: - type: integer - description: Referring physician ContactID - AdmDoc: - type: integer - description: Admitting physician ContactID - CnsDoc: - type: integer - description: Consulting physician ContactID - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - ArchivedDate: - type: string - format: date-time - DelDate: - type: string - format: date-time - Account: - type: object - properties: - id: - type: integer - AccountName: - type: string - AccountCode: - type: string - AccountType: - type: string - Site: - type: object - properties: - id: - type: integer - SiteName: - type: string - SiteCode: - type: string - maxLength: 2 - pattern: ^[A-Z0-9]{2}$ - AccountID: - type: integer - Discipline: - type: object - properties: - id: - type: integer - DisciplineName: - type: string - DisciplineCode: - type: string - SeqScr: - type: integer - description: Display order on screen - SeqRpt: - type: integer - description: Display order in reports - Department: - type: object - properties: - id: - type: integer - DeptName: - type: string - DeptCode: - type: string - SiteID: - type: integer - Workstation: - type: object - properties: - id: - type: integer - WorkstationName: - type: string - WorkstationCode: - type: string - SiteID: - type: integer - DepartmentID: - type: integer - HostApp: - type: object - properties: - HostAppID: - type: string - maxLength: 5 - HostAppName: - type: string - SiteID: - type: integer - SiteName: - type: string - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - HostComPara: - type: object - properties: - HostAppID: - type: string - maxLength: 5 - HostAppName: - type: string - HostIP: - type: string - maxLength: 15 - HostPort: - type: string - maxLength: 6 - HostPwd: - type: string - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - CodingSys: - type: object - properties: - CodingSysID: - type: integer - CodingSysAbb: - type: string - maxLength: 6 - FullText: - type: string - Description: - type: string - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - Specimen: - type: object - properties: - id: - type: integer - SpecimenID: - type: string - PatientID: - type: string - SpecimenType: - type: string - description: Specimen type code - SpecimenTypeLabel: - type: string - description: Specimen type display text - CollectionDate: - type: string - format: date-time - CollectionMethod: - type: string - description: Collection method code - CollectionMethodLabel: - type: string - description: Collection method display text - ContainerID: - type: integer - SpecimenStatus: - type: string - description: Specimen status code - SpecimenStatusLabel: - type: string - description: Specimen status display text - BodySite: - type: string - description: Body site code - BodySiteLabel: - type: string - description: Body site display text - ContainerDef: - type: object - properties: - id: - type: integer - ContainerCode: - type: string - ContainerName: - type: string - ConCategory: - type: string - description: Container category code - ConCategoryLabel: - type: string - description: Container category display text - ConSize: - type: string - description: Container size code - ConSizeLabel: - type: string - description: Container size display text - CapColor: - type: string - description: Cap color code - CapColorLabel: - type: string - description: Cap color display text - SpecimenPrep: - type: object - properties: - id: - type: integer - PrepCode: - type: string - PrepName: - type: string - Description: - type: string - SpecimenStatus: - type: object - properties: - id: - type: integer - StatusCode: - type: string - StatusName: - type: string - Description: - type: string - Status: - type: string - description: Status code - StatusLabel: - type: string - description: Status display text - Activity: - type: string - description: Activity code - ActivityLabel: - type: string - description: Activity display text - SpecimenCollection: - type: object - properties: - id: - type: integer - CollectionCode: - type: string - CollectionName: - type: string - Description: - type: string - CollectionMethod: - type: string - description: Collection method code - CollectionMethodLabel: - type: string - description: Collection method display text - Additive: - type: string - description: Additive code - AdditiveLabel: - type: string - description: Additive display text - SpecimenRole: - type: string - description: Specimen role code - SpecimenRoleLabel: - type: string - description: Specimen role display text - TestDefinition: - type: object - properties: - TestSiteID: - type: integer - SiteID: - type: integer - TestSiteCode: - type: string - TestSiteName: - type: string - TestType: - type: string - enum: - - TEST - - PARAM - - CALC - - GROUP - - TITLE - description: | - TEST: Technical test - PARAM: Parameter - CALC: Calculated - GROUP: Panel/Profile - TITLE: Section header - Description: - type: string - DisciplineID: - type: integer - DisciplineName: - type: string - DepartmentID: - type: integer - DepartmentName: - type: string - ResultType: - type: string - enum: - - NMRIC - - RANGE - - TEXT - - VSET - - NORES - description: | - Result type determines the format of test results: - - NMRIC: Single numeric value - - RANGE: Numeric range (min-max) - - TEXT: Free text result - - VSET: Value set/enum result - - NORES: No result (for GROUP and TITLE types) - - TestType to ResultType mapping: - - TEST: NMRIC | RANGE | TEXT | VSET - - PARAM: NMRIC | RANGE | TEXT | VSET - - CALC: NMRIC (calculated result is always numeric) - - GROUP: NORES (no result, container only) - - TITLE: NORES (no result, header only) - RefType: - type: string - enum: - - RANGE - - THOLD - - VSET - - TEXT - - NOREF - description: | - Reference type determines which reference range table to use: - - RANGE: Numeric reference range - - THOLD: Threshold/panic range - - VSET: Value set reference - - TEXT: Free text reference - - NOREF: No reference (for NORES result type) - - ResultType to RefType mapping: - - NMRIC: RANGE | THOLD → refnum table - - RANGE: RANGE | THOLD → refnum table - - VSET: VSET → reftxt table - - TEXT: TEXT → reftxt table - - NORES: NOREF → (no reference table) - VSet: - type: integer - description: Value set ID for VSET result type - ReqQty: - type: number - format: decimal - description: Required sample quantity - ReqQtyUnit: - type: string - description: Unit for required quantity - Unit1: - type: string - description: Primary unit - Factor: - type: number - format: decimal - description: Conversion factor - Unit2: - type: string - description: Secondary unit (after conversion) - Decimal: - type: integer - description: Number of decimal places - CollReq: - type: string - description: Collection requirements - Method: - type: string - description: Test method - ExpectedTAT: - type: integer - description: Expected turnaround time - SeqScr: - type: integer - description: Screen sequence - SeqRpt: - type: integer - description: Report sequence - IndentLeft: - type: integer - default: 0 - FontStyle: - type: string - isVisibleScr: - type: integer - default: 1 - description: Screen visibility (0=hidden, 1=visible) - isVisibleRpt: - type: integer - default: 1 - description: Report visibility (0=hidden, 1=visible) - isCountStat: - type: integer - default: 1 - Level: - type: integer - isRequestable: - type: integer - default: 1 - description: Flag indicating if test can be requested (1=yes, 0=no) - CreateDate: - type: string - format: date-time - StartDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - FormulaCode: - type: string - description: Formula expression for calculated tests - testdefcal: - type: array - description: Calculated test details (only for CALC type) - items: - type: object - testdefgrp: - type: object - description: Group definition payload for GROUP and CALC types. - properties: - members: - type: array - description: | - Group members (for GROUP and CALC types). - When creating or updating, provide members in testdefgrp.members with TestSiteID field. - Do NOT use Member, SeqScr, or Members fields when creating/updating. - items: - type: object - properties: - TestGrpID: - type: integer - description: Group membership record ID - TestSiteID: - type: integer - description: Parent group TestSiteID - Member: - type: integer - description: | - Member TestSiteID (foreign key to testdefsite). - **Note**: This field is in the response. When creating/updating, use TestSiteID in testdefgrp.members instead. - TestSiteCode: - type: string - description: Member test code - TestSiteName: - type: string - description: Member test name - TestType: - type: string - description: Member test type - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - testmap: - type: array - description: Flat test mapping payload for /api/test create/update - items: - type: object - properties: - HostType: - type: string - HostID: - type: string - HostTestCode: - type: string - HostTestName: - type: string - ClientType: - type: string - ClientID: - type: string - ClientTestCode: - type: string - ClientTestName: - type: string - ConDefID: - type: integer - nullable: true - refnum: - type: array - description: Numeric reference ranges (optional). Mutually exclusive with reftxt - a test can only have ONE reference type. - items: - type: object - properties: - RefNumID: - type: integer - NumRefType: - type: string - enum: - - NMRC - - THOLD - description: NMRC=Numeric range, THOLD=Threshold - NumRefTypeLabel: - type: string - RangeType: - type: string - RangeTypeLabel: - type: string - SpcType: - type: string - description: Specimen type code (e.g., GEN, EDTA) - Sex: - type: string - SexLabel: - type: string - LowSign: - type: string - LowSignLabel: - type: string - HighSign: - type: string - HighSignLabel: - type: string - High: - type: number - format: float - Low: - type: number - format: float - AgeStart: - type: integer - description: Minimum patient age in days - AgeEnd: - type: integer - description: Maximum patient age in days - Flag: - type: string - Interpretation: - type: string - Notes: - type: string - description: Optional note attached to the numeric reference range - reftxt: - type: array - description: Text reference ranges (optional). Mutually exclusive with refnum - a test can only have ONE reference type. - items: - type: object - properties: - RefTxtID: - type: integer - TxtRefType: - type: string - enum: - - TEXT - - VSET - description: TEXT=Free text, VSET=Value set - TxtRefTypeLabel: - type: string - Sex: - type: string - SexLabel: - type: string - AgeStart: - type: integer - description: Minimum patient age in days - AgeEnd: - type: integer - description: Maximum patient age in days - RefTxt: - type: string - Flag: - type: string - examples: - TEST_numeric: - summary: Technical test with numeric reference - value: - TestSiteID: 1 - SiteID: 1 - TestSiteCode: GLU - TestSiteName: Glucose - TestType: TEST - DisciplineID: 2 - DepartmentID: 2 - ResultType: NMRIC - RefType: NMRC - Unit1: mg/dL - ReqQty: 300 - ReqQtyUnit: uL - Decimal: 0 - Method: Hexokinase - SeqScr: 11 - SeqRpt: 11 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - refnum: - - RefNumID: 1 - NumRefType: NMRC - NumRefTypeLabel: Numeric - RangeType: REF - RangeTypeLabel: Reference Range - Sex: '2' - SexLabel: Male - LowSign: GE - LowSignLabel: '>=' - HighSign: LE - HighSignLabel: <= - Low: 70 - High: 100 - AgeStart: 6570 - AgeEnd: 36135 - Flag: 'N' - Interpretation: Normal - TEST_threshold: - summary: Technical test with threshold reference (panic) - value: - TestSiteID: 2 - SiteID: 1 - TestSiteCode: GLU - TestSiteName: Glucose - TestType: TEST - DisciplineID: 2 - DepartmentID: 2 - ResultType: NMRIC - RefType: THOLD - Unit1: mg/dL - Decimal: 0 - Method: Hexokinase - SeqScr: 11 - SeqRpt: 11 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - refnum: - - RefNumID: 2 - NumRefType: THOLD - NumRefTypeLabel: Threshold - RangeType: PANIC - RangeTypeLabel: Panic Range - Sex: '1' - SexLabel: Female - LowSign: LT - LowSignLabel: < - High: 40 - AgeStart: 0 - AgeEnd: 43800 - Flag: L - Interpretation: Critical Low - TEST_text: - summary: Technical test with text reference - value: - TestSiteID: 3 - SiteID: 1 - TestSiteCode: STAGE - TestSiteName: Disease Stage - TestType: TEST - DisciplineID: 1 - DepartmentID: 1 - ResultType: VSET - RefType: TEXT - SeqScr: 50 - SeqRpt: 50 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - reftxt: - - RefTxtID: 1 - TxtRefType: TEXT - TxtRefTypeLabel: Text - Sex: '2' - SexLabel: Male - AgeStart: 6570 - AgeEnd: 36135 - RefTxt: NORM=Normal;HYPO=Hypochromic;MACRO=Macrocytic - Flag: 'N' - PARAM: - summary: Parameter test - value: - TestSiteID: 4 - SiteID: 1 - TestSiteCode: HEIGHT - TestSiteName: Height - TestType: PARAM - DisciplineID: 10 - ResultType: NMRIC - Unit1: cm - Decimal: 0 - SeqScr: 40 - SeqRpt: 40 - isVisibleScr: 1 - isVisibleRpt: 0 - isCountStat: 0 - CALC: - summary: Calculated test with reference - value: - TestSiteID: 5 - SiteID: 1 - TestSiteCode: EGFR - TestSiteName: eGFR - TestType: CALC - DisciplineID: 2 - DepartmentID: 2 - Unit1: mL/min/1.73m2 - Decimal: 0 - SeqScr: 20 - SeqRpt: 20 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 0 - testdefcal: - - TestCalID: 1 - DisciplineID: 2 - DepartmentID: 2 - FormulaCode: CKD_EPI(CREA,AGE,GENDER) - Unit1: mL/min/1.73m2 - Decimal: 0 - testdefgrp: - members: - - TestSiteID: 21 - TestSiteCode: CREA - TestSiteName: Creatinine - TestType: TEST - - TestSiteID: 51 - TestSiteCode: AGE - TestSiteName: Age - TestType: PARAM - refnum: - - RefNumID: 5 - NumRefType: NMRC - NumRefTypeLabel: Numeric - RangeType: REF - RangeTypeLabel: Reference Range - Sex: '1' - SexLabel: Female - LowSign: GE - LowSignLabel: '>=' - HighSign: LE - HighSignLabel: <= - Low: 10 - High: 20 - AgeStart: 6570 - AgeEnd: 43800 - Flag: 'N' - Interpretation: Normal - GROUP: - summary: Panel/Profile test - value: - TestSiteID: 6 - SiteID: 1 - TestSiteCode: LIPID - TestSiteName: Lipid Panel - TestType: GROUP - DisciplineID: 2 - DepartmentID: 2 - SeqScr: 51 - SeqRpt: 51 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 1 - testdefgrp: - members: - - TestGrpID: 1 - TestSiteID: 6 - Member: 100 - MemberTestSiteID: 100 - TestSiteCode: CHOL - TestSiteName: Total Cholesterol - TestType: TEST - - TestGrpID: 2 - TestSiteID: 6 - Member: 101 - MemberTestSiteID: 101 - TestSiteCode: TG - TestSiteName: Triglycerides - TestType: TEST - TITLE: - summary: Section header - value: - TestSiteID: 7 - SiteID: 1 - TestSiteCode: CHEM_HEADER - TestSiteName: '--- CHEMISTRY ---' - TestType: TITLE - DisciplineID: 2 - DepartmentID: 2 - SeqScr: 100 - SeqRpt: 100 - isVisibleScr: 1 - isVisibleRpt: 1 - isCountStat: 0 - TestMap: - type: object - properties: - TestMapID: - type: integer - HostType: - type: string - description: Host type code (e.g., SITE, WORKSTATION, INSTRUMENT) - HostID: - type: string - description: Host identifier - ClientType: - type: string - description: Client type code (e.g., SITE, WORKSTATION, INSTRUMENT) - ClientID: - type: string - description: Client identifier - HostName: - type: string - description: Resolved host name (from view) - ClientName: - type: string - description: Resolved client name (from view) - details: - type: array - description: Test mapping detail records - items: - $ref: '#/components/schemas/TestMapDetail' - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - description: Soft delete timestamp - OrderTestList: - type: object - properties: - InternalOID: - type: integer - description: Internal order ID - OrderID: - type: string - description: Order ID (e.g., 0025030300001) - PlacerID: - type: string - nullable: true - InternalPID: - type: integer - description: Patient internal ID - SiteID: - type: integer - PVADTID: - type: integer - description: Visit ADT ID - ReqApp: - type: string - nullable: true - Priority: - type: string - enum: - - R - - S - - U - description: | - R: Routine - S: Stat - U: Urgent - PriorityLabel: - type: string - description: Priority display text - TrnDate: - type: string - format: date-time - description: Transaction/Order date - EffDate: - type: string - format: date-time - description: Effective date - CreateDate: - type: string - format: date-time - OrderStatus: - type: string - enum: - - ORD - - SCH - - ANA - - VER - - REV - - REP - description: | - ORD: Ordered - SCH: Scheduled - ANA: Analysis - VER: Verified - REV: Reviewed - REP: Reported - OrderStatusLabel: - type: string - description: Order status display text - OrderTest: - type: object - properties: - InternalOID: - type: integer - description: Internal order ID - OrderID: - type: string - description: Order ID (e.g., 0025030300001) - PlacerID: - type: string - nullable: true - InternalPID: - type: integer - description: Patient internal ID - SiteID: - type: integer - PVADTID: - type: integer - description: Visit ADT ID - ReqApp: - type: string - nullable: true - Priority: - type: string - enum: - - R - - S - - U - description: | - R: Routine - S: Stat - U: Urgent - PriorityLabel: - type: string - description: Priority display text - TrnDate: - type: string - format: date-time - description: Transaction/Order date - EffDate: - type: string - format: date-time - description: Effective date - CreateDate: - type: string - format: date-time - OrderStatus: - type: string - enum: - - ORD - - SCH - - ANA - - VER - - REV - - REP - description: | - ORD: Ordered - SCH: Scheduled - ANA: Analysis - VER: Verified - REV: Reviewed - REP: Reported - OrderStatusLabel: - type: string - description: Order status display text - Specimens: - type: array - items: - $ref: '#/components/schemas/OrderSpecimen' - description: Associated specimens for this order - Tests: - type: array - items: - $ref: '#/components/schemas/OrderTestItem' - description: Test results (patres) for this order - OrderItem: - type: object - properties: - id: - type: integer - OrderID: - type: string - TestID: - type: integer - SpecimenID: - type: string - Status: - type: string - EdgeResultRequest: - type: object - required: - - sample_id - - instrument_id - properties: - sample_id: - type: string - description: Sample barcode/identifier - instrument_id: - type: string - description: Instrument identifier - patient_id: - type: string - description: Patient identifier (optional) - results: - type: array - items: - type: object - properties: - test_code: - type: string - result_value: - type: string - unit: - type: string - flags: - type: string - enum: - - H - - L - - 'N' - - A - description: H=High, L=Low, N=Normal, A=Abnormal - EdgeResultResponse: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: Result received and queued - data: - type: object - properties: - edge_res_id: - type: integer - sample_id: - type: string - instrument_id: - type: string - EdgeOrder: - type: object - properties: - OrderID: - type: string - PatientID: - type: string - SampleID: - type: string - Tests: - type: array - items: - type: object - properties: - TestCode: - type: string - TestName: - type: string - SpecimenType: - type: string - Priority: - type: string - DueDateTime: - type: string - format: date-time - ValueSetLibItem: - type: object - description: Library/system value set item from JSON files - properties: - value: - type: string - description: The value/key code - label: - type: string - description: The display label - ValueSetDef: - type: object - description: User-defined value set definition (from database) - properties: - VSetID: - type: integer - description: Primary key - SiteID: - type: integer - description: Site reference - VSName: - type: string - description: Value set name - VSDesc: - type: string - description: Value set description - CreateDate: - type: string - format: date-time - description: Creation timestamp - EndDate: - type: string - format: date-time - nullable: true - description: Soft delete timestamp - ItemCount: - type: integer - description: Number of items in this value set - ValueSetItem: - type: object - description: User-defined value set item (from database) - properties: - VID: - type: integer - description: Primary key - SiteID: - type: integer - description: Site reference - VSetID: - type: integer - description: Reference to value set definition - VOrder: - type: integer - description: Display order - VValue: - type: string - description: The value code - VDesc: - type: string - description: The display description/label - VCategory: - type: string - description: Category code - CreateDate: - type: string - format: date-time - description: Creation timestamp - EndDate: - type: string - format: date-time - nullable: true - description: Soft delete timestamp - VSName: - type: string - description: Value set name (from joined definition) - Location: - type: object - properties: - LocationID: - type: integer - description: Primary key - SiteID: - type: integer - description: Reference to site - LocCode: - type: string - maxLength: 6 - description: Location code (short identifier) - Parent: - type: integer - nullable: true - description: Parent location ID for hierarchical locations - LocFull: - type: string - maxLength: 255 - description: Full location name - Description: - type: string - maxLength: 255 - description: Location description - LocType: - type: string - description: Location type code (e.g., ROOM, WARD, BUILDING) - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - nullable: true - EquipmentList: - type: object - properties: - EID: - type: integer - description: Equipment ID (auto-increment) - IEID: - type: string - maxLength: 50 - description: Internal Equipment ID - DepartmentID: - type: integer - description: Reference to department - InstrumentID: - type: string - maxLength: 150 - description: Instrument identifier - InstrumentName: - type: string - maxLength: 150 - description: Instrument display name - WorkstationID: - type: integer - description: Reference to workstation - Enable: - type: integer - enum: - - 0 - - 1 - description: Equipment status (0=disabled, 1=enabled) - EquipmentRole: - type: string - maxLength: 1 - description: Equipment role code - CreateDate: - type: string - format: date-time - description: Creation timestamp - EndDate: - type: string - format: date-time - nullable: true - description: Deletion timestamp (soft delete) - DepartmentName: - type: string - description: Joined department name - WorkstationName: - type: string - description: Joined workstation name - User: - type: object - properties: - UserID: - type: integer - description: Unique user identifier - Username: - type: string - description: Unique login username - Email: - type: string - format: email - description: User email address - Name: - type: string - description: Full name of the user - Role: - type: string - description: User role (admin, technician, doctor, etc.) - Department: - type: string - description: Department name - IsActive: - type: boolean - description: Whether the user account is active - CreatedAt: - type: string - format: date-time - description: Creation timestamp - UpdatedAt: - type: string - format: date-time - description: Last update timestamp - DelDate: - type: string - format: date-time - nullable: true - description: Soft delete timestamp (null if active) - UserCreate: - type: object - required: - - Username - - Email - properties: - Username: - type: string - minLength: 3 - maxLength: 50 - description: Unique login username - Email: - type: string - format: email - maxLength: 100 - description: User email address - Name: - type: string - description: Full name of the user - Role: - type: string - description: User role - Department: - type: string - description: Department name - IsActive: - type: boolean - default: true - description: Whether the user account is active - UserUpdate: - type: object - required: - - UserID - properties: - UserID: - type: integer - description: User ID to update - Email: - type: string - format: email - description: User email address - Name: - type: string - description: Full name of the user - Role: - type: string - description: User role - Department: - type: string - description: Department name - IsActive: - type: boolean - description: Whether the user account is active - UserListResponse: - type: object - properties: - status: - type: string - example: success - message: - type: string - example: Users retrieved successfully - data: - type: object - properties: - users: - type: array - items: - $ref: '#/components/schemas/User' - pagination: - type: object - properties: - current_page: - type: integer - per_page: - type: integer - total: - type: integer - total_pages: - type: integer - RuleDef: - type: object - properties: - RuleID: - type: integer - RuleCode: - type: string - example: AUTO_SET_RESULT - RuleName: - type: string - example: Automatically Set Result - Description: - type: string - nullable: true - EventCode: - type: string - example: ORDER_CREATED - ConditionExpr: - type: string - nullable: true - description: Raw DSL expression (editable) - example: if(sex('M'); result_set(0.5); result_set(0.6)) - ConditionExprCompiled: - type: string - nullable: true - description: Compiled JSON structure (auto-generated from ConditionExpr) - example: '{"conditionExpr":"patient[\"Sex\"] == \"M\"","valueExpr":"(patient[\"Sex\"] == \"M\") ? 0.5 : 0.6","then":[{"type":"RESULT_SET","value":0.5,"valueExpr":"0.5"}],"else":[{"type":"RESULT_SET","value":0.6,"valueExpr":"0.6"}]}' - CreateDate: - type: string - format: date-time - nullable: true - StartDate: - type: string - format: date-time - nullable: true - EndDate: - type: string - format: date-time - nullable: true - RuleWithDetails: - allOf: - - $ref: '#/components/schemas/RuleDef' - - type: object - properties: - linkedTests: - type: array - items: - type: integer - description: Array of TestSiteIDs this rule is linked to. Rules are active only when attached to tests. - TestRule: - type: object - description: Mapping between a rule and a test site (testrule table). Rules are active when linked via this table. - properties: - TestRuleID: - type: integer - RuleID: - type: integer - TestSiteID: - type: integer - CreateDate: - type: string - format: date-time - nullable: true - EndDate: - type: string - format: date-time - nullable: true - AuditLogEntry: - type: object - properties: - LogPatientID: - type: integer - nullable: true - LogOrderID: - type: integer - nullable: true - LogMasterID: - type: integer - nullable: true - LogSystemID: - type: integer - nullable: true - TblName: - type: string - RecID: - type: string - FldName: - type: string - nullable: true - FldValuePrev: - type: string - nullable: true - FldValueNew: - type: string - nullable: true - UserID: - type: string - SiteID: - type: string - DIDType: - type: string - nullable: true - DID: - type: string - nullable: true - MachineID: - type: string - nullable: true - SessionID: - type: string - AppID: - type: string - ProcessID: - type: string - nullable: true - WebPageID: - type: string - nullable: true - EventID: - type: string - ActivityID: - type: string - Reason: - type: string - nullable: true - LogDate: - type: string - format: date-time - Context: - type: string - IpAddress: - type: string - nullable: true - AuditLogListResponse: - type: object - properties: - data: - type: array - items: - $ref: '#/components/schemas/AuditLogEntry' - pagination: - type: object - properties: - page: - type: integer - perPage: - type: integer - total: - type: integer - required: - - page - - perPage - - total - required: - - data - - pagination - AuditLogsEnvelope: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '#/components/schemas/AuditLogListResponse' - required: - - status - - message - - data - AuditLogsErrorResponse: - type: object - properties: - status: - type: string - message: - type: string - data: - nullable: true - required: - - status - - message - - data - Contact: - type: object - properties: - ContactID: - type: integer - description: Primary key - NameFirst: - type: string - description: First name (required) - NameLast: - type: string - description: Last name - Title: - type: string - description: Title (e.g., Dr, Mr, Mrs) - Initial: - type: string - description: Middle initial - Birthdate: - type: string - format: date-time - description: Date of birth - EmailAddress1: - type: string - format: email - description: Primary email address - EmailAddress2: - type: string - format: email - description: Secondary email address - Phone: - type: string - description: Primary phone number - MobilePhone1: - type: string - description: Primary mobile number - MobilePhone2: - type: string - description: Secondary mobile number - Specialty: - type: string - description: Medical specialty code - SubSpecialty: - type: string - description: Sub-specialty code - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - description: Occupation display text - ContactDetail: - type: object - properties: - ContactDetID: - type: integer - description: Primary key - ContactID: - type: integer - description: Parent contact ID - SiteID: - type: integer - nullable: true - description: Site identifier - ContactCode: - type: string - nullable: true - description: Contact code at site - ContactEmail: - type: string - nullable: true - description: Contact email address - OccupationID: - type: integer - nullable: true - description: Occupation reference - JobTitle: - type: string - nullable: true - description: Job title - Department: - type: string - nullable: true - description: Department name - ContactStartDate: - type: string - format: date-time - ContactEndDate: - type: string - format: date-time - nullable: true - ContactDetailOperations: - type: object - properties: - created: - type: array - description: New contact details to create - items: - $ref: '#/components/schemas/ContactDetail' - edited: - type: array - description: Existing contact details to update - items: - allOf: - - $ref: '#/components/schemas/ContactDetail' - - type: object - required: - - ContactDetID - deleted: - type: array - description: Contact detail IDs to soft delete - items: - type: integer - OrderSpecimen: - type: object - properties: - InternalSID: - type: integer - description: Internal specimen ID - SID: - type: string - description: Specimen ID (e.g., 0025030300001-S01) - SiteID: - type: integer - OrderID: - type: integer - description: Reference to internal order ID - ConDefID: - type: integer - description: Container Definition ID - nullable: true - ConCode: - type: string - description: Container code - nullable: true - ConName: - type: string - description: Container name - nullable: true - Qty: - type: integer - description: Quantity - Unit: - type: string - description: Unit of measurement - Status: - type: string - enum: - - PENDING - - COLLECTED - - RECEIVED - - PREPARED - - REJECTED - description: Current specimen status - GenerateBy: - type: string - description: Source that generated this specimen - CreateDate: - type: string - format: date-time - OrderTestItem: - type: object - properties: - ResultID: - type: integer - description: Unique result ID - OrderID: - type: integer - description: Reference to internal order ID - InternalSID: - type: integer - description: Reference to specimen - nullable: true - TestSiteID: - type: integer - description: Test definition site ID - TestSiteCode: - type: string - description: Test code - TestSiteName: - type: string - description: Test name - nullable: true - TestType: - type: string - description: Test type code identifying the test category - enum: - - TEST - - PARAM - - CALC - - GROUP - - TITLE - SID: - type: string - description: Order ID reference - SampleID: - type: string - description: Sample ID (same as OrderID) - SeqScr: - type: integer - nullable: true - description: Sequence number for this test on the screen - SeqRpt: - type: integer - nullable: true - description: Sequence number for this test in reports - Result: - type: string - description: Test result value - nullable: true - Discipline: - type: object - description: Discipline metadata used for ordering tests - properties: - DisciplineID: - type: integer - nullable: true - DisciplineCode: - type: string - nullable: true - DisciplineName: - type: string - nullable: true - SeqScr: - type: integer - nullable: true - description: Discipline sequence on the screen - SeqRpt: - type: integer - nullable: true - description: Discipline sequence in reports - ResultDateTime: - type: string - format: date-time - description: Result timestamp - CreateDate: - type: string - format: date-time - PatientPatch: - type: object - description: | - Partial patient update payload. - Omitted fields are left unchanged. Send null explicitly to clear nullable fields. - properties: - PatientID: - type: string - maxLength: 30 - pattern: ^[A-Za-z0-9]+$ - description: Internal patient identifier - AlternatePID: - type: string - maxLength: 30 - pattern: ^[A-Za-z0-9]+$ - Prefix: - type: string - maxLength: 10 - enum: - - Mr - - Mrs - - Ms - - Dr - - Prof - Sex: - type: string - enum: - - '1' - - '2' - description: '1: Female, 2: Male' - NameFirst: - type: string - minLength: 1 - maxLength: 60 - pattern: ^[A-Za-z'\. ]+$ - NameMiddle: - type: string - minLength: 1 - maxLength: 60 - NameMaiden: - type: string - minLength: 1 - maxLength: 60 - NameLast: - type: string - minLength: 1 - maxLength: 60 - Suffix: - type: string - maxLength: 10 - Birthdate: - type: string - format: date-time - description: ISO 8601 UTC datetime - PlaceOfBirth: - type: string - maxLength: 100 - Citizenship: - type: string - maxLength: 100 - Street_1: - type: string - maxLength: 255 - Street_2: - type: string - maxLength: 255 - Street_3: - type: string - maxLength: 255 - ZIP: - type: string - maxLength: 10 - pattern: ^[0-9]+$ - Phone: - type: string - pattern: ^\+?[0-9]{8,15}$ - MobilePhone: - type: string - pattern: ^\+?[0-9]{8,15}$ - EmailAddress1: - type: string - format: email - maxLength: 100 - EmailAddress2: - type: string - format: email - maxLength: 100 - PatIdt: - allOf: - - $ref: '#/components/schemas/PatientIdentifier' - nullable: true - LinkTo: - type: array - description: Array of linked patient references - items: - $ref: '#/components/schemas/LinkedPatient' - Custodian: - allOf: - - $ref: '#/components/schemas/Custodian' - nullable: true - isDead: - type: string - enum: - - '0' - - '1' - description: '0: No (alive), 1: Yes (deceased)' - TimeOfDeath: - type: string - format: date-time - description: ISO 8601 UTC datetime of death - PatCom: - type: string - description: Patient comment/notes - nullable: true - PatAtt: - type: array - description: Patient address entries - nullable: true - items: - $ref: '#/components/schemas/PatAttEntry' - Province: - type: integer - description: Province AreaGeoID (foreign key to areageo table) - City: - type: integer - description: City AreaGeoID (foreign key to areageo table) - Country: - type: string - maxLength: 10 - description: Country ISO 3-letter code (e.g., IDN, USA) - Race: - type: string - maxLength: 100 - MaritalStatus: - type: string - enum: - - A - - B - - D - - M - - S - - W - description: 'A: Annulled, B: Separated, D: Divorced, M: Married, S: Single, W: Widowed' - Religion: - type: string - maxLength: 100 - Ethnic: - type: string - maxLength: 100 - TestMapDetail: - type: object - properties: - TestMapDetailID: - type: integer - TestMapID: - type: integer - HostTestCode: - type: string - description: Test code in host system - HostTestName: - type: string - description: Test name in host system - ConDefID: - type: integer - description: Container definition ID - ContainerLabel: - type: string - description: Container definition name - ClientTestCode: - type: string - description: Test code in client system - ClientTestName: - type: string - description: Test name in client system - CreateDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - description: Soft delete timestamp - TestDefinitionListItem: - type: object - properties: - TestSiteID: - type: integer - TestSiteCode: - type: string - TestSiteName: - type: string - TestType: - type: string - enum: - - TEST - - PARAM - - CALC - - GROUP - - TITLE - SeqScr: - type: integer - SeqRpt: - type: integer - isVisibleScr: - type: integer - enum: - - 0 - - 1 - isVisibleRpt: - type: integer - enum: - - 0 - - 1 - isCountStat: - type: integer - StartDate: - type: string - format: date-time - EndDate: - type: string - format: date-time - nullable: true - DisciplineID: - type: integer - nullable: true - DepartmentID: - type: integer - nullable: true - DisciplineName: - type: string - nullable: true - DepartmentName: - type: string - nullable: true - ValueSetListItem: - type: object - description: Library/system value set summary (from JSON files) - properties: - value: - type: string - description: The value set key/name - label: - type: string - description: The display name/label - count: - type: integer - description: Number of items in this value set +openapi: 3.1.0 +info: + title: CLQMS - Clinical Laboratory Quality Management System API + description: | + API for Clinical Laboratory Quality Management System supporting patient management, + specimen tracking, test ordering, instrument integration, and laboratory operations. + + **IMPORTANT:** For OpenAPI tools (Swagger UI, Redoc, Postman, etc.), use the bundled file: + `api-docs.bundled.yaml` which contains all paths and schemas merged into one file. + + This file (api-docs.yaml) contains schema references and is meant for development. + The paths are defined in separate files in the `paths/` directory. + version: 1.0.0 + contact: + name: CLQMS API Support + license: + name: Proprietary +servers: + - url: http://localhost/clqms01/ + description: Local development server + - url: https://clqms01-api.services-summit.my.id/ + description: Production server +tags: + - name: Authentication + description: User authentication and session management + - name: Patient + description: Patient registration and management + - name: Patient Visit + description: Patient visit/encounter management + - name: Organization + description: Organization structure (accounts, sites, disciplines, departments, workstations) + - name: Location + description: Location management (rooms, wards, buildings) + - name: Equipment + description: Laboratory equipment and instrument management + - name: Specimen + description: Specimen and container management + - name: Test + description: Test definitions and test catalog + - name: Rule + description: Rule engine - rules can be linked to multiple tests via testrule mapping table + - name: Calculation + description: Lightweight calculator endpoint for retrieving computed values by code or name + - name: Order + description: Laboratory order management + - name: Result + description: Patient results reporting with auto-validation + - name: Report + description: Lab report generation (HTML view) + - name: Edge API + description: Instrument integration endpoints + - name: Contact + description: Contact management (doctors, practitioners, etc.) + - name: ValueSet + description: Value set definitions and items + - name: User + description: User management and administration + - name: Demo + description: Demo/test endpoints (no authentication) + - name: Audit + description: Audit log retrieval and filtering +paths: + /api/audit-logs: + get: + tags: + - Audit + summary: Retrieve audit log entries for a table + security: + - bearerAuth: [] + parameters: + - name: table + in: query + required: true + schema: + type: string + description: Table alias for the audit data (logpatient, logorder, logmaster, logsystem) + - name: rec_id + in: query + schema: + type: string + description: Primary record identifier (RecID) to filter audit rows + - name: event_id + in: query + schema: + type: string + description: Canonical EventID (case insensitive) + - name: activity_id + in: query + schema: + type: string + description: Canonical ActivityID (case insensitive) + - name: from + in: query + schema: + type: string + format: date-time + description: Lower bound for LogDate inclusive + - name: to + in: query + schema: + type: string + format: date-time + description: Upper bound for LogDate inclusive + - name: search + in: query + schema: + type: string + description: Search term that matches user, reason, field names, or values + - name: page + in: query + schema: + type: integer + default: 1 + description: Page number + - name: perPage + in: query + schema: + type: integer + default: 20 + description: Items per page (max 100) + responses: + '200': + description: Audit log results + content: + application/json: + schema: + $ref: '#/components/schemas/AuditLogsEnvelope' + '400': + description: Validation failure (missing table or invalid filters) + content: + application/json: + schema: + $ref: '#/components/schemas/AuditLogsErrorResponse' + '500': + description: Internal error when retrieving audit logs + content: + application/json: + schema: + $ref: '#/components/schemas/AuditLogsErrorResponse' + /api/auth/login: + post: + tags: + - Authentication + summary: User login + description: Authenticate user and receive JWT token via HTTP-only cookie + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/LoginRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/LoginRequest' + responses: + '200': + description: Login successful + headers: + Set-Cookie: + description: JWT token in HTTP-only cookie + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/LoginResponse' + '400': + description: Missing username + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Invalid credentials + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + /api/auth/logout: + post: + tags: + - Authentication + summary: User logout + description: Clear JWT token cookie + security: + - bearerAuth: [] + responses: + '200': + description: Logout successful + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + /api/auth/check: + get: + tags: + - Authentication + summary: Check authentication status + security: + - bearerAuth: [] + - cookieAuth: [] + responses: + '200': + description: Authenticated + content: + application/json: + schema: + type: object + properties: + authenticated: + type: boolean + user: + type: object + '401': + description: Not authenticated + /api/auth/register: + post: + tags: + - Authentication + summary: Register new user + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RegisterRequest' + responses: + '201': + description: User created + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + /api/auth/change_pass: + post: + tags: + - Authentication + summary: Change password + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - current_password + - new_password + properties: + current_password: + type: string + format: password + new_password: + type: string + format: password + responses: + '200': + description: Password changed successfully + /v2/auth/login: + post: + tags: + - Authentication + summary: V2 User login + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/LoginRequest' + responses: + '200': + description: Login successful + content: + application/json: + schema: + $ref: '#/components/schemas/LoginResponse' + /v2/auth/logout: + post: + tags: + - Authentication + summary: V2 User logout + responses: + '200': + description: Logout successful + /v2/auth/check: + get: + tags: + - Authentication + summary: V2 Check authentication + responses: + '200': + description: Auth check result + /v2/auth/register: + post: + tags: + - Authentication + summary: V2 Register new user + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RegisterRequest' + responses: + '201': + description: User created + /api/calc/testcode/{codeOrName}: + post: + tags: + - Calculation + summary: Evaluate a configured calculation by test code or name and return the raw result map. + security: [] + parameters: + - name: codeOrName + in: path + required: true + schema: + type: string + description: TestSiteCode or TestSiteName of the calculated test (case-insensitive). + requestBody: + required: true + content: + application/json: + schema: + type: object + description: Key-value pairs where keys match member tests used in the formula. + additionalProperties: + type: number + example: + TBIL: 5 + DBIL: 3 + responses: + '200': + description: Returns a single key/value pair with the canonical TestSiteCode or an empty object when the calculation is incomplete or missing. + content: + application/json: + schema: + type: object + examples: + success: + value: + IBIL: 2 + incomplete: + value: {} + /api/calc/testsite/{testSiteID}: + post: + tags: + - Calculation + summary: Evaluate a calculation defined for a test site and return a structured result. + security: [] + parameters: + - name: testSiteID + in: path + required: true + schema: + type: integer + description: Identifier for the test site whose definition should be evaluated. + requestBody: + required: true + content: + application/json: + schema: + type: object + description: Variable assignments required by the test site formula. + additionalProperties: + type: number + example: + result: 85 + gender: female + age: 30 + responses: + '200': + description: Returns the calculated result, testSiteID, formula code, and echoed variables. + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + data: + type: object + properties: + result: + type: number + testSiteID: + type: integer + formula: + type: string + variables: + type: object + additionalProperties: + type: number + examples: + success: + value: + status: success + data: + result: 92.4 + testSiteID: 123 + formula: '{result} * {factor} + {age}' + variables: + result: 85 + gender: female + age: 30 + '404': + description: No calculation defined for the requested test site. + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: failed + message: + type: string + example: No calculation defined for this test site + /api/contact: + get: + tags: + - Contact + summary: List contacts + security: + - bearerAuth: [] + parameters: + - name: ContactName + in: query + schema: + type: string + description: Filter by contact name (searches in NameFirst and NameLast) + - name: Specialty + in: query + schema: + type: string + description: Filter by medical specialty code + responses: + '200': + description: List of contacts + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/Contact' + post: + tags: + - Contact + summary: Create new contact + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - NameFirst + properties: + NameFirst: + type: string + description: First name + NameLast: + type: string + description: Last name + Title: + type: string + description: Title (e.g., Dr, Mr, Mrs) + Initial: + type: string + description: Middle initial + Birthdate: + type: string + format: date-time + description: Date of birth + EmailAddress1: + type: string + format: email + description: Primary email address + EmailAddress2: + type: string + format: email + description: Secondary email address + Phone: + type: string + description: Primary phone number + MobilePhone1: + type: string + description: Primary mobile number + MobilePhone2: + type: string + description: Secondary mobile number + Specialty: + type: string + description: Medical specialty code + SubSpecialty: + type: string + description: Sub-specialty code + responses: + '201': + description: Contact created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + '422': + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + delete: + tags: + - Contact + summary: Delete contact + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - ContactID + properties: + ContactID: + type: integer + description: Contact ID to delete + responses: + '200': + description: Contact deleted successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + /api/contact/{id}: + get: + tags: + - Contact + summary: Get contact by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Contact ID + responses: + '200': + description: Contact details + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/Contact' + patch: + tags: + - Contact + summary: Update contact + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Contact ID to update + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - NameFirst + properties: + NameFirst: + type: string + description: First name + NameLast: + type: string + description: Last name + Title: + type: string + description: Title (e.g., Dr, Mr, Mrs) + Initial: + type: string + description: Middle initial + Birthdate: + type: string + format: date-time + description: Date of birth + EmailAddress1: + type: string + format: email + description: Primary email address + EmailAddress2: + type: string + format: email + description: Secondary email address + Phone: + type: string + description: Primary phone number + MobilePhone1: + type: string + description: Primary mobile number + MobilePhone2: + type: string + description: Secondary mobile number + Specialty: + type: string + description: Medical specialty code + SubSpecialty: + type: string + description: Sub-specialty code + Details: + description: | + Detail payload supports either a flat array of new rows (legacy format) + or an operations object with `created`, `edited`, and `deleted` arrays. + oneOf: + - $ref: '#/components/schemas/ContactDetailOperations' + - type: array + description: Legacy format for replacing details with new rows only + items: + $ref: '#/components/schemas/ContactDetail' + responses: + '201': + description: Contact updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + '422': + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + /api/demo/hello: + get: + tags: + - Demo + summary: Hello world endpoint + description: Simple test endpoint that returns a greeting message + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: Hello, World! + /api/demo/ping: + get: + tags: + - Demo + summary: Ping endpoint + description: Health check endpoint to verify API is running + responses: + '200': + description: API is running + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: pong + timestamp: + type: string + format: date-time + /api/edge/result: + post: + tags: + - Edge API + summary: Receive results from instrument (tiny-edge) + description: | + Receives instrument results and stores them in the edgeres table for processing. + This endpoint is typically called by the tiny-edge middleware connected to laboratory analyzers. + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeResultRequest' + responses: + '201': + description: Result received and queued + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeResultResponse' + '400': + description: Invalid JSON payload + /api/edge/order: + get: + tags: + - Edge API + summary: Fetch pending orders for instruments + description: Returns orders that need to be sent to laboratory instruments for testing + parameters: + - name: instrument_id + in: query + schema: + type: string + description: Filter by instrument + - name: status + in: query + schema: + type: string + enum: + - pending + - acknowledged + description: Filter by status + responses: + '200': + description: List of orders + content: + application/json: + schema: + type: object + properties: + status: + type: string + data: + type: array + items: + $ref: '#/components/schemas/EdgeOrder' + /api/edge/order/{orderId}/ack: + post: + tags: + - Edge API + summary: Acknowledge order delivery + description: Mark order as acknowledged by the instrument + parameters: + - name: orderId + in: path + required: true + schema: + type: integer + description: Edge order ID + responses: + '200': + description: Order acknowledged + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + /api/edge/status: + post: + tags: + - Edge API + summary: Log instrument status update + description: Receive status updates from laboratory instruments + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - instrument_id + - status + properties: + instrument_id: + type: string + status: + type: string + enum: + - online + - offline + - error + - maintenance + message: + type: string + timestamp: + type: string + format: date-time + responses: + '200': + description: Status logged + /api/equipmentlist: + get: + tags: + - Equipment + summary: List equipment + description: Get list of equipment with optional filters + security: + - bearerAuth: [] + parameters: + - name: IEID + in: query + schema: + type: string + description: Filter by IEID + - name: InstrumentName + in: query + schema: + type: string + description: Filter by instrument name + - name: DepartmentID + in: query + schema: + type: integer + description: Filter by department ID + - name: WorkstationID + in: query + schema: + type: integer + description: Filter by workstation ID + - name: Enable + in: query + schema: + type: integer + enum: + - 0 + - 1 + description: Filter by enable status + responses: + '200': + description: List of equipment + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/EquipmentList' + post: + tags: + - Equipment + summary: Create equipment + description: Create a new equipment entry + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - IEID + - DepartmentID + - Enable + - EquipmentRole + properties: + IEID: + type: string + maxLength: 50 + DepartmentID: + type: integer + InstrumentID: + type: string + maxLength: 150 + InstrumentName: + type: string + maxLength: 150 + WorkstationID: + type: integer + Enable: + type: integer + enum: + - 0 + - 1 + EquipmentRole: + type: string + maxLength: 1 + responses: + '201': + description: Equipment created + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: integer + delete: + tags: + - Equipment + summary: Delete equipment + description: Soft delete an equipment entry + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - EID + properties: + EID: + type: integer + responses: + '200': + description: Equipment deleted + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + /api/equipmentlist/{id}: + get: + tags: + - Equipment + summary: Get equipment by ID + description: Get a single equipment entry by its EID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Equipment ID + responses: + '200': + description: Equipment details + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/EquipmentList' + patch: + tags: + - Equipment + summary: Update equipment + description: Update an existing equipment entry + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Equipment ID + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + IEID: + type: string + maxLength: 50 + DepartmentID: + type: integer + InstrumentID: + type: string + maxLength: 150 + InstrumentName: + type: string + maxLength: 150 + WorkstationID: + type: integer + Enable: + type: integer + enum: + - 0 + - 1 + EquipmentRole: + type: string + maxLength: 1 + responses: + '200': + description: Equipment updated + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: integer + /api/location: + get: + tags: + - Location + summary: List locations + security: + - bearerAuth: [] + parameters: + - name: LocCode + in: query + schema: + type: string + description: Filter by location code + - name: LocName + in: query + schema: + type: string + description: Filter by location name (searches in LocFull) + responses: + '200': + description: List of locations + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/Location' + post: + tags: + - Location + summary: Create location + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - LocCode + - LocFull + properties: + SiteID: + type: integer + description: Reference to site + LocCode: + type: string + maxLength: 6 + description: Location code (short identifier) + Parent: + type: integer + nullable: true + description: Parent location ID for hierarchical locations + LocFull: + type: string + maxLength: 255 + description: Full location name + Description: + type: string + maxLength: 255 + description: Location description + LocType: + type: string + description: Location type code (e.g., ROOM, WARD, BUILDING) + responses: + '201': + description: Location created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + '422': + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + delete: + tags: + - Location + summary: Delete location + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - LocationID + properties: + LocationID: + type: integer + description: Location ID to delete + responses: + '200': + description: Location deleted successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + /api/location/{id}: + get: + tags: + - Location + summary: Get location by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Location ID + responses: + '200': + description: Location details + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/Location' + patch: + tags: + - Location + summary: Update location + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Location ID to update + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + SiteID: + type: integer + description: Reference to site + LocCode: + type: string + maxLength: 6 + description: Location code (short identifier) + Parent: + type: integer + nullable: true + description: Parent location ID for hierarchical locations + LocFull: + type: string + maxLength: 255 + description: Full location name + Description: + type: string + maxLength: 255 + description: Location description + LocType: + type: string + description: Location type code (e.g., ROOM, WARD, BUILDING) + responses: + '201': + description: Location updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + '422': + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + /api/ordertest: + get: + tags: + - Order + summary: List orders + security: + - bearerAuth: [] + parameters: + - name: page + in: query + schema: + type: integer + - name: perPage + in: query + schema: + type: integer + - name: InternalPID + in: query + schema: + type: integer + description: Filter by internal patient ID + - name: PVADTID + in: query + schema: + type: integer + description: Filter by patient visit ADT ID + - name: OrderStatus + in: query + schema: + type: string + enum: + - ORD + - SCH + - ANA + - VER + - REV + - REP + description: | + ORD: Ordered + SCH: Scheduled + ANA: Analysis + VER: Verified + REV: Reviewed + REP: Reported + responses: + '200': + description: List of orders + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/OrderTestList' + post: + tags: + - Order + summary: Create order with specimens and tests + description: Creates an order with associated specimens and patres records. Tests are grouped by container type to minimize specimen creation. + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - InternalPID + - Tests + properties: + OrderID: + type: string + description: Optional custom order ID (auto-generated if not provided) + InternalPID: + type: integer + description: Patient internal ID + PatVisitID: + type: integer + description: Visit ID + SiteID: + type: integer + default: 1 + PlacerID: + type: string + Priority: + type: string + enum: + - R + - S + - U + default: R + description: | + R: Routine + S: Stat + U: Urgent + ReqApp: + type: string + description: Requesting application + Comment: + type: string + Tests: + type: array + items: + type: object + required: + - TestSiteID + properties: + TestSiteID: + type: integer + description: Test definition site ID + TestID: + type: integer + description: Alias for TestSiteID + responses: + '201': + description: Order created successfully with specimens and tests + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + data: + $ref: '#/components/schemas/OrderTest' + '400': + description: Validation error + '500': + description: Server error + delete: + tags: + - Order + summary: Delete order + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - OrderID + properties: + OrderID: + type: string + responses: + '200': + description: Order deleted + /api/ordertest/status: + post: + tags: + - Order + summary: Update order status + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - OrderID + - OrderStatus + properties: + OrderID: + type: string + OrderStatus: + type: string + enum: + - ORD + - SCH + - ANA + - VER + - REV + - REP + description: | + ORD: Ordered + SCH: Scheduled + ANA: Analysis + VER: Verified + REV: Reviewed + REP: Reported + responses: + '200': + description: Order status updated + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/OrderTest' + /api/ordertest/{id}: + get: + tags: + - Order + summary: Get order by ID + description: Returns order details with associated specimens and tests + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + description: Order ID (e.g., 0025030300001) + responses: + '200': + description: Order details with specimens and tests + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/OrderTest' + patch: + tags: + - Order + summary: Update order + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + description: Order ID + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + Priority: + type: string + enum: + - R + - S + - U + OrderStatus: + type: string + enum: + - ORD + - SCH + - ANA + - VER + - REV + - REP + OrderingProvider: + type: string + DepartmentID: + type: integer + WorkstationID: + type: integer + responses: + '200': + description: Order updated + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/OrderTest' + /api/organization/account: + get: + tags: + - Organization + summary: List accounts + security: + - bearerAuth: [] + responses: + '200': + description: List of accounts + post: + tags: + - Organization + summary: Create account + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Account' + responses: + '201': + description: Account created + delete: + tags: + - Organization + summary: Delete account + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - AccountID + properties: + AccountID: + type: integer + responses: + '200': + description: Account deleted + /api/organization/account/{id}: + get: + tags: + - Organization + summary: Get account by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Account details + content: + application/json: + schema: + $ref: '#/components/schemas/Account' + patch: + tags: + - Organization + summary: Update account + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + AccountName: + type: string + Parent: + type: integer + responses: + '200': + description: Account updated + /api/organization/site: + get: + tags: + - Organization + summary: List sites + security: + - bearerAuth: [] + responses: + '200': + description: List of sites + post: + tags: + - Organization + summary: Create site + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Site' + responses: + '201': + description: Site created + delete: + tags: + - Organization + summary: Delete site + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - id + properties: + id: + type: integer + responses: + '200': + description: Site deleted + /api/organization/site/{id}: + get: + tags: + - Organization + summary: Get site by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Site details + patch: + tags: + - Organization + summary: Update site + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + SiteName: + type: string + SiteCode: + type: string + AccountID: + type: integer + responses: + '200': + description: Site updated + /api/organization/discipline: + get: + tags: + - Organization + summary: List disciplines + security: + - bearerAuth: [] + responses: + '200': + description: List of disciplines + post: + tags: + - Organization + summary: Create discipline + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Discipline' + responses: + '201': + description: Discipline created + delete: + tags: + - Organization + summary: Delete discipline + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - id + properties: + id: + type: integer + responses: + '200': + description: Discipline deleted + /api/organization/discipline/{id}: + get: + tags: + - Organization + summary: Get discipline by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Discipline details + patch: + tags: + - Organization + summary: Update discipline + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + DisciplineName: + type: string + DisciplineCode: + type: string + SeqScr: + type: integer + description: Display order on screen + SeqRpt: + type: integer + description: Display order in reports + responses: + '200': + description: Discipline updated + /api/organization/department: + get: + tags: + - Organization + summary: List departments + security: + - bearerAuth: [] + responses: + '200': + description: List of departments + post: + tags: + - Organization + summary: Create department + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Department' + responses: + '201': + description: Department created + delete: + tags: + - Organization + summary: Delete department + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - id + properties: + id: + type: integer + responses: + '200': + description: Department deleted + /api/organization/department/{id}: + get: + tags: + - Organization + summary: Get department by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Department details + patch: + tags: + - Organization + summary: Update department + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + DeptName: + type: string + DeptCode: + type: string + SiteID: + type: integer + responses: + '200': + description: Department updated + /api/organization/workstation: + get: + tags: + - Organization + summary: List workstations + security: + - bearerAuth: [] + responses: + '200': + description: List of workstations + post: + tags: + - Organization + summary: Create workstation + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Workstation' + responses: + '201': + description: Workstation created + delete: + tags: + - Organization + summary: Delete workstation + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - id + properties: + id: + type: integer + responses: + '200': + description: Workstation deleted + /api/organization/workstation/{id}: + get: + tags: + - Organization + summary: Get workstation by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Workstation details + patch: + tags: + - Organization + summary: Update workstation + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + WorkstationName: + type: string + WorkstationCode: + type: string + SiteID: + type: integer + DepartmentID: + type: integer + responses: + '200': + description: Workstation updated + /api/organization/hostapp: + get: + tags: + - Organization + summary: List host applications + security: + - bearerAuth: [] + parameters: + - name: HostAppID + in: query + schema: + type: string + - name: HostAppName + in: query + schema: + type: string + responses: + '200': + description: List of host applications + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/HostApp' + post: + tags: + - Organization + summary: Create host application + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/HostApp' + responses: + '201': + description: Host application created + delete: + tags: + - Organization + summary: Delete host application (soft delete) + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - HostAppID + properties: + HostAppID: + type: string + responses: + '200': + description: Host application deleted + /api/organization/hostapp/{id}: + get: + tags: + - Organization + summary: Get host application by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Host application details + content: + application/json: + schema: + $ref: '#/components/schemas/HostApp' + patch: + tags: + - Organization + summary: Update host application + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + HostAppName: + type: string + SiteID: + type: integer + responses: + '200': + description: Host application updated + /api/organization/hostcompara: + get: + tags: + - Organization + summary: List host communication parameters + security: + - bearerAuth: [] + parameters: + - name: HostAppID + in: query + schema: + type: string + - name: HostIP + in: query + schema: + type: string + responses: + '200': + description: List of host communication parameters + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/HostComPara' + post: + tags: + - Organization + summary: Create host communication parameters + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/HostComPara' + responses: + '201': + description: Host communication parameters created + delete: + tags: + - Organization + summary: Delete host communication parameters (soft delete) + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - HostAppID + properties: + HostAppID: + type: string + responses: + '200': + description: Host communication parameters deleted + /api/organization/hostcompara/{id}: + get: + tags: + - Organization + summary: Get host communication parameters by HostAppID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Host communication parameters details + content: + application/json: + schema: + $ref: '#/components/schemas/HostComPara' + patch: + tags: + - Organization + summary: Update host communication parameters + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + HostIP: + type: string + HostPort: + type: string + HostPwd: + type: string + responses: + '200': + description: Host communication parameters updated + /api/organization/codingsys: + get: + tags: + - Organization + summary: List coding systems + security: + - bearerAuth: [] + parameters: + - name: CodingSysAbb + in: query + schema: + type: string + - name: FullText + in: query + schema: + type: string + responses: + '200': + description: List of coding systems + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/CodingSys' + post: + tags: + - Organization + summary: Create coding system + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CodingSys' + responses: + '201': + description: Coding system created + delete: + tags: + - Organization + summary: Delete coding system (soft delete) + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - CodingSysID + properties: + CodingSysID: + type: integer + responses: + '200': + description: Coding system deleted + /api/organization/codingsys/{id}: + get: + tags: + - Organization + summary: Get coding system by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Coding system details + content: + application/json: + schema: + $ref: '#/components/schemas/CodingSys' + patch: + tags: + - Organization + summary: Update coding system + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + CodingSysAbb: + type: string + FullText: + type: string + Description: + type: string + responses: + '200': + description: Coding system updated + /api/patvisit: + get: + tags: + - Patient Visit + summary: List patient visits + security: + - bearerAuth: [] + parameters: + - name: InternalPID + in: query + schema: + type: integer + description: Filter by internal patient ID (exact match) + - name: PVID + in: query + schema: + type: string + description: Filter by visit ID (partial match) + - name: PatientID + in: query + schema: + type: string + description: Filter by patient ID (partial match) + - name: PatientName + in: query + schema: + type: string + description: Search by patient name (searches in both first and last name) + - name: CreateDateFrom + in: query + schema: + type: string + format: date-time + description: Filter visits created on or after this date + - name: CreateDateTo + in: query + schema: + type: string + format: date-time + description: Filter visits created on or before this date + - name: page + in: query + schema: + type: integer + - name: perPage + in: query + schema: + type: integer + responses: + '200': + description: List of patient visits + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/PatientVisit' + total: + type: integer + description: Total number of records + page: + type: integer + description: Current page number + per_page: + type: integer + description: Number of records per page + post: + tags: + - Patient Visit + summary: Create patient visit + description: | + Creates a new patient visit. PVID is auto-generated with 'DV' prefix if not provided. + Can optionally include PatDiag (diagnosis) and PatVisitADT (ADT information). + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - InternalPID + properties: + PVID: + type: string + description: Visit ID (auto-generated with DV prefix if not provided) + InternalPID: + type: integer + description: Patient ID (required) + EpisodeID: + type: string + description: Episode identifier + SiteID: + type: integer + description: Site reference + PatDiag: + type: object + description: Optional diagnosis information + properties: + DiagCode: + type: string + Diagnosis: + type: string + PatVisitADT: + type: object + description: Optional ADT information + properties: + ADTCode: + type: string + enum: + - A01 + - A02 + - A03 + - A04 + - A08 + LocationID: + type: integer + AttDoc: + type: integer + RefDoc: + type: integer + AdmDoc: + type: integer + CnsDoc: + type: integer + responses: + '201': + description: Visit created successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: object + properties: + PVID: + type: string + InternalPVID: + type: integer + delete: + tags: + - Patient Visit + summary: Delete patient visit + security: + - bearerAuth: [] + responses: + '200': + description: Visit deleted successfully + /api/patvisit/{id}: + get: + tags: + - Patient Visit + summary: Get visit by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + description: PVID (visit identifier like DV00001) + responses: + '200': + description: Visit details + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/PatientVisit' + patch: + tags: + - Patient Visit + summary: Update patient visit + description: | + Updates an existing patient visit. InternalPVID is required. + Can update main visit data, PatDiag, and add new PatVisitADT records. + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Internal visit ID (InternalPVID) + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + PVID: + type: string + InternalPID: + type: integer + EpisodeID: + type: string + SiteID: + type: integer + PatDiag: + type: object + description: Diagnosis information (will update if exists) + properties: + DiagCode: + type: string + Diagnosis: + type: string + PatVisitADT: + type: array + description: Array of ADT records to add (new records only) + items: + type: object + properties: + ADTCode: + type: string + enum: + - A01 + - A02 + - A03 + - A04 + - A08 + LocationID: + type: integer + AttDoc: + type: integer + RefDoc: + type: integer + AdmDoc: + type: integer + CnsDoc: + type: integer + sequence: + type: integer + description: Used for ordering multiple ADT records + responses: + '200': + description: Visit updated successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: object + properties: + PVID: + type: string + InternalPVID: + type: integer + /api/patvisit/patient/{patientId}: + get: + tags: + - Patient Visit + summary: Get visits by patient ID + security: + - bearerAuth: [] + parameters: + - name: patientId + in: path + required: true + schema: + type: integer + description: Internal Patient ID (InternalPID) + responses: + '200': + description: Patient visits list + content: + application/json: + schema: + type: object + properties: + status: + type: string + data: + type: array + items: + $ref: '#/components/schemas/PatientVisit' + /api/patvisitadt: + post: + tags: + - Patient Visit + summary: Create ADT record + description: Create a new Admission/Discharge/Transfer record + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PatVisitADT' + responses: + '201': + description: ADT record created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + delete: + tags: + - Patient Visit + summary: Delete ADT visit (soft delete) + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - PVADTID + properties: + PVADTID: + type: integer + description: ADT record ID to delete + responses: + '200': + description: ADT visit deleted successfully + /api/patvisitadt/visit/{visitId}: + get: + tags: + - Patient Visit + summary: Get ADT history by visit ID + description: Retrieve the complete Admission/Discharge/Transfer history for a visit, including all locations and doctors + security: + - bearerAuth: [] + parameters: + - name: visitId + in: path + required: true + schema: + type: integer + description: Internal Visit ID (InternalPVID) + responses: + '200': + description: ADT history retrieved successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: ADT history retrieved + data: + type: array + items: + type: object + properties: + PVADTID: + type: integer + InternalPVID: + type: integer + ADTCode: + type: string + enum: + - A01 + - A02 + - A03 + - A04 + - A08 + LocationID: + type: integer + LocationName: + type: string + AttDoc: + type: integer + AttDocFirstName: + type: string + AttDocLastName: + type: string + RefDoc: + type: integer + RefDocFirstName: + type: string + RefDocLastName: + type: string + AdmDoc: + type: integer + AdmDocFirstName: + type: string + AdmDocLastName: + type: string + CnsDoc: + type: integer + CnsDocFirstName: + type: string + CnsDocLastName: + type: string + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + /api/patvisitadt/{id}: + get: + tags: + - Patient Visit + summary: Get ADT record by ID + description: Retrieve a single ADT record by its ID, including location and doctor details + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: ADT record ID (PVADTID) + responses: + '200': + description: ADT record retrieved successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: ADT record retrieved + data: + type: object + properties: + PVADTID: + type: integer + InternalPVID: + type: integer + ADTCode: + type: string + enum: + - A01 + - A02 + - A03 + - A04 + - A08 + LocationID: + type: integer + LocationName: + type: string + AttDoc: + type: integer + AttDocFirstName: + type: string + AttDocLastName: + type: string + RefDoc: + type: integer + RefDocFirstName: + type: string + RefDocLastName: + type: string + AdmDoc: + type: integer + AdmDocFirstName: + type: string + AdmDocLastName: + type: string + CnsDoc: + type: integer + CnsDocFirstName: + type: string + CnsDocLastName: + type: string + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + patch: + tags: + - Patient Visit + summary: Update ADT record + description: Update an existing ADT record + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: ADT record ID (PVADTID) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PatVisitADT' + responses: + '200': + description: ADT record updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + /api/patient: + get: + tags: + - Patient + summary: List patients + security: + - bearerAuth: [] + parameters: + - name: page + in: query + schema: + type: integer + default: 1 + - name: perPage + in: query + schema: + type: integer + default: 20 + - name: InternalPID + in: query + schema: + type: integer + description: Filter by internal patient ID + - name: PatientID + in: query + schema: + type: string + description: Filter by patient ID + - name: Name + in: query + schema: + type: string + description: Search by patient name + - name: Birthdate + in: query + schema: + type: string + format: date + description: Filter by birthdate (YYYY-MM-DD) + responses: + '200': + description: List of patients + content: + application/json: + schema: + $ref: '#/components/schemas/PatientListResponse' + post: + tags: + - Patient + summary: Create new patient + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Patient' + responses: + '201': + description: Patient created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + '422': + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + delete: + tags: + - Patient + summary: Delete patient (soft delete) + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - InternalPID + properties: + InternalPID: + type: integer + description: Internal patient record ID + responses: + '200': + description: Patient deleted successfully + /api/patient/check: + get: + tags: + - Patient + summary: Check if patient exists + security: + - bearerAuth: [] + parameters: + - name: PatientID + in: query + schema: + type: string + description: Patient ID to check + - name: EmailAddress + in: query + schema: + type: string + format: email + description: Email address to check + - name: Phone + in: query + schema: + type: string + description: Phone number to check + responses: + '200': + description: Patient check result + content: + application/json: + schema: + type: object + properties: + exists: + type: boolean + data: + $ref: '#/components/schemas/Patient' + /api/patient/{id}: + get: + tags: + - Patient + summary: Get patient by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Internal patient record ID + responses: + '200': + description: Patient details + content: + application/json: + schema: + type: object + properties: + status: + type: string + data: + $ref: '#/components/schemas/Patient' + patch: + tags: + - Patient + summary: Partially update patient + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Internal patient record ID + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PatientPatch' + responses: + '200': + description: Patient updated successfully + '400': + description: Validation error + '404': + description: Patient not found + /api/report/{orderID}: + get: + tags: + - Report + summary: Generate lab report + description: Generate an HTML lab report for a specific order. Returns HTML content that can be viewed in browser or printed to PDF. + security: + - bearerAuth: [] + parameters: + - name: orderID + in: path + required: true + schema: + type: integer + description: Internal Order ID + responses: + '200': + description: HTML lab report + content: + text/html: + schema: + type: string + description: HTML content of the lab report + '404': + description: Order or patient not found + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '500': + description: Failed to generate report + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + /api/result: + get: + tags: + - Result + summary: List results + description: Retrieve patient test results with optional filters by order or patient + security: + - bearerAuth: [] + parameters: + - name: order_id + in: query + schema: + type: integer + description: Filter by internal order ID + - name: patient_id + in: query + schema: + type: integer + description: Filter by internal patient ID (returns cumulative results) + - name: page + in: query + schema: + type: integer + default: 1 + description: Page number for pagination + - name: per_page + in: query + schema: + type: integer + default: 20 + description: Number of results per page + responses: + '200': + description: List of results + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + data: + type: array + items: + type: object + properties: + ResultID: + type: integer + OrderID: + type: integer + TestSiteID: + type: integer + TestSiteCode: + type: string + Result: + type: string + nullable: true + ResultDateTime: + type: string + format: date-time + RefNumID: + type: integer + nullable: true + RefTxtID: + type: integer + nullable: true + CreateDate: + type: string + format: date-time + TestSiteName: + type: string + nullable: true + Unit1: + type: string + nullable: true + Unit2: + type: string + nullable: true + Low: + type: number + nullable: true + High: + type: number + nullable: true + LowSign: + type: string + nullable: true + HighSign: + type: string + nullable: true + RefDisplay: + type: string + nullable: true + /api/result/{id}: + get: + tags: + - Result + summary: Get result by ID + description: Retrieve a specific result entry with all related data + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Result ID + responses: + '200': + description: Result details + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + data: + type: object + properties: + ResultID: + type: integer + SiteID: + type: integer + OrderID: + type: integer + InternalSID: + type: integer + SID: + type: string + SampleID: + type: string + TestSiteID: + type: integer + TestSiteCode: + type: string + AspCnt: + type: integer + Result: + type: string + nullable: true + SampleType: + type: string + nullable: true + ResultDateTime: + type: string + format: date-time + WorkstationID: + type: integer + nullable: true + EquipmentID: + type: integer + nullable: true + RefNumID: + type: integer + nullable: true + RefTxtID: + type: integer + nullable: true + CreateDate: + type: string + format: date-time + TestSiteName: + type: string + nullable: true + Unit1: + type: string + nullable: true + Unit2: + type: string + nullable: true + Low: + type: number + nullable: true + High: + type: number + nullable: true + LowSign: + type: string + nullable: true + HighSign: + type: string + nullable: true + RefDisplay: + type: string + nullable: true + OrderNumber: + type: string + nullable: true + InternalPID: + type: integer + '404': + description: Result not found + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + patch: + tags: + - Result + summary: Update result + description: Update a result value with automatic validation against reference ranges. Returns calculated flag (L/H) in response but does not store it. + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Result ID + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + Result: + type: string + description: The result value + RefNumID: + type: integer + description: Reference range ID to validate against + SampleType: + type: string + nullable: true + WorkstationID: + type: integer + nullable: true + EquipmentID: + type: integer + nullable: true + responses: + '200': + description: Result updated successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + data: + type: object + properties: + result: + type: object + flag: + type: string + nullable: true + enum: + - L + - H + description: Calculated flag - L for Low, H for High, null for normal + '400': + description: Validation failed + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Result not found + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + delete: + tags: + - Result + summary: Delete result + description: Soft delete a result entry by setting DelDate + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Result ID + responses: + '200': + description: Result deleted successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + '404': + description: Result not found + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + /api/rule: + get: + tags: + - Rule + summary: List rules + security: + - bearerAuth: [] + parameters: + - name: EventCode + in: query + schema: + type: string + description: Filter by event code + - name: TestSiteID + in: query + schema: + type: integer + description: Filter by TestSiteID (returns rules linked to this test). Rules are only returned when attached to tests. + - name: search + in: query + schema: + type: string + description: Search by rule code or name + responses: + '200': + description: List of rules + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/RuleDef' + post: + tags: + - Rule + summary: Create rule + description: | + Create a new rule. Rules must be linked to at least one test via TestSiteIDs. + A single rule can be linked to multiple tests. Rules are active only when attached to tests. + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + RuleCode: + type: string + example: AUTO_SET_RESULT + RuleName: + type: string + example: Automatically Set Result + Description: + type: string + EventCode: + type: string + example: test_created + TestSiteIDs: + type: array + items: + type: integer + description: Array of TestSiteIDs to link this rule to (required) + example: + - 1 + - 2 + - 3 + ConditionExpr: + type: string + nullable: true + description: Raw DSL expression. Compile it first and persist the compiled JSON in ConditionExprCompiled. + example: if(sex('M'); result_set(0.5); result_set(0.6)) + ConditionExprCompiled: + type: string + nullable: true + description: Compiled JSON payload from POST /api/rule/compile + required: + - RuleCode + - RuleName + - EventCode + - TestSiteIDs + responses: + '201': + description: Rule created + /api/rule/{id}: + get: + tags: + - Rule + summary: Get rule with linked tests + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: RuleID + responses: + '200': + description: Rule details with linked test sites + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/RuleWithDetails' + '404': + description: Rule not found + patch: + tags: + - Rule + summary: Update rule + description: | + Update a rule. TestSiteIDs can be provided to update which tests the rule is linked to. + Tests not in the new list will be unlinked, and new tests will be linked. + Rules are active only when attached to tests. + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: RuleID + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + RuleCode: + type: string + RuleName: + type: string + Description: + type: string + EventCode: + type: string + TestSiteIDs: + type: array + items: + type: integer + description: Array of TestSiteIDs to link this rule to + ConditionExpr: + type: string + nullable: true + responses: + '200': + description: Rule updated + '404': + description: Rule not found + delete: + tags: + - Rule + summary: Soft delete rule + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: RuleID + responses: + '200': + description: Rule deleted + '404': + description: Rule not found + /api/rule/validate: + post: + tags: + - Rule + summary: Validate/evaluate an expression + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + expr: + type: string + context: + type: object + additionalProperties: true + required: + - expr + responses: + '200': + description: Validation result + /api/rule/compile: + post: + tags: + - Rule + summary: Compile DSL expression to engine-compatible structure + description: | + Compile a DSL expression to the engine-compatible JSON structure. + Frontend calls this when user clicks "Compile" button. + Returns compiled structure that can be saved to ConditionExprCompiled field. + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + expr: + type: string + description: Raw DSL expression + example: if(sex('M'); result_set(0.5); result_set(0.6)) + required: + - expr + responses: + '200': + description: Compilation successful + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + data: + type: object + properties: + raw: + type: string + description: Original DSL expression + compiled: + type: object + description: Parsed structure with conditionExpr, valueExpr, then, else + conditionExprCompiled: + type: string + description: JSON string to save to ConditionExprCompiled field + '400': + description: Compilation failed (invalid syntax) + /api/specimen: + get: + tags: + - Specimen + summary: List specimens + security: + - bearerAuth: [] + responses: + '200': + description: List of specimens + post: + tags: + - Specimen + summary: Create specimen + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Specimen' + responses: + '201': + description: Specimen created + /api/specimen/{id}: + get: + tags: + - Specimen + summary: Get specimen by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Specimen details + patch: + tags: + - Specimen + summary: Update specimen + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Specimen ID (SID) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Specimen' + responses: + '200': + description: Specimen updated + delete: + tags: + - Specimen + summary: Delete specimen (soft delete) + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Specimen ID (SID) + responses: + '200': + description: Specimen deleted successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: Specimen deleted successfully + data: + type: object + properties: + SID: + type: integer + '404': + description: Specimen not found + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: failed + message: + type: string + example: Specimen not found + data: + type: null + '500': + description: Server error + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: failed + message: + type: string + example: Failed to delete specimen + data: + type: null + /api/specimen/container: + get: + tags: + - Specimen + summary: List container definitions + security: + - bearerAuth: [] + responses: + '200': + description: List of container definitions + post: + tags: + - Specimen + summary: Create container definition + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ContainerDef' + responses: + '201': + description: Container definition created + /api/specimen/container/{id}: + get: + tags: + - Specimen + summary: Get container definition by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Container definition details + patch: + tags: + - Specimen + summary: Update container definition + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Container definition ID (ConDefID) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ContainerDef' + responses: + '200': + description: Container definition updated + /api/specimen/containerdef: + get: + tags: + - Specimen + summary: List container definitions (alias) + security: + - bearerAuth: [] + responses: + '200': + description: List of container definitions + post: + tags: + - Specimen + summary: Create container definition (alias) + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ContainerDef' + responses: + '201': + description: Container definition created + /api/specimen/containerdef/{id}: + patch: + tags: + - Specimen + summary: Update container definition (alias) + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Container definition ID (ConDefID) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ContainerDef' + responses: + '200': + description: Container definition updated + /api/specimen/prep: + get: + tags: + - Specimen + summary: List specimen preparations + security: + - bearerAuth: [] + responses: + '200': + description: List of specimen preparations + post: + tags: + - Specimen + summary: Create specimen preparation + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SpecimenPrep' + responses: + '201': + description: Specimen preparation created + /api/specimen/prep/{id}: + get: + tags: + - Specimen + summary: Get specimen preparation by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Specimen preparation details + patch: + tags: + - Specimen + summary: Update specimen preparation + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Specimen preparation ID (SpcPrpID) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SpecimenPrep' + responses: + '200': + description: Specimen preparation updated + /api/specimen/status: + get: + tags: + - Specimen + summary: List specimen statuses + security: + - bearerAuth: [] + responses: + '200': + description: List of specimen statuses + post: + tags: + - Specimen + summary: Create specimen status + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SpecimenStatus' + responses: + '201': + description: Specimen status created + /api/specimen/status/{id}: + get: + tags: + - Specimen + summary: Get specimen status by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Specimen status details + patch: + tags: + - Specimen + summary: Update specimen status + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Specimen status ID (SpcStaID) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SpecimenStatus' + responses: + '200': + description: Specimen status updated + /api/specimen/collection: + get: + tags: + - Specimen + summary: List specimen collection methods + security: + - bearerAuth: [] + responses: + '200': + description: List of collection methods + post: + tags: + - Specimen + summary: Create specimen collection method + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SpecimenCollection' + responses: + '201': + description: Collection method created + /api/specimen/collection/{id}: + get: + tags: + - Specimen + summary: Get specimen collection method by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Collection method details + patch: + tags: + - Specimen + summary: Update specimen collection method + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Specimen collection ID (SpcColID) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SpecimenCollection' + responses: + '200': + description: Collection method updated + /api/test/testmap: + get: + tags: + - Test + summary: List all test mappings + security: + - bearerAuth: [] + parameters: + - name: host + in: query + required: false + schema: + type: string + description: Filter by host name, type, or ID + - name: client + in: query + required: false + schema: + type: string + description: Filter by client name, type, or ID + responses: + '200': + description: List of test mappings + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + data: + type: array + items: + type: object + properties: + TestMapID: + type: integer + HostType: + type: string + HostID: + type: string + HostName: + type: string + ClientType: + type: string + ClientID: + type: string + ClientName: + type: string + post: + tags: + - Test + summary: Create test mapping (header only) + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + HostType: + type: string + description: Host type code + HostID: + type: string + description: Host identifier + ClientType: + type: string + description: Client type code + ClientID: + type: string + description: Client identifier + details: + type: array + description: Optional detail records to create alongside the header + items: + type: object + properties: + HostTestCode: + type: string + HostTestName: + type: string + ConDefID: + type: integer + ClientTestCode: + type: string + ClientTestName: + type: string + responses: + '201': + description: Test mapping created + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + data: + type: integer + description: Created TestMapID + delete: + tags: + - Test + summary: Soft delete test mapping (cascades to details) + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + TestMapID: + type: integer + description: Test Map ID to delete (required) + required: + - TestMapID + responses: + '200': + description: Test mapping deleted successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + data: + type: integer + description: Deleted TestMapID + '404': + description: Test mapping not found or already deleted + /api/test/testmap/{id}: + get: + tags: + - Test + summary: Get test mapping by ID with details + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Test Map ID + responses: + '200': + description: Test mapping details with nested detail records + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/TestMap' + '404': + description: Test mapping not found + patch: + tags: + - Test + summary: Update test mapping + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Test Map ID + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + HostType: + type: string + HostID: + type: string + ClientType: + type: string + ClientID: + type: string + details: + description: | + Detail payload supports either a flat array/object (treated as new rows) + or an operations object with `created`, `edited`, and `deleted` arrays. + oneOf: + - type: object + properties: + created: + type: array + description: New detail records to insert + items: + type: object + properties: + HostTestCode: + type: string + HostTestName: + type: string + ConDefID: + type: integer + ClientTestCode: + type: string + ClientTestName: + type: string + edited: + type: array + description: Existing detail records to update + items: + type: object + properties: + TestMapDetailID: + type: integer + HostTestCode: + type: string + HostTestName: + type: string + ConDefID: + type: integer + ClientTestCode: + type: string + ClientTestName: + type: string + deleted: + type: array + description: TestMapDetailIDs to soft delete + items: + type: integer + - type: array + description: Shortcut format for creating new details only + items: + type: object + properties: + HostTestCode: + type: string + HostTestName: + type: string + ConDefID: + type: integer + ClientTestCode: + type: string + ClientTestName: + type: string + - type: object + description: Shortcut format for creating a single new detail + properties: + HostTestCode: + type: string + HostTestName: + type: string + ConDefID: + type: integer + ClientTestCode: + type: string + ClientTestName: + type: string + responses: + '200': + description: Test mapping updated + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + data: + type: integer + description: Updated TestMapID + /api/test/testmap/by-testcode/{testCode}: + get: + tags: + - Test + summary: Get test mappings by test code with details + security: + - bearerAuth: [] + parameters: + - name: testCode + in: path + required: true + schema: + type: string + description: Test Code (matches HostTestCode or ClientTestCode) + responses: + '200': + description: List of test mappings with details for the test code + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/TestMap' + /api/test/testmap/detail: + get: + tags: + - Test + summary: List test mapping details + security: + - bearerAuth: [] + parameters: + - name: TestMapID + in: query + schema: + type: integer + description: Filter by TestMapID + responses: + '200': + description: List of test mapping details + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/TestMapDetail' + post: + tags: + - Test + summary: Create test mapping detail + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + TestMapID: + type: integer + description: Test Map ID (required) + HostTestCode: + type: string + HostTestName: + type: string + ConDefID: + type: integer + ClientTestCode: + type: string + ClientTestName: + type: string + required: + - TestMapID + responses: + '201': + description: Test mapping detail created + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: integer + description: Created TestMapDetailID + delete: + tags: + - Test + summary: Soft delete test mapping detail + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + TestMapDetailID: + type: integer + description: Test Map Detail ID to delete (required) + required: + - TestMapDetailID + responses: + '200': + description: Test mapping detail deleted + /api/test/testmap/detail/{id}: + get: + tags: + - Test + summary: Get test mapping detail by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Test Map Detail ID + responses: + '200': + description: Test mapping detail + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/TestMapDetail' + patch: + tags: + - Test + summary: Update test mapping detail + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Test Map Detail ID + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + TestMapID: + type: integer + HostTestCode: + type: string + HostTestName: + type: string + ConDefID: + type: integer + ClientTestCode: + type: string + ClientTestName: + type: string + responses: + '200': + description: Test mapping detail updated + /api/test/testmap/detail/by-testmap/{testMapID}: + get: + tags: + - Test + summary: Get test mapping details by test map ID + security: + - bearerAuth: [] + parameters: + - name: testMapID + in: path + required: true + schema: + type: integer + description: Test Map ID + responses: + '200': + description: List of test mapping details + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/TestMapDetail' + /api/test/testmap/detail/batch: + post: + tags: + - Test + summary: Batch create test mapping details + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + type: object + properties: + TestMapID: + type: integer + HostTestCode: + type: string + HostTestName: + type: string + ConDefID: + type: integer + ClientTestCode: + type: string + ClientTestName: + type: string + responses: + '200': + description: Batch create results + patch: + tags: + - Test + summary: Batch update test mapping details + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + type: object + properties: + TestMapDetailID: + type: integer + TestMapID: + type: integer + HostTestCode: + type: string + HostTestName: + type: string + ConDefID: + type: integer + ClientTestCode: + type: string + ClientTestName: + type: string + responses: + '200': + description: Batch update results + delete: + tags: + - Test + summary: Batch delete test mapping details + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + type: integer + description: TestMapDetailIDs to delete + responses: + '200': + description: Batch delete results + /api/test: + get: + tags: + - Test + summary: List test definitions + security: + - bearerAuth: [] + parameters: + - name: page + in: query + schema: + type: integer + default: 1 + description: Page number for pagination + - name: perPage + in: query + schema: + type: integer + default: 20 + description: Number of items per page + - name: SiteID + in: query + schema: + type: integer + description: Filter by site ID + - name: TestType + in: query + schema: + type: string + enum: + - TEST + - PARAM + - CALC + - GROUP + - TITLE + description: Filter by test type + - name: isVisibleScr + in: query + schema: + type: integer + enum: + - 0 + - 1 + description: Filter by screen visibility (0=hidden, 1=visible) + - name: isVisibleRpt + in: query + schema: + type: integer + enum: + - 0 + - 1 + description: Filter by report visibility (0=hidden, 1=visible) + - name: search + in: query + schema: + type: string + description: Search by test code or name + responses: + '200': + description: List of test definitions + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/TestDefinitionListItem' + pagination: + type: object + properties: + total: + type: integer + description: Total number of records matching the query + examples: + list_flat: + summary: Flat list response from testdefsite + value: + status: success + message: Data fetched successfully + data: + - TestSiteID: 21 + TestSiteCode: GLU + TestSiteName: Glucose + TestType: TEST + SeqScr: 11 + SeqRpt: 11 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + StartDate: '2026-01-01 00:00:00' + EndDate: null + DisciplineID: 2 + DepartmentID: 2 + DisciplineName: Clinical Chemistry + DepartmentName: Laboratory + - TestSiteID: 22 + TestSiteCode: CREA + TestSiteName: Creatinine + TestType: TEST + SeqScr: 12 + SeqRpt: 12 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + StartDate: '2026-01-01 00:00:00' + EndDate: null + DisciplineID: 2 + DepartmentID: 2 + DisciplineName: Clinical Chemistry + DepartmentName: Laboratory + post: + tags: + - Test + summary: Create test definition + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + SiteID: + type: integer + description: Site ID (required) + TestSiteCode: + type: string + description: Test code (required) + TestSiteName: + type: string + description: Test name (required) + TestType: + type: string + enum: + - TEST + - PARAM + - CALC + - GROUP + - TITLE + description: Test type (required) + Description: + type: string + DisciplineID: + type: integer + DepartmentID: + type: integer + ResultType: + type: string + enum: + - NMRIC + - RANGE + - TEXT + - VSET + - NORES + RefType: + type: string + enum: + - RANGE + - THOLD + - VSET + - TEXT + - NOREF + VSet: + type: integer + ReqQty: + type: number + format: decimal + ReqQtyUnit: + type: string + Unit1: + type: string + Factor: + type: number + format: decimal + Unit2: + type: string + Decimal: + type: integer + CollReq: + type: string + Method: + type: string + ExpectedTAT: + type: integer + SeqScr: + type: integer + SeqRpt: + type: integer + IndentLeft: + type: integer + FontStyle: + type: string + isVisibleScr: + type: integer + isVisibleRpt: + type: integer + isCountStat: + type: integer + testdefcal: + type: object + description: Calculated test metadata persisted in the `testdefcal` table. + properties: + FormulaCode: + type: string + description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}") + testdefgrp: + type: object + description: Group definition wrapper for CALC/GROUP member assignments. + properties: + members: + type: array + description: Array of member TestSiteIDs for CALC/GROUP definitions. + items: + type: object + properties: + TestSiteID: + type: integer + description: Foreign key referencing the member test's TestSiteID. + required: + - TestSiteID + refnum: + type: array + items: + type: object + reftxt: + type: array + items: + type: object + testmap: + type: array + items: + type: object + properties: + HostType: + type: string + HostID: + type: string + HostTestCode: + type: string + HostTestName: + type: string + ClientType: + type: string + ClientID: + type: string + ClientTestCode: + type: string + ClientTestName: + type: string + ConDefID: + type: integer + nullable: true + required: + - SiteID + - TestSiteCode + - TestSiteName + - TestType + examples: + TEST_no_ref: + summary: Technical test without reference or map + value: + SiteID: 1 + TestSiteCode: TEST_NREF + TestSiteName: Numeric Test + TestType: TEST + SeqScr: 500 + SeqRpt: 500 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + DisciplineID: 2 + DepartmentID: 2 + Unit1: mg/dL + Method: CBC Analyzer + PARAM_no_ref: + summary: Parameter without reference or map + value: + SiteID: 1 + TestSiteCode: PARAM_NRF + TestSiteName: Clinical Parameter + TestType: PARAM + SeqScr: 10 + SeqRpt: 10 + isVisibleScr: 1 + isVisibleRpt: 0 + isCountStat: 0 + DisciplineID: 10 + DepartmentID: 0 + Unit1: cm + Method: Manual entry + TEST_range_single: + summary: Technical test with numeric range reference (single) + value: + SiteID: 1 + TestSiteCode: TEST_RANGE + TestSiteName: Glucose Range + TestType: TEST + SeqScr: 105 + SeqRpt: 105 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + refnum: + - NumRefType: NMRC + RangeType: REF + Sex: '2' + LowSign: GE + Low: 70 + HighSign: LE + High: 100 + AgeStart: 6570 + AgeEnd: 36135 + Flag: 'N' + DisciplineID: 2 + DepartmentID: 2 + ResultType: NMRIC + RefType: RANGE + Unit1: mg/dL + Method: Hexokinase + TEST_range_multiple_map: + summary: Numeric reference with multiple ranges and test map + value: + SiteID: 1 + TestSiteCode: TEST_RMAP + TestSiteName: Glucose Panic Range + TestType: TEST + SeqScr: 110 + SeqRpt: 110 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + refnum: + - NumRefType: NMRC + RangeType: REF + Sex: '2' + LowSign: GE + Low: 70 + HighSign: LE + High: 100 + AgeStart: 6570 + AgeEnd: 36135 + Flag: 'N' + - NumRefType: NMRC + RangeType: REF + Sex: '1' + LowSign: '>' + Low: 75 + HighSign: < + High: 105 + AgeStart: 6570 + AgeEnd: 36135 + Flag: 'N' + testmap: + - HostType: SITE + HostID: '1' + HostTestCode: GLU + HostTestName: Glucose + ClientType: WST + ClientID: '1' + ClientTestCode: GLU_C + ClientTestName: Glucose Client + ConDefID: 1 + - HostType: SITE + HostID: '1' + HostTestCode: CREA + HostTestName: Creatinine + ClientType: WST + ClientID: '1' + ClientTestCode: CREA_C + ClientTestName: Creatinine Client + ConDefID: 2 + - HostType: WST + HostID: '3' + HostTestCode: HB + HostTestName: Hemoglobin + ClientType: INST + ClientID: '2' + ClientTestCode: HB_C + ClientTestName: Hemoglobin Client + ConDefID: 3 + DisciplineID: 2 + DepartmentID: 2 + ResultType: NMRIC + RefType: RANGE + Unit1: mg/dL + Method: Hexokinase + TEST_threshold: + summary: Technical test with threshold reference + value: + SiteID: 1 + TestSiteCode: TEST_THLD + TestSiteName: Sodium Threshold + TestType: TEST + SeqScr: 115 + SeqRpt: 115 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + refnum: + - NumRefType: THOLD + RangeType: PANIC + Sex: '2' + LowSign: LT + Low: 120 + AgeStart: 0 + AgeEnd: 45625 + Flag: H + DisciplineID: 2 + DepartmentID: 2 + ResultType: NMRIC + RefType: THOLD + Unit1: mmol/L + Method: Auto Analyzer + TEST_threshold_map: + summary: Threshold reference plus test map + value: + SiteID: 1 + TestSiteCode: TEST_TMAP + TestSiteName: Potassium Panic + TestType: TEST + SeqScr: 120 + SeqRpt: 120 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + refnum: + - NumRefType: THOLD + RangeType: PANIC + Sex: '2' + LowSign: LT + Low: 120 + AgeStart: 0 + AgeEnd: 45625 + Flag: H + - NumRefType: THOLD + RangeType: PANIC + Sex: '1' + LowSign: < + Low: 121 + AgeStart: 0 + AgeEnd: 45625 + Flag: H + testmap: + - HostType: SITE + HostID: '1' + ClientType: WST + ClientID: '1' + details: + - HostTestCode: HB + HostTestName: Hemoglobin + ConDefID: 3 + ClientTestCode: HB_C + ClientTestName: Hemoglobin Client + - HostTestCode: GLU + HostTestName: Glucose + ConDefID: 1 + ClientTestCode: GLU_C + ClientTestName: Glucose Client + DisciplineID: 2 + DepartmentID: 2 + ResultType: NMRIC + RefType: THOLD + Unit1: mmol/L + Method: Auto Analyzer + TEST_text: + summary: Technical test with text reference + value: + SiteID: 1 + TestSiteCode: TEST_TEXT + TestSiteName: Disease Stage + TestType: TEST + SeqScr: 130 + SeqRpt: 130 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + reftxt: + - SpcType: GEN + TxtRefType: TEXT + Sex: '2' + AgeStart: 6570 + AgeEnd: 36135 + RefTxt: NORM=Normal;HIGH=High + Flag: 'N' + DisciplineID: 1 + DepartmentID: 1 + ResultType: TEXT + RefType: TEXT + Method: Morphology + TEST_text_map: + summary: Text reference plus test map + value: + SiteID: 1 + TestSiteCode: TEST_TXM + TestSiteName: Disease Stage (Map) + TestType: TEST + SeqScr: 135 + SeqRpt: 135 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + reftxt: + - SpcType: GEN + TxtRefType: TEXT + Sex: '2' + AgeStart: 6570 + AgeEnd: 36135 + RefTxt: NORM=Normal + Flag: 'N' + - SpcType: GEN + TxtRefType: TEXT + Sex: '1' + AgeStart: 6570 + AgeEnd: 36135 + RefTxt: ABN=Abnormal + Flag: 'N' + testmap: + - HostType: SITE + HostID: '1' + ClientType: WST + ClientID: '1' + details: + - HostTestCode: STAGE + HostTestName: Disease Stage + ConDefID: 4 + ClientTestCode: STAGE_C + ClientTestName: Disease Stage Client + DisciplineID: 1 + DepartmentID: 1 + ResultType: TEXT + RefType: TEXT + TEST_valueset: + summary: Technical test using a value set result + value: + SiteID: 1 + TestSiteCode: TEST_VSET + TestSiteName: Urine Color + TestType: TEST + SeqScr: 140 + SeqRpt: 140 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + reftxt: + - SpcType: GEN + TxtRefType: VSET + Sex: '2' + AgeStart: 0 + AgeEnd: 43800 + RefTxt: NORM=Normal;MACRO=Macro + Flag: 'N' + DisciplineID: 4 + DepartmentID: 4 + ResultType: VSET + RefType: VSET + Method: Visual + TEST_valueset_map: + summary: Value set reference with test map + value: + SiteID: 1 + TestSiteCode: TEST_VMAP + TestSiteName: Urine Color (Map) + TestType: TEST + SeqScr: 145 + SeqRpt: 145 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + reftxt: + - SpcType: GEN + TxtRefType: VSET + Sex: '2' + AgeStart: 0 + AgeEnd: 43800 + RefTxt: NORM=Normal;ABN=Abnormal + Flag: 'N' + testmap: + - HostType: SITE + HostID: '1' + ClientType: WST + ClientID: '8' + details: + - HostTestCode: UCOLOR + HostTestName: Urine Color + ConDefID: 12 + ClientTestCode: UCOLOR_C + ClientTestName: Urine Color Client + DisciplineID: 4 + DepartmentID: 4 + ResultType: VSET + RefType: VSET + TEST_valueset_map_no_reftxt: + summary: Value set result with mapping but without explicit text reference entries + value: + SiteID: 1 + TestSiteCode: TEST_VSETM + TestSiteName: Urine Result Map + TestType: TEST + SeqScr: 150 + SeqRpt: 150 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + testmap: + - HostType: SITE + HostID: '1' + ClientType: WST + ClientID: '8' + details: + - HostTestCode: UGLUC + HostTestName: Urine Glucose + ConDefID: 12 + ClientTestCode: UGLUC_C + ClientTestName: Urine Glucose Client + DisciplineID: 4 + DepartmentID: 4 + ResultType: VSET + RefType: VSET + CALC_basic: + summary: Calculated test with members (no references) + value: + SiteID: 1 + TestSiteCode: CALC_BASE + TestSiteName: Estimated GFR + TestType: CALC + SeqScr: 190 + SeqRpt: 190 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 0 + DisciplineID: 2 + DepartmentID: 2 + testdefcal: + FormulaCode: CKD_EPI(CREA,AGE,GENDER) + testdefgrp: + members: + - TestSiteID: 21 + - TestSiteID: 22 + CALC_full: + summary: Calculated test with numeric reference ranges and map + value: + SiteID: 1 + TestSiteCode: CALC_FULL + TestSiteName: Estimated GFR (Map) + TestType: CALC + SeqScr: 195 + SeqRpt: 195 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 0 + refnum: + - NumRefType: NMRC + RangeType: REF + Sex: '2' + LowSign: GE + Low: 10 + HighSign: LE + High: 20 + AgeStart: 6570 + AgeEnd: 43800 + Flag: 'N' + testmap: + - HostType: SITE + HostID: '1' + ClientType: WST + ClientID: '3' + details: + - HostTestCode: EGFR + HostTestName: eGFR + ConDefID: 1 + ClientTestCode: EGFR_C + ClientTestName: eGFR Client + DisciplineID: 2 + DepartmentID: 2 + testdefcal: + FormulaCode: CKD_EPI(CREA,AGE,GENDER) + testdefgrp: + members: + - TestSiteID: 21 + - TestSiteID: 22 + GROUP_with_members: + summary: Group/profile test with members and mapping + value: + SiteID: 1 + TestSiteCode: GROUP_PNL + TestSiteName: Lipid Profile + TestType: GROUP + SeqScr: 10 + SeqRpt: 10 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + testmap: + - HostType: SITE + HostID: '1' + ClientType: WST + ClientID: '3' + details: + - HostTestCode: LIPID + HostTestName: Lipid Profile + ConDefID: 1 + ClientTestCode: LIPID_C + ClientTestName: Lipid Client + testdefgrp: + members: + - TestSiteID: 169 + - TestSiteID: 170 + responses: + '201': + description: Test definition created + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: created + message: + type: string + data: + type: object + properties: + TestSiteId: + type: integer + '400': + description: Validation error (e.g., invalid member TestSiteID) + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: failed + message: + type: string + example: 'Invalid member TestSiteID(s): 185, 186. Make sure to use TestSiteID, not SeqScr or other values.' + /api/test/{id}: + get: + tags: + - Test + summary: Get test definition by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Test Site ID + responses: + '200': + description: Test definition details + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/TestDefinition' + '404': + description: Test not found + patch: + tags: + - Test + summary: Update test definition + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Test Site ID + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + TestSiteID: + type: integer + description: Test Site ID (required) + TestSiteCode: + type: string + TestSiteName: + type: string + TestType: + type: string + enum: + - TEST + - PARAM + - CALC + - GROUP + - TITLE + Description: + type: string + DisciplineID: + type: integer + DepartmentID: + type: integer + ResultType: + type: string + enum: + - NMRIC + - RANGE + - TEXT + - VSET + - NORES + RefType: + type: string + enum: + - RANGE + - THOLD + - VSET + - TEXT + - NOREF + VSet: + type: integer + ReqQty: + type: number + format: decimal + ReqQtyUnit: + type: string + Unit1: + type: string + Factor: + type: number + format: decimal + Unit2: + type: string + Decimal: + type: integer + CollReq: + type: string + Method: + type: string + ExpectedTAT: + type: integer + SeqScr: + type: integer + SeqRpt: + type: integer + IndentLeft: + type: integer + FontStyle: + type: string + isVisibleScr: + type: integer + isVisibleRpt: + type: integer + isCountStat: + type: integer + testdefcal: + type: object + description: Calculated test metadata persisted in the `testdefcal` table. + properties: + FormulaCode: + type: string + description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}") + testdefgrp: + type: object + description: Group definition wrapper for CALC/GROUP member assignments. + properties: + members: + type: array + description: Array of member TestSiteIDs for CALC/GROUP definitions. + items: + type: object + properties: + TestSiteID: + type: integer + description: Foreign key referencing the member test's TestSiteID. + required: + - TestSiteID + refnum: + type: array + items: + type: object + reftxt: + type: array + items: + type: object + testmap: + type: array + items: + type: object + properties: + HostType: + type: string + HostID: + type: string + HostTestCode: + type: string + HostTestName: + type: string + ClientType: + type: string + ClientID: + type: string + ClientTestCode: + type: string + ClientTestName: + type: string + ConDefID: + type: integer + nullable: true + required: + - TestSiteID + responses: + '200': + description: Test definition updated + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + data: + type: object + properties: + TestSiteId: + type: integer + '400': + description: Validation error (e.g., invalid member TestSiteID) + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: failed + message: + type: string + example: 'Invalid member TestSiteID(s): 185, 186. Make sure to use TestSiteID, not SeqScr or other values.' + delete: + tags: + - Test + summary: Soft delete test definition + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Test Site ID to delete + requestBody: + content: + application/json: + schema: + type: object + properties: + TestSiteID: + type: integer + description: Optional - can be provided in body instead of path + responses: + '200': + description: Test disabled successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + data: + type: object + properties: + TestSiteId: + type: integer + EndDate: + type: string + format: date-time + '404': + description: Test not found + '422': + description: Test already disabled + /api/user: + get: + tags: + - User + summary: List users with pagination and search + security: + - bearerAuth: [] + parameters: + - name: page + in: query + schema: + type: integer + default: 1 + description: Page number + - name: per_page + in: query + schema: + type: integer + default: 20 + description: Items per page + - name: search + in: query + schema: + type: string + description: Search term for username, email, or name + responses: + '200': + description: List of users with pagination + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: Users retrieved successfully + data: + type: object + properties: + users: + type: array + items: + $ref: '#/components/schemas/User' + pagination: + type: object + properties: + current_page: + type: integer + per_page: + type: integer + total: + type: integer + total_pages: + type: integer + '500': + description: Server error + post: + tags: + - User + summary: Create new user + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UserCreate' + responses: + '201': + description: User created successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: User created successfully + data: + type: object + properties: + UserID: + type: integer + Username: + type: string + Email: + type: string + '400': + description: Validation failed + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: failed + message: + type: string + example: Validation failed + data: + type: object + '500': + description: Server error + /api/user/{id}: + get: + tags: + - User + summary: Get user by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: User ID + responses: + '200': + description: User details + content: + application/json: + schema: + $ref: '#/components/schemas/User' + '404': + description: User not found + '500': + description: Server error + patch: + tags: + - User + summary: Update existing user + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: User ID + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UserUpdate' + responses: + '200': + description: User updated successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: User updated successfully + data: + type: object + properties: + UserID: + type: integer + updated_fields: + type: array + items: + type: string + '400': + description: UserID is required + '404': + description: User not found + '500': + description: Server error + delete: + tags: + - User + summary: Delete user (soft delete) + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: User ID + responses: + '200': + description: User deleted successfully + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: User deleted successfully + data: + type: object + properties: + UserID: + type: integer + '404': + description: User not found + '500': + description: Server error + /api/valueset: + get: + tags: + - ValueSet + summary: List lib value sets + description: List all library/system value sets from JSON files with item counts. Returns an array of objects with value, label, and count properties. + security: + - bearerAuth: [] + parameters: + - name: search + in: query + schema: + type: string + description: Optional search term to filter value set names or labels + responses: + '200': + description: List of lib value sets with item counts + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + data: + type: array + items: + $ref: '#/components/schemas/ValueSetListItem' + example: + - value: sex + label: Sex + count: 3 + - value: marital_status + label: Marital Status + count: 6 + - value: order_status + label: Order Status + count: 6 + /api/valueset/{key}: + get: + tags: + - ValueSet + summary: Get lib value set by key + description: | + Get a specific library/system value set from JSON files. + + **Available value set keys:** + - `activity_result` - Activity Result + - `additive` - Additive + - `adt_event` - ADT Event + - `area_class` - Area Class + - `body_site` - Body Site + - `collection_method` - Collection Method + - `container_cap_color` - Container Cap Color + - `container_class` - Container Class + - `container_size` - Container Size + - `country` - Country + - `death_indicator` - Death Indicator + - `did_type` - DID Type + - `enable_disable` - Enable/Disable + - `entity_type` - Entity Type + - `ethnic` - Ethnic + - `fasting_status` - Fasting Status + - `formula_language` - Formula Language + - `generate_by` - Generate By + - `identifier_type` - Identifier Type + - `location_type` - Location Type + - `marital_status` - Marital Status + - `math_sign` - Math Sign + - `numeric_ref_type` - Numeric Reference Type + - `operation` - Operation (CRUD) + - `order_priority` - Order Priority + - `order_status` - Order Status + - `race` - Race (Ethnicity) + - `range_type` - Range Type + - `reference_type` - Reference Type + - `religion` - Religion + - `requested_entity` - Requested Entity + - `result_type` - Result Type + - `result_unit` - Result Unit + - `sex` - Sex + - `site_class` - Site Class + - `site_type` - Site Type + - `specimen_activity` - Specimen Activity + - `specimen_condition` - Specimen Condition + - `specimen_role` - Specimen Role + - `specimen_status` - Specimen Status + - `specimen_type` - Specimen Type + - `test_activity` - Test Activity + - `test_type` - Test Type + - `text_ref_type` - Text Reference Type + - `unit` - Unit + - `v_category` - VCategory + - `ws_type` - Workstation Type + security: + - bearerAuth: [] + parameters: + - name: key + in: path + required: true + schema: + type: string + enum: + - activity_result + - additive + - adt_event + - area_class + - body_site + - collection_method + - container_cap_color + - container_class + - container_size + - country + - death_indicator + - did_type + - enable_disable + - entity_type + - ethnic + - fasting_status + - formula_language + - generate_by + - identifier_type + - location_type + - marital_status + - math_sign + - numeric_ref_type + - operation + - order_priority + - order_status + - race + - range_type + - reference_type + - religion + - requested_entity + - result_type + - result_unit + - sex + - site_class + - site_type + - specimen_activity + - specimen_condition + - specimen_role + - specimen_status + - specimen_type + - test_activity + - test_type + - text_ref_type + - unit + - v_category + - ws_type + description: Value set key name + responses: + '200': + description: Lib value set details + content: + application/json: + schema: + type: object + properties: + status: + type: string + data: + type: array + items: + $ref: '#/components/schemas/ValueSetLibItem' + /api/valueset/refresh: + post: + tags: + - ValueSet + summary: Refresh lib ValueSet cache + description: Clear and reload the library/system ValueSet cache from JSON files. Call this after modifying JSON files in app/Libraries/Data/. + security: + - bearerAuth: [] + responses: + '200': + description: Lib ValueSet cache refreshed + content: + application/json: + schema: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: Cache cleared + /api/valueset/user/items: + get: + tags: + - ValueSet + summary: List user value set items + description: List value set items from database (user-defined) + security: + - bearerAuth: [] + parameters: + - name: VSetID + in: query + schema: + type: integer + description: Filter by ValueSet ID + - name: search + in: query + schema: + type: string + description: Search term to filter by VValue, VDesc, or VSName + - name: param + in: query + schema: + type: string + description: Alternative search parameter (alias for search) + responses: + '200': + description: List of user value set items + content: + application/json: + schema: + type: object + properties: + status: + type: string + data: + type: array + items: + $ref: '#/components/schemas/ValueSetItem' + post: + tags: + - ValueSet + summary: Create user value set item + description: Create value set item in database (user-defined) + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - VSetID + properties: + SiteID: + type: integer + description: Site reference (default 1) + VSetID: + type: integer + description: Reference to value set definition (required) + VOrder: + type: integer + description: Display order (default 0) + VValue: + type: string + description: The value code + VDesc: + type: string + description: The display description/label + responses: + '201': + description: User value set item created + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/ValueSetItem' + /api/valueset/user/items/{id}: + get: + tags: + - ValueSet + summary: Get user value set item by ID + description: Get value set item from database (user-defined) + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: User value set item details + content: + application/json: + schema: + type: object + properties: + status: + type: string + data: + $ref: '#/components/schemas/ValueSetItem' + put: + tags: + - ValueSet + summary: Update user value set item + description: Update value set item in database (user-defined) + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + SiteID: + type: integer + description: Site reference + VSetID: + type: integer + description: Reference to value set definition + VOrder: + type: integer + description: Display order + VValue: + type: string + description: The value code + VDesc: + type: string + description: The display description/label + responses: + '200': + description: User value set item updated + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/ValueSetItem' + delete: + tags: + - ValueSet + summary: Delete user value set item + description: Delete value set item from database (user-defined) + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: User value set item deleted + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + /api/valueset/user/def: + get: + tags: + - ValueSet + summary: List user value set definitions + description: List value set definitions from database (user-defined) + security: + - bearerAuth: [] + parameters: + - name: search + in: query + schema: + type: string + description: Optional search term to filter definitions + - name: page + in: query + schema: + type: integer + default: 1 + description: Page number for pagination + - name: limit + in: query + schema: + type: integer + default: 100 + description: Number of items per page + responses: + '200': + description: List of user value set definitions + content: + application/json: + schema: + type: object + properties: + status: + type: string + data: + type: array + items: + $ref: '#/components/schemas/ValueSetDef' + meta: + type: object + properties: + total: + type: integer + page: + type: integer + limit: + type: integer + post: + tags: + - ValueSet + summary: Create user value set definition + description: Create value set definition in database (user-defined) + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + SiteID: + type: integer + description: Site reference (default 1) + VSName: + type: string + description: Value set name + VSDesc: + type: string + description: Value set description + responses: + '201': + description: User value set definition created + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/ValueSetDef' + /api/valueset/user/def/{id}: + get: + tags: + - ValueSet + summary: Get user value set definition by ID + description: Get value set definition from database (user-defined) + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: User value set definition details + content: + application/json: + schema: + type: object + properties: + status: + type: string + data: + $ref: '#/components/schemas/ValueSetDef' + put: + tags: + - ValueSet + summary: Update user value set definition + description: Update value set definition in database (user-defined) + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + SiteID: + type: integer + description: Site reference + VSName: + type: string + description: Value set name + VSDesc: + type: string + description: Value set description + responses: + '200': + description: User value set definition updated + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/ValueSetDef' + delete: + tags: + - ValueSet + summary: Delete user value set definition + description: Delete value set definition from database (user-defined) + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: User value set definition deleted + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string +components: + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + description: JWT token from login endpoint + cookieAuth: + type: apiKey + in: cookie + name: token + description: JWT token stored in HTTP-only cookie + schemas: + SuccessResponse: + type: object + properties: + status: + type: string + example: success + message: + type: string + code: + type: integer + example: 200 + ErrorResponse: + type: object + properties: + status: + type: string + example: error + message: + type: string + errors: + type: object + DashboardSummary: + type: object + properties: + pendingOrders: + type: integer + todayResults: + type: integer + criticalResults: + type: integer + activePatients: + type: integer + LoginRequest: + type: object + required: + - username + - password + properties: + username: + type: string + example: labuser01 + password: + type: string + format: password + example: secret123 + LoginResponse: + type: object + properties: + status: + type: string + example: success + code: + type: integer + example: 200 + message: + type: string + example: Login successful + RegisterRequest: + type: object + required: + - username + - password + - email + properties: + username: + type: string + password: + type: string + format: password + email: + type: string + format: email + full_name: + type: string + Patient: + type: object + required: + - PatientID + - Sex + - NameFirst + - Birthdate + properties: + PatientID: + type: string + maxLength: 30 + pattern: ^[A-Za-z0-9]+$ + description: Internal patient identifier + AlternatePID: + type: string + maxLength: 30 + pattern: ^[A-Za-z0-9]+$ + Prefix: + type: string + maxLength: 10 + enum: + - Mr + - Mrs + - Ms + - Dr + - Prof + Sex: + type: string + enum: + - '1' + - '2' + description: '1: Female, 2: Male' + NameFirst: + type: string + minLength: 1 + maxLength: 60 + pattern: ^[A-Za-z'\. ]+$ + NameMiddle: + type: string + minLength: 1 + maxLength: 60 + NameMaiden: + type: string + minLength: 1 + maxLength: 60 + NameLast: + type: string + minLength: 1 + maxLength: 60 + Suffix: + type: string + maxLength: 10 + Birthdate: + type: string + format: date-time + description: ISO 8601 UTC datetime + PlaceOfBirth: + type: string + maxLength: 100 + Citizenship: + type: string + maxLength: 100 + Street_1: + type: string + maxLength: 255 + Street_2: + type: string + maxLength: 255 + Street_3: + type: string + maxLength: 255 + ZIP: + type: string + maxLength: 10 + pattern: ^[0-9]+$ + Phone: + type: string + pattern: ^\+?[0-9]{8,15}$ + MobilePhone: + type: string + pattern: ^\+?[0-9]{8,15}$ + EmailAddress1: + type: string + format: email + maxLength: 100 + EmailAddress2: + type: string + format: email + maxLength: 100 + PatIdt: + $ref: '#/components/schemas/PatientIdentifier' + LinkTo: + type: array + description: Array of linked patient references + items: + $ref: '#/components/schemas/LinkedPatient' + Custodian: + $ref: '#/components/schemas/Custodian' + isDead: + type: string + enum: + - '0' + - '1' + description: '0: No (alive), 1: Yes (deceased)' + TimeOfDeath: + type: string + format: date-time + description: ISO 8601 UTC datetime of death + PatCom: + type: string + description: Patient comment/notes + PatAtt: + type: array + description: Patient address entries + items: + $ref: '#/components/schemas/PatAttEntry' + Province: + type: integer + description: Province AreaGeoID (foreign key to areageo table) + ProvinceLabel: + type: string + description: Province name (resolved from areageo) + City: + type: integer + description: City AreaGeoID (foreign key to areageo table) + CityLabel: + type: string + description: City name (resolved from areageo) + Country: + type: string + maxLength: 10 + description: Country ISO 3-letter code (e.g., IDN, USA) + CountryLabel: + type: string + description: Country name (resolved from valueset) + Race: + type: string + maxLength: 100 + MaritalStatus: + type: string + enum: + - A + - B + - D + - M + - S + - W + description: 'A: Annulled, B: Separated, D: Divorced, M: Married, S: Single, W: Widowed' + Religion: + type: string + maxLength: 100 + Ethnic: + type: string + maxLength: 100 + PatientIdentifier: + type: object + properties: + IdentifierType: + type: string + enum: + - KTP + - PASS + - SSN + - SIM + - KTAS + description: | + KTP: 16 digit numeric + PASS: alphanumeric max 9 + SSN: 9 digit numeric + SIM: 19-20 digit numeric + KTAS: 11 digit numeric + Identifier: + type: string + maxLength: 255 + LinkedPatient: + type: object + description: Linked patient reference + properties: + InternalPID: + type: integer + description: Internal patient ID of the linked patient + PatientID: + type: string + description: Patient ID of the linked patient + Custodian: + type: object + description: Patient custodian/guardian + properties: + InternalPID: + type: integer + description: Internal patient ID of the custodian + PatientID: + type: string + description: Patient ID of the custodian + PatAttEntry: + type: object + description: Patient address/attorney entry + properties: + Address: + type: string + description: Address text + PatientListResponse: + type: object + properties: + status: + type: string + example: success + data: + type: array + items: + $ref: '#/components/schemas/Patient' + pagination: + type: object + properties: + page: + type: integer + perPage: + type: integer + total: + type: integer + PatientVisit: + type: object + properties: + InternalPVID: + type: integer + description: Primary key (auto-generated) + PVID: + type: string + description: Visit ID (auto-generated with DV prefix if not provided) + InternalPID: + type: integer + description: Reference to patient + EpisodeID: + type: string + description: Episode identifier + SiteID: + type: integer + description: Site reference + LastLocation: + type: string + description: Full name of the last/current location from patvisitadt + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + ArchivedDate: + type: string + format: date-time + DelDate: + type: string + format: date-time + PatDiag: + type: object + description: Diagnosis information (optional) + properties: + DiagCode: + type: string + Diagnosis: + type: string + PatVisitADT: + type: object + description: ADT (Admission/Discharge/Transfer) information (optional) + properties: + ADTCode: + type: string + enum: + - A01 + - A02 + - A03 + - A04 + - A08 + LocationID: + type: integer + AttDoc: + type: integer + description: Attending physician ContactID + RefDoc: + type: integer + description: Referring physician ContactID + AdmDoc: + type: integer + description: Admitting physician ContactID + CnsDoc: + type: integer + description: Consulting physician ContactID + PatVisitADT: + type: object + properties: + PVADTID: + type: integer + description: Primary key (auto-generated) + InternalPVID: + type: integer + description: Reference to patient visit + ADTCode: + type: string + enum: + - A01 + - A02 + - A03 + - A04 + - A08 + description: | + A01: Admit + A02: Transfer + A03: Discharge + A04: Register + A08: Update + LocationID: + type: integer + description: Location/ward reference + AttDoc: + type: integer + description: Attending physician ContactID + RefDoc: + type: integer + description: Referring physician ContactID + AdmDoc: + type: integer + description: Admitting physician ContactID + CnsDoc: + type: integer + description: Consulting physician ContactID + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + ArchivedDate: + type: string + format: date-time + DelDate: + type: string + format: date-time + Account: + type: object + properties: + id: + type: integer + AccountName: + type: string + AccountCode: + type: string + AccountType: + type: string + Site: + type: object + properties: + id: + type: integer + SiteName: + type: string + SiteCode: + type: string + maxLength: 2 + pattern: ^[A-Z0-9]{2}$ + AccountID: + type: integer + Discipline: + type: object + properties: + id: + type: integer + DisciplineName: + type: string + DisciplineCode: + type: string + SeqScr: + type: integer + description: Display order on screen + SeqRpt: + type: integer + description: Display order in reports + Department: + type: object + properties: + id: + type: integer + DeptName: + type: string + DeptCode: + type: string + SiteID: + type: integer + Workstation: + type: object + properties: + id: + type: integer + WorkstationName: + type: string + WorkstationCode: + type: string + SiteID: + type: integer + DepartmentID: + type: integer + HostApp: + type: object + properties: + HostAppID: + type: string + maxLength: 5 + HostAppName: + type: string + SiteID: + type: integer + SiteName: + type: string + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + HostComPara: + type: object + properties: + HostAppID: + type: string + maxLength: 5 + HostAppName: + type: string + HostIP: + type: string + maxLength: 15 + HostPort: + type: string + maxLength: 6 + HostPwd: + type: string + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + CodingSys: + type: object + properties: + CodingSysID: + type: integer + CodingSysAbb: + type: string + maxLength: 6 + FullText: + type: string + Description: + type: string + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + Specimen: + type: object + properties: + id: + type: integer + SpecimenID: + type: string + PatientID: + type: string + SpecimenType: + type: string + description: Specimen type code + SpecimenTypeLabel: + type: string + description: Specimen type display text + CollectionDate: + type: string + format: date-time + CollectionMethod: + type: string + description: Collection method code + CollectionMethodLabel: + type: string + description: Collection method display text + ContainerID: + type: integer + SpecimenStatus: + type: string + description: Specimen status code + SpecimenStatusLabel: + type: string + description: Specimen status display text + BodySite: + type: string + description: Body site code + BodySiteLabel: + type: string + description: Body site display text + ContainerDef: + type: object + properties: + id: + type: integer + ContainerCode: + type: string + ContainerName: + type: string + ConCategory: + type: string + description: Container category code + ConCategoryLabel: + type: string + description: Container category display text + ConSize: + type: string + description: Container size code + ConSizeLabel: + type: string + description: Container size display text + CapColor: + type: string + description: Cap color code + CapColorLabel: + type: string + description: Cap color display text + SpecimenPrep: + type: object + properties: + id: + type: integer + PrepCode: + type: string + PrepName: + type: string + Description: + type: string + SpecimenStatus: + type: object + properties: + id: + type: integer + StatusCode: + type: string + StatusName: + type: string + Description: + type: string + Status: + type: string + description: Status code + StatusLabel: + type: string + description: Status display text + Activity: + type: string + description: Activity code + ActivityLabel: + type: string + description: Activity display text + SpecimenCollection: + type: object + properties: + id: + type: integer + CollectionCode: + type: string + CollectionName: + type: string + Description: + type: string + CollectionMethod: + type: string + description: Collection method code + CollectionMethodLabel: + type: string + description: Collection method display text + Additive: + type: string + description: Additive code + AdditiveLabel: + type: string + description: Additive display text + SpecimenRole: + type: string + description: Specimen role code + SpecimenRoleLabel: + type: string + description: Specimen role display text + TestDefinition: + type: object + properties: + TestSiteID: + type: integer + SiteID: + type: integer + TestSiteCode: + type: string + TestSiteName: + type: string + TestType: + type: string + enum: + - TEST + - PARAM + - CALC + - GROUP + - TITLE + description: | + TEST: Technical test + PARAM: Parameter + CALC: Calculated + GROUP: Panel/Profile + TITLE: Section header + Description: + type: string + DisciplineID: + type: integer + DisciplineName: + type: string + DepartmentID: + type: integer + DepartmentName: + type: string + ResultType: + type: string + enum: + - NMRIC + - RANGE + - TEXT + - VSET + - NORES + description: | + Result type determines the format of test results: + - NMRIC: Single numeric value + - RANGE: Numeric range (min-max) + - TEXT: Free text result + - VSET: Value set/enum result + - NORES: No result (for GROUP and TITLE types) + + TestType to ResultType mapping: + - TEST: NMRIC | RANGE | TEXT | VSET + - PARAM: NMRIC | RANGE | TEXT | VSET + - CALC: NMRIC (calculated result is always numeric) + - GROUP: NORES (no result, container only) + - TITLE: NORES (no result, header only) + RefType: + type: string + enum: + - RANGE + - THOLD + - VSET + - TEXT + - NOREF + description: | + Reference type determines which reference range table to use: + - RANGE: Numeric reference range + - THOLD: Threshold/panic range + - VSET: Value set reference + - TEXT: Free text reference + - NOREF: No reference (for NORES result type) + + ResultType to RefType mapping: + - NMRIC: RANGE | THOLD → refnum table + - RANGE: RANGE | THOLD → refnum table + - VSET: VSET → reftxt table + - TEXT: TEXT → reftxt table + - NORES: NOREF → (no reference table) + VSet: + type: integer + description: Value set ID for VSET result type + ReqQty: + type: number + format: decimal + description: Required sample quantity + ReqQtyUnit: + type: string + description: Unit for required quantity + Unit1: + type: string + description: Primary unit + Factor: + type: number + format: decimal + description: Conversion factor + Unit2: + type: string + description: Secondary unit (after conversion) + Decimal: + type: integer + description: Number of decimal places + CollReq: + type: string + description: Collection requirements + Method: + type: string + description: Test method + ExpectedTAT: + type: integer + description: Expected turnaround time + SeqScr: + type: integer + description: Screen sequence + SeqRpt: + type: integer + description: Report sequence + IndentLeft: + type: integer + default: 0 + FontStyle: + type: string + isVisibleScr: + type: integer + default: 1 + description: Screen visibility (0=hidden, 1=visible) + isVisibleRpt: + type: integer + default: 1 + description: Report visibility (0=hidden, 1=visible) + isCountStat: + type: integer + default: 1 + Level: + type: integer + isRequestable: + type: integer + default: 1 + description: Flag indicating if test can be requested (1=yes, 0=no) + CreateDate: + type: string + format: date-time + StartDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + FormulaCode: + type: string + description: Formula expression for calculated tests + testdefcal: + type: array + description: Calculated test details (only for CALC type) + items: + type: object + testdefgrp: + type: object + description: Group definition payload for GROUP and CALC types. + properties: + members: + type: array + description: | + Group members (for GROUP and CALC types). + When creating or updating, provide members in testdefgrp.members with TestSiteID field. + Do NOT use Member, SeqScr, or Members fields when creating/updating. + items: + type: object + properties: + TestGrpID: + type: integer + description: Group membership record ID + TestSiteID: + type: integer + description: Parent group TestSiteID + Member: + type: integer + description: | + Member TestSiteID (foreign key to testdefsite). + **Note**: This field is in the response. When creating/updating, use TestSiteID in testdefgrp.members instead. + TestSiteCode: + type: string + description: Member test code + TestSiteName: + type: string + description: Member test name + TestType: + type: string + description: Member test type + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + testmap: + type: array + description: Flat test mapping payload for /api/test create/update + items: + type: object + properties: + HostType: + type: string + HostID: + type: string + HostTestCode: + type: string + HostTestName: + type: string + ClientType: + type: string + ClientID: + type: string + ClientTestCode: + type: string + ClientTestName: + type: string + ConDefID: + type: integer + nullable: true + refnum: + type: array + description: Numeric reference ranges (optional). Mutually exclusive with reftxt - a test can only have ONE reference type. + items: + type: object + properties: + RefNumID: + type: integer + NumRefType: + type: string + enum: + - NMRC + - THOLD + description: NMRC=Numeric range, THOLD=Threshold + NumRefTypeLabel: + type: string + RangeType: + type: string + RangeTypeLabel: + type: string + SpcType: + type: string + description: Specimen type code (e.g., GEN, EDTA) + Sex: + type: string + SexLabel: + type: string + LowSign: + type: string + LowSignLabel: + type: string + HighSign: + type: string + HighSignLabel: + type: string + High: + type: number + format: float + Low: + type: number + format: float + AgeStart: + type: integer + description: Minimum patient age in days + AgeEnd: + type: integer + description: Maximum patient age in days + Flag: + type: string + Interpretation: + type: string + Notes: + type: string + description: Optional note attached to the numeric reference range + reftxt: + type: array + description: Text reference ranges (optional). Mutually exclusive with refnum - a test can only have ONE reference type. + items: + type: object + properties: + RefTxtID: + type: integer + TxtRefType: + type: string + enum: + - TEXT + - VSET + description: TEXT=Free text, VSET=Value set + TxtRefTypeLabel: + type: string + Sex: + type: string + SexLabel: + type: string + AgeStart: + type: integer + description: Minimum patient age in days + AgeEnd: + type: integer + description: Maximum patient age in days + RefTxt: + type: string + Flag: + type: string + examples: + TEST_numeric: + summary: Technical test with numeric reference + value: + TestSiteID: 1 + SiteID: 1 + TestSiteCode: GLU + TestSiteName: Glucose + TestType: TEST + DisciplineID: 2 + DepartmentID: 2 + ResultType: NMRIC + RefType: NMRC + Unit1: mg/dL + ReqQty: 300 + ReqQtyUnit: uL + Decimal: 0 + Method: Hexokinase + SeqScr: 11 + SeqRpt: 11 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + refnum: + - RefNumID: 1 + NumRefType: NMRC + NumRefTypeLabel: Numeric + RangeType: REF + RangeTypeLabel: Reference Range + Sex: '2' + SexLabel: Male + LowSign: GE + LowSignLabel: '>=' + HighSign: LE + HighSignLabel: <= + Low: 70 + High: 100 + AgeStart: 6570 + AgeEnd: 36135 + Flag: 'N' + Interpretation: Normal + TEST_threshold: + summary: Technical test with threshold reference (panic) + value: + TestSiteID: 2 + SiteID: 1 + TestSiteCode: GLU + TestSiteName: Glucose + TestType: TEST + DisciplineID: 2 + DepartmentID: 2 + ResultType: NMRIC + RefType: THOLD + Unit1: mg/dL + Decimal: 0 + Method: Hexokinase + SeqScr: 11 + SeqRpt: 11 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + refnum: + - RefNumID: 2 + NumRefType: THOLD + NumRefTypeLabel: Threshold + RangeType: PANIC + RangeTypeLabel: Panic Range + Sex: '1' + SexLabel: Female + LowSign: LT + LowSignLabel: < + High: 40 + AgeStart: 0 + AgeEnd: 43800 + Flag: L + Interpretation: Critical Low + TEST_text: + summary: Technical test with text reference + value: + TestSiteID: 3 + SiteID: 1 + TestSiteCode: STAGE + TestSiteName: Disease Stage + TestType: TEST + DisciplineID: 1 + DepartmentID: 1 + ResultType: VSET + RefType: TEXT + SeqScr: 50 + SeqRpt: 50 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + reftxt: + - RefTxtID: 1 + TxtRefType: TEXT + TxtRefTypeLabel: Text + Sex: '2' + SexLabel: Male + AgeStart: 6570 + AgeEnd: 36135 + RefTxt: NORM=Normal;HYPO=Hypochromic;MACRO=Macrocytic + Flag: 'N' + PARAM: + summary: Parameter test + value: + TestSiteID: 4 + SiteID: 1 + TestSiteCode: HEIGHT + TestSiteName: Height + TestType: PARAM + DisciplineID: 10 + ResultType: NMRIC + Unit1: cm + Decimal: 0 + SeqScr: 40 + SeqRpt: 40 + isVisibleScr: 1 + isVisibleRpt: 0 + isCountStat: 0 + CALC: + summary: Calculated test with reference + value: + TestSiteID: 5 + SiteID: 1 + TestSiteCode: EGFR + TestSiteName: eGFR + TestType: CALC + DisciplineID: 2 + DepartmentID: 2 + Unit1: mL/min/1.73m2 + Decimal: 0 + SeqScr: 20 + SeqRpt: 20 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 0 + testdefcal: + - TestCalID: 1 + DisciplineID: 2 + DepartmentID: 2 + FormulaCode: CKD_EPI(CREA,AGE,GENDER) + Unit1: mL/min/1.73m2 + Decimal: 0 + testdefgrp: + members: + - TestSiteID: 21 + TestSiteCode: CREA + TestSiteName: Creatinine + TestType: TEST + - TestSiteID: 51 + TestSiteCode: AGE + TestSiteName: Age + TestType: PARAM + refnum: + - RefNumID: 5 + NumRefType: NMRC + NumRefTypeLabel: Numeric + RangeType: REF + RangeTypeLabel: Reference Range + Sex: '1' + SexLabel: Female + LowSign: GE + LowSignLabel: '>=' + HighSign: LE + HighSignLabel: <= + Low: 10 + High: 20 + AgeStart: 6570 + AgeEnd: 43800 + Flag: 'N' + Interpretation: Normal + GROUP: + summary: Panel/Profile test + value: + TestSiteID: 6 + SiteID: 1 + TestSiteCode: LIPID + TestSiteName: Lipid Panel + TestType: GROUP + DisciplineID: 2 + DepartmentID: 2 + SeqScr: 51 + SeqRpt: 51 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 1 + testdefgrp: + members: + - TestGrpID: 1 + TestSiteID: 6 + Member: 100 + MemberTestSiteID: 100 + TestSiteCode: CHOL + TestSiteName: Total Cholesterol + TestType: TEST + - TestGrpID: 2 + TestSiteID: 6 + Member: 101 + MemberTestSiteID: 101 + TestSiteCode: TG + TestSiteName: Triglycerides + TestType: TEST + TITLE: + summary: Section header + value: + TestSiteID: 7 + SiteID: 1 + TestSiteCode: CHEM_HEADER + TestSiteName: '--- CHEMISTRY ---' + TestType: TITLE + DisciplineID: 2 + DepartmentID: 2 + SeqScr: 100 + SeqRpt: 100 + isVisibleScr: 1 + isVisibleRpt: 1 + isCountStat: 0 + TestMap: + type: object + properties: + TestMapID: + type: integer + HostType: + type: string + description: Host type code (e.g., SITE, WORKSTATION, INSTRUMENT) + HostID: + type: string + description: Host identifier + ClientType: + type: string + description: Client type code (e.g., SITE, WORKSTATION, INSTRUMENT) + ClientID: + type: string + description: Client identifier + HostName: + type: string + description: Resolved host name (from view) + ClientName: + type: string + description: Resolved client name (from view) + details: + type: array + description: Test mapping detail records + items: + $ref: '#/components/schemas/TestMapDetail' + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + description: Soft delete timestamp + OrderTestList: + type: object + properties: + InternalOID: + type: integer + description: Internal order ID + OrderID: + type: string + description: Order ID (e.g., 0025030300001) + PlacerID: + type: string + nullable: true + InternalPID: + type: integer + description: Patient internal ID + SiteID: + type: integer + PVADTID: + type: integer + description: Visit ADT ID + ReqApp: + type: string + nullable: true + Priority: + type: string + enum: + - R + - S + - U + description: | + R: Routine + S: Stat + U: Urgent + PriorityLabel: + type: string + description: Priority display text + TrnDate: + type: string + format: date-time + description: Transaction/Order date + EffDate: + type: string + format: date-time + description: Effective date + CreateDate: + type: string + format: date-time + OrderStatus: + type: string + enum: + - ORD + - SCH + - ANA + - VER + - REV + - REP + description: | + ORD: Ordered + SCH: Scheduled + ANA: Analysis + VER: Verified + REV: Reviewed + REP: Reported + OrderStatusLabel: + type: string + description: Order status display text + OrderTest: + type: object + properties: + InternalOID: + type: integer + description: Internal order ID + OrderID: + type: string + description: Order ID (e.g., 0025030300001) + PlacerID: + type: string + nullable: true + InternalPID: + type: integer + description: Patient internal ID + SiteID: + type: integer + PVADTID: + type: integer + description: Visit ADT ID + ReqApp: + type: string + nullable: true + Priority: + type: string + enum: + - R + - S + - U + description: | + R: Routine + S: Stat + U: Urgent + PriorityLabel: + type: string + description: Priority display text + TrnDate: + type: string + format: date-time + description: Transaction/Order date + EffDate: + type: string + format: date-time + description: Effective date + CreateDate: + type: string + format: date-time + OrderStatus: + type: string + enum: + - ORD + - SCH + - ANA + - VER + - REV + - REP + description: | + ORD: Ordered + SCH: Scheduled + ANA: Analysis + VER: Verified + REV: Reviewed + REP: Reported + OrderStatusLabel: + type: string + description: Order status display text + Specimens: + type: array + items: + $ref: '#/components/schemas/OrderSpecimen' + description: Associated specimens for this order + Tests: + type: array + items: + $ref: '#/components/schemas/OrderTestItem' + description: Test results (patres) for this order + OrderItem: + type: object + properties: + id: + type: integer + OrderID: + type: string + TestID: + type: integer + SpecimenID: + type: string + Status: + type: string + EdgeResultRequest: + type: object + required: + - sample_id + - instrument_id + properties: + sample_id: + type: string + description: Sample barcode/identifier + instrument_id: + type: string + description: Instrument identifier + patient_id: + type: string + description: Patient identifier (optional) + results: + type: array + items: + type: object + properties: + test_code: + type: string + result_value: + type: string + unit: + type: string + flags: + type: string + enum: + - H + - L + - 'N' + - A + description: H=High, L=Low, N=Normal, A=Abnormal + EdgeResultResponse: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: Result received and queued + data: + type: object + properties: + edge_res_id: + type: integer + sample_id: + type: string + instrument_id: + type: string + EdgeOrder: + type: object + properties: + OrderID: + type: string + PatientID: + type: string + SampleID: + type: string + Tests: + type: array + items: + type: object + properties: + TestCode: + type: string + TestName: + type: string + SpecimenType: + type: string + Priority: + type: string + DueDateTime: + type: string + format: date-time + ValueSetLibItem: + type: object + description: Library/system value set item from JSON files + properties: + value: + type: string + description: The value/key code + label: + type: string + description: The display label + ValueSetDef: + type: object + description: User-defined value set definition (from database) + properties: + VSetID: + type: integer + description: Primary key + SiteID: + type: integer + description: Site reference + VSName: + type: string + description: Value set name + VSDesc: + type: string + description: Value set description + CreateDate: + type: string + format: date-time + description: Creation timestamp + EndDate: + type: string + format: date-time + nullable: true + description: Soft delete timestamp + ItemCount: + type: integer + description: Number of items in this value set + ValueSetItem: + type: object + description: User-defined value set item (from database) + properties: + VID: + type: integer + description: Primary key + SiteID: + type: integer + description: Site reference + VSetID: + type: integer + description: Reference to value set definition + VOrder: + type: integer + description: Display order + VValue: + type: string + description: The value code + VDesc: + type: string + description: The display description/label + VCategory: + type: string + description: Category code + CreateDate: + type: string + format: date-time + description: Creation timestamp + EndDate: + type: string + format: date-time + nullable: true + description: Soft delete timestamp + VSName: + type: string + description: Value set name (from joined definition) + Location: + type: object + properties: + LocationID: + type: integer + description: Primary key + SiteID: + type: integer + description: Reference to site + LocCode: + type: string + maxLength: 6 + description: Location code (short identifier) + Parent: + type: integer + nullable: true + description: Parent location ID for hierarchical locations + LocFull: + type: string + maxLength: 255 + description: Full location name + Description: + type: string + maxLength: 255 + description: Location description + LocType: + type: string + description: Location type code (e.g., ROOM, WARD, BUILDING) + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + nullable: true + EquipmentList: + type: object + properties: + EID: + type: integer + description: Equipment ID (auto-increment) + IEID: + type: string + maxLength: 50 + description: Internal Equipment ID + DepartmentID: + type: integer + description: Reference to department + InstrumentID: + type: string + maxLength: 150 + description: Instrument identifier + InstrumentName: + type: string + maxLength: 150 + description: Instrument display name + WorkstationID: + type: integer + description: Reference to workstation + Enable: + type: integer + enum: + - 0 + - 1 + description: Equipment status (0=disabled, 1=enabled) + EquipmentRole: + type: string + maxLength: 1 + description: Equipment role code + CreateDate: + type: string + format: date-time + description: Creation timestamp + EndDate: + type: string + format: date-time + nullable: true + description: Deletion timestamp (soft delete) + DepartmentName: + type: string + description: Joined department name + WorkstationName: + type: string + description: Joined workstation name + User: + type: object + properties: + UserID: + type: integer + description: Unique user identifier + Username: + type: string + description: Unique login username + Email: + type: string + format: email + description: User email address + Name: + type: string + description: Full name of the user + Role: + type: string + description: User role (admin, technician, doctor, etc.) + Department: + type: string + description: Department name + IsActive: + type: boolean + description: Whether the user account is active + CreatedAt: + type: string + format: date-time + description: Creation timestamp + UpdatedAt: + type: string + format: date-time + description: Last update timestamp + DelDate: + type: string + format: date-time + nullable: true + description: Soft delete timestamp (null if active) + UserCreate: + type: object + required: + - Username + - Email + properties: + Username: + type: string + minLength: 3 + maxLength: 50 + description: Unique login username + Email: + type: string + format: email + maxLength: 100 + description: User email address + Name: + type: string + description: Full name of the user + Role: + type: string + description: User role + Department: + type: string + description: Department name + IsActive: + type: boolean + default: true + description: Whether the user account is active + UserUpdate: + type: object + required: + - UserID + properties: + UserID: + type: integer + description: User ID to update + Email: + type: string + format: email + description: User email address + Name: + type: string + description: Full name of the user + Role: + type: string + description: User role + Department: + type: string + description: Department name + IsActive: + type: boolean + description: Whether the user account is active + UserListResponse: + type: object + properties: + status: + type: string + example: success + message: + type: string + example: Users retrieved successfully + data: + type: object + properties: + users: + type: array + items: + $ref: '#/components/schemas/User' + pagination: + type: object + properties: + current_page: + type: integer + per_page: + type: integer + total: + type: integer + total_pages: + type: integer + RuleDef: + type: object + properties: + RuleID: + type: integer + RuleCode: + type: string + example: AUTO_SET_RESULT + RuleName: + type: string + example: Automatically Set Result + Description: + type: string + nullable: true + EventCode: + type: string + example: ORDER_CREATED + ConditionExpr: + type: string + nullable: true + description: Raw DSL expression (editable) + example: if(sex('M'); result_set(0.5); result_set(0.6)) + ConditionExprCompiled: + type: string + nullable: true + description: Compiled JSON structure (auto-generated from ConditionExpr) + example: '{"conditionExpr":"patient[\"Sex\"] == \"M\"","valueExpr":"(patient[\"Sex\"] == \"M\") ? 0.5 : 0.6","then":[{"type":"RESULT_SET","value":0.5,"valueExpr":"0.5"}],"else":[{"type":"RESULT_SET","value":0.6,"valueExpr":"0.6"}]}' + CreateDate: + type: string + format: date-time + nullable: true + StartDate: + type: string + format: date-time + nullable: true + EndDate: + type: string + format: date-time + nullable: true + RuleWithDetails: + allOf: + - $ref: '#/components/schemas/RuleDef' + - type: object + properties: + linkedTests: + type: array + items: + type: integer + description: Array of TestSiteIDs this rule is linked to. Rules are active only when attached to tests. + TestRule: + type: object + description: Mapping between a rule and a test site (testrule table). Rules are active when linked via this table. + properties: + TestRuleID: + type: integer + RuleID: + type: integer + TestSiteID: + type: integer + CreateDate: + type: string + format: date-time + nullable: true + EndDate: + type: string + format: date-time + nullable: true + AuditLogEntry: + type: object + properties: + LogPatientID: + type: integer + nullable: true + LogOrderID: + type: integer + nullable: true + LogMasterID: + type: integer + nullable: true + LogSystemID: + type: integer + nullable: true + TblName: + type: string + RecID: + type: string + FldName: + type: string + nullable: true + FldValuePrev: + type: string + nullable: true + FldValueNew: + type: string + nullable: true + UserID: + type: string + SiteID: + type: string + DIDType: + type: string + nullable: true + DID: + type: string + nullable: true + MachineID: + type: string + nullable: true + SessionID: + type: string + AppID: + type: string + ProcessID: + type: string + nullable: true + WebPageID: + type: string + nullable: true + EventID: + type: string + ActivityID: + type: string + Reason: + type: string + nullable: true + LogDate: + type: string + format: date-time + Context: + type: string + IpAddress: + type: string + nullable: true + AuditLogListResponse: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/AuditLogEntry' + pagination: + type: object + properties: + page: + type: integer + perPage: + type: integer + total: + type: integer + required: + - page + - perPage + - total + required: + - data + - pagination + AuditLogsEnvelope: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/AuditLogListResponse' + required: + - status + - message + - data + AuditLogsErrorResponse: + type: object + properties: + status: + type: string + message: + type: string + data: + nullable: true + required: + - status + - message + - data + Contact: + type: object + properties: + ContactID: + type: integer + description: Primary key + NameFirst: + type: string + description: First name (required) + NameLast: + type: string + description: Last name + Title: + type: string + description: Title (e.g., Dr, Mr, Mrs) + Initial: + type: string + description: Middle initial + Birthdate: + type: string + format: date-time + description: Date of birth + EmailAddress1: + type: string + format: email + description: Primary email address + EmailAddress2: + type: string + format: email + description: Secondary email address + Phone: + type: string + description: Primary phone number + MobilePhone1: + type: string + description: Primary mobile number + MobilePhone2: + type: string + description: Secondary mobile number + Specialty: + type: string + description: Medical specialty code + SubSpecialty: + type: string + description: Sub-specialty code + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + description: Occupation display text + ContactDetail: + type: object + properties: + ContactDetID: + type: integer + description: Primary key + ContactID: + type: integer + description: Parent contact ID + SiteID: + type: integer + nullable: true + description: Site identifier + ContactCode: + type: string + nullable: true + description: Contact code at site + ContactEmail: + type: string + nullable: true + description: Contact email address + OccupationID: + type: integer + nullable: true + description: Occupation reference + JobTitle: + type: string + nullable: true + description: Job title + Department: + type: string + nullable: true + description: Department name + ContactStartDate: + type: string + format: date-time + ContactEndDate: + type: string + format: date-time + nullable: true + ContactDetailOperations: + type: object + properties: + created: + type: array + description: New contact details to create + items: + $ref: '#/components/schemas/ContactDetail' + edited: + type: array + description: Existing contact details to update + items: + allOf: + - $ref: '#/components/schemas/ContactDetail' + - type: object + required: + - ContactDetID + deleted: + type: array + description: Contact detail IDs to soft delete + items: + type: integer + OrderSpecimen: + type: object + properties: + InternalSID: + type: integer + description: Internal specimen ID + SID: + type: string + description: Specimen ID (e.g., 0025030300001-S01) + SiteID: + type: integer + OrderID: + type: integer + description: Reference to internal order ID + ConDefID: + type: integer + description: Container Definition ID + nullable: true + ConCode: + type: string + description: Container code + nullable: true + ConName: + type: string + description: Container name + nullable: true + Qty: + type: integer + description: Quantity + Unit: + type: string + description: Unit of measurement + Status: + type: string + enum: + - PENDING + - COLLECTED + - RECEIVED + - PREPARED + - REJECTED + description: Current specimen status + GenerateBy: + type: string + description: Source that generated this specimen + CreateDate: + type: string + format: date-time + OrderTestItem: + type: object + properties: + ResultID: + type: integer + description: Unique result ID + OrderID: + type: integer + description: Reference to internal order ID + InternalSID: + type: integer + description: Reference to specimen + nullable: true + TestSiteID: + type: integer + description: Test definition site ID + TestSiteCode: + type: string + description: Test code + TestSiteName: + type: string + description: Test name + nullable: true + TestType: + type: string + description: Test type code identifying the test category + enum: + - TEST + - PARAM + - CALC + - GROUP + - TITLE + SID: + type: string + description: Order ID reference + SampleID: + type: string + description: Sample ID (same as OrderID) + SeqScr: + type: integer + nullable: true + description: Sequence number for this test on the screen + SeqRpt: + type: integer + nullable: true + description: Sequence number for this test in reports + Result: + type: string + description: Test result value + nullable: true + Discipline: + type: object + description: Discipline metadata used for ordering tests + properties: + DisciplineID: + type: integer + nullable: true + DisciplineCode: + type: string + nullable: true + DisciplineName: + type: string + nullable: true + SeqScr: + type: integer + nullable: true + description: Discipline sequence on the screen + SeqRpt: + type: integer + nullable: true + description: Discipline sequence in reports + ResultDateTime: + type: string + format: date-time + description: Result timestamp + CreateDate: + type: string + format: date-time + PatientPatch: + type: object + description: | + Partial patient update payload. + Omitted fields are left unchanged. Send null explicitly to clear nullable fields. + properties: + PatientID: + type: string + maxLength: 30 + pattern: ^[A-Za-z0-9]+$ + description: Internal patient identifier + AlternatePID: + type: string + maxLength: 30 + pattern: ^[A-Za-z0-9]+$ + Prefix: + type: string + maxLength: 10 + enum: + - Mr + - Mrs + - Ms + - Dr + - Prof + Sex: + type: string + enum: + - '1' + - '2' + description: '1: Female, 2: Male' + NameFirst: + type: string + minLength: 1 + maxLength: 60 + pattern: ^[A-Za-z'\. ]+$ + NameMiddle: + type: string + minLength: 1 + maxLength: 60 + NameMaiden: + type: string + minLength: 1 + maxLength: 60 + NameLast: + type: string + minLength: 1 + maxLength: 60 + Suffix: + type: string + maxLength: 10 + Birthdate: + type: string + format: date-time + description: ISO 8601 UTC datetime + PlaceOfBirth: + type: string + maxLength: 100 + Citizenship: + type: string + maxLength: 100 + Street_1: + type: string + maxLength: 255 + Street_2: + type: string + maxLength: 255 + Street_3: + type: string + maxLength: 255 + ZIP: + type: string + maxLength: 10 + pattern: ^[0-9]+$ + Phone: + type: string + pattern: ^\+?[0-9]{8,15}$ + MobilePhone: + type: string + pattern: ^\+?[0-9]{8,15}$ + EmailAddress1: + type: string + format: email + maxLength: 100 + EmailAddress2: + type: string + format: email + maxLength: 100 + PatIdt: + allOf: + - $ref: '#/components/schemas/PatientIdentifier' + nullable: true + LinkTo: + type: array + description: Array of linked patient references + items: + $ref: '#/components/schemas/LinkedPatient' + Custodian: + allOf: + - $ref: '#/components/schemas/Custodian' + nullable: true + isDead: + type: string + enum: + - '0' + - '1' + description: '0: No (alive), 1: Yes (deceased)' + TimeOfDeath: + type: string + format: date-time + description: ISO 8601 UTC datetime of death + PatCom: + type: string + description: Patient comment/notes + nullable: true + PatAtt: + type: array + description: Patient address entries + nullable: true + items: + $ref: '#/components/schemas/PatAttEntry' + Province: + type: integer + description: Province AreaGeoID (foreign key to areageo table) + City: + type: integer + description: City AreaGeoID (foreign key to areageo table) + Country: + type: string + maxLength: 10 + description: Country ISO 3-letter code (e.g., IDN, USA) + Race: + type: string + maxLength: 100 + MaritalStatus: + type: string + enum: + - A + - B + - D + - M + - S + - W + description: 'A: Annulled, B: Separated, D: Divorced, M: Married, S: Single, W: Widowed' + Religion: + type: string + maxLength: 100 + Ethnic: + type: string + maxLength: 100 + TestMapDetail: + type: object + properties: + TestMapDetailID: + type: integer + TestMapID: + type: integer + HostTestCode: + type: string + description: Test code in host system + HostTestName: + type: string + description: Test name in host system + ConDefID: + type: integer + description: Container definition ID + ContainerLabel: + type: string + description: Container definition name + ClientTestCode: + type: string + description: Test code in client system + ClientTestName: + type: string + description: Test name in client system + CreateDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + description: Soft delete timestamp + TestDefinitionListItem: + type: object + properties: + TestSiteID: + type: integer + TestSiteCode: + type: string + TestSiteName: + type: string + TestType: + type: string + enum: + - TEST + - PARAM + - CALC + - GROUP + - TITLE + SeqScr: + type: integer + SeqRpt: + type: integer + isVisibleScr: + type: integer + enum: + - 0 + - 1 + isVisibleRpt: + type: integer + enum: + - 0 + - 1 + isCountStat: + type: integer + StartDate: + type: string + format: date-time + EndDate: + type: string + format: date-time + nullable: true + DisciplineID: + type: integer + nullable: true + DepartmentID: + type: integer + nullable: true + DisciplineName: + type: string + nullable: true + DepartmentName: + type: string + nullable: true + ValueSetListItem: + type: object + description: Library/system value set summary (from JSON files) + properties: + value: + type: string + description: The value set key/name + label: + type: string + description: The display name/label + count: + type: integer + description: Number of items in this value set diff --git a/public/paths/orders.yaml b/public/paths/orders.yaml index 74b17ec..5addf5d 100755 --- a/public/paths/orders.yaml +++ b/public/paths/orders.yaml @@ -1,6 +1,6 @@ /api/ordertest: - get: - tags: [Order] + get: + tags: [Order] summary: List orders security: - bearerAuth: [] @@ -18,6 +18,11 @@ schema: type: integer description: Filter by internal patient ID + - name: PVADTID + in: query + schema: + type: integer + description: Filter by patient visit ADT ID - name: OrderStatus in: query schema: @@ -47,8 +52,8 @@ items: $ref: '../components/schemas/orders.yaml#/OrderTestList' - post: - tags: [Order] + post: + tags: [Order] summary: Create order with specimens and tests description: Creates an order with associated specimens and patres records. Tests are grouped by container type to minimize specimen creation. security: @@ -124,8 +129,8 @@ description: Server error - delete: - tags: [Order] + delete: + tags: [Order] summary: Delete order security: - bearerAuth: [] @@ -144,9 +149,9 @@ '200': description: Order deleted -/api/ordertest/status: - post: - tags: [Order] +/api/ordertest/status: + post: + tags: [Order] summary: Update order status security: - bearerAuth: [] @@ -187,9 +192,9 @@ data: $ref: '../components/schemas/orders.yaml#/OrderTest' -/api/ordertest/{id}: - get: - tags: [Order] +/api/ordertest/{id}: + get: + tags: [Order] summary: Get order by ID description: Returns order details with associated specimens and tests security: @@ -201,63 +206,63 @@ schema: type: string description: Order ID (e.g., 0025030300001) - responses: - '200': - description: Order details with specimens and tests - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '../components/schemas/orders.yaml#/OrderTest' - - patch: - tags: [Order] - summary: Update order - security: - - bearerAuth: [] - parameters: - - name: id - in: path - required: true - schema: - type: string - description: Order ID - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - Priority: - type: string - enum: [R, S, U] - OrderStatus: - type: string - enum: [ORD, SCH, ANA, VER, REV, REP] - OrderingProvider: - type: string - DepartmentID: - type: integer - WorkstationID: - type: integer - responses: - '200': - description: Order updated - content: - application/json: - schema: - type: object - properties: - status: - type: string - message: - type: string - data: - $ref: '../components/schemas/orders.yaml#/OrderTest' + responses: + '200': + description: Order details with specimens and tests + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '../components/schemas/orders.yaml#/OrderTest' + + patch: + tags: [Order] + summary: Update order + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + description: Order ID + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + Priority: + type: string + enum: [R, S, U] + OrderStatus: + type: string + enum: [ORD, SCH, ANA, VER, REV, REP] + OrderingProvider: + type: string + DepartmentID: + type: integer + WorkstationID: + type: integer + responses: + '200': + description: Order updated + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '../components/schemas/orders.yaml#/OrderTest'