Files
accounting_dev_v2/application/migrations/20260915000100_separate_device_operations_permissions.php
T

84 lines
3.9 KiB
PHP

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Memisahkan akses Operasional Perangkat dari Persediaan tanpa mengubah
* transaksi, stok, jurnal, maupun tabel subledger perangkat.
*/
class Migration_Separate_device_operations_permissions extends CI_Migration
{
public function up()
{
if (!$this->db->table_exists('roles')) return;
$deviceFeatures = array(
'technician_equipment', 'technician_equipment_all',
'technician_attachment', 'technician_handover',
'technician_installation', 'technician_transfer',
'technician_return', 'technician_inspection',
'technician_customer_item', 'technician_condition',
'technician_correction'
);
foreach ($this->db->select('id,permissions,is_super_admin')->get('roles')->result() as $role) {
if ((int)$role->is_super_admin === 1) continue;
$permissions = json_decode((string)$role->permissions, true);
if (!is_array($permissions)) $permissions = array();
$changed = false;
// Migrasi lama sudah membuat permission operasional dari Persediaan.
// Bagian ini tetap idempotent untuk database yang melewati migrasi lama.
if (!isset($permissions['technician_equipment']) && isset($permissions['items']) && in_array('can_view', (array)$permissions['items'], true)) {
$permissions['technician_equipment'] = array_values(array_unique(array_intersect(
(array)$permissions['items'],
array('can_view','can_create','can_update','can_delete','can_submit','can_approve','can_post','can_export','can_import')
)));
$changed = true;
}
if (!isset($permissions['technician_customer_item'])) {
$source = isset($permissions['technician_equipment']) ? (array)$permissions['technician_equipment'] : array();
$customerRights = array_values(array_intersect($source, array('can_view','can_create','can_update')));
if ($customerRights) {
$permissions['technician_customer_item'] = $customerRights;
$changed = true;
}
}
$hasDevicePermission = false;
foreach ($deviceFeatures as $feature) {
if (!empty($permissions[$feature])) { $hasDevicePermission = true; break; }
}
if ($hasDevicePermission && (empty($permissions['technician_equipment']) || !in_array('can_view', (array)$permissions['technician_equipment'], true))) {
$permissions['technician_equipment'] = array_values(array_unique(array_merge(
array('can_view'),
isset($permissions['technician_equipment']) ? (array)$permissions['technician_equipment'] : array()
)));
$changed = true;
}
if ($changed) {
$this->db->where('id', (int)$role->id)->update('roles', array(
'permissions' => json_encode($permissions),
'updated_at' => date('Y-m-d H:i:s')
));
}
}
}
public function down()
{
if (!$this->db->table_exists('roles')) return;
foreach ($this->db->select('id,permissions,is_super_admin')->get('roles')->result() as $role) {
if ((int)$role->is_super_admin === 1) continue;
$permissions = json_decode((string)$role->permissions, true);
if (!is_array($permissions) || !isset($permissions['technician_customer_item'])) continue;
unset($permissions['technician_customer_item']);
$this->db->where('id', (int)$role->id)->update('roles', array(
'permissions' => json_encode($permissions),
'updated_at' => date('Y-m-d H:i:s')
));
}
}
}