patient done, pending patatt

This commit is contained in:
mahdahar 2025-10-01 15:36:55 +07:00
parent 750ccdee00
commit 67b1ffefad
2 changed files with 83 additions and 177 deletions

View File

@ -17,13 +17,12 @@ class Patient extends Controller {
$this->db = \Config\Database::connect();
$this->modelPatient = new PatientModel();
$this->rulesPatient = [
'PatientID' => 'required|is_unique[patient.PatientID]|max_length[50]',
'PatientID' => 'required|max_length[50]',
'AlternatePID' => 'permit_empty|max_length[50]',
'NameFirst' => 'required|min_length[1]|max_length[255]',
'EmailAddress1' => 'required|is_unique[patient.EmailAddress1]',
'EmailAddress1' => 'required',
'Gender' => 'required'
];
$this->rulesPatIdt = ['Identifier' => 'required|is_unique[patidt.Identifier]'];
}
public function index() {
@ -55,90 +54,14 @@ class Patient extends Controller {
public function create() {
$input = $this->request->getJSON(true);
if (!$this->validateData($input, $this->rulesPatient)) { return $this->validationError('patient', $this->validator->getErrors()); }
if (!$this->validateData($input, $this->rulesPatIdt)) { return $this->validationError('patidt', $this->validator->getErrors()); }
try {
$newInternalPID = $this->modelPatient->createPatient($input);
return $this->respondCreated([ 'status' => 'success', 'message' => 'data created successfully', 'data' => $newInternalPID]);
$InternalPID = $this->modelPatient->createPatient($input);
return $this->respondCreated([ 'status' => 'success', 'message' => "data $InternalPID created successfully" ]);
} catch (\Exception $e) {
return $this->failServerError('Something went wrong: ' . $e->getMessage());
}
}
// Setting up data
private function preparePatientData(array $input, string $mode = 'create'): array {
$LinkTo = null;
if (!empty($input['LinkTo'])) {
$ids = array_column($input['LinkTo'], 'InternalPID');
$LinkTo = implode(',', $ids);
}
$data = [
"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" => !empty($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,
"Custodian" => isset($input['Custodian']) ? (int)$input['Custodian'] : null,
"DelDate" => null,
"LinkTo" => $LinkTo
];
if(!empty($input['InternalPID'])) { $data["InternalPID"] = $input["InternalPID"]; }
return $data;
}
private function preparePatidtData(array $input ): array {
$data = [
"IdentifierType" => $input['Identity']['IdentifierType'] ?? null,
"Identifier" => $input['Identity']['Identifier'] ?? null,
];
return $data;
}
private function preparePatattData(array $input): array {
if (empty($input['Attachments'])) {
return [];
}
return array_map(function ($attachment) {
$row = [
"Address" => $attachment['Address'] ?? null,
];
return $row;
}, $input['Attachments']);
}
private function preparePatcomData(array $input): array {
$data = [
"Comment" => $input['Comment'] ?? null,
];
return $data;
}
private function validationError(string $context, array $errors) {
return $this->respond([
'status' => 'error',
@ -147,86 +70,13 @@ class Patient extends Controller {
], 400);
}
// Unit Testing Pass : On Progress
public function update() {
$input = $this->request->getJSON(true);
if (!$this->validateData($input, $this->rulesPatient)) { return $this->validationError('patient', $this->validator->getErrors()); }
try {
$input = $this->request->getJSON(true);
if (!$input) { return $this->respond(['status' => 'error', 'message' => 'Invalid JSON input'], 400); }
if (!$input["InternalPID"] || !is_numeric($input["InternalPID"])) { return $this->respond(['status' => 'error', 'message' => 'Invalid or missing InternalPID'], 400); }
$InternalPID = $input["InternalPID"];
$patient = $this->db->table('patient')->where('InternalPID', $InternalPID)->get()->getRowArray();
if (!$patient) { return $this->respond(['status' => 'error', 'message' => 'Patient not found'], 404); }
$dataPatient = $this->preparePatientData($input);
$dataPatIdt = $this->preparePatidtData($input);
$dataPatCom = $this->preparePatcomData($input);
$dataPatAtt = $this->preparePatattData($input);
// Validasi
if (!$this->validateData($dataPatient, $this->rulesPatient)) {
return $this->respond([
'status' => 'error',
'message' => 'Validation failed (patient)',
'errors' => $this->validator->getErrors()
], 400);
}
if (!$this->validateData($dataPatIdt, $this->rulesPatIdt)) {
return $this->respond([
'status' => 'error',
'message' => 'Validation failed (patidt)',
'errors' => $this->validator->getErrors()
], 400);
}
$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']);
}
$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']);
}
if (!empty($dataPatAtt)) {
foreach ($dataPatAtt as &$row) {
$row['InternalPID'] = $InternalPID;
}
$this->db->table('patatt')->upsertBatch($dataPatAtt);
$addresses = array_column($dataPatAtt, 'Address');
$this->db->table('patatt')->where('InternalPID', $InternalPID)->WhereNotIn('Address', $addresses)->update(['DelDate' => date('Y-m-d H:i:s')]);
} else {
$this->db->table('patatt')->where('InternalPID', $InternalPID)->update(['DelDate' => date('Y-m-d H:i:s')]);
}
if(!empty($dataPatcom['Comment'])) {
$dataPatcom['InternalPID'] = $InternalPID;
$this->db->table('patcom')->upsert($dataPatCom);
}
$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
], 200);
$InternalPID = $this->modelPatient->updatePatient($input);
return $this->respondCreated([ 'status' => 'success', 'message' => "data $InternalPID update successfully" ]);
} catch (\Exception $e) {
$this->db->transRollback();
return $this->failServerError('Something went wrong: ' . $e->getMessage());
}
}

View File

@ -64,37 +64,37 @@ class PatientModel extends Model {
if (empty($rows)) { return null; }
$patient = $rows[0];
unset($patient['Address']);
if (method_exists($this, 'transformPatientData')) { $patient = $this->transformPatientData($patient); }
// Default nested structures
$patient['Identity'] = null;
$patient['Attachments'] = [];
$patient['PatIdt'] = null;
$patient['PatAtt'] = [];
foreach ($rows as $row) {
if ($row['IdentifierType'] && $row['Identifier'] && !$patient['Identity']) {
$patient['Identity'] = [
if ($row['IdentifierType'] && $row['Identifier'] && !$patient['PatIdt']) {
$patient['PatIdt'] = [
'IdentifierType' => $row['IdentifierType'],
'Identifier' => $row['Identifier'],
];
}
if ($row['Address']) {
$patient['Attachments'][] = ['Address' => $row['Address']];
$patient['PatAtt'][] = ['Address' => $row['Address']];
}
}
if (empty($patient['Identity'])) { $patient['Identity'] = null; }
if (empty($patient['Attachments'])) { $patient['Attachments'] = null; }
if (empty($patient['PatIdt'])) { $patient['PatIdt'] = null; }
if (empty($patient['PatAtt'])) { $patient['PatAtt'] = null; }
return $patient;
}
public function createPatient($input) {
$db = \Config\Database::connect();
$patidt = $input['patidt'] ?? [];
$patatt = $input['patatt'] ?? [];
$patcom = $input['patcom'] ?? [];
$patidt = $input['PatIdt'] ?? [];
$patatt = $input['PatAtt'] ?? [];
$patcom['Comment'] = $input['Comment'] ?? [];
try {
$db->transStart();
@ -106,29 +106,85 @@ class PatientModel extends Model {
$db->table('patidt')->insert($patidt);
}
if (!empty($patcom['Comment'])) {
$patcom['InternalPID'] = $newInternalPID;
$db->table('patcom')->insert($patcom);
}
/*
if (!empty($patatt)) {
foreach ($patatt as &$row) {
$row['InternalPID'] = $newInternalPID;
}
$db->table('patatt')->upsertBatch($patatt);
}
if (!empty($patcom['Comment'])) {
$patcom['InternalPID'] = $newInternalPID;
$db->table('patcom')->insert($patcom);
}
*/
$db->transComplete();
if ($db->transStatus() === false) {
$error = $db->error();
throw new \Exception('Transaction failed: ' . ($error['message'] ?? 'Unknown DB error'));
}
return $newInternalPID;
} catch (\Exception $e) {
$db->transRollback();
throw $e; // rethrow so controller can handle response
throw $e;
}
}
public function updatePatient($input) {
$db = \Config\Database::connect();
$patidt = $input['PatIdt'] ?? [];
$patatt = $input['PatAtt'] ?? [];
$patcom['Comment'] = $input['Comment'] ?? [];
try {
$db->transStart();
$InternalPID = $input['InternalPID'];
$this->where('InternalPID',$InternalPID)->set($input)->update();
if (!empty($patidt)) {
$exists = $db->table('patidt')->where('InternalPID', $InternalPID)->get()->getRowArray();
if ($exists) {
$db->table('patidt')->where('InternalPID', $InternalPID)->update($patidt);
} else {
$patidt['InternalPID'] = $InternalPID;
$db->table('patidt')->insert($patidt);
}
} else {
$db->table('patidt')->where('InternalPID', $InternalPID)->delete();
}
if (!empty($patcom)) {
$exists = $db->table('patcom')->where('InternalPID', $InternalPID)->get()->getRowArray();
if ($exists) {
$db->table('patcom')->where('InternalPID', $InternalPID)->update($patcom);
} else {
$patidt['InternalPID'] = $InternalPID;
$db->table('patcom')->insert($patcom);
}
} else {
$db->table('patcom')->where('InternalPID', $InternalPID)->delete();
}
/*
if (!empty($patatt)) {
$db->table('patatt')->where('InternalPID', $InternalPID)->delete();
foreach ($patatt as $row) {
$row['InternalPID'] = $InternalPID;
$db->table('patatt')->insert($row);
}
} else {
$db->table('patatt')->where('InternalPID', $InternalPID)->delete();
}
*/
$db->transComplete();
if ($db->transStatus() === false) {
throw new \Exception('Failed to sync patient relations');
}
return $InternalPID;
} catch (\Exception $e) {
$db->transRollback();
throw $e;
}
}