84 lines
3.9 KiB
PHP
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')
|
|
));
|
|
}
|
|
}
|
|
}
|