clqms-be/public/api-docs.bundled.yaml

7526 lines
206 KiB
YAML
Raw Normal View History

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: Patients
description: Patient registration and management
- name: Patient Visits
description: Patient visit/encounter management
- name: Organization
description: Organization structure (accounts, sites, disciplines, departments, workstations)
- name: Specimen
description: Specimen and container management
- name: Tests
description: Test definitions and test catalog
- name: Calculations
description: Lightweight calculator endpoint for retrieving computed values by code or name
- name: Orders
description: Laboratory order management
- name: Results
description: Patient results reporting with auto-validation
- name: Reports
description: Lab report generation (HTML view)
- name: Edge API
description: Instrument integration endpoints
- name: Contacts
description: Contact management (doctors, practitioners, etc.)
- name: Locations
description: Location management (rooms, wards, buildings)
- name: ValueSets
description: Value set definitions and items
- name: Demo
description: Demo/test endpoints (no authentication)
- name: EquipmentList
description: Laboratory equipment and instrument management
- name: Users
description: User management and administration
- name: Rules
description: Rule engine - rules can be linked to multiple tests via testrule mapping table
paths:
/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/{codeOrName}:
post:
tags:
- Calculations
summary: Evaluate a configured calculation by test code or name and return the numeric result only.
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/contact:
get:
tags:
- Contacts
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:
- Contacts
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'
patch:
tags:
- Contacts
summary: Update contact
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- ContactID
- NameFirst
properties:
ContactID:
type: integer
description: Contact ID to update
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 updated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/SuccessResponse'
'422':
description: Validation error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
delete:
tags:
- Contacts
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:
- Contacts
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'
/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/results:
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/orders:
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/orders/{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:
- EquipmentList
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:
- EquipmentList
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
patch:
tags:
- EquipmentList
summary: Update equipment
description: Update an existing equipment entry
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- EID
properties:
EID:
type: integer
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
delete:
tags:
- EquipmentList
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:
- EquipmentList
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'
/api/location:
get:
tags:
- Locations
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:
- Locations
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'
patch:
tags:
- Locations
summary: Update location
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- LocationID
properties:
LocationID:
type: integer
description: Location ID to update
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'
delete:
tags:
- Locations
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:
- Locations
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'
/api/ordertest:
get:
tags:
- Orders
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:
- Orders
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
patch:
tags:
- Orders
summary: Update order
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- OrderID
properties:
OrderID:
type: string
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'
delete:
tags:
- Orders
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:
- Orders
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:
- Orders
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'
/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'
/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
patch:
tags:
- Organization
summary: Update site
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- id
properties:
id:
type: integer
SiteName:
type: string
SiteCode:
type: string
AccountID:
type: integer
responses:
'200':
description: Site updated
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
/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
patch:
tags:
- Organization
summary: Update discipline
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- id
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
responses:
'200':
description: Discipline updated
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
/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
patch:
tags:
- Organization
summary: Update department
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- id
properties:
id:
type: integer
DeptName:
type: string
DeptCode:
type: string
SiteID:
type: integer
responses:
'200':
description: Department updated
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
/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
patch:
tags:
- Organization
summary: Update workstation
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- id
properties:
id:
type: integer
WorkstationName:
type: string
WorkstationCode:
type: string
SiteID:
type: integer
DepartmentID:
type: integer
responses:
'200':
description: Workstation updated
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
/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
patch:
tags:
- Organization
summary: Update host application
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- HostAppID
properties:
HostAppID:
type: string
HostAppName:
type: string
SiteID:
type: integer
responses:
'200':
description: Host application updated
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'
/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
patch:
tags:
- Organization
summary: Update host communication parameters
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- HostAppID
properties:
HostAppID:
type: string
HostIP:
type: string
HostPort:
type: string
HostPwd:
type: string
responses:
'200':
description: Host communication parameters updated
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'
/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
patch:
tags:
- Organization
summary: Update coding system
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- CodingSysID
properties:
CodingSysID:
type: integer
CodingSysAbb:
type: string
FullText:
type: string
Description:
type: string
responses:
'200':
description: Coding system updated
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'
/api/patvisit:
get:
tags:
- Patient Visits
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 Visits
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
patch:
tags:
- Patient Visits
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: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- InternalPVID
properties:
InternalPVID:
type: integer
description: Visit ID (required)
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
delete:
tags:
- Patient Visits
summary: Delete patient visit
security:
- bearerAuth: []
responses:
'200':
description: Visit deleted successfully
/api/patvisit/{id}:
get:
tags:
- Patient Visits
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'
/api/patvisit/patient/{patientId}:
get:
tags:
- Patient Visits
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 Visits
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'
patch:
tags:
- Patient Visits
summary: Update ADT record
description: Update an existing ADT record
security:
- bearerAuth: []
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'
delete:
tags:
- Patient Visits
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 Visits
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
delete:
tags:
- Patient Visits
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/{id}:
get:
tags:
- Patient Visits
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
/api/patient:
get:
tags:
- Patients
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:
- Patients
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'
patch:
tags:
- Patients
summary: Update patient
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Patient'
responses:
'200':
description: Patient updated successfully
delete:
tags:
- Patients
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:
- Patients
summary: Check if patient exists
security:
- bearerAuth: []
parameters:
- name: PatientID
in: query
schema:
type: string
description: Patient ID to check
- name: EmailAddress1
in: query
schema:
type: string
format: email
description: Email address 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:
- Patients
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'
/api/reports/{orderID}:
get:
tags:
- Reports
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/results:
get:
tags:
- Results
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/results/{id}:
get:
tags:
- Results
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:
- Results
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:
- Results
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/rules:
get:
tags:
- Rules
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:
- Rules
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/rules/compile
required:
- RuleCode
- RuleName
- EventCode
- TestSiteIDs
responses:
'201':
description: Rule created
/api/rules/{id}:
get:
tags:
- Rules
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:
- Rules
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:
- Rules
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/rules/validate:
post:
tags:
- Rules
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/rules/compile:
post:
tags:
- Rules
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
patch:
tags:
- Specimen
summary: Update specimen
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Specimen'
responses:
'200':
description: Specimen updated
/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
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
patch:
tags:
- Specimen
summary: Update container definition
security:
- bearerAuth: []
responses:
'200':
description: Container definition updated
/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
/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
patch:
tags:
- Specimen
summary: Update container definition (alias)
security:
- bearerAuth: []
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
patch:
tags:
- Specimen
summary: Update specimen preparation
security:
- bearerAuth: []
responses:
'200':
description: Specimen preparation updated
/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
/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
patch:
tags:
- Specimen
summary: Update specimen status
security:
- bearerAuth: []
responses:
'200':
description: Specimen status updated
/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
/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
patch:
tags:
- Specimen
summary: Update specimen collection method
security:
- bearerAuth: []
responses:
'200':
description: Collection method updated
/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
/api/test/testmap:
get:
tags:
- Tests
summary: List all test mappings
security:
- bearerAuth: []
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:
- Tests
summary: Create test mapping (header only)
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
TestCode:
type: string
description: Test Code (required) - maps to HostTestCode or ClientTestCode
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
items:
type: object
properties:
HostTestCode:
type: string
HostTestName:
type: string
ConDefID:
type: integer
ClientTestCode:
type: string
ClientTestName:
type: string
required:
- TestCode
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
patch:
tags:
- Tests
summary: Update test mapping
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
TestMapID:
type: integer
description: Test Map ID (required)
TestCode:
type: string
description: Test Code - maps to HostTestCode or ClientTestCode
HostType:
type: string
HostID:
type: string
ClientType:
type: string
ClientID:
type: string
required:
- TestMapID
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
delete:
tags:
- Tests
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:
- Tests
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
/api/test/testmap/by-testcode/{testCode}:
get:
tags:
- Tests
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:
- Tests
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:
- Tests
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
patch:
tags:
- Tests
summary: Update test mapping detail
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
TestMapDetailID:
type: integer
description: Test Map Detail ID (required)
TestMapID:
type: integer
HostTestCode:
type: string
HostTestName:
type: string
ConDefID:
type: integer
ClientTestCode:
type: string
ClientTestName:
type: string
required:
- TestMapDetailID
responses:
'200':
description: Test mapping detail updated
delete:
tags:
- Tests
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:
- Tests
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'
/api/test/testmap/detail/by-testmap/{testMapID}:
get:
tags:
- Tests
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:
- Tests
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:
- Tests
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:
- Tests
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:
- Tests
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: VisibleScr
in: query
schema:
type: integer
enum:
- 0
- 1
description: Filter by screen visibility (0=hidden, 1=visible)
- name: VisibleRpt
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
data:
type: array
items:
$ref: '#/components/schemas/TestDefinition'
pagination:
type: object
properties:
total:
type: integer
description: Total number of records matching the query
post:
tags:
- Tests
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
VisibleScr:
type: integer
VisibleRpt:
type: integer
CountStat:
type: integer
details:
type: object
description: |
Type-specific details. For CALC and GROUP types, include members array.
**Important**: Members must use `TestSiteID` (the actual test ID), NOT `Member` or `SeqScr`.
Invalid TestSiteIDs will result in a 400 error.
properties:
DisciplineID:
type: integer
DepartmentID:
type: integer
ResultType:
type: string
enum:
- NMRIC
- RANGE
- TEXT
- VSET
- NORES
RefType:
type: string
enum:
- RANGE
- THOLD
- VSET
- TEXT
- NOREF
FormulaCode:
type: string
description: Formula expression for CALC type (e.g., "{TBIL} - {DBIL}")
Unit1:
type: string
Factor:
type: number
Unit2:
type: string
Decimal:
type: integer
default: 2
Method:
type: string
ExpectedTAT:
type: integer
members:
type: array
description: |
Array of member tests for CALC and GROUP types.
Each member object must contain `TestSiteID` (the actual test ID).
Do NOT use `Member` or `SeqScr` - these will be rejected with validation error.
items:
type: object
properties:
TestSiteID:
type: integer
description: The actual TestSiteID of the member test (required)
required:
- TestSiteID
refnum:
type: array
items:
type: object
reftxt:
type: array
items:
type: object
testmap:
type: array
items:
type: object
required:
- SiteID
- TestSiteCode
- TestSiteName
- TestType
examples:
CALC_test:
summary: Create calculated test with members
value:
SiteID: 1
TestSiteCode: IBIL
TestSiteName: Indirect Bilirubin
TestType: CALC
Description: Bilirubin Indirek
SeqScr: 210
SeqRpt: 210
VisibleScr: 1
VisibleRpt: 1
CountStat: 0
details:
DisciplineID: 2
DepartmentID: 2
FormulaCode: '{TBIL} - {DBIL}'
RefType: RANGE
Unit1: mg/dL
Decimal: 2
members:
- TestSiteID: 22
- TestSiteID: 23
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.'
patch:
tags:
- Tests
summary: Update test definition
security:
- bearerAuth: []
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
VisibleScr:
type: integer
VisibleRpt:
type: integer
CountStat:
type: integer
details:
type: object
description: |
Type-specific details. For CALC and GROUP types, include members array.
**Important**: Members must use `TestSiteID` (the actual test ID), NOT `Member` or `SeqScr`.
Invalid TestSiteIDs will result in a 400 error.
properties:
DisciplineID:
type: integer
DepartmentID:
type: integer
ResultType:
type: string
enum:
- NMRIC
- RANGE
- TEXT
- VSET
- NORES
RefType:
type: string
enum:
- RANGE
- THOLD
- VSET
- TEXT
- NOREF
FormulaCode:
type: string
description: Formula expression for CALC type (e.g., "{TBIL} - {DBIL}")
Unit1:
type: string
Factor:
type: number
Unit2:
type: string
Decimal:
type: integer
default: 2
Method:
type: string
ExpectedTAT:
type: integer
members:
type: array
description: |
Array of member tests for CALC and GROUP types.
Each member object must contain `TestSiteID` (the actual test ID).
Do NOT use `Member` or `SeqScr` - these will be rejected with validation error.
items:
type: object
properties:
TestSiteID:
type: integer
description: The actual TestSiteID of the member test (required)
required:
- TestSiteID
refnum:
type: array
items:
type: object
reftxt:
type: array
items:
type: object
testmap:
type: array
items:
type: object
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.'
/api/test/{id}:
get:
tags:
- Tests
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
delete:
tags:
- Tests
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/users:
get:
tags:
- Users
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:
- Users
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
patch:
tags:
- Users
summary: Update existing user
security:
- bearerAuth: []
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
/api/users/{id}:
get:
tags:
- Users
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
delete:
tags:
- Users
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:
- ValueSets
summary: List lib value sets
2026-02-23 13:16:06 +07:00
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
2026-02-23 13:16:06 +07:00
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:
2026-02-23 13:16:06 +07:00
type: array
items:
$ref: '#/components/schemas/ValueSetListItem'
example:
2026-02-23 13:16:06 +07:00
- 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:
- ValueSets
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:
- ValueSets
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:
- ValueSets
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:
- ValueSets
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:
- ValueSets
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:
- ValueSets
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:
- ValueSets
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:
- ValueSets
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:
- ValueSets
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:
- ValueSets
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:
- ValueSets
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:
- ValueSets
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'
DeathIndicator:
type: string
enum:
- 'Y'
- 'N'
description: 'Y: Yes (deceased), N: No (alive)'
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
VisibleScr:
type: integer
default: 1
description: Screen visibility (0=hidden, 1=visible)
VisibleRpt:
type: integer
default: 1
description: Report visibility (0=hidden, 1=visible)
CountStat:
type: integer
default: 1
Level:
type: integer
Requestable:
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: array
description: |
Group members (for GROUP and CALC types).
When creating or updating, provide members in details.members array with TestSiteID field.
Do NOT use Member or SeqScr 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 details.members array 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: Test mappings
items:
$ref: '#/components/schemas/TestMap'
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
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
AgeEnd:
type: integer
Flag:
type: string
Interpretation:
type: string
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
AgeEnd:
type: integer
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
VisibleScr: 1
VisibleRpt: 1
CountStat: 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: 18
AgeEnd: 99
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
VisibleScr: 1
VisibleRpt: 1
CountStat: 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: 120
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
VisibleScr: 1
VisibleRpt: 1
CountStat: 1
reftxt:
- RefTxtID: 1
TxtRefType: TEXT
TxtRefTypeLabel: Text
Sex: '2'
SexLabel: Male
AgeStart: 18
AgeEnd: 99
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
VisibleScr: 1
VisibleRpt: 0
CountStat: 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
VisibleScr: 1
VisibleRpt: 1
CountStat: 0
testdefcal:
- TestCalID: 1
DisciplineID: 2
DepartmentID: 2
FormulaCode: CKD_EPI(CREA,AGE,GENDER)
Unit1: mL/min/1.73m2
Decimal: 0
testdefgrp:
- 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: 18
AgeEnd: 120
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
VisibleScr: 1
VisibleRpt: 1
CountStat: 1
testdefgrp:
- 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
VisibleScr: 1
VisibleRpt: 1
CountStat: 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
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
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
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
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
2026-02-23 13:16:06 +07:00
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