diff --git a/app/Controllers/Patient.php b/app/Controllers/Patient.php index f92f387..dd59e2e 100644 --- a/app/Controllers/Patient.php +++ b/app/Controllers/Patient.php @@ -251,116 +251,253 @@ class Patient extends Controller { // OK - Done + // public function update($InternalPID = null) { + + // try { + + // $InternalPID = (int) $InternalPID; + + // $input = $this->request->getJSON(true); + + // $dataPatient = [ + // "PatientID" => $input['PatientID'] ?? null, + // "AlternatePID" => $input['AlternatePID'] ?? null, + // "Prefix" => $input['Prefix'] ?? null, + // "NameFirst" => $input['NameFirst'] ?? null, + // "NameMiddle" => $input['NameMiddle'] ?? null, + // "NameMaiden" => $input['NameMaiden'] ?? null, + // "NameLast" => $input['NameLast'] ?? null, + // "Suffix" => $input['Suffix'] ?? null, + // "NameAlias" => $input['NameAlias'] ?? null, + // "Gender" => isset($input['Gender']) ? (int) $input['Gender'] : null, + // "PlaceOfBirth" => $input['PlaceOfBirth'] ?? null, + // "Birthdate" => $input['Birthdate'] ?: null, + // "Street_1" => $input['Street_1'] ?? null, + // "Street_2" => $input['Street_2'] ?? null, + // "Street_3" => $input['Street_3'] ?? null, + // "City" => $input['City'] ?? null, + // "Province" => $input['Province'] ?? null, + // "ZIP" => $input['ZIP'] ?? null, + // "EmailAddress1" => $input['EmailAddress1'] ?? null, + // "EmailAddress2" => $input['EmailAddress2'] ?? null, + // "Phone" => $input['Phone'] ?? null, + // "MobilePhone" => $input['MobilePhone'] ?? null, + // "RaceID" => isset($input['RaceID']) ? (int) $input['RaceID'] : null, + // "IntCountryID" => isset($input['IntCountryID']) ? (int) $input['IntCountryID'] : null, + // "MaritalStatus" => $input['MaritalStatus'] ?? null, + // "ReligionID" => isset($input['ReligionID']) ? (int) $input['ReligionID'] : null, + // "EthnicID" => isset($input['EthnicID']) ? (int) $input['EthnicID'] : null, + // "Citizenship" => $input['Citizenship'] ?? null, + // "DeathIndicator" => isset($input['DeathIndicator']) ? (int) $input['DeathIndicator'] : null, + // 'DeathDateTime' => $input['DeathDateTime'] ?: null, + // "CreateDate" => date('Y-m-d H:i:s'), + // "DelDate" => null, + // // Linkto + // // Mother + // // AccountNumber + // ]; + + // $rulesDataPatient = [ + // 'PatientID' => 'required|is_unique[patient.PatientID]|max_length[50]', + // 'AlternatePID' => 'permit_empty|max_length[50]', + // 'NameFirst' => 'required|min_length[1]|max_length[255]', + // 'EmailAddress1' => 'required|is_unique[patient.EmailAddress1]', + // 'DeathIndicator' => 'required', + // 'Gender' => 'required' + // ]; + + // $dataPatidt = [ + // "IdentifierType" => $input['IdentifierType'] ?? null, + // "Identifier" => $input['Identifier'] ?? null, + // "CreateDate" => date('Y-m-d H:i:s'), + // ]; + + // $rulesDataPatidt = [ + // 'Identifier' => 'required|is_unique[patidt.Identifier]', + // ]; + + // $existingPatient = $this->db->table('patient')->where('InternalPID', $InternalPID)->get()->getRowArray(); + + // // Mengembalikan 404 + // if (empty($existingPatient)) { + // return $this->failNotFound('Patient with ID ' . $InternalPID . ' not found.'); + // } + + // // Request dari client tidak valid atau tidak bisa diproses oleh server - 400 + // if (!$this->validateData($dataPatient, $rules)) { + // return $this->failValidationErrors($this->validator->getErrors()); + // } + + // $allowedUpdateFields = [ + // 'NameFirst', 'NameLast', 'NameMiddle', + // 'PatientID', 'AlternatePID', 'Birthdate', 'PlaceOfBirth', + // 'Street_1', 'Street_2', 'Street_3', 'City', 'Province', 'ZIP', + // 'EmailAddress1', 'EmailAddress2', 'Phone', 'MobilePhone', 'Mother', 'AccountNumber' + // ]; + + // $datas = []; + // foreach ($allowedUpdateFields as $field) { + // if (isset($dataPatient[$field])) { + // $datas[$field] = $dataPatient[$field]; + // } + // } + + // if (empty($dataPatient)) { + // return $this->failValidationError('No data provided for update.'); + // } + + // $this->db->table('patient')->where('InternalPID', $InternalPID)->update($dataPatient); + + // // Sukses & Insert = 201 - Kirim data patient ID + // return $this->respondCreated([ + // 'status' => 'success', + // 'message' => 'Patient updated successfully', + // 'data' => $dataPatient + // ], 201); + + // } catch (\Exception $e) { + // // Error Server = 500 + // return $this->failServerError('Something went wrong '.$e->getMessage()); + // } + // } public function update($InternalPID = null) { - try { - - $InternalPID = (int) $InternalPID; + if (!$InternalPID || !is_numeric($InternalPID)) { + return $this->respond(['status' => 'error', 'message' => 'Invalid or missing InternalPID'], 400); + } $input = $this->request->getJSON(true); + if (!$input) { + return $this->respond(['status' => 'error', 'message' => 'Invalid JSON input'], 400); + } + // Cek apakah data patient ada + $patient = $this->db->table('patient')->where('InternalPID', $InternalPID)->get()->getRowArray(); + if (!$patient) { + return $this->respond(['status' => 'error', 'message' => 'Patient not found'], 404); + } + + $LinkTo = null; + if (!empty($input['LinkTo']) && is_array($input['LinkTo'])) { + $ids = []; + foreach ($input['LinkTo'] as $row) { + if (isset($row['InternalPID']) && is_numeric($row['InternalPID'])) { + $ids[] = (int)$row['InternalPID']; + } + } + $LinkTo = implode(',', $ids); + } + + // Data untuk update patient $dataPatient = [ - "PatientID" => $input['PatientID'] ?? null, - "AlternatePID" => $input['AlternatePID'] ?? null, - "Prefix" => $input['Prefix'] ?? null, - "NameFirst" => $input['NameFirst'] ?? null, - "NameMiddle" => $input['NameMiddle'] ?? null, - "NameMaiden" => $input['NameMaiden'] ?? null, - "NameLast" => $input['NameLast'] ?? null, - "Suffix" => $input['Suffix'] ?? null, - "NameAlias" => $input['NameAlias'] ?? null, - "Gender" => isset($input['Gender']) ? (int) $input['Gender'] : null, - "PlaceOfBirth" => $input['PlaceOfBirth'] ?? null, - "Birthdate" => $input['Birthdate'] ?: null, - "Street_1" => $input['Street_1'] ?? null, - "Street_2" => $input['Street_2'] ?? null, - "Street_3" => $input['Street_3'] ?? null, - "City" => $input['City'] ?? null, - "Province" => $input['Province'] ?? null, - "ZIP" => $input['ZIP'] ?? null, - "EmailAddress1" => $input['EmailAddress1'] ?? null, - "EmailAddress2" => $input['EmailAddress2'] ?? null, - "Phone" => $input['Phone'] ?? null, - "MobilePhone" => $input['MobilePhone'] ?? null, - "RaceID" => isset($input['RaceID']) ? (int) $input['RaceID'] : null, - "IntCountryID" => isset($input['IntCountryID']) ? (int) $input['IntCountryID'] : null, - "MaritalStatus" => $input['MaritalStatus'] ?? null, - "ReligionID" => isset($input['ReligionID']) ? (int) $input['ReligionID'] : null, - "EthnicID" => isset($input['EthnicID']) ? (int) $input['EthnicID'] : null, - "Citizenship" => $input['Citizenship'] ?? null, - "DeathIndicator" => isset($input['DeathIndicator']) ? (int) $input['DeathIndicator'] : null, - 'DeathDateTime' => $input['DeathDateTime'] ?: null, - "CreateDate" => date('Y-m-d H:i:s'), - "DelDate" => null, - // Linkto - // Mother - // AccountNumber + "PatientID" => $input['PatientID'] ?? $patient['PatientID'], + "AlternatePID" => $input['AlternatePID'] ?? $patient['AlternatePID'], + "Prefix" => $input['Prefix'] ?? $patient['Prefix'], + "NameFirst" => $input['NameFirst'] ?? $patient['NameFirst'], + "NameMiddle" => $input['NameMiddle'] ?? $patient['NameMiddle'], + "NameMaiden" => $input['NameMaiden'] ?? $patient['NameMaiden'], + "NameLast" => $input['NameLast'] ?? $patient['NameLast'], + "Suffix" => $input['Suffix'] ?? $patient['Suffix'], + "NameAlias" => $input['NameAlias'] ?? $patient['NameAlias'], + "Gender" => isset($input['Gender']) && is_numeric($input['Gender']) ? (int)$input['Gender'] : $patient['Gender'], + "PlaceOfBirth" => $input['PlaceOfBirth'] ?? $patient['PlaceOfBirth'], + "Birthdate" => $input['Birthdate'] ?: $patient['Birthdate'], + "Street_1" => $input['Street_1'] ?? $patient['Street_1'], + "Street_2" => $input['Street_2'] ?? $patient['Street_2'], + "Street_3" => $input['Street_3'] ?? $patient['Street_3'], + "City" => $input['City'] ?? $patient['City'], + "Province" => $input['Province'] ?? $patient['Province'], + "ZIP" => $input['ZIP'] ?? $patient['ZIP'], + "EmailAddress1" => $input['EmailAddress1'] ?? $patient['EmailAddress1'], + "EmailAddress2" => $input['EmailAddress2'] ?? $patient['EmailAddress2'], + "Phone" => $input['Phone'] ?? $patient['Phone'], + "MobilePhone" => $input['MobilePhone'] ?? $patient['MobilePhone'], + "RaceID" => isset($input['RaceID']) && is_numeric($input['RaceID']) ? (int)$input['RaceID'] : $patient['RaceID'], + "IntCountryID" => isset($input['IntCountryID']) && is_numeric($input['IntCountryID']) ? (int)$input['IntCountryID'] : $patient['IntCountryID'], + "MaritalStatus" => $input['MaritalStatus'] ?? $patient['MaritalStatus'], + "ReligionID" => isset($input['ReligionID']) && is_numeric($input['ReligionID']) ? (int)$input['ReligionID'] : $patient['ReligionID'], + "EthnicID" => isset($input['EthnicID']) && is_numeric($input['EthnicID']) ? (int)$input['EthnicID'] : $patient['EthnicID'], + "Citizenship" => $input['Citizenship'] ?? $patient['Citizenship'], + "DeathIndicator" => isset($input['DeathIndicator']) && is_numeric($input['DeathIndicator']) ? (int)$input['DeathIndicator'] : $patient['DeathIndicator'], + 'DeathDateTime' => $input['DeathDateTime'] ?: $patient['DeathDateTime'], + "LinkTo" => $LinkTo, ]; + // Atur aturan validasi dengan pengecualian is_unique untuk InternalPID ini $rulesDataPatient = [ - 'PatientID' => 'required|is_unique[patient.PatientID]|max_length[50]', + 'PatientID' => "required|max_length[50]|is_unique[patient.PatientID,InternalPID,{$InternalPID}]", 'AlternatePID' => 'permit_empty|max_length[50]', 'NameFirst' => 'required|min_length[1]|max_length[255]', - 'EmailAddress1' => 'required|is_unique[patient.EmailAddress1]', + 'EmailAddress1' => "required|is_unique[patient.EmailAddress1,InternalPID,{$InternalPID}]", 'DeathIndicator' => 'required', 'Gender' => 'required' ]; + // Ambil data patidt + $patidt = $this->db->table('patidt')->where('InternalPID', $InternalPID)->get()->getRowArray(); $dataPatidt = [ - "IdentifierType" => $input['IdentifierType'] ?? null, - "Identifier" => $input['Identifier'] ?? null, - "CreateDate" => date('Y-m-d H:i:s'), + "IdentifierType" => $input['Identity']['IdentifierType'] ?? ($patidt['IdentifierType'] ?? null), + "Identifier" => $input['Identity']['Identifier'] ?? ($patidt['Identifier'] ?? null), ]; $rulesDataPatidt = [ - 'Identifier' => 'required|is_unique[patidt.Identifier]', - ]; - - $existingPatient = $this->db->table('patient')->where('InternalPID', $InternalPID)->get()->getRowArray(); - - // Mengembalikan 404 - if (empty($existingPatient)) { - return $this->failNotFound('Patient with ID ' . $InternalPID . ' not found.'); - } - - // Request dari client tidak valid atau tidak bisa diproses oleh server - 400 - if (!$this->validateData($dataPatient, $rules)) { - return $this->failValidationErrors($this->validator->getErrors()); - } - - $allowedUpdateFields = [ - 'NameFirst', 'NameLast', 'NameMiddle', - 'PatientID', 'AlternatePID', 'Birthdate', 'PlaceOfBirth', - 'Street_1', 'Street_2', 'Street_3', 'City', 'Province', 'ZIP', - 'EmailAddress1', 'EmailAddress2', 'Phone', 'MobilePhone', 'Mother', 'AccountNumber' + 'Identifier' => "required|is_unique[patidt.Identifier,InternalPID,{$InternalPID}]" ]; - $datas = []; - foreach ($allowedUpdateFields as $field) { - if (isset($dataPatient[$field])) { - $datas[$field] = $dataPatient[$field]; - } + // Validasi + if (!$this->validateData($dataPatient, $rulesDataPatient)) { + return $this->respond([ + 'status' => 'error', + 'message' => 'Validation failed (patient)', + 'errors' => $this->validator->getErrors() + ], 400); } - if (empty($dataPatient)) { - return $this->failValidationError('No data provided for update.'); + if (!$this->validateData($dataPatidt, $rulesDataPatidt)) { + return $this->respond([ + 'status' => 'error', + 'message' => 'Validation failed (patidt)', + 'errors' => $this->validator->getErrors() + ], 400); } + // Transaksi update + $this->db->transStart(); + $this->db->table('patient')->where('InternalPID', $InternalPID)->update($dataPatient); + $dbError = $this->db->error(); + if (!empty($dbError['message'])) { + $this->db->transRollback(); + return $this->failServerError('Update patient failed: ' . $dbError['message']); + } - // Sukses & Insert = 201 - Kirim data patient ID - return $this->respondCreated([ - 'status' => 'success', + $this->db->table('patidt')->where('InternalPID', $InternalPID)->update($dataPatidt); + $dbError = $this->db->error(); + if (!empty($dbError['message'])) { + $this->db->transRollback(); + return $this->failServerError('Update patidt failed: ' . $dbError['message']); + } + + $this->db->transComplete(); + + if ($this->db->transStatus() === false) { + $dbError = $this->db->error(); + return $this->failServerError('Failed to update patient data (transaction rolled back): ' . ($dbError['message'] ?? 'Unknown error')); + } + + return $this->respond([ + 'status' => 'success', 'message' => 'Patient updated successfully', - 'data' => $dataPatient - ], 201); + 'data' => $InternalPID + ], 200); } catch (\Exception $e) { - // Error Server = 500 - return $this->failServerError('Something went wrong '.$e->getMessage()); - } + $this->db->transRollback(); + return $this->failServerError('Something went wrong: ' . $e->getMessage()); + } } + // OK - Done public function delete($InternalPID = null) {