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: Orders description: Laboratory order management - name: Results description: Patient results reporting - 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 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/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 - name: include in: query schema: type: string enum: - details description: Include specimens and tests in response 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/OrderTest' 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 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/results: get: tags: - Results summary: Get patient results description: Retrieve patient test results with optional filters security: - bearerAuth: [] parameters: - name: InternalPID in: query schema: type: integer description: Filter by internal patient ID - name: OrderID in: query schema: type: string description: Filter by order ID - name: TestCode in: query schema: type: string description: Filter by test code - name: date_from in: query schema: type: string format: date description: Filter results from date (YYYY-MM-DD) - name: date_to in: query schema: type: string format: date description: Filter results to date (YYYY-MM-DD) - name: verified_only in: query schema: type: boolean default: false description: Return only verified results responses: '200': description: List of patient results content: application/json: schema: type: object properties: status: type: string data: type: array items: type: object properties: ResultID: type: integer InternalPID: type: integer OrderID: type: string TestID: type: integer TestCode: type: string TestName: type: string ResultValue: type: string Unit: type: string ReferenceRange: type: string AbnormalFlag: type: string Verified: type: boolean VerifiedBy: type: string VerifiedDate: type: string format: date-time ResultDate: type: string format: date-time post: tags: - Results summary: Create or update result description: Create a new result or update an existing result entry security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - InternalPID - TestID - ResultValue properties: InternalPID: type: integer OrderID: type: string TestID: type: integer ResultValue: type: string Unit: type: string AbnormalFlag: type: string enum: - H - L - 'N' - A - C description: H=High, L=Low, N=Normal, A=Abnormal, C=Critical responses: '201': description: Result created successfully content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' /api/results/{id}: get: tags: - Results summary: Get result by ID description: Retrieve a specific result entry by its ID 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 data: type: object properties: ResultID: type: integer InternalPID: type: integer OrderID: type: string TestID: type: integer TestCode: type: string TestName: type: string ResultValue: type: string Unit: type: string ReferenceRange: type: string AbnormalFlag: type: string Verified: type: boolean VerifiedBy: type: string VerifiedDate: type: string format: date-time ResultDate: type: string format: date-time patch: tags: - Results summary: Update result description: Update an existing result entry 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: ResultValue: type: string Unit: type: string AbnormalFlag: type: string enum: - H - L - 'N' - A - C Verified: type: boolean responses: '200': description: Result updated successfully content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' delete: tags: - Results summary: Delete result description: Soft delete a result entry 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' /api/results/{id}/verify: post: tags: - Results summary: Verify result description: Mark a result as verified by the current user security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer description: Result ID responses: '200': description: Result verified successfully content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' /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 /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/tests: 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 refnum: type: array items: type: object reftxt: type: array items: type: object testmap: type: array items: type: object required: - SiteID - TestSiteCode - TestSiteName - TestType 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 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 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 /api/tests/{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/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 AccountID: type: integer Discipline: type: object properties: id: type: integer DisciplineName: type: string DisciplineCode: type: string 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 FormulaInput: type: string description: Input variables for calculated tests 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 (only for GROUP type) items: type: object 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 FormulaInput: CREA,AGE,GENDER FormulaCode: CKD_EPI(CREA,AGE,GENDER) Unit1: mL/min/1.73m2 Decimal: 0 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 Member: 100 TestSiteCode: CHOL TestSiteName: Total Cholesterol - TestGrpID: 2 Member: 101 TestSiteCode: TG TestSiteName: Triglycerides 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 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 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 SID: type: string description: Order ID reference SampleID: type: string description: Sample ID (same as OrderID) Result: type: string description: Test result value nullable: true 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