예제 #1
0
 /**
  * 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);
     }
 }
예제 #2
0
 /**
  * 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);
         }
     }
 }
예제 #3
0
 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;
 }