diff --git a/app/Database/Migrations/2025-10-11-100001_Test.php b/app/Database/Migrations/2025-10-11-100001_Test.php index 4e1846d..7e80648 100644 --- a/app/Database/Migrations/2025-10-11-100001_Test.php +++ b/app/Database/Migrations/2025-10-11-100001_Test.php @@ -6,22 +6,6 @@ use CodeIgniter\Database\Migration; class CreateTestsTable extends Migration { public function up() { - $this->forge->addField([ - 'TestID' => ['type' => 'INT', 'auto_increment' => true, 'unsigned' => true], - 'Parent' => ['type' => 'INT', 'null' => true], - 'TestCode' => ['type' => 'VARCHAR', 'constraint'=> 6, 'null' => false], - 'TestName' => ['type' => 'varchar', 'constraint'=> 50, 'null' => false], - 'Description' => ['type' => 'VARCHAR', 'constraint'=> 150, 'null' => false], - 'DisciplineID' => ['type' => 'INT', 'null' => false], - 'Method' => ['type' => 'varchar', 'constraint'=>50, 'null' => true], - 'Seq' => ['type' => 'int', 'constraint'=> 15, 'null' => true], - 'CountStat' => ['type' => 'int', 'null' => true ], - 'CreateDate' => ['type' => 'Datetime', 'null' => true], - 'EndDate' => ['type' => 'Datetime', 'null' => true], - ]); - $this->forge->addKey('TestID', true); - $this->forge->createTable('testdef'); - $this->forge->addField([ 'TestSiteID' => ['type' => 'INT', 'auto_increment' => true, 'unsigned' => true], 'SiteID' => ['type' => 'INT', 'null' => false], @@ -117,7 +101,6 @@ class CreateTestsTable extends Migration { } public function down() { - $this->forge->dropTable('testdef'); $this->forge->dropTable('testdefsite'); $this->forge->dropTable('testdeftech'); $this->forge->dropTable('testdefcal'); diff --git a/app/Database/Seeds/TestSeeder.php b/app/Database/Seeds/TestSeeder.php index d125d19..01fea98 100644 --- a/app/Database/Seeds/TestSeeder.php +++ b/app/Database/Seeds/TestSeeder.php @@ -15,126 +15,230 @@ class TestSeeder extends Seeder { foreach ($rows as $row) { $vs[$row['VSetID']][$row['VValue']] = $row['VID']; } - /* - $data = ['SiteID' => '1','TestSiteCode' => 'QTESTNUM', 'TestSiteName' =>'Dummy Test', 'TestType' => $vs[27]['TEST'],'Description' => '', - 'SeqScr' => '4','SeqRpt' => '4','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + + // TestType mapping from VSetID=27: + // TEST = $vs[27]['TEST'] + // PARAM = $vs[27]['PARAM'] + // CALC = $vs[27]['CALC'] + // GROUP = $vs[27]['GROUP'] + // TITLE = $vs[27]['TITLE'] + + // ======================================== + // TITLE TYPE - Headers/Sections + // ======================================== + $data = ['SiteID' => '1', 'TestSiteCode' => 'HDR-HEMA', 'TestSiteName' => 'HEMATOLOGY', 'Type' => $vs[27]['TITLE'], 'Description' => 'Hematology Section Header', 'SeqScr' => '1', 'SeqRpt' => '1', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '1', 'DepartmentID' =>'1', 'ResultType'=>$vs[43]['NMRIC'], 'RefType'=>[44]['RANGE'], 'VSet' => '', 'ReqQty'=> '500', - 'ReqQtyUnit'=>'mL','Unit1' => 'g/dL','Factor' => '','Unit2' => '', 'CollReq'=>'', 'Method' => '','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); - $this->db->table('testdeftech')->insert($data); - /* - $data = ['SiteID' => '1','TestSiteCode' => 'HB', 'TestSiteName' =>'Hemoglobin', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '4','SeqRpt' => '4','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + + $data = ['SiteID' => '1', 'TestSiteCode' => 'HDR-CHEM', 'TestSiteName' => 'CHEMISTRY', 'Type' => $vs[27]['TITLE'], 'Description' => 'Chemistry Section Header', 'SeqScr' => '10', 'SeqRpt' => '10', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '1', 'DepartmentID' =>'1', 'VSet' => '','SpcType' => $vs[15]['BLD'] ,'Unit1' => 'g/dL','Factor' => '','Unit2' => '','Method' => '','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'HDR-URIN', 'TestSiteName' => 'URINALYSIS', 'Type' => $vs[27]['TITLE'], 'Description' => 'Urinalysis Section Header', 'SeqScr' => '30', 'SeqRpt' => '30', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + + // ======================================== + // TEST TYPE - Actual Laboratory Tests + // ======================================== + // Hematology Tests + $data = ['SiteID' => '1', 'TestSiteCode' => 'HB', 'TestSiteName' => 'Hemoglobin', 'Type' => $vs[27]['TEST'], 'Description' => '', 'SeqScr' => '2', 'SeqRpt' => '2', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '1', 'DepartmentID' => '1', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['BLD'], 'ReqQty' => '500', 'ReqQtyUnit' => 'uL', 'Unit1' => 'g/dL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '1', 'Method' => 'CBC Analyzer', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - $data = ['SiteID' => '1','TestSiteCode' => 'HCT', 'TestSiteName' =>'Hematokrit', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '5','SeqRpt' => '5','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + $data = ['SiteID' => '1', 'TestSiteCode' => 'HCT', 'TestSiteName' => 'Hematocrit', 'Type' => $vs[27]['TEST'], 'Description' => '', 'SeqScr' => '3', 'SeqRpt' => '3', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '1', 'DepartmentID' =>'1', 'VSet' => '','SpcType' => $vs[15]['BLD'],'Unit1' => '%','Factor' => '','Unit2' => '','Method' => '','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '1', 'DepartmentID' => '1', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['BLD'], 'ReqQty' => '500', 'ReqQtyUnit' => 'uL', 'Unit1' => '%', 'Factor' => '', 'Unit2' => '', 'Decimal' => '1', 'Method' => 'CBC Analyzer', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - $data = ['SiteID' => '1','TestSiteCode' => 'ERY', 'TestSiteName' =>'Eritrosit', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '6','SeqRpt' => '6','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + $data = ['SiteID' => '1', 'TestSiteCode' => 'RBC', 'TestSiteName' => 'Red Blood Cell', 'Type' => $vs[27]['TEST'], 'Description' => 'Eritrosit', 'SeqScr' => '4', 'SeqRpt' => '4', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - $data = [ 'DisciplineID' => '1', 'DepartmentID' =>'1', 'VSet' => '','SpcType' => $vs[15]['BLD'], 'Unit1' => '10^6/mL','Factor' => '','Unit2' => '','Method' => '','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '1', 'DepartmentID' => '1', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['BLD'], 'ReqQty' => '500', 'ReqQtyUnit' => 'uL', 'Unit1' => 'x10^6/uL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '2', 'Method' => 'CBC Analyzer', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - $data = ['SiteID' => '1','TestSiteCode' => 'MCV', 'TestSiteName' =>'MCV', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '8','SeqRpt' => '8','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + $data = ['SiteID' => '1', 'TestSiteCode' => 'WBC', 'TestSiteName' => 'White Blood Cell', 'Type' => $vs[27]['TEST'], 'Description' => 'Leukosit', 'SeqScr' => '5', 'SeqRpt' => '5', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'MCH', 'TestSiteName' =>'MCH', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '9','SeqRpt' => '9','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; - $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'MCHC', 'TestSiteName' =>'MCHC', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '10','SeqRpt' => '10','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; - $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'GLUAR', 'TestSiteName' =>'Glukosa Sewaktu', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '13','SeqRpt' => '13','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; - $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '2', 'DepartmentID' =>'3', 'VSet' => '','SpcType' => $vs[15]['SER'],'Unit1' => 'U/L','Factor' => '','Unit2' => '','Method' => 'Hexokinase','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '1', 'DepartmentID' => '1', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['BLD'], 'ReqQty' => '500', 'ReqQtyUnit' => 'uL', 'Unit1' => 'x10^3/uL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '2', 'Method' => 'CBC Analyzer', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'GLUF', 'TestSiteName' =>'Glukosa Puasa', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '14','SeqRpt' => '14','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + + $data = ['SiteID' => '1', 'TestSiteCode' => 'PLT', 'TestSiteName' => 'Platelet', 'Type' => $vs[27]['TEST'], 'Description' => 'Trombosit', 'SeqScr' => '6', 'SeqRpt' => '6', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - $data = [ 'DisciplineID' => '2', 'DepartmentID' =>'3', 'VSet' => '','SpcType' => $vs[15]['SER'], 'Unit1' => 'U/L','Factor' => '','Unit2' => '','Method' => 'Hexokinase','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '1', 'DepartmentID' => '1', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['BLD'], 'ReqQty' => '500', 'ReqQtyUnit' => 'uL', 'Unit1' => 'x10^3/uL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'Method' => 'CBC Analyzer', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'GLU2HPP', 'TestSiteName' =>'Glukosa 2 Jam PP', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '15','SeqRpt' => '15','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + + $data = ['SiteID' => '1', 'TestSiteCode' => 'MCV', 'TestSiteName' => 'MCV', 'Type' => $vs[27]['TEST'], 'Description' => 'Mean Corpuscular Volume', 'SeqScr' => '7', 'SeqRpt' => '7', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '2', 'DepartmentID' =>'3', 'VSet' => '','SpcType' => $vs[15]['SER'], 'Unit1' => 'mg/dL','Factor' => '','Unit2' => '','Method' => 'Hexokinase','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '1', 'DepartmentID' => '1', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['BLD'], 'ReqQty' => '500', 'ReqQtyUnit' => 'uL', 'Unit1' => 'fL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '1', 'Method' => 'CBC Analyzer', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'TC', 'TestSiteName' =>'Cholesterol Total', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '17','SeqRpt' => '17','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + + $data = ['SiteID' => '1', 'TestSiteCode' => 'MCH', 'TestSiteName' => 'MCH', 'Type' => $vs[27]['TEST'], 'Description' => 'Mean Corpuscular Hemoglobin', 'SeqScr' => '8', 'SeqRpt' => '8', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'LDL', 'TestSiteName' =>'Cholesterol LDL Direk', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '18','SeqRpt' => '18','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; - $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'HDL', 'TestSiteName' =>'Cholesterol HDL', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '19','SeqRpt' => '19','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; - $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'TG', 'TestSiteName' =>'Trigliserida', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '20','SeqRpt' => '20','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; - $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'SGOT', 'TestSiteName' =>'Aspartate Aminotransferase', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '23','SeqRpt' => '23','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; - $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '2', 'DepartmentID' =>'3', 'VSet' => '','SpcType' => $vs[15]['SER'], 'Unit1' => 'mg/dL','Factor' => '0.017','Unit2' => 'mkat/L','Method' => 'IFCC','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '1', 'DepartmentID' => '1', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['BLD'], 'ReqQty' => '500', 'ReqQtyUnit' => 'uL', 'Unit1' => 'pg', 'Factor' => '', 'Unit2' => '', 'Decimal' => '1', 'Method' => 'CBC Analyzer', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'SGPT', 'TestSiteName' =>'Alanine Aminotransferase', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '24','SeqRpt' => '24','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + + $data = ['SiteID' => '1', 'TestSiteCode' => 'MCHC', 'TestSiteName' => 'MCHC', 'Type' => $vs[27]['TEST'], 'Description' => 'Mean Corpuscular Hemoglobin Concentration', 'SeqScr' => '9', 'SeqRpt' => '9', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '2', 'DepartmentID' =>'3', 'VSet' => '','SpcType' => $vs[15]['SER'], 'Unit1' => 'mg/dL','Factor' => '','Unit2' => '','Method' => 'IFCC','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '1', 'DepartmentID' => '1', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['BLD'], 'ReqQty' => '500', 'ReqQtyUnit' => 'uL', 'Unit1' => 'g/dL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '1', 'Method' => 'CBC Analyzer', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'CREA', 'TestSiteName' =>'Kreatinin', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '26','SeqRpt' => '26','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + + // Chemistry Tests + $data = ['SiteID' => '1', 'TestSiteCode' => 'GLU', 'TestSiteName' => 'Glucose', 'Type' => $vs[27]['TEST'], 'Description' => 'Glukosa Sewaktu', 'SeqScr' => '11', 'SeqRpt' => '11', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '2', 'DepartmentID' =>'3', 'VSet' => '','SpcType' => $vs[15]['SER'], 'Unit1' => 'mg/dL','Factor' => '88.4','Unit2' => 'mmol/L','Method' => 'Enzymatic','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['SER'], 'ReqQty' => '300', 'ReqQtyUnit' => 'uL', 'Unit1' => 'mg/dL', 'Factor' => '0.0555', 'Unit2' => 'mmol/L', 'Decimal' => '0', 'Method' => 'Hexokinase', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'CREAU', 'TestSiteName' =>'Kreatinin Urin', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '27','SeqRpt' => '27','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; + + $data = ['SiteID' => '1', 'TestSiteCode' => 'CREA', 'TestSiteName' => 'Creatinine', 'Type' => $vs[27]['TEST'], 'Description' => 'Kreatinin', 'SeqScr' => '12', 'SeqRpt' => '12', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'CREAC', 'TestSiteName' =>'Creatinine Clearance', 'TestType' => $vs[27]['CalN'],'Description' => 'Cockcroft-Gault formula','SeqScr' => '28','SeqRpt' => '28','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][0],'CreateDate' => "$now"]; - $this->db->table('testdefsite')->insert($data); - - - $data = ['SiteID' => '1','TestSiteCode' => 'COLOR', 'TestSiteName' =>'Warna', 'TestType' => $vs[27]['Test'],'Description' => '','SeqScr' => '30','SeqRpt' => '30','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][1],'CreateDate' => "$now"]; - $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '4', 'DepartmentID' =>'6', 'VSet' => '1002','SpcType' => $vs[15]['SER'], 'Unit1' => '','Factor' => '','Unit2' => '','Method' => '','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['SER'], 'ReqQty' => '300', 'ReqQtyUnit' => 'uL', 'Unit1' => 'mg/dL', 'Factor' => '88.4', 'Unit2' => 'umol/L', 'Decimal' => '2', 'Method' => 'Enzymatic', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'HEIGHT', 'TestSiteName' =>'Tinggi badan', 'TestType' => $vs[27]['PARAM'],'Description' => '','SeqScr' => '31','SeqRpt' => '31','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][0],'CreateDate' => "$now"]; + + $data = ['SiteID' => '1', 'TestSiteCode' => 'UREA', 'TestSiteName' => 'Blood Urea Nitrogen', 'Type' => $vs[27]['TEST'], 'Description' => 'BUN', 'SeqScr' => '13', 'SeqRpt' => '13', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '10', 'DepartmentID' =>'', 'VSet' => '','SpcType' => '', 'Unit1' => 'm','Factor' => '','Unit2' => '','Method' => '','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['SER'], 'ReqQty' => '300', 'ReqQtyUnit' => 'uL', 'Unit1' => 'mg/dL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '1', 'Method' => 'Urease-GLDH', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'WEIGHT', 'TestSiteName' =>'Berat badan', 'TestType' => $vs[27]['PARAM'],'Description' => '','SeqScr' => '32','SeqRpt' => '32','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][0],'CreateDate' => "$now"]; + + $data = ['SiteID' => '1', 'TestSiteCode' => 'SGOT', 'TestSiteName' => 'AST (SGOT)', 'Type' => $vs[27]['TEST'], 'Description' => 'Aspartate Aminotransferase', 'SeqScr' => '14', 'SeqRpt' => '14', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - $data = ['DisciplineID' => '10', 'DepartmentID' =>'', 'VSet' => '','SpcType' => '', 'Unit1' => 'Kg','Factor' => '','Unit2' => '','Method' => '','CreateDate' => "$now"]; - $data['TestSiteID']= $this->db->insertID(); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['SER'], 'ReqQty' => '300', 'ReqQtyUnit' => 'uL', 'Unit1' => 'U/L', 'Factor' => '0.017', 'Unit2' => 'ukat/L', 'Decimal' => '0', 'Method' => 'IFCC', 'CreateDate' => "$now"]; $this->db->table('testdeftech')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'WAIST', 'TestSiteName' =>'Lingkar pinggang', 'TestType' => $vs[27]['PARAM'],'Description' => '','SeqScr' => '33','SeqRpt' => '33','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][0],'CreateDate' => "$now"]; + + $data = ['SiteID' => '1', 'TestSiteCode' => 'SGPT', 'TestSiteName' => 'ALT (SGPT)', 'Type' => $vs[27]['TEST'], 'Description' => 'Alanine Aminotransferase', 'SeqScr' => '15', 'SeqRpt' => '15', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'AGE', 'TestSiteName' =>'Usia', 'TestType' => $vs[27]['PARAM'],'Description' => '','SeqScr' => '34','SeqRpt' => '34','VisibleScr' => $vs[2][1],'VisibleRpt' => '0','CountStat' => $vs[2][0],'CreateDate' => "$now"]; + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['SER'], 'ReqQty' => '300', 'ReqQtyUnit' => 'uL', 'Unit1' => 'U/L', 'Factor' => '0.017', 'Unit2' => 'ukat/L', 'Decimal' => '0', 'Method' => 'IFCC', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'CHOL', 'TestSiteName' => 'Total Cholesterol', 'Type' => $vs[27]['TEST'], 'Description' => 'Kolesterol Total', 'SeqScr' => '16', 'SeqRpt' => '16', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'SISTL', 'TestSiteName' =>'Sistolik', 'TestType' => $vs[27]['PARAM'],'Description' => '','SeqScr' => '35','SeqRpt' => '35','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][0],'CreateDate' => "$now"]; + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['THOLD'], 'VSet' => '', 'SpcType' => $vs[15]['SER'], 'ReqQty' => '300', 'ReqQtyUnit' => 'uL', 'Unit1' => 'mg/dL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'Method' => 'Enzymatic', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'TG', 'TestSiteName' => 'Triglycerides', 'Type' => $vs[27]['TEST'], 'Description' => 'Trigliserida', 'SeqScr' => '17', 'SeqRpt' => '17', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - - $data = ['SiteID' => '1','TestSiteCode' => 'DIASTL', 'TestSiteName' =>'Diastolik', 'TestType' => $vs[27]['PARAM'],'Description' => '','SeqScr' => '36','SeqRpt' => '36','VisibleScr' => $vs[2][1],'VisibleRpt' => $vs[2][1],'CountStat' => $vs[2][0],'CreateDate' => "$now"]; + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['THOLD'], 'VSet' => '', 'SpcType' => $vs[15]['SER'], 'ReqQty' => '300', 'ReqQtyUnit' => 'uL', 'Unit1' => 'mg/dL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'Method' => 'GPO-PAP', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'HDL', 'TestSiteName' => 'HDL Cholesterol', 'Type' => $vs[27]['TEST'], 'Description' => 'Kolesterol HDL', 'SeqScr' => '18', 'SeqRpt' => '18', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; $this->db->table('testdefsite')->insert($data); - */ + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['THOLD'], 'VSet' => '', 'SpcType' => $vs[15]['SER'], 'ReqQty' => '300', 'ReqQtyUnit' => 'uL', 'Unit1' => 'mg/dL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'Method' => 'Direct', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'LDL', 'TestSiteName' => 'LDL Cholesterol', 'Type' => $vs[27]['TEST'], 'Description' => 'Kolesterol LDL', 'SeqScr' => '19', 'SeqRpt' => '19', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['THOLD'], 'VSet' => '', 'SpcType' => $vs[15]['SER'], 'ReqQty' => '300', 'ReqQtyUnit' => 'uL', 'Unit1' => 'mg/dL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'Method' => 'Direct', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + // ======================================== + // PARAM TYPE - Parameters (non-lab values) + // ======================================== + $data = ['SiteID' => '1', 'TestSiteCode' => 'HEIGHT', 'TestSiteName' => 'Height', 'Type' => $vs[27]['PARAM'], 'Description' => 'Tinggi Badan', 'SeqScr' => '40', 'SeqRpt' => '40', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][0], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '10', 'DepartmentID' => '', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => '', 'VSet' => '', 'SpcType' => '', 'ReqQty' => '', 'ReqQtyUnit' => '', 'Unit1' => 'cm', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'Method' => '', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'WEIGHT', 'TestSiteName' => 'Weight', 'Type' => $vs[27]['PARAM'], 'Description' => 'Berat Badan', 'SeqScr' => '41', 'SeqRpt' => '41', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][0], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '10', 'DepartmentID' => '', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => '', 'VSet' => '', 'SpcType' => '', 'ReqQty' => '', 'ReqQtyUnit' => '', 'Unit1' => 'kg', 'Factor' => '', 'Unit2' => '', 'Decimal' => '1', 'Method' => '', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'AGE', 'TestSiteName' => 'Age', 'Type' => $vs[27]['PARAM'], 'Description' => 'Usia', 'SeqScr' => '42', 'SeqRpt' => '42', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][0], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '10', 'DepartmentID' => '', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => '', 'VSet' => '', 'SpcType' => '', 'ReqQty' => '', 'ReqQtyUnit' => '', 'Unit1' => 'years', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'Method' => '', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'SYSTL', 'TestSiteName' => 'Systolic BP', 'Type' => $vs[27]['PARAM'], 'Description' => 'Tekanan Darah Sistolik', 'SeqScr' => '43', 'SeqRpt' => '43', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][0], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '10', 'DepartmentID' => '', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => '', 'VSet' => '', 'SpcType' => '', 'ReqQty' => '', 'ReqQtyUnit' => '', 'Unit1' => 'mmHg', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'Method' => '', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'DIASTL', 'TestSiteName' => 'Diastolic BP', 'Type' => $vs[27]['PARAM'], 'Description' => 'Tekanan Darah Diastolik', 'SeqScr' => '44', 'SeqRpt' => '44', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][0], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '10', 'DepartmentID' => '', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => '', 'VSet' => '', 'SpcType' => '', 'ReqQty' => '', 'ReqQtyUnit' => '', 'Unit1' => 'mmHg', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'Method' => '', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + // ======================================== + // CALC TYPE - Calculated Tests + // ======================================== + $data = ['SiteID' => '1', 'TestSiteCode' => 'BMI', 'TestSiteName' => 'Body Mass Index', 'Type' => $vs[27]['CALC'], 'Description' => 'Indeks Massa Tubuh - weight/(height^2)', 'SeqScr' => '45', 'SeqRpt' => '45', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '10', 'DepartmentID' => '', 'FormulaInput' => 'WEIGHT,HEIGHT', 'FormulaCode' => 'WEIGHT / ((HEIGHT/100) * (HEIGHT/100))', 'Unit1' => 'kg/m2', 'Factor' => '', 'Unit2' => '', 'Decimal' => '1', 'CreateDate' => "$now"]; + $this->db->table('testdefcal')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'EGFR', 'TestSiteName' => 'eGFR (CKD-EPI)', 'Type' => $vs[27]['CALC'], 'Description' => 'Estimated Glomerular Filtration Rate', 'SeqScr' => '20', 'SeqRpt' => '20', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'FormulaInput' => 'CREA,AGE,GENDER', 'FormulaCode' => 'CKD_EPI(CREA,AGE,GENDER)', 'Unit1' => 'mL/min/1.73m2', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'CreateDate' => "$now"]; + $this->db->table('testdefcal')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'LDLCALC', 'TestSiteName' => 'LDL Cholesterol (Calculated)', 'Type' => $vs[27]['CALC'], 'Description' => 'Friedewald formula: TC - HDL - (TG/5)', 'SeqScr' => '21', 'SeqRpt' => '21', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][0], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '2', 'DepartmentID' => '2', 'FormulaInput' => 'CHOL,HDL,TG', 'FormulaCode' => 'CHOL - HDL - (TG/5)', 'Unit1' => 'mg/dL', 'Factor' => '', 'Unit2' => '', 'Decimal' => '0', 'CreateDate' => "$now"]; + $this->db->table('testdefcal')->insert($data); + + // ======================================== + // GROUP TYPE - Panel/Profile Tests + // ======================================== + $data = ['SiteID' => '1', 'TestSiteCode' => 'CBC', 'TestSiteName' => 'Complete Blood Count', 'Type' => $vs[27]['GROUP'], 'Description' => 'Darah Lengkap', 'SeqScr' => '50', 'SeqRpt' => '50', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $cbcID = $this->db->insertID(); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'LIPID', 'TestSiteName' => 'Lipid Profile', 'Type' => $vs[27]['GROUP'], 'Description' => 'Profil Lipid', 'SeqScr' => '51', 'SeqRpt' => '51', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $lipidID = $this->db->insertID(); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'LFT', 'TestSiteName' => 'Liver Function Test', 'Type' => $vs[27]['GROUP'], 'Description' => 'Fungsi Hati', 'SeqScr' => '52', 'SeqRpt' => '52', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $lftID = $this->db->insertID(); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'RFT', 'TestSiteName' => 'Renal Function Test', 'Type' => $vs[27]['GROUP'], 'Description' => 'Fungsi Ginjal', 'SeqScr' => '53', 'SeqRpt' => '53', 'IndentLeft' => '0', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $rftID = $this->db->insertID(); + + // Urinalysis Tests (with valueset result type) + $data = ['SiteID' => '1', 'TestSiteCode' => 'UCOLOR', 'TestSiteName' => 'Urine Color', 'Type' => $vs[27]['TEST'], 'Description' => 'Warna Urine', 'SeqScr' => '31', 'SeqRpt' => '31', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '4', 'DepartmentID' => '4', 'ResultType' => $vs[43]['VSET'], 'RefType' => $vs[44]['VSET'], 'VSet' => '1001', 'SpcType' => $vs[15]['UR'], 'ReqQty' => '10', 'ReqQtyUnit' => 'mL', 'Unit1' => '', 'Factor' => '', 'Unit2' => '', 'Decimal' => '', 'Method' => 'Visual', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'UGLUC', 'TestSiteName' => 'Urine Glucose', 'Type' => $vs[27]['TEST'], 'Description' => 'Glukosa Urine', 'SeqScr' => '32', 'SeqRpt' => '32', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '4', 'DepartmentID' => '4', 'ResultType' => $vs[43]['VSET'], 'RefType' => $vs[44]['VSET'], 'VSet' => '1002', 'SpcType' => $vs[15]['UR'], 'ReqQty' => '10', 'ReqQtyUnit' => 'mL', 'Unit1' => '', 'Factor' => '', 'Unit2' => '', 'Decimal' => '', 'Method' => 'Dipstick', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'UPROT', 'TestSiteName' => 'Urine Protein', 'Type' => $vs[27]['TEST'], 'Description' => 'Protein Urine', 'SeqScr' => '33', 'SeqRpt' => '33', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '4', 'DepartmentID' => '4', 'ResultType' => $vs[43]['VSET'], 'RefType' => $vs[44]['VSET'], 'VSet' => '1003', 'SpcType' => $vs[15]['UR'], 'ReqQty' => '10', 'ReqQtyUnit' => 'mL', 'Unit1' => '', 'Factor' => '', 'Unit2' => '', 'Decimal' => '', 'Method' => 'Dipstick', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + + $data = ['SiteID' => '1', 'TestSiteCode' => 'PH', 'TestSiteName' => 'Urine pH', 'Type' => $vs[27]['TEST'], 'Description' => 'pH Urine', 'SeqScr' => '34', 'SeqRpt' => '34', 'IndentLeft' => '1', 'VisibleScr' => $vs[2][1], 'VisibleRpt' => $vs[2][1], 'CountStat' => $vs[2][1], 'CreateDate' => "$now"]; + $this->db->table('testdefsite')->insert($data); + $testSiteID = $this->db->insertID(); + $data = ['SiteID' => '1', 'TestSiteID' => $testSiteID, 'DisciplineID' => '4', 'DepartmentID' => '4', 'ResultType' => $vs[43]['NMRIC'], 'RefType' => $vs[44]['RANGE'], 'VSet' => '', 'SpcType' => $vs[15]['UR'], 'ReqQty' => '10', 'ReqQtyUnit' => 'mL', 'Unit1' => '', 'Factor' => '', 'Unit2' => '', 'Decimal' => '1', 'Method' => 'Dipstick', 'CreateDate' => "$now"]; + $this->db->table('testdeftech')->insert($data); + } } \ No newline at end of file diff --git a/public/docs/20251212001-database_design_review_sonnet.md b/docs/20251212001-database_design_review_sonnet.md similarity index 100% rename from public/docs/20251212001-database_design_review_sonnet.md rename to docs/20251212001-database_design_review_sonnet.md diff --git a/public/docs/20251212002-database_design_review_opus.md b/docs/20251212002-database_design_review_opus.md similarity index 100% rename from public/docs/20251212002-database_design_review_opus.md rename to docs/20251212002-database_design_review_opus.md diff --git a/docs/20251216002-Test_OrderTest_RefRange_schema_redesign_proposal.md b/docs/20251216002-Test_OrderTest_RefRange_schema_redesign_proposal.md new file mode 100644 index 0000000..30b79d3 --- /dev/null +++ b/docs/20251216002-Test_OrderTest_RefRange_schema_redesign_proposal.md @@ -0,0 +1,432 @@ +# Database Schema Redesign Proposal: Test, OrderTest & RefRange Modules + +**Date:** 2025-12-16 +**Status:** Draft / Proposal +**Author:** Development Team +**Purpose:** Propose cleaner, more maintainable table structure + +--- + +## The Problem: Current Design Issues + +### 1. Test Module - Confusing Table Split + +**Current Structure:** +``` +testdefsite → Basic test info (code, name, description) +testdeftech → Technical info (result type, units, specimen) +testdefcal → Calculation formula +testgrp → Test grouping/panels +testmap → External system mapping +``` + +**Issues:** +| Problem | Description | +|:--------|:------------| +| ❌ Artificial separation | `testdefsite` and `testdeftech` are 1:1 relationship - why separate them? | +| ❌ Confusing naming | "def" prefix is redundant, "site" suffix is misleading | +| ❌ Redundant columns | `SiteID`, `DisciplineID`, `DepartmentID` duplicated across tables | +| ❌ Hard to query | Need multiple JOINs just to get basic test info | + +--- + +### 2. OrderTest Module - Unnecessary Normalization + +**Current Structure:** +``` +ordertest → Main order +ordercom → Comments (separate table) +orderatt → Attachments (separate table) +orderstatus → Status history (separate table) +``` + +**Issues:** +| Problem | Description | +|:--------|:------------| +| ❌ Over-normalized | Comments/attachments could be JSON or simpler structure | +| ❌ Status as separate table | If you only need current status, this adds complexity | +| ❌ Missing link | No link between order and actual tests ordered | + +--- + +### 3. RefRange Module - Too Many Similar Tables + +**Current Structure:** +``` +refnum → Numeric ranges (Low, High, Critical) +refthold → Threshold (single cutoff value) +reftxt → Text reference +refvset → Value set reference +``` + +**Issues:** +| Problem | Description | +|:--------|:------------| +| ❌ 4 tables for same concept | All are "reference ranges" with slight variations | +| ❌ Duplicated columns | Same columns repeated: TestSiteID, SpcType, Sex, AgeStart, AgeEnd | +| ❌ Hard to maintain | Adding a new field means updating 4 tables | + +--- + +## Proposed Redesign + +### Part A: Test Module - Consolidated Design + +**BEFORE (5 tables):** +``` +testdefsite + testdeftech + testdefcal + testgrp + testmap +``` + +**AFTER (3 tables):** +``` +tests → All test definition in ONE table +test_panels → Panel/group membership +test_mappings → External system mapping +``` + +#### A1. `tests` (Consolidated Test Definition) + +Merge `testdefsite`, `testdeftech`, and `testdefcal` into ONE table: + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ tests │ +├─────────────────────────────────────────────────────────────────┤ +│ id INT UNSIGNED PK AUTO_INCREMENT │ +│ site_id INT UNSIGNED -- Which lab site │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Basic Info (from testdefsite) -- │ +│ code VARCHAR(10) -- Test code │ +│ name VARCHAR(100) -- Test name │ +│ description VARCHAR(255) │ +│ test_type ENUM('single','panel','calculated') │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Technical Info (from testdeftech) -- │ +│ discipline_id INT UNSIGNED -- Chemistry, Hematology │ +│ department_id INT UNSIGNED │ +│ result_type ENUM('numeric','text','coded') │ +│ specimen_type VARCHAR(20) │ +│ specimen_qty DECIMAL(10,2) │ +│ specimen_unit VARCHAR(20) │ +│ unit VARCHAR(20) -- Result unit │ +│ decimal_places TINYINT │ +│ method VARCHAR(100) │ +│ expected_tat INT -- Turnaround time (mins) │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Calculated Test Info (from testdefcal) -- │ +│ formula TEXT -- NULL if not calculated │ +│ formula_inputs JSON -- List of input test IDs │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Display Order -- │ +│ sort_order_screen INT │ +│ sort_order_report INT │ +│ visible_screen BOOLEAN DEFAULT 1 │ +│ visible_report BOOLEAN DEFAULT 1 │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Audit -- │ +│ created_at DATETIME │ +│ updated_at DATETIME │ +│ deleted_at DATETIME -- Soft delete │ +└─────────────────────────────────────────────────────────────────┘ +``` + +**Benefits:** +- ✅ One query to get all test info +- ✅ No redundant columns +- ✅ Clear naming +- ✅ `test_type` tells you if it's a panel or calculated test + +--- + +#### A2. `test_panels` (Panel Membership) + +For tests that are panels (groups of other tests): + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ test_panels │ +├─────────────────────────────────────────────────────────────────┤ +│ id INT UNSIGNED PK AUTO_INCREMENT │ +│ panel_test_id INT UNSIGNED FK → tests.id -- The panel │ +│ member_test_id INT UNSIGNED FK → tests.id -- Member test │ +│ sort_order INT │ +│ created_at DATETIME │ +└─────────────────────────────────────────────────────────────────┘ +``` + +**Example:** CBC panel contains: WBC, RBC, HGB, HCT, PLT +``` +panel_test_id=1 (CBC), member_test_id=2 (WBC) +panel_test_id=1 (CBC), member_test_id=3 (RBC) +panel_test_id=1 (CBC), member_test_id=4 (HGB) +... +``` + +--- + +#### A3. `test_mappings` (External System Mapping) + +Keep this separate (good design): + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ test_mappings │ +├─────────────────────────────────────────────────────────────────┤ +│ id INT UNSIGNED PK AUTO_INCREMENT │ +│ test_id INT UNSIGNED FK → tests.id │ +│ external_system VARCHAR(50) -- 'LIS', 'HIS', 'Analyzer'│ +│ external_code VARCHAR(50) -- Code in that system │ +│ external_name VARCHAR(100) │ +│ connection_id INT UNSIGNED -- Which connection/device │ +│ direction ENUM('inbound','outbound','both') │ +│ created_at DATETIME │ +│ updated_at DATETIME │ +└─────────────────────────────────────────────────────────────────┘ +``` + +--- + +### Part B: Reference Range - Unified Design + +**BEFORE (4 tables):** +``` +refnum + refthold + refvset + reftxt +``` + +**AFTER (1 table):** +``` +reference_ranges → All reference types in ONE table +``` + +#### B1. `reference_ranges` (Unified) + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ reference_ranges │ +├─────────────────────────────────────────────────────────────────┤ +│ id INT UNSIGNED PK AUTO_INCREMENT │ +│ test_id INT UNSIGNED FK → tests.id │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Criteria (same across all old tables) -- │ +│ specimen_type VARCHAR(20) │ +│ sex ENUM('M','F','A') -- A = All/Any │ +│ age_min INT -- In days for precision │ +│ age_max INT -- In days │ +│ age_unit ENUM('days','months','years') │ +│ criteria VARCHAR(100) -- Additional criteria │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Reference Type -- │ +│ ref_type ENUM('numeric','threshold','text','coded') │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Numeric Range (when ref_type = 'numeric') -- │ +│ critical_low DECIMAL(15,4) │ +│ normal_low DECIMAL(15,4) │ +│ normal_high DECIMAL(15,4) │ +│ critical_high DECIMAL(15,4) │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Threshold (when ref_type = 'threshold') -- │ +│ threshold_value DECIMAL(15,4) │ +│ threshold_operator ENUM('<','<=','>','>=','=') │ +│ below_text VARCHAR(50) -- "Negative", "Normal" │ +│ above_text VARCHAR(50) -- "Positive", "Abnormal" │ +│ gray_zone_low DECIMAL(15,4) │ +│ gray_zone_high DECIMAL(15,4) │ +│ gray_zone_text VARCHAR(50) -- "Equivocal" │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Text/Coded (when ref_type = 'text' or 'coded') -- │ +│ reference_text TEXT -- Expected values or desc │ +│ value_set JSON -- For coded: list of valid│ +├─────────────────────────────────────────────────────────────────┤ +│ -- Audit -- │ +│ created_at DATETIME │ +│ updated_at DATETIME │ +└─────────────────────────────────────────────────────────────────┘ +``` + +**Benefits:** +- ✅ One table instead of 4 +- ✅ Easy to add new reference types +- ✅ Single query with `ref_type` filter +- ✅ No duplicated criteria columns + +--- + +### Part C: OrderTest - Cleaner Design + +**BEFORE (4 tables):** +``` +ordertest + ordercom + orderatt + orderstatus +``` + +**AFTER (3 tables):** +``` +orders → Main order with current status +order_tests → Individual tests in the order (MISSING before!) +order_history → Status changes + comments combined +``` + +#### C1. `orders` (Main Order) + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ orders │ +├─────────────────────────────────────────────────────────────────┤ +│ id INT UNSIGNED PK AUTO_INCREMENT │ +│ order_number VARCHAR(30) UNIQUE -- Display order ID │ +│ accession_number VARCHAR(30) -- Lab accession │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Patient & Visit -- │ +│ patient_id INT UNSIGNED FK → patients.id │ +│ visit_id INT UNSIGNED FK → visits.id │ +│ site_id INT UNSIGNED │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Order Details -- │ +│ priority ENUM('routine','urgent','stat') │ +│ status ENUM('pending','collected','received', │ +│ 'in_progress','completed','cancelled') │ +│ ordered_by INT UNSIGNED -- Doctor/User ID │ +│ ordered_at DATETIME │ +│ collected_at DATETIME │ +│ received_at DATETIME │ +│ completed_at DATETIME │ +├─────────────────────────────────────────────────────────────────┤ +│ -- Audit -- │ +│ created_at DATETIME │ +│ updated_at DATETIME │ +│ deleted_at DATETIME │ +└─────────────────────────────────────────────────────────────────┘ +``` + +--- + +#### C2. `order_tests` (Tests in Order) — **NEW TABLE!** + +**This was MISSING in original design!** How do you know what tests are in an order? + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ order_tests │ +├─────────────────────────────────────────────────────────────────┤ +│ id INT UNSIGNED PK AUTO_INCREMENT │ +│ order_id INT UNSIGNED FK → orders.id │ +│ test_id INT UNSIGNED FK → tests.id │ +├─────────────────────────────────────────────────────────────────┤ +│ status ENUM('ordered','in_progress','resulted', │ +│ 'verified','cancelled') │ +│ result_value VARCHAR(255) -- The actual result │ +│ result_flag ENUM('N','L','H','LL','HH','A') -- Normal/Abn│ +│ result_comment TEXT │ +│ resulted_by INT UNSIGNED -- Tech who entered result │ +│ resulted_at DATETIME │ +│ verified_by INT UNSIGNED -- Supervisor who verified │ +│ verified_at DATETIME │ +├─────────────────────────────────────────────────────────────────┤ +│ created_at DATETIME │ +│ updated_at DATETIME │ +└─────────────────────────────────────────────────────────────────┘ +``` + +--- + +#### C3. `order_history` (Combined Audit Trail) + +Combine `ordercom`, `orderatt`, `orderstatus` into one audit table: + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ order_history │ +├─────────────────────────────────────────────────────────────────┤ +│ id INT UNSIGNED PK AUTO_INCREMENT │ +│ order_id INT UNSIGNED FK → orders.id │ +│ order_test_id INT UNSIGNED FK → order_tests.id (nullable) │ +├─────────────────────────────────────────────────────────────────┤ +│ event_type ENUM('status_change','comment','attachment', │ +│ 'result_edit','verification') │ +│ old_value TEXT │ +│ new_value TEXT │ +│ comment TEXT │ +│ attachment_path VARCHAR(255) -- For attachments │ +├─────────────────────────────────────────────────────────────────┤ +│ created_by INT UNSIGNED │ +│ created_at DATETIME │ +└─────────────────────────────────────────────────────────────────┘ +``` + +--- + +## Summary: Before vs After + +| Module | Before | After | Change | +|:-------|:-------|:------|:-------| +| **Test** | 5 tables | 3 tables | -2 tables | +| **RefRange** | 4 tables | 1 table | -3 tables | +| **OrderTest** | 4 tables | 3 tables | -1 table, +1 essential table | +| **Total** | 13 tables | 7 tables | **-6 tables** | + +### New ERD + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ PROPOSED ERD │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────┐ ┌──────────────┐ ┌─────────────────┐ │ +│ │ tests │◄────────│ test_panels │ │ test_mappings │ │ +│ │ (All tests) │ │ (Panel→Test) │ │ (Ext. systems) │ │ +│ └──────┬──────┘ └──────────────┘ └─────────────────┘ │ +│ │ │ +│ │ 1:N │ +│ ▼ │ +│ ┌──────────────────┐ │ +│ │ reference_ranges │ (All ref types in one table) │ +│ └──────────────────┘ │ +│ │ +│ │ +│ ┌──────────┐ 1:N ┌─────────────┐ 1:N ┌───────────────┐ │ +│ │ patients │◄──────────│ orders │◄──────────│ order_history │ │ +│ └──────────┘ └──────┬──────┘ └───────────────┘ │ +│ │ │ +│ │ 1:N │ +│ ▼ │ +│ ┌─────────────┐ │ +│ │ order_tests │ (What tests are in order) │ +│ └──────┬──────┘ │ +│ │ │ +│ │ N:1 │ +│ ▼ │ +│ ┌─────────────┐ │ +│ │ tests │ │ +│ └─────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## Migration Strategy + +Since this is a major restructure: + +1. **Create new migration files** (don't modify old ones) +2. **Write data migration script** to move data from old to new tables +3. **Update Models, Controllers, Views** to use new table names +4. **Test thoroughly** before dropping old tables + +--- + +## Questions for Discussion + +1. Is storing `formula` as TEXT acceptable, or need a more structured approach? +2. Should `order_history` store ALL changes, or just important ones? +3. Any additional fields needed that I missed? + +--- + +## Next Steps + +1. ✅ Review and approve this proposal +2. 🔲 Create new migration files +3. 🔲 Write data migration scripts +4. 🔲 Update Models to use new tables +5. 🔲 Update Controllers and Services +6. 🔲 Deprecate old tables diff --git a/docs/api_contract_patient_registration.md b/docs/api_contract_patient_registration.md new file mode 100644 index 0000000..721f63c --- /dev/null +++ b/docs/api_contract_patient_registration.md @@ -0,0 +1,222 @@ +# Patient Registration API Contract + +**Version:** 1.0.0 +**Base URL:** `/api/v1` + +--- + +## 1. Patients (`/patients`) + +### GET /patients +Retrieve list of patients. + +**Query Parameters:** +- `page` (int, default: 1) +- `limit` (int, default: 20) +- `search` (string) - Search by name, MRN (PatientID), or phone. + +**Response (200 OK):** +```json +{ + "data": [ + { + "InternalPID": 1001, + "PatientID": "MRN-2025-0001", + "NameFirst": "John", + "NameLast": "Doe", + "Gender": 1, + "Birthdate": "1990-05-15", + "MobilePhone": "+1234567890", + "EmailAddress1": "john.doe@example.com" + } + ] +} +``` + +--- + +### POST /patients +Register a new patient. + +**Request Body:** +```json +{ + "PatientID": "MRN-2025-0002", + "AlternatePID": "ALT-123", // Optional + "Prefix": "Mr.", // Optional + "NameFirst": "Jane", + "NameMiddle": "Marie", // Optional + "NameLast": "Doe", + "NameMaiden": null, // Optional + "Suffix": null, // Optional + "Gender": 2, // 1=Male, 2=Female (example) + "Birthdate": "1992-08-20", + "PlaceOfBirth": "New York", // Optional + "Street_1": "123 Main St", + "Street_2": "Apt 4B", // Optional + "City": "Metropolis", + "Province": "NY", + "ZIP": "10001", + "Phone": "555-0100", // Optional + "MobilePhone": "555-0199", + "EmailAddress1": "jane.doe@example.com", + "MaritalStatus": 1, // 1=Single, 2=Married, etc. + "Religion": 1, // Optional ID + "Race": 1, // Optional ID + "Citizenship": "USA" // Optional +} +``` + +**Response (201 Created):** +```json +{ + "message": "Patient created successfully", + "data": { + "InternalPID": 1002, + "PatientID": "MRN-2025-0002", + "CreateDate": "2025-12-16T10:00:00Z" + } +} +``` + +--- + +### GET /patients/{id} +Get full details of a specific patient. + +**Response (200 OK):** +```json +{ + "data": { + "InternalPID": 1001, + "PatientID": "MRN-2025-0001", + "NameFirst": "John", + "NameLast": "Doe", + "identifiers": [ + { + "PatIdtID": 5, + "IdentifierType": "Passport", + "Identifier": "A12345678" + } + ], + "relations": [], + "comments": [] + } +} +``` + +--- + +### PUT /patients/{id} +Update patient demographics. + +**Request Body:** +```json +{ + "NameLast": "Smith", + "MobilePhone": "555-9999", + "EmailAddress1": "john.smith@example.com" +} +``` + +**Response (200 OK):** +```json +{ + "message": "Patient updated successfully", + "data": { "InternalPID": 1001 } +} +``` + +--- + +## 2. Patient Identifiers (`/patients/{id}/identifiers`) + +### POST /patients/{id}/identifiers +Add an identifier (SSN, Passport, Driver's License) to a patient. + +**Request Body:** +```json +{ + "IdentifierType": "SSN", + "Identifier": "000-11-2222", + "EffectiveDate": "2020-01-01", // Optional + "ExpirationDate": "2030-01-01" // Optional +} +``` + +**Response (201 Created):** +```json +{ + "message": "Identifier added", + "data": { "PatIdtID": 15 } +} +``` + +--- + +## 3. Patient Comments (`/patients/{id}/comments`) + +### POST /patients/{id}/comments +Add a comment to a patient record. + +**Request Body:** +```json +{ + "Comment": "Patient requests wheelchair assistance upon arrival." +} +``` + +**Response (201 Created):** +```json +{ + "message": "Comment added", + "data": { "PatComID": 42 } +} +``` + +--- + +## 4. Patient Relations (`/patients/{id}/relations`) +*Note: Pending Schema Update (Currently `patrelation` is missing columns)* + +### POST /patients/{id}/relations +Add a family member or emergency contact. + +**Request Body:** +```json +{ + "RelatedPID": 1050, // If relation is also a patient + "RelationType": "Spouse", // Requires schema update to store this + "IsEmergency": true // Requires schema update +} +``` + +**Response (201 Created):** +```json +{ + "message": "Relation added", + "data": { "PatRelID": 8 } +} +``` + +--- + +## 5. Patient Attachments (`/patients/{id}/attachments`) + +### POST /patients/{id}/attachments +Upload a file for a patient (insurance card, ID scan). + +**Request (Multipart/Form-Data):** +- `file`: (Binary File) +- `Address`: (string, optional description or file path reference) + +**Response (201 Created):** +```json +{ + "message": "File uploaded", + "data": { + "PatAttID": 99, + "Address": "/uploads/patients/1001/scan_id.pdf" + } +} +```