Files
accounting_dev_v2/application/migrations/20260901002400_create_professional_roles_permissions.php
2026-09-11 16:03:00 +07:00

30 lines
4.3 KiB
PHP

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Migration_Create_professional_roles_permissions extends CI_Migration
{
private function rights($map){$out=array();foreach($map as$key=>$level){$actions=array('can_view');if($level==='write')$actions=array('can_view','can_create','can_update','can_export','can_import');if($level==='approve')$actions=array('can_view','can_create','can_update','can_approve','can_post','can_export','can_import');$out[$key]=$actions;}return json_encode($out);}
public function up(){
if(!$this->db->field_exists('permissions','roles'))$this->db->query("ALTER TABLE roles ADD permissions LONGTEXT NULL AFTER nama_role");
if(!$this->db->field_exists('description','roles'))$this->db->query("ALTER TABLE roles ADD description VARCHAR(255) NULL AFTER permissions");
if(!$this->db->field_exists('is_active','roles'))$this->db->query("ALTER TABLE roles ADD is_active TINYINT(1) NOT NULL DEFAULT 1 AFTER description");
$roles=array(
'Admin'=>array('Semua konfigurasi, transaksi dan administrasi pengguna.',array()),
'Accounting Manager'=>array('Kontrol accounting, approval, closing, laporan, budget dan pajak.',array('dashboard'=>'write','approvals'=>'approve','invoices'=>'approve','purchases'=>'approve','items'=>'view','asset'=>'approve','cash_bank'=>'approve','jurnal'=>'approve','reports'=>'write','budgets'=>'approve','taxes'=>'approve')),
'Finance & Treasury'=>array('Kas, bank, pembayaran, penerimaan dan posisi kas.',array('dashboard'=>'view','approvals'=>'approve','invoices'=>'write','purchases'=>'write','cash_bank'=>'approve','jurnal'=>'write','reports'=>'view')),
'AR / Sales Billing'=>array('Customer, penjualan, invoice, piutang dan penerimaan.',array('dashboard'=>'view','invoices'=>'approve','cash_bank'=>'view','jurnal'=>'view','reports'=>'view')),
'AP / Purchasing'=>array('Supplier, purchase workflow, hutang dan pembayaran supplier.',array('dashboard'=>'view','purchases'=>'approve','items'=>'view','cash_bank'=>'view','jurnal'=>'view','reports'=>'view')),
'Inventory & Warehouse'=>array('Persediaan, gudang, barcode, mutasi dan stock opname.',array('dashboard'=>'view','items'=>'approve','purchases'=>'view','asset'=>'view','reports'=>'view')),
'Asset Officer'=>array('Register aset, penyusutan, maintenance dan asset opname.',array('dashboard'=>'view','asset'=>'approve','items'=>'view','purchases'=>'view','jurnal'=>'view','reports'=>'view')),
'HR & Payroll'=>array('Data karyawan, absensi dan payroll.',array('dashboard'=>'view','employees'=>'approve','cash_bank'=>'view','jurnal'=>'view','reports'=>'view')),
'Tax Officer'=>array('Master pajak, transaksi pajak dan pelaporan pajak.',array('dashboard'=>'view','taxes'=>'approve','invoices'=>'view','purchases'=>'view','jurnal'=>'view','reports'=>'view')),
'Auditor / Read Only'=>array('Akses baca dan export tanpa mengubah transaksi.',array('dashboard'=>'view','approvals'=>'view','invoices'=>'view','purchases'=>'view','items'=>'view','asset'=>'view','cash_bank'=>'view','jurnal'=>'view','reports'=>'view','budgets'=>'view','taxes'=>'view','employees'=>'view')),
'Management Viewer'=>array('Dashboard, approval dan laporan manajemen.',array('dashboard'=>'view','approvals'=>'approve','reports'=>'view','budgets'=>'view')),
'Keuangan'=>array('Role legacy keuangan; gunakan Finance & Treasury untuk user baru.',array('dashboard'=>'view','invoices'=>'write','purchases'=>'write','cash_bank'=>'approve','jurnal'=>'write','reports'=>'view')),
'Gudang'=>array('Role legacy gudang; gunakan Inventory & Warehouse untuk user baru.',array('dashboard'=>'view','items'=>'approve','purchases'=>'view','asset'=>'view','reports'=>'view'))
);
foreach($roles as$name=>$definition){$data=array('permissions'=>$this->rights($definition[1]),'description'=>$definition[0],'is_active'=>1);$row=$this->db->get_where('roles',array('nama_role'=>$name))->row();if($row)$this->db->where('id',$row->id)->update('roles',$data);else{$data['nama_role']=$name;$this->db->insert('roles',$data);}}
$this->db->query("CREATE OR REPLACE SQL SECURITY INVOKER VIEW v_users AS SELECT u.id,u.username,u.password,u.role_id,u.created_at,u.nama,r.nama_role,COALESCE(r.permissions,'{}') permissions,r.is_active role_is_active FROM users u LEFT JOIN roles r ON r.id=u.role_id");
}
public function down(){throw new RuntimeException('Gunakan backup untuk rollback role dan permission.');}
}