示例#1
0
文件: Pos.php 项目: AbuMuhammad/ap3
 /**
  * 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()));
     }
 }
示例#2
0
 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;
     }
 }
示例#3
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);
         }
     }
 }
示例#4
0
 /**
  * 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()));
     }
 }
示例#5
0
 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");
     }
 }
示例#6
0
 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');
 }
示例#7
0
 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;
 }
示例#10
0
 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;
     }
 }
示例#11
0
 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()]];
     }
 }
示例#12
0
 public function actionCariDokProfil()
 {
     $hutangPiutang = new HutangPiutang('search');
     $hutangPiutang->unsetAttributes();
     $hutangPiutang->scenario = 'pilihDokumen';
     if (isset($_GET['HutangPiutang'])) {
         $hutangPiutang->attributes = $_GET['HutangPiutang'];
     }
 }