Files
accounting_dev_v2/application/views/hr_payroll/organization_master.php
T
2026-09-14 11:14:25 +07:00

38 lines
6.8 KiB
PHP

<div class="container-fluid py-3">
<?php $this->load->view('hr_payroll/_header',array('active_menu'=>'organization_master','title'=>'Departemen & Posisi','subtitle'=>'Satu sumber data organisasi untuk karyawan, pembelian, payroll, jadwal, dan modul terkait.')); ?>
<div class="row g-3">
<div class="col-lg-6"><div class="card h-100"><div class="card-header"><b>Departemen</b></div><div class="card-body">
<form id="departmentForm" class="row g-2 mb-3"><input type="hidden" name="<?=$this->security->get_csrf_token_name()?>" value="<?=$this->security->get_csrf_hash()?>"><input type="hidden" name="id"><div class="col-md-3"><input class="form-control" name="code" placeholder="Kode" required></div><div class="col-md-4"><input class="form-control" name="name" placeholder="Nama departemen" required></div><div class="col-md-5"><input class="form-control" name="description" placeholder="Keterangan"></div><div class="col-8"><label><input type="checkbox" name="is_active" value="1" checked> Aktif</label></div><div class="col-4 text-end"><button type="button" class="btn btn-light btn-reset">Reset</button> <button class="btn btn-primary">Simpan</button></div></form>
<div class="table-responsive"><table class="table table-sm align-middle"><thead><tr><th>Kode</th><th>Departemen</th><th>Status</th><th></th></tr></thead><tbody id="departmentRows"></tbody></table></div>
</div></div></div>
<div class="col-lg-6"><div class="card h-100"><div class="card-header"><b>Posisi / Jabatan</b></div><div class="card-body">
<form id="positionForm" class="row g-2 mb-3"><input type="hidden" name="<?=$this->security->get_csrf_token_name()?>" value="<?=$this->security->get_csrf_hash()?>"><input type="hidden" name="id"><div class="col-md-3"><input class="form-control" name="code" placeholder="Kode" required></div><div class="col-md-4"><input class="form-control" name="name" placeholder="Nama posisi" required></div><div class="col-md-5"><select class="form-select" name="department_id" id="positionDepartment"><option value="">Semua departemen</option></select></div><div class="col-12"><input class="form-control" name="description" placeholder="Keterangan/tanggung jawab"></div><div class="col-8"><label><input type="checkbox" name="is_active" value="1" checked> Aktif</label></div><div class="col-4 text-end"><button type="button" class="btn btn-light btn-reset">Reset</button> <button class="btn btn-primary">Simpan</button></div></form>
<div class="table-responsive"><table class="table table-sm align-middle"><thead><tr><th>Kode</th><th>Posisi</th><th>Departemen</th><th>Status</th><th></th></tr></thead><tbody id="positionRows"></tbody></table></div>
</div></div></div>
</div>
</div>
<script>
$(function(){
const base='<?=base_url('organizationmaster/')?>';
const departmentForm=document.getElementById('departmentForm'),positionForm=document.getElementById('positionForm');
const departmentRows=document.getElementById('departmentRows'),positionRows=document.getElementById('positionRows'),positionDepartment=document.getElementById('positionDepartment');
const esc=v=>$('<div>').text(v??'').html();
let state={departments:[],positions:[]};
async function load(){
try{
const response=await fetch(base+'data',{headers:{Accept:'application/json','X-Requested-With':'XMLHttpRequest'}}),json=await response.json();
if(!response.ok||!json.status)throw new Error(json.message||'Gagal mengambil master organisasi.');
state={departments:Array.isArray(json.departments)?json.departments:[],positions:Array.isArray(json.positions)?json.positions:[]};
departmentRows.innerHTML=state.departments.map(x=>`<tr><td>${esc(x.code)}</td><td>${esc(x.department_name)}<small class="d-block text-muted">${esc(x.description||'')}</small></td><td>${x.is_active==1?'Aktif':'Nonaktif'}</td><td class="text-end"><button class="btn btn-sm btn-outline-primary edit-dep" data-id="${x.id}">Edit</button> <button class="btn btn-sm btn-outline-danger del-dep" data-id="${x.id}">Hapus</button></td></tr>`).join('')||'<tr><td colspan="4" class="text-center text-muted">Belum ada departemen.</td></tr>';
positionRows.innerHTML=state.positions.map(x=>`<tr><td>${esc(x.code)}</td><td>${esc(x.position_name)}</td><td>${esc(x.department_name||'Semua')}</td><td>${x.is_active==1?'Aktif':'Nonaktif'}</td><td class="text-end"><button class="btn btn-sm btn-outline-primary edit-pos" data-id="${x.id}">Edit</button> <button class="btn btn-sm btn-outline-danger del-pos" data-id="${x.id}">Hapus</button></td></tr>`).join('')||'<tr><td colspan="5" class="text-center text-muted">Belum ada posisi.</td></tr>';
positionDepartment.innerHTML='<option value="">Semua departemen</option>'+state.departments.filter(x=>x.is_active==1).map(x=>`<option value="${x.id}">${esc(x.code+' - '+x.department_name)}</option>`).join('');
}catch(error){departmentRows.innerHTML=positionRows.innerHTML=`<tr><td colspan="5" class="text-danger">${esc(error.message)}</td></tr>`;}
}
async function save(form,path){const button=form.querySelector('button[type="submit"]');button.disabled=true;try{const response=await fetch(base+path,{method:'POST',body:new FormData(form),headers:{Accept:'application/json','X-Requested-With':'XMLHttpRequest'}}),json=await response.json();if(!response.ok||!json.status)throw new Error(json.message||'Gagal menyimpan');form.reset();form.elements.id.value='';form.elements.is_active.checked=true;await load();}catch(error){alert(error.message)}finally{button.disabled=false}}
departmentForm.addEventListener('submit',event=>{event.preventDefault();save(departmentForm,'save_department')});
positionForm.addEventListener('submit',event=>{event.preventDefault();save(positionForm,'save_position')});
$(document).on('click','.btn-reset',function(){const form=this.closest('form');form.reset();form.elements.id.value='';form.elements.is_active.checked=true}).on('click','.edit-dep',function(){const x=state.departments.find(v=>v.id==this.dataset.id),f=departmentForm;if(!x)return;f.elements.id.value=x.id;f.elements.code.value=x.code;f.elements.name.value=x.department_name;f.elements.description.value=x.description||'';f.elements.is_active.checked=x.is_active==1}).on('click','.edit-pos',function(){const x=state.positions.find(v=>v.id==this.dataset.id),f=positionForm;if(!x)return;f.elements.id.value=x.id;f.elements.code.value=x.code;f.elements.name.value=x.position_name;f.elements.department_id.value=x.department_id||'';f.elements.description.value=x.description||'';f.elements.is_active.checked=x.is_active==1}).on('click','.del-dep,.del-pos',async function(){if(!confirm('Hapus data ini? Data yang sudah digunakan akan dinonaktifkan.'))return;const path=this.classList.contains('del-dep')?'delete_department/':'delete_position/',response=await fetch(base+path+this.dataset.id,{method:'POST',body:new FormData(departmentForm),headers:{Accept:'application/json','X-Requested-With':'XMLHttpRequest'}}),json=await response.json();alert(json.message);load()});
load();
});
</script>