Normalize formatting/line endings across configs, controllers, models, tests, and OpenAPI specs. Update rule expression/rule engine implementation and remove obsolete RuleAction controller/model. Add unit tests for rule expression syntax and multi-action behavior, and include docs updates.
89 lines
3.2 KiB
PHP
89 lines
3.2 KiB
PHP
<?php
|
|
namespace App\Models\Patient;
|
|
|
|
use App\Models\BaseModel;
|
|
use App\Models\BaseUtcModel;
|
|
|
|
class PatAttModel extends BaseModel {
|
|
protected $table = 'patatt';
|
|
protected $primaryKey = 'PatAttID';
|
|
protected $allowedFields = ['InternalPID', 'Address', 'UserID', 'CreateDate', 'DelDate'];
|
|
|
|
protected $useTimestamps = true;
|
|
protected $createdField = 'CreateDate';
|
|
protected $updatedField = '';
|
|
protected $useSoftDeletes = true;
|
|
protected $deletedField = 'DelDate';
|
|
|
|
protected $beforeInsert = ['normalizeDatesToUTC'];
|
|
protected $beforeUpdate = ['normalizeDatesToUTC'];
|
|
protected $afterFind = ['convertDatesToUTCISO'];
|
|
protected $afterInsert = ['convertDatesToUTCISO'];
|
|
protected $afterUpdate = ['convertDatesToUTCISO'];
|
|
|
|
public function createPatAtt($patatt, string $newInternalPID) {
|
|
foreach ($patatt as &$row) {
|
|
$row['InternalPID'] = (string)$newInternalPID;
|
|
}
|
|
$this->insertBatch($patatt);
|
|
}
|
|
|
|
public function updatePatAtt(array $patatt, string $InternalPID) {
|
|
// Ambil daftar address aktif saat ini dari DB
|
|
$oldActive = $this->getActiveAddresses($InternalPID);
|
|
|
|
// Normalisasi input baru (hapus duplikat & pastikan punya key 'Address')
|
|
$mapNew = [];
|
|
foreach ($patatt as $row) {
|
|
if (empty($row['Address'])) continue;
|
|
$mapNew[$row['Address']] = $row; // overwrite duplikat
|
|
}
|
|
|
|
$newData = array_keys($mapNew);
|
|
|
|
// Hitung data yang ditambah & dihapus
|
|
$added = array_diff($newData, $oldActive); // address baru
|
|
$removed = array_diff($oldActive, $newData); // address lama dihapus
|
|
|
|
// Soft delete yang dihapus
|
|
if (!empty($removed)) {
|
|
$this->softDeleteByAddresses($InternalPID, $removed);
|
|
}
|
|
|
|
// Tambahkan / re-activate yang baru
|
|
foreach ($added as $addr) {
|
|
$data = $mapNew[$addr];
|
|
$data['InternalPID'] = $InternalPID;
|
|
|
|
// Coba re-activate dulu
|
|
$this->reactivateAddress($InternalPID, $addr);
|
|
|
|
// Cek apakah ada baris yang di-update (re-activate)
|
|
if ($this->db->affectedRows() === 0) {
|
|
// Tidak ada baris lama yang dihapus → insert baru
|
|
$this->insert($data);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function deletePatAtt(string $InternalPID) {
|
|
$this->where('InternalPID', $InternalPID)->delete();
|
|
}
|
|
|
|
// Dapatkan daftar alamat aktif berdasarkan InternalPID
|
|
public function getActiveAddresses(string $InternalPID): array {
|
|
$rows = $this->select('Address')->where('InternalPID', $InternalPID)->where('DelDate', null)->findAll();
|
|
return array_column($rows, 'Address');
|
|
}
|
|
// Soft delete beberapa address sekaligus
|
|
public function softDeleteByAddresses(string $InternalPID, array $addresses) {
|
|
if (empty($addresses)) return;
|
|
$this->where('InternalPID', $InternalPID)->whereIn('Address', $addresses)->delete();
|
|
}
|
|
// Reactivate (hapus DelDate) 1 address jika pernah dihapus
|
|
// Return true jika berhasil re-activate
|
|
public function reactivateAddress(string $InternalPID, string $Address): bool {
|
|
return $this->where('InternalPID', $InternalPID)->where('Address', $Address)->where('DelDate IS NOT NULL', null, false)->set('DelDate', null)->orderBy('PatAttID', 'DESC')->limit(1)->update();
|
|
}
|
|
}
|