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: ORDER_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 example: order["Priority"] == "S" actions: type: array items: type: object properties: ActionType: type: string example: SET_RESULT ActionParams: oneOf: - type: string - type: object required: - RuleCode - RuleName - EventCode - TestSiteIDs responses: '201': description: Rule created /api/rules/{id}: get: tags: - Rules summary: Get rule with actions and linked tests security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer description: RuleID responses: '200': description: Rule details with actions and 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(''F'') ? set_result(0.7) : set_result(1))' 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/rules/{id}/actions: get: tags: - Rules summary: List actions for a rule security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer description: RuleID responses: '200': description: Actions list content: application/json: schema: type: object properties: status: type: string message: type: string data: type: array items: $ref: '#/components/schemas/RuleAction' post: tags: - Rules summary: Create action for a rule security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer description: RuleID requestBody: required: true content: application/json: schema: type: object properties: ActionType: type: string example: SET_RESULT ActionParams: oneOf: - type: string - type: object required: - ActionType responses: '201': description: Action created /api/rules/{id}/actions/{actionId}: patch: tags: - Rules summary: Update action security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer description: RuleID - name: actionId in: path required: true schema: type: integer description: RuleActionID requestBody: required: true content: application/json: schema: type: object properties: ActionType: type: string ActionParams: oneOf: - type: string - type: object responses: '200': description: Action updated delete: tags: - Rules summary: Soft delete action security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer description: RuleID - name: actionId in: path required: true schema: type: integer description: RuleActionID responses: '200': description: Action deleted /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 description: List all library/system value sets from JSON files with item counts. Returns an array of objects with value, label, and count properties. security: - bearerAuth: [] parameters: - name: search in: query schema: type: string description: Optional search term to filter value set names or labels responses: '200': description: List of lib value sets with item counts content: application/json: schema: type: object properties: status: type: string example: success data: type: array items: $ref: '#/components/schemas/ValueSetListItem' example: - value: sex label: Sex count: 3 - value: marital_status label: Marital Status count: 6 - value: order_status label: Order Status count: 6 /api/valueset/{key}: get: tags: - 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(''F'') ? set_result(0.7) : set_result(1))' ConditionExprCompiled: type: string nullable: true description: Compiled JSON structure (auto-generated from ConditionExpr) example: '{"conditionExpr":"order["Sex"] == \"F\"","valueExpr":"(order["Sex"] == \"F\") ? 0.7 : 1","then":{"type":"SET_RESULT","value":0.7,"valueExpr":"0.7"},"else":{"type":"SET_RESULT","value":1,"valueExpr":"1"}}' CreateDate: type: string format: date-time nullable: true StartDate: type: string format: date-time nullable: true EndDate: type: string format: date-time nullable: true RuleAction: type: object properties: RuleActionID: type: integer RuleID: type: integer ActionType: type: string example: SET_RESULT ActionParams: type: string description: JSON string parameters nullable: true example: '{"testSiteID": 1, "value": "Normal"}' CreateDate: type: string format: date-time nullable: true EndDate: type: string format: date-time nullable: true RuleWithDetails: allOf: - $ref: '#/components/schemas/RuleDef' - type: object properties: actions: type: array items: $ref: '#/components/schemas/RuleAction' 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 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