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') )); } } }