Untitled
unknown
plain_text
2 years ago
25 kB
6
Indexable
public function paymentConfirmation() { DB::beginTransaction(); $payment = new OyiPay; $confirmPayment = $payment->callback(); $vaTagihanBayar = VaTagihan::where('kode',$confirmPayment->partner_trx_id)->first(); if(!$vaTagihanBayar){ return "kode tidak ditemukan"; } $vaAkun = VaAkun::find($vaTagihanBayar->va_akun_id); // get list akun VA aja $vaAkunList = VaAkun::whereHas('bank',function($q){ $q->whereIn('kode',['002','008','009','013','014','022','213']); })->where('pelanggan_id',$vaAkun->pelanggan_id)->where('va_number','!=',$vaAkun->va_number)->where('va_status',1)->get(); $this->checkVaTagihanDetail($vaTagihanBayar,$vaAkun); if($vaTagihanBayar && $vaTagihanBayar->status > 0){ $formatTanggal = str_replace('/','-',$confirmPayment->settlement_time); $vaTagihanBayar->settlement_time = Carbon::parse($formatTanggal)->format('Y-m-d H:i:s'); $vaTagihanBayar->settlement_status = $confirmPayment->settlement_status; $vaTagihanBayar->save(); } else{ $formatTBayar = str_replace('/','-',$confirmPayment->tx_date); $tanggalBayar = Carbon::parse($formatTBayar)->timezone('Asia/Jakarta')->format('Y-m-d H:i:s'); $bankBayar = $vaTagihanBayar ? $vaTagihanBayar->bank : NULL; $nominalCallback = $bankBayar ? $confirmPayment->amount - $bankBayar->biaya_transfer_pelanggan : $confirmPayment->amount; if($confirmPayment->success && $vaTagihanBayar && (int)$vaTagihanBayar->nominal == (int)$nominalCallback){ $formatTSettlement = str_replace('/','-',$confirmPayment->settlement_time); $tanggalSettlement = Carbon::parse($formatTSettlement)->format('Y-m-d H:i:s'); $pelanggan = $vaAkun->pelanggan; $oyiPayAPI = new OyiPay; // UPDATE TAGIHAN BARU KE VA BAYAR $kodeCabang = $pelanggan->cabang->kode; $nominalVa = $this->getNominalVa($pelanggan); // FORMAT PARTNER TRX ID => [kode cabang]-[nopel]-[kode channel]-[bulan tagihan start]-[bln tagihan end]-[tagihan terbayar + 1] $kodeTagihanBaru = $kodeCabang.'-'.$pelanggan->no_pelanggan.'-'.strtoupper($bankBayar->kode).'-'.$nominalVa['periode_tagihan'].'-'.$nominalVa['next_tagihan']; $arrayDataUpdate = array( 'va_id' => $vaAkun->va_id, 'amount' => (int)$nominalVa['total'] + $bankBayar->biaya_transfer_pelanggan, 'is_lifetime' => true, 'expiration_time' => -1, 'partner_trx_id' => $kodeTagihanBaru, ); // CALL API UPDATE $updateVa = $oyiPayAPI->updateVA($arrayDataUpdate); $jsonDecodeUpdate = json_decode($updateVa); if($jsonDecodeUpdate->status->code == '246'){ // insert ke queue update va $this->insertUpdateVAQueue($vaAkun->id,$arrayDataUpdate); } if($jsonDecodeUpdate->status->code == '000' || $vaAkun->va_status == 0 || $jsonDecodeUpdate->status->code == '246'){ // kalau status nya 0 -> nonaktif di skip $countUpdateBerhasil = 0; $arrayVaTagihanId = array(); // UPDATE TAGIHAN BARU KE VA TIDAK BAYAR foreach($vaAkunList as $akunList){ $vaTagihanUpdate = VaTagihan::where('va_akun_id',$akunList->id)->where('status',0)->first(); $bankAkun = $akunList->bank; if($vaTagihanUpdate){ $arrayUpdateVa = array( 'va_id' => $akunList->va_id, 'amount' => (int)$nominalVa['total'] + $bankAkun->biaya_transfer_pelanggan, 'is_lifetime' => true, 'expiration_time' => -1, 'partner_trx_id' => $vaTagihanUpdate->kode, ); // CALL API UPDATE $updateVaAkun = $oyiPayAPI->updateVA($arrayUpdateVa); $updateDecode = json_decode($updateVaAkun); if($updateDecode->status->code == '000' || $updateDecode->status->code == '246'){ // UPDATE TAGIHAN VA if($vaTagihanUpdate->voucher_id){ $vaTagihanUpdate->voucher_id = NULL; $vaTagihanUpdate->catatan_voucher = NULL; } // UPDATE TAGIHAN VA $vaTagihanUpdate->nominal = $nominalVa['total']; $vaTagihanUpdate->harga_tv = $nominalVa['tv']; $vaTagihanUpdate->harga_internet = $nominalVa['internet']; $vaTagihanUpdate->updated_at = Carbon::now(); $vaTagihanUpdate->save(); $countUpdateBerhasil += 1; $arrayVaTagihanId[] = $vaTagihanUpdate->id; if($updateDecode->status->code == '246'){ // insert ke queue update va $this->insertUpdateVAQueue($akunList->id,$arrayUpdateVa); } }else{ Log::useFiles(storage_path().'/logs/callback-va-fail.log'); Log::info($bankAkun->nama); Log::info($updateVaAkun); } } } if(@count($vaAkunList) == $countUpdateBerhasil){ // INSERT CALLBACK VA VaCallback::insert(array( 'id' => Uuid::uuid4()->toString(), 'va_penyedia_id' => $vaAkun->bank->va_penyedia_id, 'va_akun_id' => $vaAkun->id, 'kode_tagihan' => $confirmPayment->partner_trx_id, 'nominal' => $nominalCallback, 'tanggal_bayar' => $tanggalBayar, 'status' => 'SUKSES', 'keterangan' => 'CALLBACK '.$vaAkun->va_number.' : '.$confirmPayment->partner_trx_id, 'transfer_referensi' => $confirmPayment->trx_id, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), )); // DATA PREPARATION $tagihanId = VaTagihanDetail::where('va_tagihan_id',$vaTagihanBayar->id)->pluck('tagihan_id')->toArray(); $listTagihan = Tagihan::whereIn('id',$tagihanId)->orderBy('tanggal_jatuh_tempo')->get(); $countTagihan = @count($tagihanId); $jtTerbayar = array(); $pegawaiId = $bankBayar->pegawai_id; $nominalTagihan = array_sum($listTagihan->pluck('total')->toArray()); $nominalTagihanVa = $vaTagihanBayar->nominal; $nominalPotongan = $nominalTagihan - $nominalTagihanVa; // UPDATE TAGIHAN VA $vaTagihanBayar->status = 1; $vaTagihanBayar->tanggal_bayar = $tanggalBayar; $vaTagihanBayar->settlement_time = $tanggalSettlement; $vaTagihanBayar->settlement_status = $confirmPayment->settlement_status; $vaTagihanBayar->updated_at = Carbon::now(); $vaTagihanBayar->save(); // CREATE PEMBAYARAN $pembayaranId = Uuid::uuid4()->toString(); Pembayaran::insert(array( 'id' => $pembayaranId, 'kode' => "PAYWW".(time()+rand(1,100)), 'deskripsi' => "Pembayaran tagihan ".$countTagihan." bulan. Pelanggan ".$pelanggan->no_pelanggan.".", 'tahun_tagihan' => Carbon::now()->year, 'tipe_pembayaran_id' => 2, 'total_kotor' => $nominalTagihan, 'total_potongan' => $nominalPotongan, 'total_akhir' => $nominalTagihanVa, 'tanggal_bayar' => $tanggalBayar, 'metode_pembayaran_id' => 2, 'status_pembayaran_id' => 2, 'voucher_id' => $vaTagihanBayar->voucher_id, 'keterangan' => NULL, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), 'catatan_voucher' => $vaTagihanBayar->catatan_voucher, 'penerima_pembayaran_id' => $pegawaiId, 'pelanggan_id' => $pelanggan->id, 'jumlah_tagihan' => $countTagihan, )); //KIRIM NOTIFIKASI EMAIL $this->sendReceipt($pembayaranId); //KIRIM NOTIFIKASI FIREBASE $this->sendFirebaseNotification($pelanggan,$vaTagihanBayar); // UPDATE TAGIHAN foreach($listTagihan as $tagihan){ Tagihan::where('id',$tagihan->id)->update(array( 'lunas' => 1, 'tanggal_bayar' => $tanggalBayar, 'tanggal_cetak' => $tanggalBayar, 'kolektor_id' => $pegawaiId, 'pembayaran_id' => $pembayaranId, )); DetailTagihan::insert(array( 'id' => Uuid::uuid4()->toString(), 'tagihan_id' => $tagihan->id, 'tipe_pembayaran_id' => 2, 'deskripsi' => "Tagihan Bulanan Pelanggan ".$pelanggan->no_pelanggan." Paket ".$pelanggan->paket->nama, 'total' => $pelanggan->paket->biaya_perbulan, 'harga_satuan' => $pelanggan->paket->biaya_perbulan, 'jumlah' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), )); $jtTerbayar[] = array( 'bulan_tagihan' => $tagihan->bulan_tagihan, 'tahun_tagihan' => $tagihan->tahun_tagihan, 'tanggal_jatuh_tempo' => $tagihan->tanggal_jatuh_tempo, ); } // GENERATE TAGIHAN BARU $tagihanBaruId = array(); $checkTagihanBelumLunas = Tagihan::where('pelanggan_id',$pelanggan->id)->whereNotNull('bulan_tagihan')->where('lunas',0) ->orderBy('tahun_tagihan')->orderBy('bulan_tagihan')->get(); if(@count($checkTagihanBelumLunas) == 0){ $lunas = Tagihan::where('pelanggan_id',$pelanggan->id)->whereNotNull('bulan_tagihan')->where('lunas','>',0) ->orderBy('tahun_tagihan','desc')->orderBy('bulan_tagihan','desc')->first(); // GENERATE NEXT TANGGAL JATUH TEMPO $tempTime = $lunas->bulan_tagihan < 10 ? $lunas->tahun_tagihan.'-0'.$lunas->bulan_tagihan.'-01' : $lunas->tahun_tagihan.'-'.$lunas->bulan_tagihan.'-01'; $nextDate = date('Y-m-d',strtotime('+1 month',strtotime($tempTime))); $explodeNew = explode('-', $nextDate); $carbonDate = Carbon::now(); if($pelanggan->jatuh_tempo){ if($pelanggan->jatuh_tempo == 31){ $hariTempo = date('t',strtotime($nextDate)); } elseif((int)$explodeNew[1] == 2 && $pelanggan->jatuh_tempo >= 28){ $hariTempo = date('t',strtotime($nextDate)); } else{ $hariTempo = $pelanggan->jatuh_tempo < 10 ? '0'.$pelanggan->jatuh_tempo : $pelanggan->jatuh_tempo; } } elseif(empty($pelanggan->jatuh_tempo) && $pelanggan->tanggal_pasang){ $tanggalPasang = (int)date('d',strtotime($pelanggan->tanggal_pasang)); if($tanggalPasang == 31){ $hariTempo = date('t',strtotime($nextDate)); } elseif((int)$explodeNew[1] == 2 && $tanggalPasang >= 28){ $hariTempo = date('t',strtotime($nextDate)); } else{ $hariTempo = $tanggalPasang < 10 ? '0'.$tanggalPasang : $tanggalPasang; } } else{ if($carbonDate->day == 31){ $hariTempo = date('t',strtotime($nextDate)); } elseif($carbonDate->month == 2 && $carbonDate->day >= 28){ $hariTempo = date('t',strtotime($nextDate)); } else{ $hariTempo = $date->day < 10 ? '0'.$date->day : $date->day; } } $jatuhTempo = date('Y-m-',strtotime($nextDate)).$hariTempo; // CEK PROMO if($pelanggan->paket->promo_jenis){ // PAKET PROMO if(strtotime($pelanggan->paket->promo_berlaku_dari) <= strtotime($pelanggan->tanggal_pasang) && strtotime($pelanggan->paket->promo_berlaku_hingga) >= strtotime($pelanggan->tanggal_pasang)){ // TANGGAL PASANG DI ANTARA RENTANG PROMO BERLAKU if($pelanggan->paket->jenis_pembayaran == 1){ // PRABAYAR $jatahPromo = $pelanggan->paket->promo_jatah_bulan - 1; $firstDate = date('Y-m-',strtotime($pelanggan->tanggal_pasang)).'01'; $batasAwalPromo = $firstDate; $batasAkhirPromo = date('Y-m-t',strtotime('+'.$jatahPromo.' months',strtotime($firstDate))); } else{ // PASCABAYAR $jatahPromo = $pelanggan->paket->promo_jatah_bulan; $firstDate = date('Y-m-',strtotime($pelanggan->tanggal_pasang)).'01'; $batasAwalPromo = date('Y-m-d',strtotime('+ 1 months',strtotime($firstDate))); $batasAkhirPromo = date('Y-m-t',strtotime('+'.$jatahPromo.' months',strtotime($batasAwalPromo))); } if(strtotime($jatuhTempo) <= strtotime($batasAkhirPromo) && strtotime($jatuhTempo) >= strtotime($batasAwalPromo)){ // BULAN SEKARANG MASIH TERMASUK PADA BULAN JATAH PROMO $total_tagihan = $pelanggan->paket->biaya_perbulan; $tempTv = ($pelanggan->paket->layananTv) ? $pelanggan->paket->layananTv->iuran : 0; $tempInternet = ($pelanggan->paket->layananInternet) ? $pelanggan->paket->layananInternet->iuran : 0; if($pelanggan->paket->promo_jenis == 1){ // POTONGAN NOMINAL FIX $hargaLayananTv = $tempTv - $pelanggan->paket->promo_tv; $hargaLayananInternet = $tempInternet - $pelanggan->paket->promo_internet; $totalTagihan = $hargaLayananTv + $hargaLayananInternet; } else{ // POTONGAN PERSEN; $hargaLayananTv = $tempTv - (($tempTv * $pelanggan->paket->promo_persen) / 100); $hargaLayananInternet = $tempInternet - (($tempInternet * $pelanggan->paket->promo_persen) / 100); $totalTagihan = $total_tagihan - (($total_tagihan * $pelanggan->paket->promo_persen) / 100); } } else{ // BULAN SEKARANG SUDAH TIDAK TERMASUK PADA BULAN JATAH PROMO $totalTagihan = $pelanggan->paket->biaya_perbulan; $hargaLayananTv = ($pelanggan->paket->layananTv) ? $pelanggan->paket->layananTv->iuran : 0; $hargaLayananInternet = ($pelanggan->paket->layananInternet) ? $pelanggan->paket->layananInternet->iuran : 0; } } else{ // TANGGAL PASANG TIDAK DI ANTARA RENTANG PROMO BERLAKU $totalTagihan = $pelanggan->paket->biaya_perbulan; $hargaLayananTv = ($pelanggan->paket->layananTv) ? $pelanggan->paket->layananTv->iuran : 0; $hargaLayananInternet = ($pelanggan->paket->layananInternet) ? $pelanggan->paket->layananInternet->iuran : 0; } } else{ // PAKET BUKAN PROMO $totalTagihan = $pelanggan->paket->biaya_perbulan; $hargaLayananTv = ($pelanggan->paket->layananTv) ? $pelanggan->paket->layananTv->iuran : 0; $hargaLayananInternet = ($pelanggan->paket->layananInternet) ? $pelanggan->paket->layananInternet->iuran : 0; } // GENERATE TAGIHAN BULAN SELANJUTNYA $kodeTagihanBaru = $pelanggan->no_pelanggan.(Carbon::now()->timestamp + rand(1,10000)); $addTagihan = new Tagihan; $addTagihan->id = Uuid::uuid4()->toString(); $addTagihan->kode = $kodeTagihanBaru; $addTagihan->pelanggan_id = $pelanggan->id; $addTagihan->total = $totalTagihan; $addTagihan->harga_layanan_tv = $hargaLayananTv; $addTagihan->harga_layanan_internet = $hargaLayananInternet; $addTagihan->tahun_tagihan = $explodeNew[0]; $addTagihan->bulan_tagihan = (int)$explodeNew[1]; $addTagihan->tanggal_jatuh_tempo = $jatuhTempo; $addTagihan->deskripsi = "Iuran Bulanan Paket ".$pelanggan->paket->nama; $addTagihan->paket_id = $pelanggan->paket_id; $addTagihan->save(); // VALUE UNTUK DATA VA $tagihanBaruId[] = $addTagihan->id; } // INSERT TAGIHAN VA $tableTagihan = new VaTagihan; $tableTagihan->id = Uuid::uuid4()->toString(); $tableTagihan->va_akun_id = $vaAkun->id; $tableTagihan->va_bank_id = $vaAkun->va_bank_id; $tableTagihan->kode = $arrayDataUpdate['partner_trx_id']; $tableTagihan->nominal = $nominalVa['total']; $tableTagihan->harga_tv = $nominalVa['tv']; $tableTagihan->harga_internet = $nominalVa['internet']; $tableTagihan->status = 0; $tableTagihan->tanggal_bayar = NULL; $tableTagihan->tanggal_disbursement = NULL; $tableTagihan->keterangan = NULL; $tableTagihan->created_at = Carbon::now(); $tableTagihan->updated_at = Carbon::now(); $tableTagihan->save(); // INSERT DETAIL TAGIHAN VA foreach($tagihanBaruId as $idTagihan){ $arrayDetail = array( 'va_tagihan_id' => $tableTagihan->id, 'tagihan_id' => $idTagihan, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), ); VaTagihanDetail::insert($arrayDetail); } // UPDATE DETAIL TAGIHAN VA TIDAK BAYAR if(@count($arrayVaTagihanId) > 0){ foreach($arrayVaTagihanId as $vaTagihanIdValue){ // DELETE RECORD VA TAGIHAN DETAIL VaTagihanDetail::where('va_tagihan_id',$vaTagihanIdValue)->delete(); // INSERT RECORD VA TAGIHAN DETAIL foreach($tagihanBaruId as $idTagihan){ $arrayDetailTagihan = array( 'va_tagihan_id' => $vaTagihanIdValue, 'tagihan_id' => $idTagihan, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), ); VaTagihanDetail::insert($arrayDetailTagihan); } } } // KIRIM EMAIL NOTIFIKASI PEMBAYARAN $emailCheck = $pelanggan->email ? $this->checkEmail($pelanggan->email) : FALSE; $getKey = env('BROADCAST_EMAIL_CLIENT_KEY'); if($pelanggan->email && $emailCheck && $getKey){ $bulanTagihan = array( '1' => 'Januari', '2' => 'Februari', '3' => 'Maret', '4' => 'April', '5' => 'Mei', '6' => 'Juni', '7' => 'Juli', '8' => 'Agustus', '9' => 'September', '10' => 'Oktober', '11' => 'November', '12' => 'Desember' ); $indexAkhir = $countTagihan - 1; $tanggalAwal = $bulanTagihan[$jtTerbayar[0]['bulan_tagihan']].' - '.$jtTerbayar[0]['tahun_tagihan']; $tanggalAkhir = $bulanTagihan[$jtTerbayar[$indexAkhir]['bulan_tagihan']].' - '.$jtTerbayar[$indexAkhir]['tahun_tagihan']; $bulanBayar = (int)date('m',strtotime($tanggalBayar)); $tahunBayar = (int)date('Y',strtotime($tanggalBayar)); // CEK PAKET $paketInternet = $pelanggan->paket->layanan_internet_id ? $pelanggan->paket->layananInternet->up_to ? $pelanggan->paket->layananInternet->up_to : '-' : '-'; // FORMAT PARAMETER EMAIL NOTIFIKASI PEMBAYARAN $notifParam = array( 'client_key'=> $getKey, 'invoice' => array( 'title' => $pelanggan->cabang->nama.' - PEMBAYARAN TAGIHAN '.$tanggalAwal.' / '.$tanggalAkhir, 'no_invoice'=> $vaTagihanBayar->kode.'/'.$kodeCabang.'/'.$bulanBayar.'/'.$tahunBayar, 'customer' => array( 'id' => $pelanggan->no_pelanggan, 'name' => $pelanggan->nama, 'email' => $pelanggan->email, 'address' => $pelanggan->alamat, 'state' => $pelanggan->cabang->kota_id ? $pelanggan->cabang->kota->provinsi->nama : '-', 'country' => 'Indonesia', ), 'due_date' => date('Y-m-d',strtotime($jtTerbayar[0]['tanggal_jatuh_tempo'])), 'po_wo_contract_no' => NULL, 'package' => array( array( 'name' => $pelanggan->paket->nama, 'price' => $pelanggan->paket->biaya_perbulan, 'speed' => $paketInternet, 'usage_start' => date('Y-m-d',strtotime($jtTerbayar[0]['tanggal_jatuh_tempo'])), 'usage_end' => date('Y-m-d',strtotime($jtTerbayar[$indexAkhir]['tanggal_jatuh_tempo'])), 'total_current_charge' => $nominalTagihanVa, ), ), 'installation_address' => $pelanggan->alamat, 'payment_channel' => 'VIRTUAL ACCOUNT', 'payment_bank_name' => $vaAkun->bank->nama, 'payment_account_name' => $vaAkun->pelanggan->nama, 'payment_account_number'=> $vaAkun->va_number, ), ); $kirimEmail = $this->sendMail($notifParam); } } else{ // INSERT CALLBACK VA VaCallback::insert(array( 'id' => Uuid::uuid4()->toString(), 'va_penyedia_id' => $vaAkun->bank->va_penyedia_id, 'va_akun_id' => $vaAkun->id, 'kode_tagihan' => $confirmPayment->partner_trx_id, 'nominal' => $nominalCallback, 'tanggal_bayar' => $tanggalBayar, 'status' => 'GAGAL', 'keterangan' => 'GAGAL UPDATE AKUN VA SELAIN AKUN BAYAR', 'transfer_referensi' => $confirmPayment->trx_id, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), )); } } else{ // INSERT CALLBACK VA VaCallback::insert(array( 'id' => Uuid::uuid4()->toString(), 'va_penyedia_id' => $vaAkun->bank->va_penyedia_id, 'va_akun_id' => $vaAkun->id, 'kode_tagihan' => $confirmPayment->partner_trx_id, 'nominal' => $nominalCallback, 'tanggal_bayar' => $tanggalBayar, 'status' => 'GAGAL', 'keterangan' => $jsonDecodeUpdate->status->message, 'transfer_referensi' => $confirmPayment->trx_id, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), )); } } else{ $keteranganCC = 'CALLBACK '.$vaAkun->va_number.' : '.$confirmPayment->partner_trx_id; $keterangan = !$vaTagihanBayar ? 'KODE TAGIHAN TIDAK DITEMUKAN; '.$keteranganCC : $keteranganCC; // INSERT CALLBACK VA VaCallback::insert(array( 'id' => Uuid::uuid4()->toString(), 'va_penyedia_id' => $vaAkun->bank->va_penyedia_id, 'va_akun_id' => $vaAkun->id, 'kode_tagihan' => $confirmPayment->partner_trx_id, 'nominal' => $nominalCallback, 'tanggal_bayar' => $tanggalBayar, 'status' => 'GAGAL', 'keterangan' => $keterangan, 'transfer_referensi' => $confirmPayment->trx_id, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), )); } } DB::commit(); return 'OK'; }
Editor is loading...