pemindahan submenu peralatan teknisi ke menu Oprasional Peralatan
This commit is contained in:
@@ -23,6 +23,6 @@ class Accountingattachments extends MY_Controller
|
||||
}
|
||||
public function download($id){$f=$this->db->get_where('transaction_attachments',array('id'=>(int)$id))->row();if(!$f)show_404();$this->assertEntityAccess($f);$path=FCPATH.'uploads/accounting/'.$f->stored_name;if(!$this->safePath($path))show_404();$this->load->helper('download');force_download($f->original_name,file_get_contents($path));}
|
||||
public function preview($id){$f=$this->db->get_where('transaction_attachments',array('id'=>(int)$id))->row();if(!$f)show_404();$this->assertEntityAccess($f);$path=FCPATH.'uploads/accounting/'.$f->stored_name;if(!$this->safePath($path))show_404();$mime=function_exists('finfo_open')?(new finfo(FILEINFO_MIME_TYPE))->file($path):$f->mime_type;if($mime!=='application/pdf'&&strpos((string)$mime,'image/')!==0)show_404();$name=str_replace(array('"',"\r","\n"),'',basename($f->original_name));$this->output->set_header('Content-Type: '.$mime)->set_header('Content-Disposition: inline; filename="'.$name.'"')->set_header('Content-Length: '.filesize($path))->set_header('X-Content-Type-Options: nosniff')->set_output(file_get_contents($path));}
|
||||
private function assertEntityAccess($file){$company=(int)$this->session->userdata('company_id');if(in_array($file->entity_type,array('technician_equipment_document','customer_equipment_registry'),true)){$table=$file->entity_type==='technician_equipment_document'?'technician_equipment_documents':'customer_equipment_registry';$owned=$this->db->get_where($table,array('id'=>(int)$file->entity_id,'company_id'=>$company))->row();if(!$owned)show_error('Akses lampiran ditolak.',403,'Akses ditolak');$permissions=$this->session->userdata('permissions');$known=is_array($permissions)&&array_key_exists('technician_attachment',$permissions);$fallback=!$known&&(check_permission('technician_equipment','can_view')||check_permission('items','can_view'));if(!is_master_admin_user()&&!check_permission('technician_attachment','can_view')&&!$fallback)show_error('Akses lampiran ditolak.',403,'Akses ditolak');return;}if($file->entity_type==='technician_installation'){$owned=$this->db->select('b.id')->from('item_barcodes b')->join('items i','i.id=b.item_id')->where(array('b.id'=>(int)$file->entity_id,'i.company_id'=>$company))->get()->row();if(!$owned)show_error('Akses lampiran ditolak.',403,'Akses ditolak');$this->requirePermission('items','can_view');return;}if($file->entity_type==='technician_status_change'){$owned=$this->db->get_where('technician_item_status_logs',array('id'=>(int)$file->entity_id,'company_id'=>$company))->row();if(!$owned)show_error('Akses lampiran ditolak.',403,'Akses ditolak');$this->requirePermission('items','can_view');return;}$map=array('stock_document'=>array('stock_documents','items'),'asset'=>array('assets','asset'),'asset_maintenance'=>array('asset_maintenance','asset'),'asset_opname'=>array('asset_opnames','asset'));if(!isset($map[$file->entity_type]))return;list($table,$feature)=$map[$file->entity_type];if(!$this->db->get_where($table,array('id'=>(int)$file->entity_id,'company_id'=>$company))->row())show_error('Akses lampiran ditolak.',403,'Akses ditolak');$this->requirePermission($feature,'can_view');}
|
||||
private function assertEntityAccess($file){$company=(int)$this->session->userdata('company_id');if(in_array($file->entity_type,array('technician_equipment_document','customer_equipment_registry'),true)){$table=$file->entity_type==='technician_equipment_document'?'technician_equipment_documents':'customer_equipment_registry';$owned=$this->db->get_where($table,array('id'=>(int)$file->entity_id,'company_id'=>$company))->row();if(!$owned)show_error('Akses lampiran ditolak.',403,'Akses ditolak');$this->requirePermission('technician_attachment','can_view');return;}if($file->entity_type==='technician_installation'){$owned=$this->db->select('b.id')->from('item_barcodes b')->join('items i','i.id=b.item_id')->where(array('b.id'=>(int)$file->entity_id,'i.company_id'=>$company))->get()->row();if(!$owned)show_error('Akses lampiran ditolak.',403,'Akses ditolak');$this->requirePermission('technician_attachment','can_view');return;}if($file->entity_type==='technician_status_change'){$owned=$this->db->get_where('technician_item_status_logs',array('id'=>(int)$file->entity_id,'company_id'=>$company))->row();if(!$owned)show_error('Akses lampiran ditolak.',403,'Akses ditolak');$this->requirePermission('technician_attachment','can_view');return;}$map=array('stock_document'=>array('stock_documents','items'),'asset'=>array('assets','asset'),'asset_maintenance'=>array('asset_maintenance','asset'),'asset_opname'=>array('asset_opnames','asset'));if(!isset($map[$file->entity_type]))return;list($table,$feature)=$map[$file->entity_type];if(!$this->db->get_where($table,array('id'=>(int)$file->entity_id,'company_id'=>$company))->row())show_error('Akses lampiran ditolak.',403,'Akses ditolak');$this->requirePermission($feature,'can_view');}
|
||||
private function safePath($path){$root=realpath(FCPATH.'uploads/accounting');$real=realpath($path);return$root&&$real&&strpos($real,$root.DIRECTORY_SEPARATOR)===0&&is_file($real);}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,8 @@ class Roles extends MY_Admin_Controller
|
||||
$duplicate=$this->db->where('nama_role',$name)->where('id !=',$id)->count_all_results('roles');if($duplicate)return json_response(false,'Nama role sudah digunakan.',array(),422);
|
||||
$posted=(array)$this->input->post('permissions');$permissions=array();
|
||||
foreach($this->features as$key=>$label){$allowedActions=array_keys($this->actions);if($key==='payroll')$allowedActions=array_merge($allowedActions,array('can_manage_all_salary','can_manage_allowances'));$selected=array_values(array_intersect((array)(isset($posted[$key])?$posted[$key]:array()),$allowedActions));if($key==='payroll'&&in_array('can_manage_allowances',$selected,true)&&!in_array('can_update',$selected,true))$selected[]='can_update';if($selected){if(!in_array('can_view',$selected,true))array_unshift($selected,'can_view');$permissions[$key]=$selected;}}
|
||||
$hasDevicePermission=false;foreach(array_keys($permissions)as$feature){if(strpos($feature,'technician_')===0){$hasDevicePermission=true;break;}}
|
||||
if($hasDevicePermission){if(empty($permissions['technician_equipment']))$permissions['technician_equipment']=array('can_view');elseif(!in_array('can_view',$permissions['technician_equipment'],true))array_unshift($permissions['technician_equipment'],'can_view');}
|
||||
if(!$permissions)return json_response(false,'Role wajib mempunyai minimal satu permission.',array(),422);
|
||||
$data=array('nama_role'=>$name,'description'=>$description,'permissions'=>json_encode($permissions),'is_active'=>$this->input->post('is_active')?1:0,'updated_at'=>date('Y-m-d H:i:s'));
|
||||
if($id)$this->db->where('id',$id)->update('roles',$data);else{$data['is_system']=0;$data['is_super_admin']=0;$data['created_at']=date('Y-m-d H:i:s');$this->db->insert('roles',$data);$id=$this->db->insert_id();}
|
||||
|
||||
@@ -200,7 +200,7 @@ class Teknisi extends MY_Controller {
|
||||
elseif($installed>0)$badge='<span class="badge bg-primary">Dipasang</span><small class="d-block text-muted mt-1">'.htmlspecialchars(($row->customer_name?:'-').' · '.($row->usage_date?:'-'),ENT_QUOTES,'UTF-8').'</small>';
|
||||
else$badge='<span class="badge bg-success">Dibawa</span>';
|
||||
$action='-';
|
||||
if(is_master_admin_user()||check_permission('items','can_update')){
|
||||
if(is_master_admin_user()||check_permission('technician_installation','can_create')||check_permission('technician_installation','can_update')||check_permission('technician_return','can_update')){
|
||||
$action='<button type="button" class="btn btn-sm btn-outline-primary btn-change-item-status" data-user="'.(int)$row->user_id.'" data-barcode="'.htmlspecialchars($row->barcode,ENT_QUOTES,'UTF-8').'" data-item="'.htmlspecialchars($row->nama_barang,ENT_QUOTES,'UTF-8').'" data-tracking="'.$tracking.'" data-carried="'.$carried.'" data-installed="'.$installed.'" data-customer="'.(int)$row->customer_id.'"><i class="bi bi-arrow-left-right me-1"></i>Ubah Status</button>';
|
||||
if(!empty($row->proof_id))$action.=' <a class="btn btn-sm btn-outline-info" target="_blank" href="'.base_url('accountingattachments/preview/'.(int)$row->proof_id).'" title="Bukti terakhir"><i class="bi bi-image"></i></a>';
|
||||
}elseif(!empty($row->proof_id))$action='<a class="btn btn-sm btn-outline-info" target="_blank" href="'.base_url('accountingattachments/preview/'.(int)$row->proof_id).'"><i class="bi bi-image me-1"></i>Bukti</a>';
|
||||
@@ -478,7 +478,7 @@ class Teknisi extends MY_Controller {
|
||||
"active_menu" => "peralatan_teknisi",
|
||||
"teknisi_list" => $this->ptm->get_teknisi_list(),
|
||||
"customers" => $this->db->select('id,nama')->where('company_id',(int)$this->companycontext->id())->order_by('nama')->get('customers')->result(),
|
||||
"can_export" => is_master_admin_user() || check_permission('technician_equipment','can_export') || check_permission('items','can_export'),
|
||||
"can_export" => is_master_admin_user() || check_permission('technician_equipment','can_export'),
|
||||
"equipment_permissions" => $this->equipmentPermissionFlags(),
|
||||
"equipment_dashboard" => $this->scopedEquipmentDashboard(),
|
||||
"initial_filters" => $this->logFilters(),
|
||||
@@ -499,7 +499,7 @@ class Teknisi extends MY_Controller {
|
||||
|
||||
public function get_status_history_data($userId=0)
|
||||
{
|
||||
$this->requirePermission('items','can_view');$userId=(int)$userId;if(!$this->ptm->get_teknisi_info($userId))return json_response(false,'Teknisi tidak ditemukan.',array('data'=>array()),404);
|
||||
$this->equipmentPermission('technician_equipment','can_view');$userId=(int)$userId;if(!$this->ptm->get_teknisi_info($userId))return json_response(false,'Teknisi tidak ditemukan.',array('data'=>array()),404);
|
||||
$labels=array('initial'=>'Saldo Awal','carried'=>'Dibawa Teknisi','installed'=>'Dipasang','returned'=>'Kembali ke Gudang','warehouse'=>'Gudang');$rows=array();
|
||||
foreach($this->ptm->get_status_history($userId)as$index=>$row){$proof=$row->attachment_id?'<a class="btn btn-sm btn-outline-info" target="_blank" href="'.base_url('accountingattachments/preview/'.(int)$row->attachment_id).'" title="Lihat bukti"><i class="bi bi-image"></i></a>':'-';$rows[]=array($index+1,date('d/m/Y',strtotime($row->event_date)),htmlspecialchars(($row->kode_detail?:'-').' - '.($row->nama_barang?:'-'),ENT_QUOTES,'UTF-8'),htmlspecialchars($row->barcode,ENT_QUOTES,'UTF-8'),htmlspecialchars($labels[$row->from_status]??ucfirst($row->from_status),ENT_QUOTES,'UTF-8').' → '.htmlspecialchars($labels[$row->to_status]??ucfirst($row->to_status),ENT_QUOTES,'UTF-8'),number_format((float)$row->qty,0,',','.'),htmlspecialchars($row->customer_name?:'-',ENT_QUOTES,'UTF-8'),htmlspecialchars($row->notes?:'-',ENT_QUOTES,'UTF-8'),htmlspecialchars($row->actor_name?:'-',ENT_QUOTES,'UTF-8'),$proof);}
|
||||
return json_response(true,'Riwayat status peralatan.',array('data'=>$rows));
|
||||
@@ -509,7 +509,7 @@ class Teknisi extends MY_Controller {
|
||||
{
|
||||
if(strtoupper($this->input->method())==='POST')return json_response(false,'Alur status lama dinonaktifkan. Gunakan workbench Peralatan Teknisi agar histori dan saldo tetap sinkron.',array(),409);
|
||||
if(strtoupper($this->input->method())!=='POST')show_404();
|
||||
$this->requirePermission('items','can_update');
|
||||
$this->equipmentPermission('technician_correction','can_update');
|
||||
$barcode=trim((string)$this->input->post('barcode',true));$userId=(int)$this->input->post('user_id');$status=trim((string)$this->input->post('status',true));$date=trim((string)$this->input->post('date',true));$customer=(int)$this->input->post('customer_id');$notes=trim((string)$this->input->post('notes',true));$qty=(float)$this->input->post('qty');$source=trim((string)$this->input->post('source_status',true));$key=trim((string)$this->input->post('idempotency_key',true));
|
||||
if($barcode===''||$userId<1)return json_response(false,'Barang teknisi tidak valid.',array(),422);
|
||||
if(!in_array($status,array('installed','carried','warehouse'),true))return json_response(false,'Status tujuan tidak valid.',array(),422);
|
||||
@@ -657,7 +657,7 @@ class Teknisi extends MY_Controller {
|
||||
public function register_customer_equipment()
|
||||
{
|
||||
if(strtoupper($this->input->method())!=='POST')show_404();
|
||||
$this->equipmentPermission('technician_equipment','can_create');
|
||||
$this->equipmentPermission('technician_customer_item','can_create');
|
||||
$saved=array();try{$files=$this->validatedEquipmentFiles();$post=$this->input->post(NULL,true);if((($post['ownership_type']??'')==='transferred_non_inventory'||!empty($post['deployment_allowed']))&&!$files)throw new BusinessException('Bukti penyerahan/otorisasi wajib dilampirkan untuk status yang dipilih.');$this->db->trans_begin();$result=$this->technicianequipmentservice->registerExternal($post,(int)$this->session->userdata('user_id'));foreach($files as$file)$saved[]=$this->storeEquipmentFile((int)$result['id'],$file,'customer_equipment_registry');if($this->db->trans_status()===false)throw new RuntimeException('Register barang customer gagal disimpan.');$this->db->trans_commit();log_activity('items','equipment_register','Mendaftarkan barang customer non-accounting '.$result['external_barcode'],'success');return json_response(true,'Barang customer berhasil dicatat tanpa masuk persediaan accounting.',array('result'=>$result));}
|
||||
catch(Throwable $e){if($this->db->trans_active())$this->db->trans_rollback();foreach($saved as$path)if(is_file($path))@unlink($path);return business_exception_response($e);}
|
||||
}
|
||||
@@ -741,15 +741,14 @@ class Teknisi extends MY_Controller {
|
||||
|
||||
private function equipmentPermission($feature,$action)
|
||||
{
|
||||
if(is_master_admin_user())return true;if(check_permission($feature,$action))return true;$permissions=$this->session->userdata('permissions');if(is_array($permissions)&&array_key_exists($feature,$permissions))return$this->requirePermission($feature,$action);
|
||||
// Hanya session lama yang belum mengenal feature baru yang memakai fallback.
|
||||
if(check_permission('items',$action))return true;
|
||||
if(is_master_admin_user())return true;
|
||||
if(check_permission($feature,$action))return true;
|
||||
return$this->requirePermission($feature,$action);
|
||||
}
|
||||
|
||||
private function equipmentPermissionFlags()
|
||||
{
|
||||
$pairs=array('view'=>array('technician_equipment','can_view'),'attachment'=>array('technician_attachment','can_view'),'register'=>array('technician_equipment','can_create'),'handover'=>array('technician_handover','can_create'),'install'=>array('technician_installation','can_create'),'remove'=>array('technician_installation','can_update'),'transfer'=>array('technician_transfer','can_update'),'return'=>array('technician_return','can_update'),'inspect_view'=>array('technician_inspection','can_view'),'inspect'=>array('technician_inspection','can_post'),'condition'=>array('technician_condition','can_update'),'correct'=>array('technician_correction','can_update'),'export'=>array('technician_equipment','can_export'));$flags=array();$permissions=$this->session->userdata('permissions');foreach($pairs as$key=>$pair){$known=is_array($permissions)&&array_key_exists($pair[0],$permissions);$flags[$key]=is_master_admin_user()||check_permission($pair[0],$pair[1])||(!$known&&check_permission('items',$pair[1]));}return$flags;
|
||||
$pairs=array('view'=>array('technician_equipment','can_view'),'attachment'=>array('technician_attachment','can_view'),'register'=>array('technician_customer_item','can_create'),'handover'=>array('technician_handover','can_create'),'install'=>array('technician_installation','can_create'),'remove'=>array('technician_installation','can_update'),'transfer'=>array('technician_transfer','can_update'),'return'=>array('technician_return','can_update'),'inspect_view'=>array('technician_inspection','can_view'),'inspect'=>array('technician_inspection','can_post'),'condition'=>array('technician_condition','can_update'),'correct'=>array('technician_correction','can_update'),'export'=>array('technician_equipment','can_export'));$flags=array();foreach($pairs as$key=>$pair)$flags[$key]=is_master_admin_user()||check_permission($pair[0],$pair[1]);return$flags;
|
||||
}
|
||||
|
||||
private function restrictedTechnicianEmployee()
|
||||
|
||||
Reference in New Issue
Block a user