456 lines
15 KiB
PHP
456 lines
15 KiB
PHP
<?php
|
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
|
|
|
class Asset extends CI_Controller {
|
|
|
|
public function __construct(){
|
|
parent::__construct();
|
|
$this->load->database();
|
|
|
|
if (!$this->session->userdata('logged_in')) {
|
|
redirect('auth');
|
|
}
|
|
}
|
|
|
|
public function index(){
|
|
$data = ["active_menu" => "asset"];
|
|
$this->load->view('partials/header', $data);
|
|
$this->load->view('asset/layout');
|
|
$this->load->view('partials/footer');
|
|
}
|
|
|
|
// ================= GET DATA =================
|
|
public function get_data(){
|
|
$data = $this->db
|
|
->select('assets.*, lokasi_asset.nama as nama_lokasi')
|
|
->from('assets')
|
|
->join('lokasi_asset', 'lokasi_asset.id = assets.lokasi_asset_id', 'left')
|
|
->order_by('assets.tanggal_perolehan','DESC')
|
|
->get()
|
|
->result();
|
|
|
|
$no = 1;
|
|
$result = [];
|
|
|
|
foreach($data as $d){
|
|
$result[] = [
|
|
$no++,
|
|
$d->tanggal_perolehan,
|
|
$d->kode_asset ?? '-',
|
|
$d->nama_asset,
|
|
$d->nama_lokasi ?? '-',
|
|
$d->keterangan ?? '-',
|
|
number_format($d->nilai_perolehan),
|
|
$d->masa_manfaat . ' bln',
|
|
number_format($d->penyusutan_per_bulan),
|
|
$d->created_at,
|
|
'
|
|
<button class="btn btn-sm btn-info btn-detail mb-1 ml-1" data-id="'.$d->id.'"><i class="bi bi-eye"></i></button>
|
|
<button class="btn btn-sm btn-warning btn-edit mb-1 ml-1" data-id="'.$d->id.'">Edit</button>
|
|
<button class="btn btn-sm btn-danger btn-delete mb-1 ml-1" data-id="'.$d->id.'">Hapus</button>
|
|
'
|
|
];
|
|
}
|
|
|
|
echo json_encode(['data'=>$result]);
|
|
}
|
|
|
|
// ================= DETAIL ASSET + HISTORY =================
|
|
public function detail($id)
|
|
{
|
|
$data = $this->db
|
|
->select('a.*, la.nama AS nama_lokasi') // ambil field tambahan dari lokasi_asset
|
|
->from('assets a')
|
|
->join('lokasi_asset la', 'a.lokasi_asset_id = la.id', 'left')
|
|
->where('a.id', $id)
|
|
->get()
|
|
->row();
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
public function get_history($asset_id){
|
|
$data = $this->db
|
|
->where('asset_id', $asset_id)
|
|
->order_by('created_at', 'DESC')
|
|
->get('asset_mutations')
|
|
->result();
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
// ================= SAVE MANUAL (1 UNIT) =================
|
|
public function save(){
|
|
$harga = preg_replace('/\D/','',$this->input->post('harga'));
|
|
$residu = preg_replace('/\D/','',$this->input->post('residu'));
|
|
$masa = (int)$this->input->post('masa');
|
|
$account_debit_id = (int)$this->input->post('account_asset');
|
|
$account_kredit_id = (int)$this->input->post('account_kas');
|
|
$lokasi_asset_id = (int)$this->input->post('lokasi_asset');
|
|
$tanggal = $this->input->post('tanggal');
|
|
$nama_asset = $this->input->post('nama_asset');
|
|
$keterangan = $this->input->post('keterangan');
|
|
|
|
$nilai_perolehan = $harga * 1;
|
|
$penyusutan = ($harga - $residu) / ($masa ?: 1);
|
|
|
|
$this->db->trans_start();
|
|
|
|
$data = [
|
|
'kode_asset' => 'AST-'.time(),
|
|
'nama_asset' => $nama_asset,
|
|
'harga_per_unit' => $harga,
|
|
'nilai_perolehan' => $nilai_perolehan,
|
|
'tanggal_perolehan' => $tanggal,
|
|
'masa_manfaat' => $masa,
|
|
'nilai_residu' => $residu,
|
|
'penyusutan_per_bulan' => $penyusutan,
|
|
'nilai_buku' => $nilai_perolehan,
|
|
'sumber' => 'pembelian',
|
|
'account_debit_id' => $account_debit_id,
|
|
'account_kredit_id' => $account_kredit_id,
|
|
'lokasi_asset_id' => $lokasi_asset_id,
|
|
'keterangan' => $keterangan,
|
|
'qty' => 1
|
|
];
|
|
|
|
$this->db->insert('assets',$data);
|
|
$asset_id = $this->db->insert_id();
|
|
|
|
// Journal
|
|
$this->db->insert('journals',[
|
|
'tanggal' => $tanggal,
|
|
'no_ref' => 'AST-'.date('YmdHis').'-'.$asset_id,
|
|
'keterangan' => 'Penambahan Aset '.$nama_asset,
|
|
'ref_type' => 'assets',
|
|
'ref_id' => $asset_id,
|
|
'created_by' => $this->session->userdata('user_id')
|
|
]);
|
|
|
|
$jid = $this->db->insert_id();
|
|
|
|
$this->db->insert('journal_details',[
|
|
'journal_id' => $jid,
|
|
'account_id' => $account_debit_id,
|
|
'debit' => $nilai_perolehan,
|
|
'kredit' => 0
|
|
]);
|
|
|
|
$this->db->insert('journal_details',[
|
|
'journal_id' => $jid,
|
|
'account_id' => $account_kredit_id,
|
|
'debit' => 0,
|
|
'kredit' => $nilai_perolehan
|
|
]);
|
|
|
|
// MUTATION PEROLEHAN
|
|
$this->db->insert('asset_mutations',[
|
|
'asset_id' => $asset_id,
|
|
'tipe' => 'perolehan',
|
|
'nilai' => $nilai_perolehan,
|
|
'keterangan' => 'Perolehan manual: '.$keterangan,
|
|
'tanggal_dibuat' => $tanggal
|
|
]);
|
|
|
|
$this->db->trans_complete();
|
|
|
|
if ($this->db->trans_status()) {
|
|
log_activity('Asset', 'create', 'Menambah asset manual: '.$nama_asset.' (ID: '.$asset_id.')');
|
|
echo json_encode(['status'=>true]);
|
|
} else {
|
|
echo json_encode(['status'=>false]);
|
|
}
|
|
}
|
|
|
|
// ================= SAVE FROM STOCK =================
|
|
public function save_from_stock(){
|
|
$item_id = $this->input->post('item_id');
|
|
$account_debit_id = (int)$this->input->post('account_asset');
|
|
$lokasi_asset_id = (int)$this->input->post('s_lokasi_asset');
|
|
$masa = (int)$this->input->post('s_masa');
|
|
$residu = preg_replace('/\D/','',$this->input->post('s_residu'));
|
|
$tanggal = $this->input->post('s_tanggal');
|
|
$keterangan = $this->input->post('s_keterangan');
|
|
$barcode_id = $this->input->post('barcode_id');
|
|
$qty = (int)$this->input->post('qty');
|
|
if($qty < 1){
|
|
$qty = 1;
|
|
}
|
|
|
|
$item = $this->db->get_where('items',['id'=>$item_id])->row();
|
|
|
|
if(!$item){
|
|
echo json_encode(['status'=>false,'message'=>'Item tidak ditemukan']);
|
|
return;
|
|
}
|
|
|
|
if(!$barcode_id){
|
|
echo json_encode(['status'=>false,'message'=>'Barcode wajib dipilih']);
|
|
return;
|
|
}
|
|
|
|
if($item->stok < $qty){
|
|
echo json_encode(['status'=>false,'message'=>'Stok tidak cukup']);
|
|
return;
|
|
}
|
|
|
|
$harga = $item->harga_beli;
|
|
$nama_asset = $item->nama_barang;
|
|
$nilai_perolehan = $harga * $qty;
|
|
$penyusutan = ($nilai_perolehan - $residu) / ($masa ?: 1);
|
|
|
|
$this->db->trans_start();
|
|
|
|
// INSERT ASSET
|
|
$this->db->insert('assets',[
|
|
'item_id' => $item_id,
|
|
'kode_asset' => 'AST-'.time(),
|
|
'nama_asset' => $nama_asset,
|
|
'harga_per_unit' => $harga,
|
|
'nilai_perolehan' => $nilai_perolehan,
|
|
'tanggal_perolehan' => $tanggal,
|
|
'masa_manfaat' => $masa,
|
|
'nilai_residu' => $residu,
|
|
'penyusutan_per_bulan' => $penyusutan,
|
|
'nilai_buku' => $nilai_perolehan,
|
|
'sumber' => 'gudang',
|
|
'account_debit_id' => $account_debit_id,
|
|
'account_kredit_id' => 21, // Persediaan
|
|
'lokasi_asset_id' => $lokasi_asset_id,
|
|
'keterangan' => $keterangan,
|
|
'qty' => $qty
|
|
]);
|
|
|
|
$asset_id = $this->db->insert_id();
|
|
|
|
// START - Item Movement & item barcodes update status
|
|
$this->db->where('item_id', $item_id);
|
|
$this->db->order_by('created_at', 'DESC');
|
|
$this->db->limit(1);
|
|
$item_move = $this->db->get('item_movements')->row();
|
|
|
|
// get item_barcode
|
|
$itemBar = $this->db->get_where('item_barcodes', ['id'=>$barcode_id])->row();
|
|
|
|
if($itemBar->qty_sisa < $qty) {
|
|
echo json_encode(['status'=>false, 'message'=>'Stok tidak cukup. Sisa: '.$itemBar->qty_sisa]);
|
|
$this->db->trans_rollback();
|
|
return;
|
|
}
|
|
|
|
$total_sisa = $itemBar->qty_sisa - $qty;
|
|
$status_bar = ($total_sisa == 0) ? 'installed' : 'available';
|
|
|
|
$this->db->insert('item_movements',[
|
|
'item_id' => $item_id,
|
|
'barcode_id' => $barcode_id,
|
|
'qty' => $qty,
|
|
'from_type' => $item_move ? $item_move->to_type : 'warehouse', //enum('supplier','warehouse','technician','customer','invoice','asset')
|
|
'to_type' => 'asset', //enum('supplier','warehouse','technician','customer','invoice','asset')
|
|
'movement_type' => 'installation', //enum('purchase','transfer','installation','uninstallation','supplier_return','customer_return','adjustment','sold_out','asset')
|
|
'notes' => $keterangan,
|
|
'created_at' => date('Y-m-d H:i:s')
|
|
]);
|
|
// Status yang boleh masuk : enum('available','reserved','installed','damaged','lost','returned_supplier','sold_out','asset')
|
|
$this->db->where('id', $barcode_id)->update('item_barcodes', ['status' => $status_bar, 'qty_sisa' => $total_sisa]);
|
|
|
|
// Journal
|
|
$this->db->insert('journals',[
|
|
'tanggal' => $tanggal,
|
|
'no_ref' => 'AST-'.date('YmdHis').'-'.$asset_id,
|
|
'keterangan' => 'Penambahan Aset dari Gudang '.$nama_asset,
|
|
'ref_type' => 'assets',
|
|
'ref_id' => $asset_id,
|
|
'created_by' => $this->session->userdata('user_id')
|
|
]);
|
|
|
|
$jid = $this->db->insert_id();
|
|
|
|
// Debit Asset
|
|
$this->db->insert('journal_details',[
|
|
'journal_id' => $jid,
|
|
'account_id' => $account_debit_id,
|
|
'debit' => $nilai_perolehan,
|
|
'kredit' => 0
|
|
]);
|
|
|
|
// Kredit Persediaan
|
|
$this->db->insert('journal_details',[
|
|
'journal_id' => $jid,
|
|
'account_id' => 21,
|
|
'debit' => 0,
|
|
'kredit' => $nilai_perolehan
|
|
]);
|
|
|
|
// UPDATE STOK ITEM (kurangi sesuai qty)
|
|
$this->db->where('id', $item_id)
|
|
->set('stok', 'stok-'.$qty, FALSE)
|
|
->update('items');
|
|
|
|
// MUTATION DARI GUDANG
|
|
$this->db->insert('asset_mutations',[
|
|
'asset_id' => $asset_id,
|
|
'tipe' => 'perolehan',
|
|
'nilai' => $nilai_perolehan,
|
|
'keterangan' => 'Perolehan dari gudang: '.$nama_asset,
|
|
'tanggal_dibuat' => $tanggal
|
|
]);
|
|
|
|
$this->db->trans_complete();
|
|
|
|
if ($this->db->trans_status()) {
|
|
log_activity('Asset', 'create', 'Menambah asset dari gudang: '.$nama_asset.' (ID: '.$asset_id.', Qty: '.$qty.')');
|
|
echo json_encode(['status'=>true]);
|
|
} else {
|
|
echo json_encode(['status'=>false]);
|
|
}
|
|
}
|
|
|
|
// ================= UPDATE =================
|
|
public function update(){
|
|
$id = $this->input->post('id');
|
|
$nama_asset = $this->input->post('nama_asset');
|
|
$lokasi_asset_id = (int)$this->input->post('lokasi_asset');
|
|
$keterangan = $this->input->post('keterangan');
|
|
|
|
$this->db->trans_start();
|
|
|
|
$data = [
|
|
'nama_asset' => $nama_asset,
|
|
'lokasi_asset_id' => $lokasi_asset_id,
|
|
'keterangan' => $keterangan
|
|
];
|
|
|
|
$this->db->where('id',$id);
|
|
$this->db->update('assets',$data);
|
|
|
|
// MUTATION EDIT
|
|
$this->db->insert('asset_mutations',[
|
|
'asset_id' => $id,
|
|
'tipe' => 'penambahan',
|
|
'nilai' => 0,
|
|
'keterangan' => 'Edit asset: '.$nama_asset
|
|
]);
|
|
|
|
$this->db->trans_complete();
|
|
|
|
if ($this->db->trans_status()) {
|
|
log_activity('Asset', 'update', 'Update asset ID: '.$id.' Nama: '.$nama_asset);
|
|
echo json_encode(['status'=>true]);
|
|
} else {
|
|
echo json_encode(['status'=>false]);
|
|
}
|
|
}
|
|
|
|
// ================= DELETE =================
|
|
public function delete(){
|
|
$id = $this->input->post('id');
|
|
$alasan = $this->input->post('alasan');
|
|
$keterangan = $this->input->post('keterangan');
|
|
|
|
$asset = $this->db->get_where('assets',['id'=>$id])->row();
|
|
|
|
$this->db->trans_start();
|
|
|
|
// Hapus journal
|
|
$journals = $this->db->get_where('journals', ['ref_type'=>'assets', 'ref_id'=>$id])->result();
|
|
foreach($journals as $j){
|
|
$this->db->delete('journal_details', ['journal_id'=>$j->id]);
|
|
$this->db->delete('journals', ['id'=>$j->id]);
|
|
}
|
|
|
|
// Hapus asset
|
|
$this->db->delete('assets',['id'=>$id]);
|
|
|
|
// MUTATION DELETE
|
|
$this->db->insert('asset_mutations',[
|
|
'asset_id' => $id,
|
|
'tipe' => 'pengurangan',
|
|
'nilai' => $asset->nilai_buku,
|
|
'keterangan' => 'Penghapusan ('.$alasan.'): '.$keterangan
|
|
]);
|
|
|
|
$this->db->trans_complete();
|
|
|
|
if ($this->db->trans_status()) {
|
|
log_activity('Asset', 'delete', 'Hapus asset ID: '.$id.' Alasan: '.$alasan);
|
|
echo json_encode(['status'=>true]);
|
|
} else {
|
|
echo json_encode(['status'=>false]);
|
|
}
|
|
}
|
|
|
|
// ================= GET DATA SELECT =================
|
|
public function get_accounts_kas(){
|
|
$data = $this->db
|
|
->where_in('sub_tipe', ['kas', 'hutang'])
|
|
->order_by('kode_akun', 'ASC')
|
|
->get('accounts')
|
|
->result();
|
|
echo json_encode($data);
|
|
}
|
|
|
|
public function get_accounts_asset(){
|
|
$data = $this->db
|
|
->group_start()
|
|
->like('nama_akun', 'Aset', 'after')
|
|
->group_end()
|
|
->order_by('kode_akun', 'ASC')
|
|
->get('accounts')
|
|
->result();
|
|
echo json_encode($data);
|
|
}
|
|
|
|
public function get_items()
|
|
{
|
|
// $data = $this->db
|
|
// ->select('items.*, kode_barang.*')
|
|
// ->from('items')
|
|
// ->join('kode_barang', 'items.kode_id = kode_barang.id', 'left')
|
|
// ->where('items.stok >', 0)
|
|
// ->get()
|
|
// ->result();
|
|
|
|
$this->db->select('
|
|
items.id,
|
|
items.nama_barang,
|
|
items.harga_jual,
|
|
items.harga_beli,
|
|
items.kode_detail,
|
|
kode_barang.tracking_type,
|
|
COALESCE(SUM(
|
|
stock_logs.qty * IF(stock_logs.tipe="masuk",1,-1)
|
|
),0) as stok
|
|
');
|
|
|
|
$this->db->where('status', 'active');
|
|
$this->db->from('items');
|
|
|
|
$this->db->join('stock_logs',
|
|
'stock_logs.item_id = items.id' ,
|
|
'left');
|
|
|
|
$this->db->join('kode_barang',
|
|
'items.kode_id = kode_barang.id' ,
|
|
'left');
|
|
|
|
// $this->db->where('items.account_id', $account_id);
|
|
|
|
$this->db->group_by('items.id');
|
|
|
|
// ✅ INI KUNCINYA
|
|
$this->db->having('stok >', 0);
|
|
|
|
|
|
$data = $this->db->get()->result();
|
|
|
|
echo json_encode($data);
|
|
}
|
|
|
|
public function get_lokasi_asset(){
|
|
$data = $this->db
|
|
->get('lokasi_asset')
|
|
->result();
|
|
echo json_encode($data);
|
|
}
|
|
} |