refactor: Remove SpecimenType field from tests management

- Update API documentation to remove SpecimenType from examples

- Remove SpecimenType from tests API client

- Remove specimen type dropdown and handling from tests page
This commit is contained in:
mahdahar 2026-02-16 07:03:25 +07:00
parent f7a884577f
commit f917a0f018
3 changed files with 86 additions and 131 deletions

View File

@ -657,9 +657,11 @@ components:
TITLE: Section header
DisciplineID:
type: integer
DisciplineName:
type: string
DepartmentID:
type: integer
SpecimenType:
DepartmentName:
type: string
Unit:
type: string
@ -736,28 +738,7 @@ components:
Flag:
type: string
examples:
TEST_simple:
summary: Technical test - no reference range
value:
id: 1
TestCode: GLU
TestName: Glucose
TestType: TEST
DisciplineID: 1
DepartmentID: 1
SpecimenType: SER
Unit: mg/dL
TEST_numeric_nmrc:
summary: Technical test - numeric reference (NMRC)
value:
id: 1
TestCode: GLU
TestName: Glucose
TestType: TEST
DisciplineID: 1
DepartmentID: 1
SpecimenType: SER
Unit: mg/dL
$1 Unit: mg/dL
refnum:
- RefNumID: 1
NumRefType: NMRC
@ -767,9 +748,9 @@ components:
Sex: '2'
SexLabel: Male
LowSign: GE
LowSignLabel: '>=
LowSignLabel: ">="
HighSign: LE
HighSignLabel: '<='
HighSignLabel: "<="
Low: 70
High: 100
AgeStart: 18
@ -785,7 +766,6 @@ components:
TestType: TEST
DisciplineID: 1
DepartmentID: 1
SpecimenType: SER
Unit: mg/dL
refnum:
- RefNumID: 2
@ -796,23 +776,13 @@ components:
Sex: '1'
SexLabel: Female
LowSign: LT
LowSignLabel: '<'
LowSignLabel: "<"
High: 40
AgeStart: 0
AgeEnd: 120
Flag: L
Interpretation: Critical Low
TEST_text_text:
summary: Technical test - text reference (TEXT)
value:
id: 1
TestCode: RBC_MORPH
TestName: RBC Morphology
TestType: TEST
DisciplineID: 1
DepartmentID: 1
SpecimenType: BLD
Unit: null
$1 Unit: null
reftxt:
- RefTxtID: 1
TxtRefType: TEXT
@ -832,7 +802,6 @@ components:
TestType: TEST
DisciplineID: 1
DepartmentID: 1
SpecimenType: null
Unit: null
reftxt:
- RefTxtID: 2
@ -853,19 +822,8 @@ components:
TestType: PARAM
DisciplineID: 1
DepartmentID: 1
SpecimenType: SER
Unit: mg/dL
CALC_numeric_nmrc:
summary: Calculated test - numeric reference (NMRC)
value:
id: 3
TestCode: BUN_CR_RATIO
TestName: BUN/Creatinine Ratio
TestType: CALC
DisciplineID: 1
DepartmentID: 1
SpecimenType: SER
Unit: null
$1 Unit: null
Formula: "BUN / Creatinine"
refnum:
- RefNumID: 5
@ -876,26 +834,16 @@ components:
Sex: '1'
SexLabel: Female
LowSign: GE
LowSignLabel: '>=
LowSignLabel: ">="
HighSign: LE
HighSignLabel: '<='
HighSignLabel: "<="
Low: 10
High: 20
AgeStart: 18
AgeEnd: 120
Flag: N
Interpretation: Normal
CALC_numeric_thold:
summary: Calculated test - threshold reference (THOLD)
value:
id: 3
TestCode: BUN_CR_RATIO
TestName: BUN/Creatinine Ratio
TestType: CALC
DisciplineID: 1
DepartmentID: 1
SpecimenType: SER
Unit: null
$1 Unit: null
Formula: "BUN / Creatinine"
refnum:
- RefNumID: 6
@ -906,7 +854,7 @@ components:
Sex: '1'
SexLabel: Female
LowSign: GT
LowSignLabel: '>'
LowSignLabel: ">"
Low: 20
AgeStart: 18
AgeEnd: 120
@ -922,7 +870,6 @@ components:
TestType: GROUP
DisciplineID: 1
DepartmentID: 1
SpecimenType: SER
Unit: null
TITLE:
summary: Section header - no reference range allowed
@ -933,7 +880,6 @@ components:
TestType: TITLE
DisciplineID: 1
DepartmentID: 1
SpecimenType: null
Unit: null
TestMap:
@ -1952,6 +1898,68 @@ paths:
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]
@ -2026,8 +2034,6 @@ paths:
EndDate:
type: string
format: date-time
$1
delete:
tags: [Patient Visits]
summary: Delete ADT visit (soft delete)
@ -2122,7 +2128,7 @@ $1
type: string
format: date-time
$2/account/{id}:
/api/organization/account/{id}:
get:
tags: [Organization]
summary: Get account by ID
@ -2137,6 +2143,10 @@ $2/account/{id}:
responses:
'200':
description: Account details
content:
application/json:
schema:
$ref: '#/components/schemas/Account'
# ========================================
# Organization - Site Routes

View File

@ -21,7 +21,6 @@ export async function createTest(data) {
VisibleScr: data.VisibleScr ? '1' : '0',
VisibleRpt: data.VisibleRpt ? '1' : '0',
// Type-specific fields
SpecimenType: data.SpecimenType,
Unit: data.Unit,
Formula: data.Formula,
// Reference ranges (only for TEST and CALC)
@ -44,7 +43,6 @@ export async function updateTest(data) {
VisibleScr: data.VisibleScr ? '1' : '0',
VisibleRpt: data.VisibleRpt ? '1' : '0',
// Type-specific fields
SpecimenType: data.SpecimenType,
Unit: data.Unit,
Formula: data.Formula,
// Reference ranges (only for TEST and CALC)

View File

@ -2,7 +2,6 @@
import { onMount } from 'svelte';
import { fetchTests, createTest, updateTest, deleteTest } from '$lib/api/tests.js';
import { fetchDisciplines, fetchDepartments } from '$lib/api/organization.js';
import { fetchSpecimenTypes } from '$lib/api/specimens.js';
import { success as toastSuccess, error as toastError } from '$lib/utils/toast.js';
import DataTable from '$lib/components/DataTable.svelte';
import Modal from '$lib/components/Modal.svelte';
@ -14,7 +13,6 @@
let tests = $state([]);
let disciplines = $state([]);
let departments = $state([]);
let specimenTypes = $state([]);
let modalOpen = $state(false);
let modalMode = $state('create');
let saving = $state(false);
@ -38,7 +36,6 @@
VisibleScr: true,
VisibleRpt: true,
// Type-specific fields
SpecimenType: '',
Unit: '',
Formula: '',
// Reference ranges
@ -96,10 +93,6 @@
formData.TestType === 'TEST' || formData.TestType === 'CALC'
);
const canHaveSpecimen = $derived(
formData.TestType === 'TEST' || formData.TestType === 'PARAM'
);
const canHaveFormula = $derived(
formData.TestType === 'CALC'
);
@ -112,7 +105,6 @@
{ key: 'TestSiteCode', label: 'Code', class: 'font-medium' },
{ key: 'TestSiteName', label: 'Name' },
{ key: 'TestType', label: 'Type', class: 'w-32' },
{ key: 'SpecimenType', label: 'Specimen', class: 'w-32' },
{ key: 'Unit', label: 'Unit', class: 'w-24' },
{ key: 'DisciplineName', label: 'Discipline' },
{ key: 'DepartmentName', label: 'Department' },
@ -123,8 +115,7 @@
await Promise.all([
loadTests(),
loadDisciplines(),
loadDepartments(),
loadSpecimenTypes()
loadDepartments()
]);
});
@ -176,15 +167,6 @@
}
}
async function loadSpecimenTypes() {
try {
const response = await fetchSpecimenTypes();
specimenTypes = Array.isArray(response.data) ? response.data : [];
} catch (err) {
specimenTypes = [];
}
}
function openCreateModal() {
modalMode = 'create';
activeTab = 'basic';
@ -199,7 +181,6 @@
SeqRpt: '0',
VisibleScr: true,
VisibleRpt: true,
SpecimenType: '',
Unit: '',
Formula: '',
refnum: [],
@ -232,7 +213,6 @@
SeqRpt: row.SeqRpt || '0',
VisibleScr: row.VisibleScr === '1' || row.VisibleScr === 1 || row.VisibleScr === true,
VisibleRpt: row.VisibleRpt === '1' || row.VisibleRpt === 1 || row.VisibleRpt === true,
SpecimenType: row.SpecimenType || '',
Unit: row.Unit || '',
Formula: row.Formula || '',
refnum: row.refnum || [],
@ -364,9 +344,6 @@
const payload = { ...formData };
// Remove fields not applicable to this type
if (!canHaveSpecimen) {
delete payload.SpecimenType;
}
if (!canHaveUnit) {
delete payload.Unit;
}
@ -447,12 +424,6 @@
filteredDepartments.map(d => ({ value: d.DepartmentID, label: d.DepartmentName }))
);
const specimenTypeOptions = $derived(
specimenTypes.map(s => ({
value: s.SpecimenCode || s.SpecimenType,
label: s.SpecimenName || s.SpecimenType
}))
);
</script>
<div class="p-6">
@ -649,31 +620,7 @@
</div>
<!-- Type-specific fields -->
{#if canHaveSpecimen}
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<SelectDropdown
label="Specimen Type"
name="specimenType"
bind:value={formData.SpecimenType}
options={specimenTypeOptions}
placeholder="Select specimen type..."
/>
{#if canHaveUnit}
<div class="form-control">
<label class="label" for="unit">
<span class="label-text font-medium">Unit</span>
</label>
<input
id="unit"
type="text"
class="input input-bordered w-full"
bind:value={formData.Unit}
placeholder="e.g., mg/dL"
/>
</div>
{/if}
</div>
{:else if canHaveUnit}
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
{#if canHaveFormula}
<div class="form-control">