From 1af4adddf78ee9d8ef436074aa6cbf9d02631dd3 Mon Sep 17 00:00:00 2001 From: mahdahar <89adham@gmail.com> Date: Thu, 19 Feb 2026 16:30:41 +0700 Subject: [PATCH] feat: Update test modal UX and improve DataTable/Modal components --- docs/api-docs.bundled.yaml | 4866 +++++++++++++++++ src/lib/components/DataTable.svelte | 4 +- src/lib/components/Modal.svelte | 2 +- src/routes/(app)/master-data/+page.svelte | 4 +- .../(app)/master-data/contacts/+page.svelte | 22 +- .../(app)/master-data/containers/+page.svelte | 36 +- .../(app)/master-data/counters/+page.svelte | 34 +- .../(app)/master-data/geography/+page.svelte | 10 +- .../(app)/master-data/locations/+page.svelte | 30 +- .../master-data/occupations/+page.svelte | 32 +- .../master-data/specialties/+page.svelte | 22 +- .../(app)/master-data/tests/+page.svelte | 159 +- .../(app)/master-data/tests/TestModal.svelte | 3 +- .../(app)/master-data/tests/referenceRange.js | 50 +- .../tests/test-modal/BasicInfoForm.svelte | 54 +- .../tests/test-modal/GroupMembersTab.svelte | 2 +- .../tests/test-modal/NumericRefRange.svelte | 427 +- .../test-modal/ReferenceRangeSection.svelte | 246 +- .../test-modal/TechnicalConfigForm.svelte | 146 +- .../tests/test-modal/ValueSetRefRange.svelte | 2 +- .../(app)/master-data/valuesets/+page.svelte | 6 +- 21 files changed, 5454 insertions(+), 703 deletions(-) create mode 100644 docs/api-docs.bundled.yaml diff --git a/docs/api-docs.bundled.yaml b/docs/api-docs.bundled.yaml new file mode 100644 index 0000000..69f3bfe --- /dev/null +++ b/docs/api-docs.bundled.yaml @@ -0,0 +1,4866 @@ +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) +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/location: + get: + tags: + - Locations + summary: List locations + security: + - bearerAuth: [] + parameters: + - name: LocCode + in: query + schema: + type: string + description: Filter by location code + - name: LocName + in: query + schema: + type: string + description: Filter by location name (searches in LocFull) + responses: + '200': + description: List of locations + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + type: array + items: + $ref: '#/components/schemas/Location' + post: + tags: + - Locations + summary: Create location + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - LocCode + - LocFull + properties: + SiteID: + type: integer + description: Reference to site + LocCode: + type: string + maxLength: 6 + description: Location code (short identifier) + Parent: + type: integer + nullable: true + description: Parent location ID for hierarchical locations + LocFull: + type: string + maxLength: 255 + description: Full location name + Description: + type: string + maxLength: 255 + description: Location description + LocType: + type: string + description: Location type code (e.g., ROOM, WARD, BUILDING) + responses: + '201': + description: Location created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + '422': + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + patch: + tags: + - Locations + summary: Update location + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - LocationID + properties: + LocationID: + type: integer + description: Location ID to update + SiteID: + type: integer + description: Reference to site + LocCode: + type: string + maxLength: 6 + description: Location code (short identifier) + Parent: + type: integer + nullable: true + description: Parent location ID for hierarchical locations + LocFull: + type: string + maxLength: 255 + description: Full location name + Description: + type: string + maxLength: 255 + description: Location description + LocType: + type: string + description: Location type code (e.g., ROOM, WARD, BUILDING) + responses: + '201': + description: Location updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + '422': + description: Validation error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + delete: + tags: + - Locations + summary: Delete location + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - LocationID + properties: + LocationID: + type: integer + description: Location ID to delete + responses: + '200': + description: Location deleted successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessResponse' + /api/location/{id}: + get: + tags: + - Locations + summary: Get location by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + description: Location ID + responses: + '200': + description: Location details + content: + application/json: + schema: + type: object + properties: + status: + type: string + message: + type: string + data: + $ref: '#/components/schemas/Location' + /api/ordertest: + get: + tags: + - Orders + summary: List orders + security: + - bearerAuth: [] + parameters: + - name: page + in: query + schema: + type: integer + - name: perPage + in: query + schema: + type: integer + - name: InternalPID + in: query + schema: + type: integer + description: Filter by internal patient ID + - name: OrderStatus + in: query + schema: + type: string + enum: + - ORD + - SCH + - ANA + - VER + - REV + - REP + description: | + ORD: Ordered + SCH: Scheduled + ANA: Analysis + VER: Verified + REV: Reviewed + REP: Reported + responses: + '200': + description: List of orders + post: + tags: + - Orders + summary: Create order + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - PatientID + - Tests + properties: + PatientID: + type: string + VisitID: + type: string + Priority: + type: string + enum: + - R + - S + - U + description: | + R: Routine + S: Stat + U: Urgent + SiteID: + type: integer + RequestingPhysician: + type: string + Tests: + type: array + items: + type: object + properties: + TestID: + type: integer + SpecimenType: + type: string + responses: + '201': + description: Order created successfully + patch: + tags: + - Orders + summary: Update order + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/OrderTest' + responses: + '200': + description: Order updated + delete: + tags: + - Orders + summary: Delete order + security: + - bearerAuth: [] + 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 + /api/ordertest/{id}: + get: + tags: + - Orders + summary: Get order by ID + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Order details + /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/patvisit: + get: + tags: + - Patient Visits + summary: List patient visits + security: + - bearerAuth: [] + parameters: + - 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/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 + - VSET + RefType: + type: string + enum: + - NMRC + - TEXT + - THOLD + - VSET + 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 + - VSET + RefType: + type: string + enum: + - NMRC + - TEXT + - THOLD + - VSET + 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 object where keys are value set names and values are item counts. + security: + - bearerAuth: [] + parameters: + - name: search + in: query + schema: + type: string + description: Optional search term to filter value set names + 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: object + additionalProperties: + type: integer + description: Number of items in each value set + example: + sex: 3 + marital_status: 6 + order_status: 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 + 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 + 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 + - VSET + description: | + NMRIC: Numeric result + VSET: Value set result + RefType: + type: string + enum: + - NMRC + - TEXT + - THOLD + - VSET + description: | + NMRC: Numeric reference range + TEXT: Text reference + THOLD: Threshold reference + VSET: Value set reference + 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 + 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 + TestSiteID: + type: integer + HostType: + type: string + description: Host type code + HostID: + type: string + description: Host identifier + HostDataSource: + type: string + description: Host data source + HostTestCode: + type: string + description: Test code in host system + HostTestName: + type: string + description: Test name in host system + ClientType: + type: string + description: Client type code + ClientID: + type: string + description: Client identifier + ClientDataSource: + type: string + description: Client data source + ConDefID: + type: integer + description: Connection 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 + OrderTest: + type: object + properties: + OrderID: + type: string + PatientID: + type: string + VisitID: + type: string + OrderDate: + 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 + Priority: + type: string + enum: + - R + - S + - U + description: | + R: Routine + S: Stat + U: Urgent + PriorityLabel: + type: string + description: Priority display text + SiteID: + type: integer + RequestingPhysician: + type: string + 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 + 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 diff --git a/src/lib/components/DataTable.svelte b/src/lib/components/DataTable.svelte index 07dfa29..c1fd255 100644 --- a/src/lib/components/DataTable.svelte +++ b/src/lib/components/DataTable.svelte @@ -68,7 +68,7 @@ {#each columns as column} - + {column.label} {/each} @@ -102,7 +102,7 @@ role={onRowClick ? 'button' : undefined} > {#each columns as column} - + {#if cell} {@render cell({ column, row, value: getValue(row, column.key), index })} {:else if column.render} diff --git a/src/lib/components/Modal.svelte b/src/lib/components/Modal.svelte index 284e9fc..184c9ac 100644 --- a/src/lib/components/Modal.svelte +++ b/src/lib/components/Modal.svelte @@ -83,7 +83,7 @@
{#if title} - + {:else}
{/if} diff --git a/src/routes/(app)/master-data/+page.svelte b/src/routes/(app)/master-data/+page.svelte index bb57f2a..b932ffe 100644 --- a/src/routes/(app)/master-data/+page.svelte +++ b/src/routes/(app)/master-data/+page.svelte @@ -80,8 +80,8 @@
-

Master Data

-

Manage reference data and lookup values used throughout the system

+

Master Data

+

Manage reference data and lookup values used throughout the system

{#each modules as module} diff --git a/src/routes/(app)/master-data/contacts/+page.svelte b/src/routes/(app)/master-data/contacts/+page.svelte index 0e8b06b..c8862d4 100644 --- a/src/routes/(app)/master-data/contacts/+page.svelte +++ b/src/routes/(app)/master-data/contacts/+page.svelte @@ -172,8 +172,8 @@
-

Contacts

-

Manage physicians and contacts

+

Contacts

+

Manage physicians and contacts

@@ -412,7 +412,7 @@
diff --git a/src/routes/(app)/master-data/locations/+page.svelte b/src/routes/(app)/master-data/locations/+page.svelte index d39ed65..c93534c 100644 --- a/src/routes/(app)/master-data/locations/+page.svelte +++ b/src/routes/(app)/master-data/locations/+page.svelte @@ -169,8 +169,8 @@
-

Locations

-

Manage locations and facilities

+

Locations

+

Manage locations and facilities

-

+

{searchQuery.trim() ? 'No occupations match your search' : 'No occupations found'}

-

+

{searchQuery.trim() ? `No occupations found matching "${searchQuery}". Try a different search term or clear the filter.` : 'Get started by adding your first occupation code. These codes are used when registering patients to identify their profession.'} @@ -264,7 +264,7 @@

{#if formErrors.OccCode} - {formErrors.OccCode} + {formErrors.OccCode} {:else} - Short unique code (max 10 characters) + Short unique code (max 10 characters) {/if}
{#if formErrors.OccText} - {formErrors.OccText} + {formErrors.OccText} {:else} - Full name of the occupation + Full name of the occupation {/if}
{#if formErrors.Description} - {formErrors.Description} + {formErrors.Description} {:else} - Optional additional details about this occupation + Optional additional details about this occupation {/if}
diff --git a/src/routes/(app)/master-data/specialties/+page.svelte b/src/routes/(app)/master-data/specialties/+page.svelte index 2ec2023..204bdf5 100644 --- a/src/routes/(app)/master-data/specialties/+page.svelte +++ b/src/routes/(app)/master-data/specialties/+page.svelte @@ -149,8 +149,8 @@
-

Medical Specialties

-

Manage medical specialty codes and their hierarchical relationships

+

Medical Specialties

+

Manage medical specialty codes and their hierarchical relationships

@@ -300,7 +325,7 @@ function openCreateModal(type = 'TEST') {
- e.key === 'Enter' && handleSearch()} /> + e.key === 'Enter' && handleSearch()} />
diff --git a/src/routes/(app)/master-data/tests/TestModal.svelte b/src/routes/(app)/master-data/tests/TestModal.svelte index da051ec..e5ce513 100644 --- a/src/routes/(app)/master-data/tests/TestModal.svelte +++ b/src/routes/(app)/master-data/tests/TestModal.svelte @@ -59,8 +59,7 @@ // Get tab count badge for reference range function getRefRangeCount() { - return (formData.refnum?.length || 0) + (formData.reftxt?.length || 0) + - (formData.refthold?.length || 0) + (formData.refvset?.length || 0); + return (formData.refnum?.length || 0) + (formData.reftxt?.length || 0); } // Get tab count badge for group members diff --git a/src/routes/(app)/master-data/tests/referenceRange.js b/src/routes/(app)/master-data/tests/referenceRange.js index 6b5a961..7937b92 100644 --- a/src/routes/(app)/master-data/tests/referenceRange.js +++ b/src/routes/(app)/master-data/tests/referenceRange.js @@ -14,6 +14,19 @@ export const flagOptions = [ { value: 'C', label: 'C', description: 'Critical' } ]; +export const refTypeOptions = [ + { value: 'REF', label: 'REF', description: 'Reference Range' }, + { value: 'CRTC', label: 'CRTC', description: 'Critical Range' }, + { value: 'VAL', label: 'VAL', description: 'Validation Range' }, + { value: 'RERUN', label: 'RERUN', description: 'Rerun Range' }, + { value: 'THOLD', label: 'THOLD', description: 'Threshold Range' } +]; + +export const textRefTypeOptions = [ + { value: 'TEXT', label: 'TEXT', description: 'Text Reference' }, + { value: 'VSET', label: 'VSET', description: 'Value Set Reference' } +]; + export const sexOptions = [ { value: '2', label: 'Male' }, { value: '1', label: 'Female' }, @@ -22,7 +35,8 @@ export const sexOptions = [ export function createNumRef() { return { - Sex: '2', + RefType: 'REF', + Sex: '0', LowSign: 'GE', HighSign: 'LE', Low: null, @@ -30,7 +44,7 @@ export function createNumRef() { AgeStart: 0, AgeEnd: 120, Flag: 'N', - Interpretation: 'Normal', + Interpretation: '', SpcType: '', Criteria: '' }; @@ -38,7 +52,8 @@ export function createNumRef() { export function createTholdRef() { return { - Sex: '2', + RefType: 'THOLD', + Sex: '0', LowSign: 'GE', HighSign: 'LE', Low: null, @@ -46,7 +61,7 @@ export function createTholdRef() { AgeStart: 0, AgeEnd: 120, Flag: 'N', - Interpretation: 'Normal', + Interpretation: '', SpcType: '', Criteria: '' }; @@ -54,7 +69,8 @@ export function createTholdRef() { export function createTextRef() { return { - Sex: '2', + RefType: 'TEXT', + Sex: '0', AgeStart: 0, AgeEnd: 120, RefTxt: '', @@ -66,7 +82,8 @@ export function createTextRef() { export function createVsetRef() { return { - Sex: '2', + RefType: 'VSET', + Sex: '0', AgeStart: 0, AgeEnd: 120, RefTxt: '', @@ -87,16 +104,8 @@ export function validateNumericRange(ref, index) { return errors; } -export function validateTholdRange(ref, index) { - const errors = []; - if (ref.Low !== null && ref.High !== null && ref.Low > ref.High) { - errors.push(`Range ${index + 1}: Low value cannot be greater than High value`); - } - if (ref.AgeStart !== null && ref.AgeEnd !== null && ref.AgeStart > ref.AgeEnd) { - errors.push(`Range ${index + 1}: Age start cannot be greater than Age end`); - } - return errors; -} +// Alias for threshold validation (same logic) +export const validateTholdRange = validateNumericRange; export function validateTextRange(ref, index) { const errors = []; @@ -106,10 +115,5 @@ export function validateTextRange(ref, index) { return errors; } -export function validateVsetRange(ref, index) { - const errors = []; - if (ref.AgeStart !== null && ref.AgeEnd !== null && ref.AgeStart > ref.AgeEnd) { - errors.push(`Range ${index + 1}: Age start cannot be greater than Age end`); - } - return errors; -} +// Alias for value set validation (same logic) +export const validateVsetRange = validateTextRange; diff --git a/src/routes/(app)/master-data/tests/test-modal/BasicInfoForm.svelte b/src/routes/(app)/master-data/tests/test-modal/BasicInfoForm.svelte index 3ddd1a4..91865db 100644 --- a/src/routes/(app)/master-data/tests/test-modal/BasicInfoForm.svelte +++ b/src/routes/(app)/master-data/tests/test-modal/BasicInfoForm.svelte @@ -21,7 +21,7 @@ } = $props(); const typeLabels = { - TEST: 'Single Test', + TEST: 'Test', PARAM: 'Parameter', CALC: 'Calculated', GROUP: 'Panel' @@ -44,8 +44,8 @@ const typeLabels = {
- -
- - -
-
- Use test codes with operators: +, -, *, / + Use test codes with operators: +, -, *, /
{/if} @@ -134,7 +120,7 @@ const typeLabels = {
- -
+ +
+
+ + +
- Visibility + Visibility
- Statistics + Statistics