/** * Menambah layer inventory baru untuk proses retur penjualan, * sesuai HPP (Harga Pokok Penjualan) dari penjualan yang dipilih. * Tapi jika current layer minus, penambahan qty dimasukkan ke layer yang minus terlebih dahulu * @param object $returPenjualanDetail Objek Model ReturPenjualanDetail * @return boolean true jika berhasil menambah inventory * @throws Exception */ public function returJual($returPenjualanDetail) { $hpps = HargaPokokPenjualan::model()->findAll('penjualan_detail_id=:penjualanDetail', array(':penjualanDetail' => $returPenjualanDetail->penjualan_detail_id)); $sisa = $returPenjualanDetail->qty; foreach ($hpps as $hpp) { if ($sisa == 0) { break; } $inventoryBalance = new InventoryBalance(); $inventoryBalance->asal = InventoryBalance::ASAL_RETURJUAL; $inventoryBalance->nomor_dokumen = $returPenjualanDetail->returPenjualan->nomor; $inventoryBalance->pembelian_detail_id = $hpp->pembelian_detail_id; $inventoryBalance->retur_penjualan_detail_id = $returPenjualanDetail->id; $inventoryBalance->barang_id = $returPenjualanDetail->penjualanDetail->barang_id; $inventoryBalance->harga_beli = $hpp->harga_beli; /* Jika hpp jumlahnya cukup, nol kan sisa. catat qtynya di inventory */ if ($hpp->qty >= $sisa) { $inventoryBalance->qty_awal = $sisa; $inventoryBalance->qty = $sisa; $sisa = 0; } else { /* Jika hpp tidak cukup, catat di inventory secukupnya, cari lagi di hpp berikutnya (jika ada) */ $inventoryBalance->qty_awal = $hpp->qty; $inventoryBalance->qty = $hpp->qty; $sisa -= $hpp->qty; } $layerTerakhir = $this->layerTerakhir($returPenjualanDetail->penjualanDetail->barang_id); if (!is_null($layerTerakhir) && $layerTerakhir->qty <= 0) { /* * Jika layer terakhir nilainya <=0, 0 kan qty nya. * Sesuaikan qty layer saat ini */ $inventoryBalance->qty += $layerTerakhir->qty; $layerTerakhir->qty = 0; if (!$layerTerakhir->save()) { throw new Exception("Gagal simpan layer terakhir"); } } if ($inventoryBalance->save()) { return true; } else { throw new Exception("Gagal simpan layer inventory"); } } /* FIX ME: Jika masih ada sisa, * berarti qty barang yang diretur lebih banyak dari qty barang yang di jual ?? * cari di penjualan berikutnya */ if ($sisa > 0) { throw new Exception("Retur jual lebih banyak dari penjualan: barang=" . $returPenjualanDetail->penjualanDetail->barang->nama); } }
/** * 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 tampilkanHargaBeli($data) { $hpp = HargaPokokPenjualan::model()->findAll('penjualan_detail_id=' . $data->id); $barisPertama = true; $text = ''; foreach ($hpp as $hargaBeli) { if (!$barisPertama) { $text .= '<br />'; } $text .= number_format($hargaBeli->harga_beli, 0, ',', '.') . ' x ' . $hargaBeli->qty; $barisPertama = false; } return $text; }