pemindahan submenu peralatan teknisi ke menu Oprasional Peralatan

This commit is contained in:
Wian Drs
2026-09-15 11:47:49 +07:00
parent 8fedd39d8f
commit e4d6245a3d
17 changed files with 151 additions and 42 deletions
+18 -4
View File
@@ -12,7 +12,8 @@ class NavigationService
array('key'=>'approvals','label'=>'Approval','icon'=>'bi-inbox','url'=>'approvals','feature'=>'approvals','badge'=>$this->approvalBadge()),
array('key'=>'sales_menu','label'=>'Penjualan','icon'=>'bi-receipt','feature'=>'invoices','badge'=>$this->salesBadge('all'),'badge_class'=>$this->salesBadge('overdue')?'nav-badge-danger':'nav-badge-warning','badge_title'=>'Invoice, piutang, pengiriman, atau retur membutuhkan tindakan','children'=>array(array('key'=>'sales','label'=>'Ringkasan Penjualan','url'=>'sales'),array('key'=>'sales_invoice','label'=>'Invoice','url'=>'invoices','badge'=>$this->salesBadge('draft')+$this->salesBadge('approval'),'badge_class'=>'nav-badge-warning'),array('key'=>'sales_delivery','label'=>'Pengiriman / Surat Jalan','url'=>'sales/deliveries','badge'=>$this->salesBadge('delivery'),'badge_class'=>'nav-badge-warning'),array('key'=>'receivables','label'=>'Piutang & Pembayaran','url'=>'receivables','badge'=>$this->salesBadge('receivable'),'badge_class'=>$this->salesBadge('overdue')?'nav-badge-danger':'nav-badge-warning'),array('key'=>'sales_return','label'=>'Retur Penjualan & Refund','url'=>'sales/returns','badge'=>$this->salesBadge('return'),'badge_class'=>'nav-badge-warning'),array('key'=>'customers','label'=>'Customer','url'=>'customers'))),
array('key'=>'purchase','label'=>'Pembelian','icon'=>'bi-cart','feature'=>array('purchases','purchase_returns','purchase_refunds','supplier_debit_notes'),'badge'=>$this->purchaseBadge(),'badge_class'=>$this->purchaseBadgeClass(),'badge_title'=>'Tagihan dan dokumen Retur/Refund yang membutuhkan tindakan','children'=>array(array('key'=>'suppliers','label'=>'Master Supplier','url'=>'suppliers','feature'=>'purchases'),array('key'=>'purchases','label'=>'Purchase Workflow','url'=>'purchases','feature'=>'purchases'),array('key'=>'purchase_returns','label'=>'Retur & Refund','url'=>'purchases/returns','feature'=>array('purchase_returns','purchase_refunds','supplier_debit_notes'),'badge'=>$this->returnBadge(),'badge_class'=>$this->returnBadgeClass(),'badge_title'=>'Dokumen Retur/Refund yang membutuhkan tindakan'),array('key'=>'payables','label'=>'Hutang & Pembayaran','url'=>'payables','feature'=>'purchases','badge'=>$this->payableBadge(),'badge_class'=>$this->payableBadgeClass(),'badge_title'=>$this->payableBadgeTitle()))),
array('key'=>'inventory','label'=>'Persediaan','icon'=>'bi-boxes','feature'=>array('items','technician_equipment'),'badge'=>$this->inventoryBadge(),'badge_class'=>($this->inventoryDocumentBadge()+$this->technicianActionBadge())>0?'nav-badge-danger':'nav-badge-warning','badge_title'=>'Barang pending, dokumen stok, atau peralatan teknisi membutuhkan tindakan','children'=>array(array('key'=>'inventory_overview','label'=>'Ringkasan Persediaan','url'=>'inventoryprofessional','feature'=>'items'),array('key'=>'draft_items','label'=>'Barang Pending','url'=>'items/draft_items','feature'=>'items','badge'=>$this->pendingItemBadge(),'badge_class'=>'nav-badge-warning'),array('key'=>'items','label'=>'Daftar Barang','url'=>'items','feature'=>'items'),array('key'=>'inventory_operations','label'=>'Operasional Stok','url'=>'inventoryprofessional/operations','feature'=>'items','badge'=>$this->inventoryDocumentBadge(),'badge_class'=>'nav-badge-danger','badge_title'=>'Dokumen stok menunggu persetujuan atau posting'),array('key'=>'inventory_locations','label'=>'Gudang & Lokasi Rak','url'=>'inventoryprofessional/locations','feature'=>'items'),array('key'=>'kode_barang','label'=>'Jenis / Kode Barang','url'=>'kodebarang','feature'=>'items'),array('key'=>'peralatan_teknisi','label'=>'Peralatan Teknisi','url'=>'teknisi','feature'=>array('technician_equipment','items'),'badge'=>$this->technicianActionBadge(),'badge_class'=>'nav-badge-danger','badge_title'=>'Barang menunggu pemeriksaan atau tindak lanjut'),array('key'=>'inventory_reports','label'=>'Laporan Persediaan','url'=>'inventoryprofessional/reports','feature'=>'items'))),
array('key'=>'inventory','label'=>'Persediaan','icon'=>'bi-boxes','feature'=>'items','badge'=>$this->inventoryBadge(),'badge_class'=>$this->inventoryDocumentBadge()>0?'nav-badge-danger':'nav-badge-warning','badge_title'=>'Barang pending atau dokumen stok membutuhkan tindakan','children'=>array(array('key'=>'inventory_overview','label'=>'Ringkasan Persediaan','url'=>'inventoryprofessional','feature'=>'items'),array('key'=>'draft_items','label'=>'Barang Pending','url'=>'items/draft_items','feature'=>'items','badge'=>$this->pendingItemBadge(),'badge_class'=>'nav-badge-warning'),array('key'=>'items','label'=>'Daftar Barang','url'=>'items','feature'=>'items'),array('key'=>'inventory_operations','label'=>'Operasional Stok','url'=>'inventoryprofessional/operations','feature'=>'items','badge'=>$this->inventoryDocumentBadge(),'badge_class'=>'nav-badge-danger','badge_title'=>'Dokumen stok menunggu persetujuan atau posting'),array('key'=>'inventory_locations','label'=>'Gudang & Lokasi Rak','url'=>'inventoryprofessional/locations','feature'=>'items'),array('key'=>'kode_barang','label'=>'Jenis / Kode Barang','url'=>'kodebarang','feature'=>'items'),array('key'=>'inventory_reports','label'=>'Laporan Persediaan','url'=>'inventoryprofessional/reports','feature'=>'items'))),
array('key'=>'peralatan_teknisi','label'=>'Operasional Perangkat','icon'=>'bi-router','url'=>'teknisi','feature'=>'technician_equipment','badge'=>$this->technicianActionBadge(),'badge_class'=>'nav-badge-danger','badge_title'=>'Perangkat menunggu pemeriksaan atau tindak lanjut'),
array('key'=>'fixed_assets','label'=>'Aset Tetap','icon'=>'bi-building-gear','url'=>'fixedassets','feature'=>'asset'),
array('key'=>'accounting','label'=>'Accounting','icon'=>'bi-journal-text','feature'=>'jurnal','children'=>array(array('key'=>'jurnal','label'=>'Jurnal Umum','url'=>'jurnal'),array('key'=>'accounts','label'=>'Daftar Akun','url'=>'accounts'),array('key'=>'basejurnal','label'=>'Base Jurnal','url'=>'basejurnal'),array('key'=>'accounting_periods','label'=>'Periode Accounting','url'=>'accountingperiods'))),
array('key'=>'professional_reports','label'=>'Laporan Profesional','icon'=>'bi-bar-chart','url'=>'professionalreports','feature'=>'reports'),
@@ -29,8 +30,14 @@ class NavigationService
private function budgetApprovalBadge(){if($this->budgetBadge!==null)return$this->budgetBadge;if(!$this->allowed('budgets'))return$this->budgetBadge=0;$company=(int)$this->CI->session->userdata('company_id');$total=0;if($this->CI->db->table_exists('budgets')&&(is_master_admin_user()||check_permission('budgets','can_approve'))){$this->CI->db->where('status','submitted');if($this->CI->db->field_exists('company_id','budgets'))$this->CI->db->where('company_id',$company);$total+=(int)$this->CI->db->count_all_results('budgets');}if($this->CI->db->table_exists('account_budget_entries')&&$this->CI->db->table_exists('account_budget_reminder_completions')){$period=date('Y-m');$row=$this->CI->db->query("SELECT COUNT(*) total FROM account_budget_entries e WHERE e.company_id=? AND e.is_active=1 AND e.reminder_enabled=1 AND ((e.entry_type='recurring' AND e.period<=?) OR (e.entry_type='override' AND e.period=?)) AND LEAST(e.reminder_day,DAY(LAST_DAY(CURDATE())))<=LEAST(DAY(LAST_DAY(CURDATE())),DAY(CURDATE())+7) AND NOT EXISTS(SELECT 1 FROM account_budget_reminder_completions c WHERE c.company_id=e.company_id AND c.budget_entry_id=e.id AND c.period=?)",array($company,$period,$period,$period))->row();$total+=(int)($row?$row->total:0);}return$this->budgetBadge=$total;}
private function pendingItemBadge(){if($this->pendingBadge!==null)return$this->pendingBadge;if(!$this->CI->db->table_exists('items'))return$this->pendingBadge=0;$company=(int)$this->CI->session->userdata('company_id');if($this->CI->db->table_exists('item_barcodes'))return$this->pendingBadge=(int)$this->CI->db->query("SELECT COUNT(DISTINCT i.id) total FROM items i LEFT JOIN item_barcodes ib ON ib.item_id=i.id AND ib.status='pending' WHERE i.company_id=? AND EXISTS(SELECT 1 FROM goods_receipt_lines grl WHERE grl.item_id=i.id) AND(i.status='draft' OR ib.id IS NOT NULL)",array($company))->row()->total;return$this->pendingBadge=(int)$this->CI->db->where(array('status'=>'draft','company_id'=>$company))->count_all_results('items');}
private function inventoryDocumentBadge(){if($this->inventoryDocumentBadge!==null)return$this->inventoryDocumentBadge;if(!$this->CI->db->table_exists('stock_documents'))return$this->inventoryDocumentBadge=0;$this->CI->db->where_in('status',array('submitted','approved'));if($this->CI->db->field_exists('company_id','stock_documents'))$this->CI->db->where('company_id',(int)$this->CI->session->userdata('company_id'));return$this->inventoryDocumentBadge=(int)$this->CI->db->count_all_results('stock_documents');}
private function technicianActionBadge(){if($this->technicianBadge!==null)return$this->technicianBadge;if(!$this->CI->db->table_exists('technician_custody_allocations'))return$this->technicianBadge=0;$this->CI->db->where('company_id',(int)$this->CI->session->userdata('company_id'))->where_in('condition_status',array('inspection_required','repair_required','damaged','lost'));return$this->technicianBadge=(int)$this->CI->db->count_all_results('technician_custody_allocations');}
private function inventoryBadge(){return$this->pendingItemBadge()+$this->inventoryDocumentBadge()+$this->technicianActionBadge();}
private function technicianActionBadge(){
if($this->technicianBadge!==null)return$this->technicianBadge;
if(!$this->CI->db->table_exists('technician_custody_allocations')||(!is_master_admin_user()&&!check_permission('technician_inspection','can_view')))return$this->technicianBadge=0;
$technicianId=0;$role=strtolower((string)$this->CI->session->userdata('role'));
if(!is_master_admin_user()&&!check_permission('technician_equipment_all','can_view')&&strpos($role,'teknisi')!==false&&$this->CI->db->field_exists('employee_id','users')){$user=$this->CI->db->select('employee_id')->get_where('users',array('id'=>(int)$this->CI->session->userdata('user_id')))->row();$technicianId=$user?(int)$user->employee_id:0;}
$this->CI->load->library('TechnicianEquipmentService');$stats=$this->CI->technicianequipmentservice->inspectionQueueStats($technicianId);return$this->technicianBadge=(int)$stats['row_count'];
}
private function inventoryBadge(){return$this->pendingItemBadge()+$this->inventoryDocumentBadge();}
private function payableBadge(){if($this->payableBadge!==null)return$this->payableBadge;if(!$this->CI->db->table_exists('supplier_invoices'))return$this->payableBadge=0;$this->CI->db->select("COUNT(DISTINCT id) total,SUM(CASE WHEN due_date<=CURDATE() THEN 1 ELSE 0 END) overdue",false)->where('status','partial')->where('balance >',0);if($this->CI->db->field_exists('company_id','supplier_invoices'))$this->CI->db->where('company_id',(int)$this->CI->session->userdata('company_id'));$row=$this->CI->db->get('supplier_invoices')->row();$this->payableBadge=$row?(int)$row->total:0;$this->payableBadgeClass=$row&&(int)$row->overdue>0?'nav-badge-danger':($this->payableBadge>0?'nav-badge-warning':'');return$this->payableBadge;}
private function payableBadgeClass(){$this->payableBadge();return$this->payableBadgeClass;}
private function payableBadgeTitle(){$this->payableBadge();return$this->payableBadgeClass==='nav-badge-danger'?'Ada tagihan yang sudah jatuh tempo':'Tagihan belum lunas dan belum jatuh tempo';}
@@ -38,6 +45,13 @@ class NavigationService
private function returnBadgeClass(){$this->returnBadge();return$this->returnBadgeClass;}
private function purchaseBadge(){return($this->allowed('purchases')?$this->payableBadge():0)+$this->returnBadge();}
private function purchaseBadgeClass(){return($this->allowed('purchases')&&$this->payableBadgeClass()==='nav-badge-danger')||$this->returnBadgeClass()==='nav-badge-danger'?'nav-badge-danger':($this->purchaseBadge()>0?'nav-badge-warning':'');}
public function breadcrumb($active){foreach($this->items()as$i){if($i['key']===$active)return array($i['label']);foreach(isset($i['children'])?$i['children']:array()as$c)if($c['key']===$active)return array($i['label'],$c['label']);}return array(ucwords(str_replace('_',' ',$active)));}
public function breadcrumb($active){
if($active==='peralatan_teknisi'){
$pages=array('index'=>'Ringkasan','bulk_workflow'=>'Pergerakan Batch','detail'=>'Detail Teknisi','replacement_workflow'=>'Pemasangan & Penggantian','inspection_queue'=>'Pemeriksaan','customer_register'=>'Barang Customer','log_barang'=>'Riwayat & PDF');
$method=strtolower((string)$this->CI->router->fetch_method());
return array('Operasional Perangkat',$pages[$method]??'Ringkasan');
}
foreach($this->items()as$i){if($i['key']===$active)return array($i['label']);foreach(isset($i['children'])?$i['children']:array()as$c)if($c['key']===$active)return array($i['label'],$c['label']);}return array(ucwords(str_replace('_',' ',$active)));
}
public function quickActions(){$defs=array(array('label'=>'Jurnal','icon'=>'bi-journal-plus','url'=>'jurnal','feature'=>'jurnal'),array('label'=>'Terima Pembayaran','icon'=>'bi-cash-coin','url'=>'receivables','feature'=>'invoices'),array('label'=>'Bayar Supplier','icon'=>'bi-wallet2','url'=>'payables','feature'=>'purchases'),array('label'=>'Scan QR','icon'=>'bi-qr-code-scan','url'=>'inventoryprofessional#scanner','feature'=>'items'));$out=array();foreach($defs as$d)if($this->allowed($d['feature']))$out[]=$d;return$out;}
}