public function simpan() { $this->scenario = 'simpan'; $transaction = $this->dbConnection->beginTransaction(); try { /* * Save sekaligus mengubah status dari draft jadi piutang */ if ($this->save()) { $details = ReturPenjualanDetail::model()->findAll("retur_penjualan_id={$this->id}"); foreach ($details as $detail) { /* * Untuk setiap item, tambahkan qty ke inventory baru */ InventoryBalance::model()->returJual($detail); } // Total dari retur penjualan // Jika nanti ada item lain, misal: Transport, pajak, dll // ditambahkan di sini $jumlahReturJual = $this->ambilTotal(); /* * Create hutang */ $hutang = new HutangPiutang(); $hutang->profil_id = $this->profil_id; $hutang->jumlah = $jumlahReturJual; $hutang->tipe = HutangPiutang::TIPE_HUTANG; $hutang->asal = HutangPiutang::DARI_RETUR_JUAL; $hutang->nomor_dokumen_asal = $this->nomor; if (!$hutang->save()) { throw new Exception("Gagal simpan hutang"); } /* * Hutang Detail */ $hutangDetail = new HutangPiutangDetail(); $hutangDetail->hutang_piutang_id = $hutang->id; $hutangDetail->keterangan = 'Retur Jual: ' . $this->nomor; $hutangDetail->jumlah = $jumlahReturJual; if (!$hutangDetail->save()) { throw new Exception("Gagal simpan hutang detail"); } /* * Simpan hutang_id ke pembelian */ if (!ReturPenjualan::model()->updateByPk($this->id, array('hutang_piutang_id' => $hutang->id)) > 1) { throw new Exception("Gagal simpan hutang_id"); } $transaction->commit(); return true; } else { throw new Exception("Gagal Simpan Retur Penjualan"); } } catch (Exception $e) { $transaction->rollback(); throw $e; } }
public function renderInventoryDocumentLinkToView($data) { $inventoryBalance = InventoryBalance::model()->findByPk($data->id); $namaController = $inventoryBalance->namaAsalController(); $model = $inventoryBalance->modelAsal(); return '<a href="' . $this->createUrl("{$namaController}/view", array('id' => $model->id)) . '">' . $data->nomor_dokumen . '</a>'; }
public function actionGetBarangInfo($barcode) { if (isset($barcode)) { $barang = Barang::model()->find('barcode=:barcode', [':barcode' => $barcode]); $stock = InventoryBalance::model()->find(array('select' => 'sum(qty) jumlah', 'condition' => 'barang_id=:barangId', 'params' => array(':barangId' => $barang->id))); echo "<small>{$barang->barcode}</small> {$barang->nama} <small>Stok</small> {$stock->jumlah}"; } }
/** * Proses simpan penjualan. * Jika piutang, terbit nota debit (gudang) * * Simpan penjualan: * 1. Update status dari draft menjadi piutang. * 2. Update stock * 3. Catat harga beli dan harga jual * 4. Jika stok minus harga beli adalah harga beli terakhir * 5. Buat nota debit (piutang) * */ public function simpanPenjualan() { if (!$this->save()) { throw new Exception('Gagal simpan penjualan', 500); } $details = PenjualanDetail::model()->findAll('penjualan_id=:penjualanId', array(':penjualanId' => $this->id)); foreach ($details as $detail) { $inventoryTerpakai = InventoryBalance::model()->jual($detail->barang_id, $detail->qty); $count = 1; foreach ($inventoryTerpakai as $layer) { $hpp = new HargaPokokPenjualan(); $hpp->penjualan_detail_id = $detail->id; $hpp->pembelian_detail_id = $layer['pembelianDetailId']; $hpp->qty = $layer['qtyTerpakai']; $hpp->harga_beli = $layer['hargaBeli']; // Jika negatif simpan juga di harga_beli_temp // FIX ME, jika pembelian harga beli nya beda if (isset($layer['negatif']) && $layer['negatif']) { $hpp->harga_beli_temp = $layer['hargaBeli']; } if (!$hpp->save()) { throw new Exception("Gagal simpan HPP", 500); } /* Tambahan untuk transfer mode, * cek apakah harga jual masih sama dengan inventory * jika beda, maka tambahkan juga detail penjualannya * ctt: transfer mode, harga jual = harga beli, jadi * hpp = penjualan_detail */ if ($this->transfer_mode && $count > 1) { $this->tambahDetailTransferBarang($detail, HargaPokokPenjualan::model()->findByPk($hpp->id)); } $count++; } } $jumlahPenjualan = $this->ambilTotal(); // Buat Hutang Piutang $piutang = new HutangPiutang(); $piutang->profil_id = $this->profil_id; $piutang->jumlah = $jumlahPenjualan; $piutang->tipe = HutangPiutang::TIPE_PIUTANG; $piutang->asal = HutangPiutang::DARI_PENJUALAN; $piutang->nomor_dokumen_asal = $this->nomor; if (!$piutang->save()) { throw new Exception("Gagal simpan piutang", 500); } /* * Piutang Detail */ $piutangDetail = new HutangPiutangDetail(); $piutangDetail->hutang_piutang_id = $piutang->id; $piutangDetail->keterangan = 'Pembelian: ' . $this->nomor; $piutangDetail->jumlah = $jumlahPenjualan; if (!$piutangDetail->save()) { throw new Exception("Gagal simpan piutang detail", 500); } /* * Simpan hutang_piutang_id ke penjualan */ if (!Penjualan::model()->updateByPk($this->id, array('hutang_piutang_id' => $piutang->id)) > 1) { throw new Exception("Gagal simpan piutang_id", 500); } /* Simpan poin jika ada */ if ($this->getCurPoin() > 0) { $penjualanMember = new PenjualanMember(); $penjualanMember->penjualan_id = $this->id; $penjualanMember->profil_id = $this->profil_id; $penjualanMember->poin = $this->getCurPoin(); if (!$penjualanMember->save()) { throw new Exception("Gagal simpan poin ke penjualan", 500); } } }
public function actionTotalStok() { $this->layout = '//layouts/box_kecil'; $this->render('totalstok', ['totalStok' => InventoryBalance::model()->totalInventory()]); }
/** * Mencari harga beli layer pertama yang belum habis di inventory * @param int $barangId * @return decimal harga beli */ public function getHargaBeliAwal($barangId) { $inventory = InventoryBalance::model()->find(array('condition' => 'barang_id=:barangId and qty <>0', 'order' => 'id', 'params' => array(':barangId' => $barangId))); /* Jika tidak ada stok yang pantas (stok = 0 semua) * maka cari inventory yang paling baru */ if (is_null($inventory)) { $inventory = InventoryBalance::model()->find(array('condition' => 'barang_id=:barangId', 'order' => 'id desc', 'params' => array(':barangId' => $barangId))); } return is_null($inventory) ? 0 : $inventory->harga_beli; }
/** * Proses simpan Stock Opname. * 1. Update status dari draft menjadi so * 2. Update inventory terkait dengan cara FIFO * a. Pengurangan, dilakukan seperti penjualan * b. Penambahan, dilakukan pada current inventory, terus ke inv sebelumnya * @return boolean True jika sukses * @throws Exception */ public function simpanSo() { $this->scenario = 'simpanSo'; $transaction = $this->dbConnection->beginTransaction(); try { if ($this->save()) { $details = StockOpnameDetail::model()->findAll('stock_opname_id=' . $this->id); foreach ($details as $detail) { InventoryBalance::model()->so($this, $detail); if (!is_null($this->rak_id)) { Barang::model()->updateByPk($detail->barang_id, array('rak_id' => $this->rak_id)); } } $transaction->commit(); return array('sukses' => true); } else { throw new Exception("Gagal Simpan Stock Opname"); } } catch (Exception $ex) { $transaction->rollback(); return array('sukses' => false, 'error' => array('msg' => $ex->getMessage(), 'code' => $ex->getCode())); } }
public function simpanReturPembelian() { $this->scenario = 'simpanReturBeli'; $transaction = $this->dbConnection->beginTransaction(); try { /* * Save sekaligus mengubah status dari draft jadi piutang */ if ($this->save()) { $details = ReturPembelianDetail::model()->findAll("retur_pembelian_id={$this->id}"); if (is_null($details)) { throw new Exception("Tidak ada detail"); } foreach ($details as $detail) { $inventoryTerpakai = InventoryBalance::model()->returBeli($detail); $count = 1; foreach ($inventoryTerpakai as $layer) { if ($count > 1) { $detailBaru = new ReturPembelianDetail(); $detailBaru->retur_pembelian_id = $this->id; $detailBaru->inventory_balance_id = $layer['id']; $detailBaru->qty = $layer['qtyTerpakai']; if (!$detailBaru->save()) { throw new Exception('Gagal simpan retur pembelian detail (layer baru)', 500); } } else { $detail->qty = $layer['qtyTerpakai']; if (!$detail->save()) { throw new Exception("Gagal simpan detail", 500); } } $count++; } } $jumlahReturBeli = $this->ambilTotal(); /* * Create (piutang) */ $hutang = new HutangPiutang(); $hutang->profil_id = $this->profil_id; $hutang->jumlah = $jumlahReturBeli; $hutang->tipe = HutangPiutang::TIPE_PIUTANG; $hutang->asal = HutangPiutang::DARI_RETUR_BELI; $hutang->nomor_dokumen_asal = $this->nomor; if (!$hutang->save()) { throw new Exception("Gagal simpan hutang"); } /* * Hutang Detail */ $hutangDetail = new HutangPiutangDetail(); $hutangDetail->hutang_piutang_id = $hutang->id; $hutangDetail->keterangan = 'Retur Beli: ' . $this->nomor; $hutangDetail->jumlah = $jumlahReturBeli; if (!$hutangDetail->save()) { throw new Exception("Gagal simpan hutang detail"); } /* * Simpan hutang_id ke retur pembelian */ if (!ReturPembelian::model()->updateByPk($this->id, array('hutang_piutang_id' => $hutang->id)) > 1) { throw new Exception("Gagal simpan hutang_id"); } $transaction->commit(); return ['sukses' => true]; } else { throw new Exception("Gagal Simpan Retur Pembelian"); } } catch (Exception $ex) { $transaction->rollback(); return ['sukses' => false, 'error' => ['msg' => $ex->getMessage(), 'code' => $ex->getCode()]]; } }
/** * Menyimpan barang yang dihapus ke tabel penjualan_detail_h * @param ActiveRecord $detail Penjualan Detail * @param int $jenis Jenis Hapus (per barang, atau per nota), default per barang */ public function simpanHapusDetail($detail, $jenis = PenjualanDetailHapus::JENIS_PER_BARANG) { $userAdmin = User::model()->findByPk(Yii::app()->user->getState('kasirOtorisasiUserId')); $penjualanHapus = new PenjualanDetailHapus(); $penjualanHapus->barang_id = $detail->barang_id; $penjualanHapus->barang_barcode = $detail->barang->barcode; $penjualanHapus->barang_nama = $detail->barang->nama; $penjualanHapus->harga_beli = InventoryBalance::model()->getHargaBeliAwal($detail->barang_id); $penjualanHapus->harga_jual = $detail->harga_jual; $penjualanHapus->user_kasir_id = $detail->updated_by; $penjualanHapus->user_kasir_nama = $detail->updatedBy->nama; $penjualanHapus->user_admin_id = $userAdmin->id; $penjualanHapus->user_admin_nama = $userAdmin->nama; $penjualanHapus->penjualan_id = $detail->penjualan_id; $penjualanHapus->jenis = $jenis; $penjualanHapus->save(); }