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, ' ' ]; } 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); } }