/** * Simpan POS * 1. Simpan penjualan * 2. Proses penerimaan */ public function simpanPOS($posData) { $transaction = $this->dbConnection->beginTransaction(); $this->scenario = 'simpanPenjualan'; try { $this->simpanPenjualan(); $penerimaan = new Penerimaan(); $penerimaan->tanggal = date('d-m-Y'); //$penerimaan->referensi = '[POS]'; //$penerimaan->tanggal_referensi = date('d-m-Y'); $penerimaan->profil_id = $this->profil_id; $penerimaan->kas_bank_id = $posData['account']; $penerimaan->jenis_transaksi_id = $posData['jenistr']; $penerimaan->kategori_id = self::KATEGORI_TRX; $penerimaan->uang_dibayar = $posData['uang']; $penerimaan->save(); $penjualan = Penjualan::model()->findByPk($this->id); $hutangPiutangId = $penjualan->hutang_piutang_id; $dokumen = HutangPiutang::model()->findByPk($hutangPiutangId); if (is_null($dokumen)) { die(serialize($penjualan->attributes)); } $item = $dokumen->itemBayarHutang; $penerimaanDetail = new PenerimaanDetail(); $penerimaanDetail->penerimaan_id = $penerimaan->id; $penerimaanDetail->item_id = $item['itemId']; $penerimaanDetail->hutang_piutang_id = $hutangPiutangId; $penerimaanDetail->keterangan = '[POS] ' . $dokumen->keterangan(); $penerimaanDetail->jumlah = $dokumen->sisa; $penerimaanDetail->save(); $penerimaanLoad = Penerimaan::model()->findByPk($penerimaan->id); if (!$penerimaanLoad->prosesP()) { throw new Exception("Gagal proses penerimaan", 500); } // if (!$penerimaan->prosesP()) { // throw new Exception("Gagal proses penerimaan", 500); // } $transaction->commit(); return array('sukses' => true); } catch (Exception $ex) { $transaction->rollback(); return array('sukses' => false, 'error' => array('msg' => $ex->getMessage(), 'code' => $ex->getCode())); } }
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; } }
/** * 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); } } }
/** * Simpan pembelian: * 1. update status dari draft menjadi pembelian. * 2. update stock. * 3. update harga jual & rrp * 4. create hutang. * 5. update stok minus. BELUM !! * @return boolean True jika proses berhasil * @throws Exception */ public function simpanPembelian() { $this->scenario = 'simpanPembelian'; $transaction = $this->dbConnection->beginTransaction(); /* Untuk jumlah pembelian yang sangat banyak, misal: init data */ if ($this->profil_id == 1) { ini_set('memory_limit', '-1'); set_time_limit(0); } try { if ($this->save()) { /* * Ambil data barang, dan data inventory terakhir/terbaru nya * Jika inventory tidak ada, maka ib.* nilainya null */ $details = PembelianDetail::model()->findAll('pembelian_id=:pembelianId', array(':pembelianId' => $this->id)); foreach ($details as $detail) { /* Untuk setiap barang yang dibeli */ /* Sesuaikan inventory */ $inventoryBalance = new InventoryBalance(); $inventoryBalance->beli(InventoryBalance::ASAL_PEMBELIAN, $this->nomor, $detail->id, $detail->barang_id, $detail->harga_beli, $detail->qty); /* * Update harga jual */ if (!HargaJual::model()->updateHarga($detail->barang_id, $detail->harga_jual)) { throw new Exception("Gagal Update Harga Jual"); } /* * Update Rrp */ if (!HargaJualRekomendasi::model()->updateHarga($detail->barang_id, $detail->harga_jual_rekomendasi)) { throw new Exception("Gagal Update RRP"); } /* Tambahkan supplier ke barang ini, jika belum ada */ $supplierBarangAda = SupplierBarang::model()->find("supplier_id={$this->profil_id} and barang_id = {$detail->barang_id}"); if (is_null($supplierBarangAda)) { $supplierBarang = new SupplierBarang(); $supplierBarang->barang_id = $detail->barang_id; $supplierBarang->supplier_id = $this->profil_id; if (!$supplierBarang->save()) { throw new Exception("Gagal simpan supplier barang"); } } } // Total dari pembelian barang // Jika nanti ada item lain, misal: Transport, pajak, dll // ditambahkan di sini $jumlahPembelian = $this->ambilTotal(); /* * Create (hutang) */ $hutang = new HutangPiutang(); $hutang->profil_id = $this->profil_id; $hutang->jumlah = $jumlahPembelian; $hutang->tipe = HutangPiutang::TIPE_HUTANG; $hutang->asal = HutangPiutang::DARI_PEMBELIAN; $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 = 'Pembelian: ' . $this->nomor; $hutangDetail->jumlah = $jumlahPembelian; if (!$hutangDetail->save()) { throw new Exception("Gagal simpan hutang detail"); } /* * Simpan hutang_id ke pembelian */ if (!Pembelian::model()->updateByPk($this->id, array('hutang_piutang_id' => $hutang->id)) > 1) { throw new Exception("Gagal simpan hutang_id"); } $transaction->commit(); return array('sukses' => true); } else { throw new Exception("Gagal Simpan Pembelian"); } } catch (Exception $ex) { $transaction->rollback(); // throw $up; return array('sukses' => false, 'error' => array('msg' => $ex->getMessage(), 'code' => $ex->getCode())); } }
public function prosesP() { $this->scenario = 'proses'; if ($this->save()) { // Ambil details yang hutang piutang untuk diproses lebih lanjut $details = PenerimaanDetail::model()->findAll('penerimaan_id=:penerimaanId and hutang_piutang_id is not null', array(':penerimaanId' => $this->id)); foreach ($details as $detail) { $hutangPiutang = HutangPiutang::model()->findByPk($detail->hutang_piutang_id); // Bayar dan simpan if (!($hutangPiutang->bayar() && $hutangPiutang->save())) { throw new Exception("Gagal proses bayar hutang piutang"); } } return true; } else { throw new Exception("Gagal Proses"); } }
public function hutangPiutangPdf($profilId, $showDetail, $pilihCetak, $kertas) { $model = new ReportHutangPiutangForm(); $report = null; if (isset($profilId)) { $model->profilId = $profilId; $model->showDetail = $showDetail; $model->pilihCetak = $pilihCetak; $report = $model->reportHutangPiutang(); } else { throw new Exception("Tidak ada data", 500); } $configs = Config::model()->findAll(); /* * Ubah config (object) jadi array */ $branchConfig = array(); foreach ($configs as $config) { $branchConfig[$config->nama] = $config->nilai; } /* * Persiapan render PDF */ $waktu = date('Y-m-d H:i:s'); $waktuCetak = date_format(date_create_from_format('Y-m-d H:i:s', $waktu), 'dmY His'); $listNamaKertas = ReportHutangPiutangForm::listKertas(); $mPDF1 = Yii::app()->ePdf->mpdf('', $listNamaKertas[$kertas]); $mPDF1->WriteHTML($this->renderPartial('_hutangpiutang_pdf', array('model' => $model, 'report' => $report, 'config' => $branchConfig, 'listAsalHP' => HutangPiutang::model()->listNamaAsal(), 'waktu' => $waktu, 'waktuCetak' => $waktuCetak, 'profil' => Profil::model()->findByPk($model->profilId)), true)); $mPDF1->SetDisplayMode('fullpage'); $mPDF1->pagenumPrefix = 'Hal '; $mPDF1->pagenumSuffix = ' / '; // Render PDF $mPDF1->Output("Hutang Piutang {$branchConfig['toko.nama']} {$waktuCetak}.pdf", 'I'); }
public function actionPilihDokumen($id) { $dokumen = HutangPiutang::model()->findByPk($id); $item = $dokumen->itemBayarHutang; $return = array('id' => $id, 'itemId' => $item['itemId'], 'itemNama' => $item['itemNama'], 'itemParent' => $item['itemParent'], 'nomorDokumenAsal' => $dokumen->nomor_dokumen_asal, 'nomor' => $dokumen->nomor, 'jumlah' => $dokumen->sisa, 'keterangan' => $dokumen->keterangan()); $this->renderJSON($return); }
/** * Returns the data model based on the primary key given in the GET variable. * If the data model is not found, an HTTP exception will be raised. * @param integer $id the ID of the model to be loaded * @return HutangPiutang the loaded model * @throws CHttpException */ public function loadModel($id) { $model = HutangPiutang::model()->findByPk($id); if ($model === null) { throw new CHttpException(404, 'The requested page does not exist.'); } return $model; }
public function reportHutangPiutangCsv() { $csv = '"jenis","nomor_hp","tgl","asal_dokumen","asal_nomor","jumlah","bayar","sisa"' . PHP_EOL; $pilihHutang = false; $pilihPiutang = false; if (is_array($this->pilihCetak)) { foreach ($this->pilihCetak as $pilihan) { if ($pilihan == 'hutang') { $pilihHutang = true; } else { if ($pilihan == 'piutang') { $pilihPiutang = true; } } } } $listAsalHP = HutangPiutang::model()->listNamaAsal(); /* Untuk csv selalu tampilkan detail */ $showDetail = true; if ($showDetail) { $command = Yii::app()->db->createCommand(); $command->select('hp.*, tbayar.*'); $command->from("hutang_piutang hp"); $command->leftJoin("\n (SELECT\n hutang_piutang_id, SUM(jumlah) jumlah_bayar\n FROM\n (SELECT\n detail.hutang_piutang_id, detail.jumlah\n FROM\n penerimaan_detail detail\n JOIN hutang_piutang hp ON detail.hutang_piutang_id = hp.id\n AND hp.profil_id = :profilId\n AND hp.status = :statusHp\n AND hp.tipe = :tipeHp\n JOIN penerimaan ON detail.penerimaan_id = penerimaan.id \n AND penerimaan.status= :statusPenerimaan\n UNION\n SELECT\n detail.hutang_piutang_id, detail.jumlah\n FROM\n pengeluaran_detail detail\n JOIN hutang_piutang hp ON detail.hutang_piutang_id = hp.id\n AND hp.profil_id = :profilId\n AND hp.status = :statusHp\n AND hp.tipe = :tipeHp\n JOIN pengeluaran ON detail.pengeluaran_id = pengeluaran.id\n AND pengeluaran.status = :statusPengeluaran\n ) t\n GROUP BY hutang_piutang_id) tbayar", "hp.id = tbayar.hutang_piutang_id"); $command->order("nomor"); $command->where("profil_id = :profilId AND tipe = :tipeHp AND status = :statusHp"); $command->bindValues([':profilId' => $this->profilId, ':tipeHp' => HutangPiutang::TIPE_HUTANG, ':statusHp' => HutangPiutang::STATUS_BELUM_LUNAS, ':statusPenerimaan' => Penerimaan::STATUS_BAYAR, ':statusPengeluaran' => Pengeluaran::STATUS_BAYAR]); if ($pilihHutang) { $dataHutang = $command->queryAll(); foreach ($dataHutang as $data) { $sisa = $data['jumlah'] - $data['jumlah_bayar']; $csv .= "\"hutang\"," . "\"{$data['nomor']}\"," . "\"{$data['created_at']}\"," . "\"{$listAsalHP[$data['asal']]}\"," . "\"{$data['nomor_dokumen_asal']}\"," . "\"{$data['jumlah']}\"," . "\"{$data['jumlah_bayar']}\"," . "\"" . $sisa . "\"," . PHP_EOL; } } $command->bindValues([':profilId' => $this->profilId, ':tipeHp' => HutangPiutang::TIPE_PIUTANG, ':statusHp' => HutangPiutang::STATUS_BELUM_LUNAS, ':statusPenerimaan' => Penerimaan::STATUS_BAYAR, ':statusPengeluaran' => Pengeluaran::STATUS_BAYAR]); if ($pilihPiutang) { $dataPiutang = $command->queryAll(); foreach ($dataPiutang as $data) { $sisa = $data['jumlah'] - $data['jumlah_bayar']; $csv .= "\"piutang\"," . "\"{$data['nomor']}\"," . "\"{$data['created_at']}\"," . "\"{$listAsalHP[$data['asal']]}\"," . "\"{$data['nomor_dokumen_asal']}\"," . "\"{$data['jumlah']}\"," . "\"{$data['jumlah_bayar']}\"," . "\"" . $sisa . "\"," . PHP_EOL; } } } return $csv; }
public function proses() { $this->scenario = 'proses'; $transaction = $this->dbConnection->beginTransaction(); try { if ($this->save()) { // Ambil details yang hutang piutang untuk diproses lebih lanjut $details = PengeluaranDetail::model()->findAll('pengeluaran_id=:pengeluaranId and hutang_piutang_id is not null', array(':pengeluaranId' => $this->id)); foreach ($details as $detail) { $hutangPiutang = HutangPiutang::model()->findByPk($detail->hutang_piutang_id); // Bayar dan simpan if (!($hutangPiutang->bayar() && $hutangPiutang->save())) { throw new Exception("Gagal proses bayar hutang piutang"); } } $transaction->commit(); return true; } else { throw new Exception("Gagal Proses"); } } catch (Exception $e) { $transaction->rollback(); throw $e; } }
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()]]; } }
public function actionCariDokProfil() { $hutangPiutang = new HutangPiutang('search'); $hutangPiutang->unsetAttributes(); $hutangPiutang->scenario = 'pilihDokumen'; if (isset($_GET['HutangPiutang'])) { $hutangPiutang->attributes = $_GET['HutangPiutang']; } }