clqms-be/app/Controllers/Patient.php

317 lines
13 KiB
PHP
Raw Normal View History

<?php
namespace App\Controllers;
use CodeIgniter\API\ResponseTrait;
use CodeIgniter\Controller;
use CodeIgniter\Database\RawSql;
class Patient extends Controller {
use ResponseTrait;
public function __construct() {
$this->db = \Config\Database::connect();
}
2025-07-23 11:03:46 +07:00
// OK
public function index() {
2025-07-23 11:03:46 +07:00
try {
$pat_num = $this->request->getVar('pat_num');
$pat_altnum = $this->request->getVar('pat_altnum');
$pat_name = $this->request->getVar('pat_name');
$pat_dob = $this->request->getVar('pat_dob');
$start_date = $this->request->getVar('start_date');
$end_date = $this->request->getVar('end_date');
2025-07-23 11:03:46 +07:00
$builder = $this->db->table('patients');
if ($pat_name !== null) {
$sql = "LOWER(CONCAT_WS(' ', IFNULL(prefix,''), IFNULL(name_first,''), IFNULL(name_middle,''), IFNULL(name_last,''), IFNULL(name_maiden,''), IFNULL(suffix,'')))";
$rawSql = new RawSql($sql);
$builder->like($rawSql, $pat_name, 'both');
}
if ($pat_num !== null) { $builder->where('pat_num', $pat_num); }
if ($pat_altnum !== null) { $builder->where('pat_altnum', $pat_altnum); }
if ($pat_dob !== null) { $builder->where('pat_dob', $pat_dob); }
if ($start_date !== null || $end_date !== null) {
$builder->join('requests', 'pat_id=patients.pat_id','left');
if ($start_date !== null) { $builder->where('requests.req_date >=', $start_date . ' 00:00:00'); }
if ($end_date !== null) { $builder->where('requests.req_date <=', $end_date . ' 23:59:00'); }
}
$filteredPatients = $builder->get()->getResultArray();
2025-07-23 11:03:46 +07:00
// Data pasien tidak ada mengembalikan - success 200
if (empty($filteredPatients)) {
return $this->respond([
2025-07-16 09:19:47 +07:00
'status' => 'success',
2025-07-23 11:03:46 +07:00
'message' => 'No patient records found matching the criteria.',
'data' => []
], 200);
}
// Data pasien ditemukan dan mengembalikan - success 200
return $this->respond([
'status' => 'success',
'message'=> "Patients fetched successfully",
'data' => $filteredPatients,
], 200);
} catch (\Exception $e) {
// Error Server Mengembalikan 500
return $this->failServerError('Something went wrong');
}
}
2025-07-23 11:03:46 +07:00
// OK
public function show($id = null) {
2025-07-23 11:03:46 +07:00
try {
$builder = $this->db->table('patients');
$patient = $builder->where('pat_num', $id)->get()->getRowArray();
2025-07-23 11:03:46 +07:00
// Data pasien tidak ada mengembalikan - success 200
if (empty($patient)) {
return $this->respond([
2025-07-16 09:19:47 +07:00
'status' => 'success',
2025-07-23 11:03:46 +07:00
'message' => 'Patient with ID ' . $id . ' not found.',
'data' => [],
], 200);
}
// Data pasien ditemukan dan mengembalikan - success 200
return $this->respond([
'status' => 'success',
'message'=> "Patient Show Successfully",
'data' => $patient,
], 200);
} catch (\Exception $e) {
// Error Server Mengembalikan 500
return $this->failServerError('Something went wrong');
}
2025-07-16 09:19:47 +07:00
}
2025-07-23 11:03:46 +07:00
// OK
public function create() {
2025-07-23 11:03:46 +07:00
try {
$input = $this->request->getJSON(true);
$data = [
2025-07-28 16:44:23 +07:00
// "pat_id" => $input['patientID'] ?? null,
"pat_num" => $input['alternateID'] ?? null,
// "pat_altnum" => $input['alternateID'] ?? null,
// "prefix" => $input['prefix'] ?? null,
"name_first" => $input['firstName'] ?? null,
"name_middle" => $input['middleName'] ?? null,
"name_last" => $input['lastName'] ?? null,
"name_maiden" => $input['maidenName'] ?? null,
"gender" => $input['gender'] ?? null,
"birth_place" => $input['placeOfBirthdate'] ?? null,
"birth_date" => $input['birthdate'] ?? null,
"mother" => $input['motherName'] ?? null,
"marital_status" => $input['maritalStatus'] ?? null,
// "religion_id" => $input['religion'] ?? null,
// "race_id" => $input['race'] ?? null,
// "ethinc_id" => $input['ethnic'] ?? null,
// "suffix" => $input['suffix'] ?? null,
// "name_alias" => $input['nameAlias'] ?? null,
"address_1" => $input['street1'] ?? null,
"address_2" => $input['street2'] ?? null,
// "address_3" => $input['street3'] ?? null,
"city" => $input['city'] ?? null,
"province" => $input['province'] ?? null,
// "zip" => $input['zip'] ?? null,
"email_1" => $input['email1'] ?? null,
"email_2" => $input['email2'] ?? null,
"phone" => $input['phone'] ?? null,
"mobile_phone" => $input['mobile'] ?? null,
"death" => $input['death'] ?? null,
"death_date" => $input['deathtime'] ?? null,
// "account_number" => $input['accountNumber'] ?? null,
// "country_id" => $input['countryId'] ?? null,
// "citizenship" => $input['citizenship'] ?? null,
// "link_to" => $input['linkTo'] ?? null,
"create_date" => date('Y-m-d H:i:s'),
// "del_date" => $input['delDate'] ?? null
2025-07-23 11:03:46 +07:00
];
$rules = [
'pat_num' => 'required|is_unique[patients.pat_num]|max_length[50]',
'name_first' => 'required|min_length[3]|max_length[255]',
'name_middle' => 'permit_empty',
'name_maiden' => 'permit_empty',
'name_last' => 'permit_empty',
2025-07-28 16:44:23 +07:00
// 'birth_date' => 'permit_empty|valid_date[Y-m-d]|not_in_list[0000-00-00]',
2025-07-23 11:03:46 +07:00
'pat_altnum' => 'permit_empty|max_length[50]',
'address_1' => 'permit_empty',
'address_2' => 'permit_empty',
'address_3' => 'permit_empty',
'city' => 'permit_empty',
];
// Request dari client tidak valid atau tidak bisa diproses oleh server - 400
if (!$this->validateData($data, $rules)) {
return $this->respond([
'status' => 'error',
'message' => 'Validation failed',
'errors' => $this->validator->getErrors()
], 400);
}
$this->db->table('patients')->insert($data);
$newPatientId = $this->db->insertID();
// Sukses & Insert = 201 - Kirim data patient ID
return $this->respondCreated([
'status' => 'success',
'message' => 'Patient created successfully',
'data' => $newPatientId
], 201);
} catch (\Exception $e) {
2025-07-23 11:03:46 +07:00
// Error Server = 500
2025-07-28 16:44:23 +07:00
return $this->failServerError('Something went wrong'.$e);
2025-07-23 11:03:46 +07:00
}
}
2025-07-23 11:03:46 +07:00
// OK
public function update($pat_id = null) {
2025-07-23 11:03:46 +07:00
try {
$input = $this->request->getJSON(true);
2025-07-23 11:03:46 +07:00
$data = [
'name_first' => $input['name_first'], // Mengambil dari firstName
'name_last' => $input['name_last'], // Mengambil dari lastName
'name_middle' => $input['middleName'] ?? null, // Mengambil dari middleName
'name_maiden' => $input['maindenName'] ?? null, // Mengambil dari maindenName
'pat_num' => $input['pat_num'], // Mengambil dari patientID
'prefix' => $input['title'] ?? null, // Mengambil dari title
'suffix' => $input['suffixName'] ?? null, // Mengambil dari suffixName
'birth_date' => $input['birthdate'] ?? null, // Mengambil dari birthdate
'pat_altnum' => $input['alternateID'] ?? null, // Mengambil dari alternateID
'address_1' => $input['street1'] ?? null, // Mengambil dari street1
'address_2' => $input['street2'] ?? null, // Mengambil dari street2
'address_3' => $input['placeOfBirthdate'] ?? null, // Memetakan placeOfBirthdate ke address_3, jika diperlukan
'city' => $input['city'] ?? null, // Mengambil dari city
'province' => $input['province'] ?? null, // Mengambil dari province
'zip' => null, // Tidak ada padanan langsung di newPatientForm, bisa diisi manual atau dari input lain
'email_1' => $input['email1'] ?? null, // Mengambil dari email1
'email_2' => $input['email2'] ?? null, // Mengambil dari email2
'phone' => $input['phone'] ?? null, // Mengambil dari phone
'mobile_phone' => $input['mobile'] ?? null, // Mengambil dari mobile
'mother' => $input['motherName'] ?? null, // Mengambil dari motherName
'account_number' => null, // Tidak ada padanan langsung, bisa diisi manual atau dari input lain
'marital_status' => $input['maritalStatus'] ?? null, // Mengambil dari maritalStatus
'country_id' => null, // Tidak ada padanan langsung, perlu penyesuaian jika ada input negara
'citizenship' => null, // Tidak ada padanan langsung, perlu penyesuaian jika ada input kewarganegaraan
'death' => $input['death'] ?? null, // Mengambil dari death (asumsi 0/1 atau boolean)
'death_date' => $input['deathTime'] ?? null, // Mengambil dari deathTime
'create_date' => date('Y-m-d H:i:s'), // Ini adalah tanggal dan waktu saat ini di server PHP
];
// Apakah Pasien Ada
$existingPatient = $this->db->table('patients')->where('pat_id', $pat_id)->get()->getRowArray();
// Mengembalikan 404
if (empty($existingPatient)) {
return $this->failNotFound('Patient with ID ' . $pat_id . ' not found.');
}
2025-07-23 11:03:46 +07:00
$rules = [
'pat_num' => 'required|max_length[50]',
'name_first' => 'required|min_length[3]|max_length[255]',
'name_middle' => 'permit_empty',
'name_maiden' => 'permit_empty',
'name_last' => 'permit_empty',
'birth_date' => 'permit_empty|valid_date[Y-m-d]',
'pat_altnum' => 'permit_empty|max_length[50]',
'address_1' => 'permit_empty',
'address_2' => 'permit_empty',
'address_3' => 'permit_empty',
'city' => 'permit_empty',
];
// Request dari client tidak valid atau tidak bisa diproses oleh server - 400
if (!$this->validateData($data, $rules)) {
return $this->failValidationErrors($this->validator->getErrors());
}
$allowedUpdateFields = [
'name_first', 'name_last', 'name_middle',
'pat_num', 'pat_altnum', 'birth_date', 'birth_place',
'address_1', 'address_2', 'address_3', 'city', 'province', 'zip',
'email_1', 'email_2', 'phone', 'mobile_phone', 'mother', 'account_number'
];
$datas = [];
foreach ($allowedUpdateFields as $field) {
if (isset($data[$field])) {
$datas[$field] = $data[$field];
}
}
if (empty($data)) {
return $this->failValidationError('No data provided for update.');
}
$this->db->table('patients')->where('pat_id', $pat_id)->update($data);
2025-07-23 11:03:46 +07:00
// Sukses & Insert = 201 - Kirim data patient ID
return $this->respondCreated([
'status' => 'success',
'message' => 'Patient updated successfully',
'data' => $data
], 201);
2025-07-23 11:03:46 +07:00
} catch (\Exception $e) {
// Error Server = 500
return $this->failServerError('Something went wrong '.$e);
}
}
2025-07-23 11:03:46 +07:00
// OK
public function delete($pat_id = null) {
try {
if (!$pat_id) {
return $this->failValidationError('Patient ID is required.');
}
// Cari data pasien
$patient = $this->db->table('patients')
->where('pat_id', $pat_id)
->get()
->getRow();
if (!$patient) {
return $this->failNotFound("Patient ID with {$pat_id} not found.");
}
// Hapus data pasien berdasarkan pat_num
$this->db->table('patients')->where('pat_id', $pat_id)->delete();
// Mengembalikan 200
return $this->respondDeleted([
'status' => 'success',
'message' => "Patient ID with {$pat_id} deleted successfully."
]);
} catch (\Exception $e) {
return $this->failServerError("Internal server error: " . $e->getMessage());
}
}
}