hr dan payroll

This commit is contained in:
Wian Drs
2026-09-15 10:38:43 +07:00
parent 5e1fd11410
commit 8fedd39d8f
47 changed files with 1409 additions and 370 deletions
+32 -1
View File
@@ -38,6 +38,9 @@ class Jurnal extends MY_Controller {
$start = $_POST['start'];
$length = $_POST['length'];
$search = $_POST['search']['value'];
$status = (string) $this->input->post('status', true);
$allowedStatuses = array('draft', 'submitted', 'approved', 'posted', 'rejected', 'reversed');
if (!in_array($status, $allowedStatuses, true)) $status = '';
// ================= TOTAL ALL
$totalAll = $this->db->where('company_id',$this->companycontext->id())->count_all_results('journals');
@@ -45,6 +48,10 @@ class Jurnal extends MY_Controller {
// ================= QUERY FILTERED (HITUNG)
$this->db->from('journals')->where('company_id',$this->companycontext->id());
if ($status !== '') {
$this->db->where('status', $status);
}
if(!empty($search)){
$this->db->group_start();
$this->db->like('no_ref', $search);
@@ -63,6 +70,9 @@ class Jurnal extends MY_Controller {
journals.keterangan,
journals.status,
journals.is_reversed,
journals.ref_type,
journals.created_by,
journals.rejection_reason,
COALESCE(SUM(journal_details.debit),0) as total_debit,
COALESCE(SUM(journal_details.kredit),0) as total_kredit
');
@@ -70,6 +80,10 @@ class Jurnal extends MY_Controller {
$this->db->join('journal_details','journal_details.journal_id = journals.id','LEFT');
$this->db->where('journals.company_id',$this->companycontext->id());
if ($status !== '') {
$this->db->where('journals.status', $status);
}
if(!empty($search)){
$this->db->group_start();
$this->db->like('journals.no_ref', $search);
@@ -92,12 +106,17 @@ class Jurnal extends MY_Controller {
foreach ($query as $row) {
$no++;
$isAdmin = $this->session->userdata('role') === 'Admin';
$isAdmin = is_master_admin_user() || $this->session->userdata('role') === 'Admin';
$isOwner = (int)$row->created_by === (int)$this->session->userdata('user_id');
$aksi = '<button class="btn btn-sm btn-info btn-detail" data-id="'.$row->id.'">Detail</button> ';
if ($row->status === 'draft') {
$aksi .= '<button class="btn btn-sm btn-primary btn-submit" data-id="'.$row->id.'">Submit</button> ';
if ($isAdmin) $aksi .= '<button class="btn btn-sm btn-danger btn-delete" data-id="'.$row->id.'">Hapus</button> ';
}
if ($row->status === 'rejected' && ($isOwner || $isAdmin) && in_array((string)$row->ref_type, array('', 'manual_journal'), true)) {
$aksi .= '<button class="btn btn-sm btn-warning btn-edit-rejected" data-id="'.$row->id.'">Edit & Koreksi</button> ';
if ($isAdmin) $aksi .= '<button class="btn btn-sm btn-danger btn-delete" data-id="'.$row->id.'">Hapus</button> ';
}
if ($isAdmin && $row->status === 'submitted') {
$aksi .= '<button class="btn btn-sm btn-success btn-approve" data-id="'.$row->id.'">Approve</button> ';
$aksi .= '<button class="btn btn-sm btn-outline-danger btn-reject" data-id="'.$row->id.'">Reject</button> ';
@@ -181,6 +200,18 @@ class Jurnal extends MY_Controller {
}
}
public function update_rejected($id)
{
if (strtoupper($this->input->method()) !== 'POST') return json_response(false, 'Metode request tidak diizinkan.', array(), 405);
try {
$accounts=(array)$this->input->post('account_id');$debit=(array)$this->input->post('debit');$kredit=(array)$this->input->post('kredit');$lines=array();
foreach($accounts as$index=>$accountId){$d=isset($debit[$index])?$this->parseNominal($debit[$index]):0;$k=isset($kredit[$index])?$this->parseNominal($kredit[$index]):0;if($d<=0&&$k<=0)continue;$lines[]=array('account_id'=>(int)$accountId,'debit'=>$d,'kredit'=>$k);}
$journal=$this->journalservice->reviseRejected((int)$id,array('tanggal'=>(string)$this->input->post('tanggal',true),'keterangan'=>trim((string)$this->input->post('keterangan',true))),$lines,(int)$this->session->userdata('user_id'));
log_activity('Jurnal','revise_rejected','Mengoreksi jurnal ditolak '.$journal->no_ref.' menjadi Draft.','success');
return json_response(true,'Koreksi jurnal berhasil disimpan sebagai Draft dan dapat diajukan kembali.',array('journal_id'=>$journal->id));
} catch (Throwable $exception) { return business_exception_response($exception); }
}
/** Menerima nominal raw maupun berformat 20,000 / 20.000 / 20.000,50. */
private function parseNominal($value)
{