From 30c0c538d65d569915edce5f1ae0ce3e1e5eaca5 Mon Sep 17 00:00:00 2001 From: mahdahar <89adham@gmail.com> Date: Wed, 18 Feb 2026 11:07:00 +0700 Subject: [PATCH] refactor: Remove redundant ValueSet call and convert global function to private method - TestsController: Remove duplicate rangeTypeOptions assignment that was being set inside the NUM condition block, causing it to be set unnecessarily when it's also handled elsewhere - ResponseTrait: Convert global helper function convert_empty_strings_to_null() to private class method convertEmptyStringsToNull() for better encapsulation and to avoid dependency on global functions - Database schema: Update clqms_database.dbml with accurate table structure derived from app/Models/ directory, reorganizing tables by functional categories (Patient, Visit, Organization, Location, Test, Specimen, Order, Contact management) --- app/Controllers/TestsController.php | 1 - app/Traits/ResponseTrait.php | 34 +- docs/clqms_database.dbml | 1336 +++++++++++---------------- 3 files changed, 594 insertions(+), 777 deletions(-) diff --git a/app/Controllers/TestsController.php b/app/Controllers/TestsController.php index 4ae56d6..1a9bbf2 100644 --- a/app/Controllers/TestsController.php +++ b/app/Controllers/TestsController.php @@ -184,7 +184,6 @@ class TestsController extends BaseController ]; }, $refnumData ?? []); - $row['rangeTypeOptions'] = ValueSet::getOptions('range_type'); } if ($refType === '2' || $refType === 'TEXT' || $refType === '4' || $refType === 'VSET') { diff --git a/app/Traits/ResponseTrait.php b/app/Traits/ResponseTrait.php index ecfe63f..cc7f494 100644 --- a/app/Traits/ResponseTrait.php +++ b/app/Traits/ResponseTrait.php @@ -23,9 +23,41 @@ trait ResponseTrait { // Convert empty strings to null in the data if ($data !== null && (is_array($data) || is_object($data))) { - $data = convert_empty_strings_to_null($data); + $data = $this->convertEmptyStringsToNull($data); } return $this->baseRespond($data, $status, $message); } + + /** + * Recursively convert empty strings to null in arrays or objects + * + * @param mixed $data The data to process (array, object, or scalar) + * @return mixed The processed data with empty strings converted to null + */ + private function convertEmptyStringsToNull($data) + { + if (is_array($data)) { + foreach ($data as $key => $value) { + if (is_array($value)) { + $data[$key] = $this->convertEmptyStringsToNull($value); + } elseif (is_object($value)) { + $data[$key] = $this->convertEmptyStringsToNull($value); + } elseif ($value === '') { + $data[$key] = null; + } + } + } elseif (is_object($data)) { + foreach ($data as $key => $value) { + if (is_array($value)) { + $data->$key = $this->convertEmptyStringsToNull($value); + } elseif (is_object($value)) { + $data->$key = $this->convertEmptyStringsToNull($value); + } elseif ($value === '') { + $data->$key = null; + } + } + } + return $data; + } } diff --git a/docs/clqms_database.dbml b/docs/clqms_database.dbml index e4fe546..edd357c 100644 --- a/docs/clqms_database.dbml +++ b/docs/clqms_database.dbml @@ -1,854 +1,640 @@ // CLQMS Database Schema -// Generated from ERD_EXTRACT.md +// Generated from app/Models/ directory // Database Markup Language (DBML) for dbdiagram.io and other tools // ============================================ -// TABLE 1: Organization Structure +// TABLE 1: Patient Management +// ============================================ + +Table patient { + InternalPID int [pk, increment] + PatientID varchar(255) + AlternatePID varchar(255) + Prefix varchar(50) + NameFirst varchar(255) + NameMiddle varchar(255) + NameMaiden varchar(255) + NameLast varchar(255) + Suffix varchar(50) + NameAlias varchar(255) + Sex varchar(10) + Birthdate datetime + PlaceOfBirth varchar(255) + Street_1 varchar(255) + Street_2 varchar(255) + Street_3 varchar(255) + City varchar(100) + Province varchar(100) + ZIP varchar(20) + Country varchar(100) + EmailAddress1 varchar(255) + EmailAddress2 varchar(255) + Phone varchar(50) + MobilePhone varchar(50) + AccountNumber varchar(100) + Race varchar(50) + MaritalStatus varchar(50) + Religion varchar(50) + Ethnic varchar(50) + Citizenship varchar(100) + DeathIndicator boolean + TimeOfDeath datetime + Custodian int [ref: > patient.InternalPID] + LinkTo int [ref: > patient.InternalPID] + CreateDate datetime [not null] + DelDate datetime +} + +Table patidt { + PatIdtID int [pk, increment] + InternalPID int [not null, ref: > patient.InternalPID] + IdentifierType varchar(100) + Identifier varchar(255) + EffectiveDate datetime + ExpirationDate datetime + CreateDate datetime [not null] + DelDate datetime +} + +Table patcom { + PatComID int [pk, increment] + InternalPID int [not null, ref: > patient.InternalPID] + Comment text + CreateDate datetime [not null] + EndDate datetime +} + +Table patatt { + PatAttID int [pk, increment] + InternalPID int [not null, ref: > patient.InternalPID] + UserID int + Address text + CreateDate datetime [not null] + DelDate datetime +} + +// ============================================ +// TABLE 2: Visit Management +// ============================================ + +Table patvisit { + InternalPVID int [pk, increment] + InternalPID int [not null, ref: > patient.InternalPID] + EpisodeID int + PVID varchar(100) + CreateDate datetime [not null] + EndDate datetime + ArchivedDate datetime + DelDate datetime +} + +Table patvisitadt { + PVADTID int [pk, increment] + InternalPVID int [not null, ref: > patvisit.InternalPVID] + LocationID int [ref: > location.LocationID] + ADTCode varchar(50) + AttDoc varchar(255) + RefDoc varchar(255) + AdmDoc varchar(255) + CnsDoc varchar(255) + CreateDate datetime [not null] + EndDate datetime + ArchivedDate datetime + DelDate datetime +} + +Table patdiag { + InternalPVID int [pk, increment] + InternalPVID int [not null, ref: > patvisit.InternalPVID] + InternalPID int [not null, ref: > patient.InternalPID] + DiagCode varchar(50) + Diagnosis varchar(255) + CreateDate datetime [not null] + EndDate datetime + ArchivedDate datetime + DelDate datetime +} + +// ============================================ +// TABLE 3: Organization Structure // ============================================ Table account { - AccountID int [pk] + AccountID int [pk, increment] AccountName varchar(255) - ParentAccountID int - CreateDate datetime + Initial varchar(50) + Street_1 varchar(255) + Street_2 varchar(255) + Street_3 varchar(255) + City varchar(100) + Province varchar(100) + ZIP varchar(20) + Country varchar(100) + AreaCode varchar(20) + EmailAddress1 varchar(255) + EmailAddress2 varchar(255) + Phone varchar(50) + Fax varchar(50) + Parent int [ref: > account.AccountID] + CreateDate datetime [not null] EndDate datetime } Table site { - SiteID int [pk] - AccountID int + SiteID int [pk, increment] + AccountID int [not null, ref: > account.AccountID] + Parent int [ref: > site.SiteID] + SiteTypeID int + SiteClassID int + SiteCode varchar(50) SiteName varchar(255) - Location varchar(255) - CreateDate datetime - EndDate datetime -} - -Table discipline { - DisciplineID int [pk] - DisciplineName varchar(255) - CreateDate datetime + ME varchar(50) + CreateDate datetime [not null] EndDate datetime } Table department { - DepartmentID int [pk] + DepartmentID int [pk, increment] + DisciplineID int [ref: > discipline.DisciplineID] + SiteID int [ref: > site.SiteID] + DepartmentCode varchar(50) DepartmentName varchar(255) - DisciplineID int - CreateDate datetime + CreateDate datetime [not null] + EndDate datetime +} + +Table discipline { + DisciplineID int [pk, increment] + SiteID int [ref: > site.SiteID] + Parent int [ref: > discipline.DisciplineID] + DisciplineCode varchar(50) + DisciplineName varchar(255) + CreateDate datetime [not null] EndDate datetime } Table workstation { - WorkstationID int [pk] - SiteID int - DepartmentID int + WorkstationID int [pk, increment] + DepartmentID int [ref: > department.DepartmentID] + LinkTo int [ref: > workstation.WorkstationID] + EquipmentID int + WorkstationCode varchar(50) WorkstationName varchar(255) - LocalDB boolean - CreateDate datetime + Type varchar(50) + Enable boolean + CreateDate datetime [not null] EndDate datetime } -Table instrument { - InstrumentID int [pk] - SiteID int - WorkstationID int - InstrumentAlias varchar(255) - InstrumentName varchar(255) - InstrumentType varchar(255) - CreateDate datetime - EndDate datetime -} - -Table personnel { - PersonnelID int [pk] - SiteID int - PersonnelName varchar(255) - Position varchar(255) - CreateDate datetime - EndDate datetime -} - -Table personneldocument { - DocID int [pk] - PersonnelID int - DocType varchar(255) - DocFile blob - ExpiryDate datetime - CreateDate datetime -} - -Table personnelaccess { - AccessID int [pk] - PersonnelID int - Role varchar(255) - Permissions text - CreateDate datetime -} +// ============================================ +// TABLE 4: Location Management +// ============================================ Table location { - LocationID int [pk] - SiteID int - ParentLocationID int - LocationTypeID int - LocationName varchar(255) - CreateDate datetime + LocationID int [pk, increment] + SiteID int [not null, ref: > site.SiteID] + Parent int [ref: > location.LocationID] + LocCode varchar(50) + LocFull varchar(255) + Description text + LocType varchar(50) + CreateDate datetime [not null] EndDate datetime } Table locationaddress { - AddressID int [pk] - LocationID int - AddressLine1 varchar(255) - AddressLine2 varchar(255) - City varchar(100) - PostalCode varchar(20) - CreateDate datetime -} - -Table patient { - PatientID int [pk] - SiteID int - InternalPID int - FirstName varchar(255) - LastName varchar(255) - DateOfBirth datetime - Sex varchar(10) - Race varchar(50) - Ethnicity varchar(50) - Religion varchar(50) - CreateDate datetime - DelDate datetime -} - -Table patientcontact { - ContactID int [pk] - InternalPID int - ContactType varchar(50) - ContactValue varchar(255) - CreateDate datetime -} - -Table patientinsurance { - InsuranceID int [pk] - InternalPID int - InsuranceProvider varchar(255) - PolicyNumber varchar(100) - GroupNumber varchar(100) - EffectiveDate datetime - ExpiryDate datetime - CreateDate datetime -} - -Table patientvisit { - VisitID int [pk] - InternalPID int - SiteID int - VisitClass varchar(50) - VisitType varchar(50) - VisitDate datetime - DischargeDate datetime - CreateDate datetime -} - -Table admission { - AdmissionID int [pk] - VisitID int - PatientID int - SiteID int - AdmissionDate datetime - DischargeDate datetime - ADTCode varchar(50) - ReferringParty varchar(255) - BillingAccount varchar(255) - AttendingDoctor varchar(255) - ReferringDoctor varchar(255) - VitalSigns text - CreateDate datetime -} - -Table admissionlocation { - ID int [pk] - AdmissionID int - LocationID int - TransferDate datetime - CreateDate datetime -} - -Table testorder { - OrderID varchar(13) [pk] - SiteID int - PatientID int - VisitID int - OrderDate datetime - Urgency varchar(50) - Status varchar(50) - OrderingProvider varchar(255) - ProductionSiteID int - CreateDate datetime + LocationID int [pk, ref: > location.LocationID] + Province int [ref: > areageo.AreaGeoID] + City int [ref: > areageo.AreaGeoID] + Street1 varchar(255) + Street2 varchar(255) + PostCode varchar(20) + GeoLocationSystem varchar(50) + GeoLocationData text + Phone varchar(50) + Email varchar(255) + CreateDate datetime [not null] EndDate datetime } -Table testorderdetail { - OrderDetailID int [pk] - OrderID varchar(13) - TestID int - Priority int - Status varchar(50) - CreateDate datetime +Table areageo { + AreaGeoID int [pk, increment] + Parent int [ref: > areageo.AreaGeoID] + AreaCode varchar(50) + Class varchar(50) + AreaName varchar(255) } -Table specimen { - SID varchar(17) [pk] - OrderID varchar(13) - SpecimenDefID int - ParentSID varchar(17) - SpecimenType varchar(50) - SpecimenRole varchar(50) - CollectionDate datetime - CollectionSite int - CollectedBy int - ContainerType varchar(50) - Additive varchar(50) - CollectionMethod varchar(50) - BodySite varchar(50) - SpecimenCondition varchar(50) - Status varchar(50) - CreateDate datetime - EndDate datetime -} - -Table specimencollection { - ID int [pk] - SID varchar(17) - Activity varchar(50) - ActivityName varchar(100) - ActRes varchar(50) - LocationID int - EquipmentID int - PersonnelID int - ActivityDate datetime - Notes text - CreateDate datetime -} - -Table specimentransport { - TransportID int [pk] - SID varchar(17) - SenderID int - ReceiverID int - TransportDate datetime - Condition text - PackagingID varchar(50) - FromLocation int - ToLocation int - CreateDate datetime -} - -Table specimenstorage { - StorageID int [pk] - SID varchar(17) - LocationID int - StorageTemperature decimal(10,2) - StorageDate datetime - ThawCount int - ExpiryDate datetime - CreateDate datetime -} - -Table testdef { - TestID int [pk] - TestName varchar(255) - TestCode varchar(50) - LOINCCode varchar(50) - TestType varchar(50) - DisciplineID int - SpecimenTypeID int - ContainerTypeID int - ResultType varchar(50) - ResultUnit varchar(50) - Methodology varchar(255) - CreateDate datetime - EndDate datetime -} +// ============================================ +// TABLE 5: Test Management +// ============================================ Table testdefsite { - ID int [pk] - TestID int - SiteID int - TestNameLocal varchar(255) - TestCodeLocal varchar(50) - WorkstationID int - InstrumentID int - Active boolean - CreateDate datetime + TestSiteID int [pk, increment] + SiteID int [not null, ref: > site.SiteID] + TestSiteCode varchar(50) + TestSiteName varchar(255) + TestType varchar(50) // TEST, PARAM, CALC, GROUP, TITLE + Description text + SeqScr int + SeqRpt int + IndentLeft int + FontStyle varchar(50) + VisibleScr boolean + VisibleRpt boolean + CountStat boolean + CreateDate datetime [not null] + StartDate datetime + EndDate datetime } Table testdeftech { - ID int [pk] - TestID int - InstrumentID int - InstrumentTestCode varchar(50) - TestMapping varchar(255) - Active boolean - CreateDate datetime -} - -Table calculatedtest { - CalculatedTestID int [pk] - TestID int - Formula text - ParamTestID1 int - ParamTestID2 int - ParamTestID3 int - ParamTestID4 int - CreateDate datetime -} - -Table grouptest { - GroupTestID int [pk] - GroupTestName varchar(255) - GroupTestType varchar(50) - CreateDate datetime -} - -Table grouptestmember { - ID int [pk] - GroupTestID int - TestID int - Sequence int - CreateDate datetime -} - -Table panel { - PanelID int [pk] - PanelName varchar(255) - PanelType varchar(50) - ParentPanelID int - DisciplineID int - CreateDate datetime + TestTechID int [pk, increment] + TestSiteID int [not null, ref: > testdefsite.TestSiteID] + DisciplineID int [ref: > discipline.DisciplineID] + DepartmentID int [ref: > department.DepartmentID] + VSet int + ResultType varchar(50) // NM, TX, DT, TM, VS, HL7 + RefType varchar(50) // NUM, TXT, VSET + ReqQty decimal(10,4) + ReqQtyUnit varchar(20) + Unit1 varchar(50) + Factor decimal(10,6) + Unit2 varchar(50) + Decimal int + CollReq text + Method varchar(255) + ExpectedTAT int + CreateDate datetime [not null] EndDate datetime } -Table panelmember { - ID int [pk] - PanelID int - TestID int - Sequence int - CreateDate datetime +Table testdefcal { + TestCalID int [pk, increment] + TestSiteID int [not null, ref: > testdefsite.TestSiteID] + DisciplineID int [ref: > discipline.DisciplineID] + DepartmentID int [ref: > department.DepartmentID] + FormulaInput varchar(500) + FormulaCode text + RefType varchar(50) + Unit1 varchar(50) + Factor decimal(10,6) + Unit2 varchar(50) + Decimal int + Method varchar(255) + CreateDate datetime [not null] + EndDate datetime } -Table referencerangenumeric { - RefRangeID int [pk] - TestID int - AgeFrom int - AgeTo int +Table testdefgrp { + TestGrpID int [pk, increment] + TestSiteID int [not null, ref: > testdefsite.TestSiteID] + Member int [ref: > testdefsite.TestSiteID] + CreateDate datetime [not null] + EndDate datetime +} + +Table testmap { + TestMapID int [pk, increment] + TestSiteID int [not null, ref: > testdefsite.TestSiteID] + ConDefID int [ref: > containerdef.ConDefID] + HostType varchar(50) + HostID varchar(100) + HostDataSource varchar(100) + HostTestCode varchar(100) + HostTestName varchar(255) + ClientType varchar(50) + ClientID varchar(100) + ClientDataSource varchar(100) + ClientTestCode varchar(100) + ClientTestName varchar(255) + CreateDate datetime [not null] + EndDate datetime +} + +// ============================================ +// TABLE 6: Reference Ranges +// ============================================ + +Table refnum { + RefNumID int [pk, increment] + SiteID int [not null, ref: > site.SiteID] + TestSiteID int [not null, ref: > testdefsite.TestSiteID] + SpcType varchar(50) Sex varchar(10) - LowValue decimal(10,2) - HighValue decimal(10,2) - Unit varchar(20) - SpecimenTypeID int - SiteID int - EffectiveDate datetime - ExpiryDate datetime - CreateDate datetime -} - -Table referencerangethreshold { - RefRangeID int [pk] - TestID int - AgeFrom int - AgeTo int - Sex varchar(10) - CutOffLow decimal(10,2) - CutOffHigh decimal(10,2) - GrayZoneLow decimal(10,2) - GrayZoneHigh decimal(10,2) - SpecimenTypeID int - SiteID int - EffectiveDate datetime - ExpiryDate datetime - CreateDate datetime -} - -Table referencerangetext { - RefRangeID int [pk] - TestID int - AgeFrom int - AgeTo int - Sex varchar(10) - TextValue text - SpecimenTypeID int - SiteID int - EffectiveDate datetime - ExpiryDate datetime - CreateDate datetime -} - -Table calibrator { - CalibratorID int [pk] - CalibratorName varchar(255) - Manufacturer varchar(255) - LotNumber varchar(50) - ExpiryDate datetime - TestID int - CreateDate datetime -} - -Table calibration { - CalibrationID int [pk] - InstrumentID int - TestID int - CalibratorID int - Level int - CalibrationDate datetime - Factor decimal(10,4) - Absorbance decimal(10,4) - TargetValue decimal(10,4) - TargetUnit varchar(20) - PersonnelID int - Status varchar(50) - CreateDate datetime -} - -Table calparinst { - CalParInstID int [pk] - EquipmentID int - Calibrator varchar(255) - LotNo varchar(50) - ExpiryDate datetime - TestInstID1 int - SampleType varchar(50) - Level int - Concentration decimal(10,4) - CalUnit varchar(20) - CreateDate datetime -} - -Table qcmaterial { - QCMaterialID int [pk] - MaterialName varchar(255) - Manufacturer varchar(255) - LotNumber varchar(50) - ExpiryDate datetime - Level int - TestID int - TargetMean decimal(10,4) - TargetSD decimal(10,4) - TargetCV decimal(10,4) - CreateDate datetime -} - -Table qcresult { - QCResultID int [pk] - InstrumentID int - TestID int - QCMaterialID int - Level int - QCDate datetime - ResultValue decimal(10,4) - Mean decimal(10,4) - SD decimal(10,4) - CV decimal(10,4) - Sigma decimal(10,4) - ZScore decimal(10,4) + Criteria varchar(255) + AgeStart int + AgeEnd int + NumRefType varchar(50) // NR, CR + RangeType varchar(50) // LL-UL, LL, UL, ABS + LowSign varchar(5) + Low decimal(15,5) + HighSign varchar(5) + High decimal(15,5) + Display varchar(50) Flag varchar(10) - PersonnelID int - Status varchar(50) - CreateDate datetime + Interpretation text + Notes text + CreateDate datetime [not null] + StartDate datetime + EndDate datetime } -Table qcstatistic { - StatisticID int [pk] - InstrumentID int - TestID int - QCMaterialID int - Level int - StatisticDate datetime - Mean decimal(10,4) - SD decimal(10,4) - CV decimal(10,4) - SampleSize int - CreateDate datetime +Table reftxt { + RefTxtID int [pk, increment] + SiteID int [not null, ref: > site.SiteID] + TestSiteID int [not null, ref: > testdefsite.TestSiteID] + SpcType varchar(50) + Sex varchar(10) + Criteria varchar(255) + AgeStart int + AgeEnd int + TxtRefType varchar(50) // TX, VS + RefTxt text + Flag varchar(10) + Notes text + CreateDate datetime [not null] + StartDate datetime + EndDate datetime +} + +Table refvset { + RefVSetID int [pk, increment] + SiteID int [not null, ref: > site.SiteID] + TestSiteID int [not null, ref: > testdefsite.TestSiteID] + SpcType varchar(50) + Sex varchar(10) + AgeStart int + AgeEnd int + RefTxt varchar(255) + CreateDate datetime [not null] + EndDate datetime +} + +Table refthold { + RefTHoldID int [pk, increment] + SiteID int [not null, ref: > site.SiteID] + TestSiteID int [not null, ref: > testdefsite.TestSiteID] + SpcType varchar(50) + Sex varchar(10) + AgeStart int + AgeEnd int + Threshold decimal(15,5) + BelowTxt text + AboveTxt text + GrayzoneLow decimal(15,5) + GrayzoneHigh decimal(15,5) + GrayzoneTxt text + CreateDate datetime [not null] + EndDate datetime +} + +// ============================================ +// TABLE 7: Specimen Management +// ============================================ + +Table specimen { + InternalSID int [pk, increment] + SID varchar(17) [not null, unique] + SiteID int [not null, ref: > site.SiteID] + OrderID varchar(13) + ConDefID int [ref: > containerdef.ConDefID] + Parent int [ref: > specimen.InternalSID] + Qty decimal(10,4) + Unit varchar(20) + GenerateBy varchar(100) + SchDateTime datetime + CreateDate datetime [not null] + EndDate datetime + ArchiveDate datetime +} + +Table specimenstatus { + SpcStaID int [pk, increment] + SID varchar(17) [not null, ref: > specimen.SID] + OrderID varchar(13) + CurrSiteID int [ref: > site.SiteID] + CurrLocID int [ref: > location.LocationID] + UserID int + SpcAct varchar(50) + ActRes varchar(50) + SpcStatus varchar(50) + Qty decimal(10,4) + Unit varchar(20) + SpcCon varchar(50) + Comment text + Origin varchar(100) + GeoLocationSystem varchar(50) + GeoLocationData text + DIDType varchar(50) + DID varchar(100) + CreateDate datetime [not null] + EndDate datetime + ArchiveDate datetime +} + +Table specimencollection { + SpcColID int [pk, increment] + SpcStaID int [not null, ref: > specimenstatus.SpcStaID] + SpRole varchar(50) + ColMethod varchar(50) + BodySite varchar(50) + CntSize varchar(50) + FastingVolume decimal(10,4) + ColStart datetime + ColEnd datetime + CreateDate datetime [not null] + EndDate datetime + ArchiveDate datetime +} + +Table specimenprep { + SpcPrpID int [pk, increment] + SpcStaID int [not null, ref: > specimenstatus.SpcStaID] + Description text + Method varchar(255) + Additive varchar(100) + AddQty decimal(10,4) + AddUnit varchar(20) + PrepStart datetime + PrepEnd datetime + CreateDate datetime [not null] + EndDate datetime + ArchiveDate datetime +} + +Table containerdef { + ConDefID int [pk, increment] + SiteID int [not null, ref: > site.SiteID] + ConCode varchar(50) + ConName varchar(255) + ConDesc text + Additive varchar(100) + ConClass varchar(50) + Color varchar(50) + CreateDate datetime [not null] + EndDate datetime +} + +// ============================================ +// TABLE 8: Order Management +// ============================================ + +Table ordertest { + InternalOID int [pk, increment] + OrderID varchar(13) [not null, unique] + PlacerID varchar(100) + InternalPID int [not null, ref: > patient.InternalPID] + SiteID int [ref: > site.SiteID] + PVADTID int [ref: > patvisitadt.PVADTID] + ReqApp varchar(100) + Priority varchar(50) + TrnDate datetime + EffDate datetime + CreateDate datetime [not null] + EndDate datetime + ArchiveDate datetime + DelDate datetime } Table patres { - ResultID int [pk] - SID varchar(17) - TestID int + ResultID int [pk, increment] + SiteID int [ref: > site.SiteID] OrderID varchar(13) - ResultValue varchar(100) - ResultNumeric decimal(15,5) - ResultText text - ResultUnit varchar(20) - ResultStatus varchar(50) - PersonnelID int - VerificationDate datetime - VerificationPersonnel int - CreateDate datetime + InternalSID int [ref: > specimen.InternalSID] + SID varchar(17) + SampleID varchar(100) + TestSiteID int [ref: > testdefsite.TestSiteID] + WorkstationID int [ref: > workstation.WorkstationID] + EquipmentID int + RefNumID int [ref: > refnum.RefNumID] + RefTxtID int [ref: > reftxt.RefTxtID] + TestSiteCode varchar(50) + AspCnt int + Result text + SampleType varchar(50) + ResultDateTime datetime + CreateDate datetime [not null] EndDate datetime + ArchiveDate datetime + DelDate datetime } -Table patrestech { - TechResultID int [pk] - ResultID int - InstrumentID int - RawResult text - ResultDate datetime - RerunCount int - Dilution decimal(10,4) - CreateDate datetime -} +// ============================================ +// TABLE 9: Contact Management +// ============================================ -Table patresflag { - FlagID int [pk] - ResultID int - FlagType varchar(10) - FlagDescription varchar(255) - CreateDate datetime -} - -Table resultdistribution { - DistributionID int [pk] - ResultID int - RecipientType varchar(50) - RecipientID int - DistributionDate datetime - DistributionMethod varchar(50) - Status varchar(50) - CreateDate datetime -} - -Table valuesetmember { - MemberID int [pk] - ValueSetID int - MemberCode varchar(50) - MemberValue varchar(255) - DisplayOrder int - Active boolean - CreateDate datetime -} - -Table reagent { - ReagentID int [pk] - ReagentName varchar(255) - Manufacturer varchar(255) - CatalogNumber varchar(100) - LotNumber varchar(50) - ExpiryDate datetime - TestID int - InstrumentID int - CreateDate datetime -} - -Table reagentusage { - UsageID int [pk] - ReagentID int - TestID int - UsageDate datetime - QuantityUsed decimal(10,2) - PersonnelID int - OrderID varchar(13) - SID varchar(17) - CreateDate datetime -} - -Table product { - ProductID int [pk] - CatalogID int - SiteID int - LotNumber varchar(50) - ExpiryDate datetime - Quantity int - ReorderLevel int - LocationID int - CreateDate datetime -} - -Table inventorytransaction { - TransactionID int [pk] - ProductID int - TransactionType varchar(50) - Quantity int - TransactionDate datetime - PersonnelID int - ReferenceID varchar(100) - Notes text - CreateDate datetime -} - -Table equipment { - EquipmentID int [pk] - EquipmentName varchar(255) - EquipmentType varchar(50) - Manufacturer varchar(255) - Model varchar(100) - SerialNumber varchar(100) - SiteID int - LocationID int - Status varchar(50) - InstallDate datetime - DecommissionDate datetime - CreateDate datetime -} - -Table equipmentmaintenance { - MaintenanceID int [pk] - EquipmentID int - MaintenanceType varchar(100) - MaintenanceDate datetime - Description text - PerformedBy varchar(255) - NextMaintenanceDate datetime - CreateDate datetime -} - -Table equipmentactivity { - ActivityID int [pk] - EquipmentID int - ActivityType varchar(100) - ActivityDate datetime - ActivityResult varchar(50) - PersonnelID int - Notes text - CreateDate datetime -} - -Table equipmenttestcount { - ID int [pk] - EquipmentID int - TestDate datetime - TestType varchar(50) - TestCount int - CreateDate datetime -} - -Table doctor { - DoctorID int [pk] - DoctorName varchar(255) - DoctorCode varchar(50) +Table contact { + ContactID int [pk, increment] + NameFirst varchar(255) + NameLast varchar(255) + Title varchar(100) + Initial varchar(50) + Birthdate datetime + EmailAddress1 varchar(255) + EmailAddress2 varchar(255) + Phone varchar(50) + MobilePhone1 varchar(50) + MobilePhone2 varchar(50) Specialty varchar(100) - SIP varchar(50) - PracticeLocation varchar(255) - ContactID int - CreateDate datetime + SubSpecialty varchar(100) + CreateDate datetime [not null] EndDate datetime } Table contactdetail { - DetailID int [pk] - ContactID int - DetailType varchar(50) - DetailValue varchar(255) - CreateDate datetime + ContactDetID int [pk, increment] + ContactID int [not null, ref: > contact.ContactID] + SiteID int [ref: > site.SiteID] + OccupationID int [ref: > occupation.OccupationID] + ContactCode varchar(50) + ContactEmail varchar(255) + JobTitle varchar(100) + Department varchar(100) + ContactStartDate datetime + ContactEndDate datetime } -Table auditarchive { - ArchiveID int [pk] - AuditID int - ArchiveDate datetime - ArchiveLocation varchar(255) - CreateDate datetime -} - -Table user { - UserID int [pk] - Username varchar(100) - PasswordHash varchar(255) - PersonnelID int - Role varchar(50) - Status varchar(20) - LastLogin datetime - CreateDate datetime -} - -Table usersession { - SessionID int [pk] - UserID int - SessionToken varchar(255) - ExpiryDate datetime - IPAddress varchar(50) - CreateDate datetime -} - -Table reporttemplate { - TemplateID int [pk] - TemplateName varchar(255) - TemplateType varchar(50) - DisciplineID int - TemplateConfig text - CreateDate datetime +Table medicalspecialty { + SpecialtyID int [pk, increment] + Parent int [ref: > medicalspecialty.SpecialtyID] + SpecialtyText varchar(255) + Title varchar(100) + CreateDate datetime [not null] EndDate datetime } -Table reportoutput { - OutputID int [pk] - TemplateID int - OrderID varchar(13) - OutputFormat varchar(50) - OutputData blob - GeneratedDate datetime - PersonnelID int - CreateDate datetime -} - -Table hosttestmapping { - MappingID int [pk] - HostID int - HostTestCode varchar(50) - LocalTestID int - CreateDate datetime -} - -Table hostsynclog { - LogID int [pk] - HostID int - SyncDate datetime - RecordsProcessed int - Errors int - Status varchar(20) - Details text - CreateDate datetime +Table occupation { + OccupationID int [pk, increment] + OccCode varchar(50) + OccText varchar(255) + Description text + CreateDate datetime [not null] } // ============================================ -// RELATIONSHIPS +// TABLE 10: Value Sets // ============================================ -// Organization Structure -Ref: account.ParentAccountID > account.AccountID [delete: cascade] -Ref: site.AccountID > account.AccountID -Ref: department.DisciplineID > discipline.DisciplineID -Ref: workstation.SiteID > site.SiteID -Ref: workstation.DepartmentID > department.DepartmentID -Ref: instrument.SiteID > site.SiteID -Ref: instrument.WorkstationID > workstation.WorkstationID +Table valuesetdef { + VSetID int [pk, increment] + SiteID int [not null, ref: > site.SiteID] + VSName varchar(255) + VSDesc text + CreateDate datetime [not null] + EndDate datetime +} -// Personnel -Ref: personnel.SiteID > site.SiteID -Ref: personneldocument.PersonnelID > personnel.PersonnelID -Ref: personnelaccess.PersonnelID > personnel.PersonnelID +Table valueset { + VID int [pk, increment] + SiteID int [not null, ref: > site.SiteID] + VSetID int [not null, ref: > valuesetdef.VSetID] + VCategory varchar(100) + VOrder int + VValue varchar(255) + VDesc varchar(255) + CreateDate datetime [not null] + EndDate datetime +} -// Location Management -Ref: location.SiteID > site.SiteID -Ref: location.ParentLocationID > location.LocationID -Ref: locationaddress.LocationID > location.LocationID +// ============================================ +// TABLE 11: System / Counter +// ============================================ -// Patient Registration -Ref: patient.SiteID > site.SiteID -Ref: patientcontact.InternalPID > patient.InternalPID -Ref: patientinsurance.InternalPID > patient.InternalPID -Ref: patientvisit.InternalPID > patient.InternalPID -Ref: patientvisit.SiteID > site.SiteID +Table counter { + CounterID int [pk, increment] + CounterValue bigint + CounterStart bigint + CounterEnd bigint + CounterReset varchar(50) + CreateDate datetime [not null] + EndDate datetime +} -// Patient Admission -Ref: admission.VisitID > patientvisit.VisitID -Ref: admission.PatientID > patient.PatientID -Ref: admission.SiteID > site.SiteID -Ref: admissionlocation.AdmissionID > admission.AdmissionID -Ref: admissionlocation.LocationID > location.LocationID - -// Test Ordering -Ref: testorder.SiteID > site.SiteID -Ref: testorder.PatientID > patient.PatientID -Ref: testorder.VisitID > patientvisit.VisitID -Ref: testorder.ProductionSiteID > site.SiteID -Ref: testorderdetail.OrderID > testorder.OrderID - -// Specimen Management -Ref: specimen.OrderID > testorder.OrderID -Ref: specimencollection.SID > specimen.SID -Ref: specimencollection.LocationID > location.LocationID -Ref: specimencollection.EquipmentID > instrument.InstrumentID -Ref: specimencollection.PersonnelID > personnel.PersonnelID -Ref: specimentransport.SID > specimen.SID -Ref: specimentransport.SenderID > personnel.PersonnelID -Ref: specimentransport.ReceiverID > personnel.PersonnelID -Ref: specimenstorage.SID > specimen.SID -Ref: specimenstorage.LocationID > location.LocationID - -// Test Management -Ref: testdef.DisciplineID > discipline.DisciplineID -Ref: testdefsite.TestID > testdef.TestID -Ref: testdefsite.SiteID > site.SiteID -Ref: testdefsite.WorkstationID > workstation.WorkstationID -Ref: testdefsite.InstrumentID > instrument.InstrumentID -Ref: testdeftech.TestID > testdef.TestID -Ref: testdeftech.InstrumentID > instrument.InstrumentID -Ref: calculatedtest.TestID > testdef.TestID -Ref: grouptestmember.GroupTestID > grouptest.GroupTestID -Ref: grouptestmember.TestID > testdef.TestID -Ref: panel.ParentPanelID > panel.PanelID -Ref: panel.DisciplineID > discipline.DisciplineID -Ref: panelmember.PanelID > panel.PanelID -Ref: panelmember.TestID > testdef.TestID - -// Reference Range -Ref: referencerangenumeric.TestID > testdef.TestID -Ref: referencerangenumeric.SiteID > site.SiteID -Ref: referencerangethreshold.TestID > testdef.TestID -Ref: referencerangethreshold.SiteID > site.SiteID -Ref: referencerangetext.TestID > testdef.TestID -Ref: referencerangetext.SiteID > site.SiteID - -// Calibration -Ref: calibrator.TestID > testdef.TestID -Ref: calibration.InstrumentID > instrument.InstrumentID -Ref: calibration.TestID > testdef.TestID -Ref: calibration.CalibratorID > calibrator.CalibratorID -Ref: calibration.PersonnelID > personnel.PersonnelID -Ref: calparinst.EquipmentID > instrument.InstrumentID - -// Quality Control -Ref: qcmaterial.TestID > testdef.TestID -Ref: qcresult.InstrumentID > instrument.InstrumentID -Ref: qcresult.TestID > testdef.TestID -Ref: qcresult.QCMaterialID > qcmaterial.QCMaterialID -Ref: qcresult.PersonnelID > personnel.PersonnelID -Ref: qcstatistic.InstrumentID > instrument.InstrumentID -Ref: qcstatistic.TestID > testdef.TestID -Ref: qcstatistic.QCMaterialID > qcmaterial.QCMaterialID - -// Test Results -Ref: patres.SID > specimen.SID -Ref: patres.TestID > testdef.TestID -Ref: patres.OrderID > testorder.OrderID -Ref: patres.PersonnelID > personnel.PersonnelID -Ref: patrestech.ResultID > patres.ResultID -Ref: patrestech.InstrumentID > instrument.InstrumentID -Ref: patresflag.ResultID > patres.ResultID -Ref: resultdistribution.ResultID > patres.ResultID - -// Reagent & Inventory -Ref: reagent.TestID > testdef.TestID -Ref: reagent.InstrumentID > instrument.InstrumentID -Ref: reagentusage.ReagentID > reagent.ReagentID -Ref: reagentusage.TestID > testdef.TestID -Ref: reagentusage.PersonnelID > personnel.PersonnelID - -Ref: product.SiteID > site.SiteID -Ref: product.LocationID > location.LocationID -Ref: inventorytransaction.ProductID > product.ProductID -Ref: inventorytransaction.PersonnelID > personnel.PersonnelID - -// Equipment Management -Ref: equipment.SiteID > site.SiteID -Ref: equipment.LocationID > location.LocationID -Ref: equipmentmaintenance.EquipmentID > equipment.EquipmentID -Ref: equipmentactivity.EquipmentID > equipment.EquipmentID -Ref: equipmentactivity.PersonnelID > personnel.PersonnelID -Ref: equipmenttestcount.EquipmentID > equipment.EquipmentID - - -// User & Authentication -Ref: user.PersonnelID > personnel.PersonnelID -Ref: usersession.UserID > user.UserID - -// Visualization & Reporting -Ref: reporttemplate.DisciplineID > discipline.DisciplineID -Ref: reportoutput.TemplateID > reporttemplate.TemplateID -Ref: reportoutput.OrderID > testorder.OrderID -Ref: reportoutput.PersonnelID > personnel.PersonnelID - -// Host System Integration -Ref: hosttestmapping.LocalTestID > testdef.TestID +Table edgeres { + EdgeResID int [pk, increment] + SiteID int [ref: > site.SiteID] + InstrumentID int + SampleID varchar(100) + PatientID varchar(100) + Payload text + Status varchar(50) + AutoProcess boolean + ProcessedAt datetime + ErrorMessage text + CreateDate datetime [not null] + EndDate datetime + ArchiveDate datetime + DelDate datetime +} +Table zones { + id int [pk, increment] + name varchar(255) + code varchar(50) + type varchar(50) + description text + status varchar(50) + created_at datetime + updated_at datetime +}