Files
api_arrahn/app/Services/Reports/OnePercentService.php
T

442 lines
20 KiB
PHP

<?php
namespace App\Services\Reports;
use App\AkruNetPecahan;
use App\Cawangan;
use App\CawanganDetail;
use App\Gadai;
use App\StokAudit1;
use App\StokAudit10;
use App\StokAudit11;
use App\StokAudit12;
use App\StokAudit2;
use App\StokAudit3;
use App\StokAudit4;
use App\StokAudit5;
use App\StokAudit6;
use App\StokAudit7;
use App\StokAudit8;
use App\StokAudit9;
use App\TransaksiKeuntungan;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use App\Support\v2\Calculation as V2Calculation;
use Carbon\Carbon;
use Exception;
class OnePercentService
{
// `B` stands for balance sheet and `L` stands for Ledger
private $kod_cawangan;
private $cawangan;
public function __construct($kod_cawangan){
$this->kod_cawangan = $kod_cawangan;
$this->cawangan = Cawangan::where('kodcaw',$kod_cawangan)->first();
}
public function getTotalRounded($type='B',$start = '2023-12-14',$end = '2023-12-14'){
if($type == 'B'){
$rounded = TransaksiKeuntungan::on('mysql7')
->leftJoin('transaction as trans', function($join)
{
$join->on('trans.norujukan', '=', 'transaksi_keuntungan.norujukan');
$join->on('trans.created_at', '=', 'transaksi_keuntungan.tarikh_bayaran');
})
->where('trans.trans_type','T')
->sum('transaksi_keuntungan.rounded');
}else if($type == 'L'){
$rounded = TransaksiKeuntungan::on('mysql7')
->whereDate('tarikh_bayaran','>=',$start)
->whereDate('tarikh_bayaran','<=',$end)
->sum('rounded');;
}
return $rounded;
}
public function getTotalKeuntungan($type = 'B',$start = '2023-12-14',$end = '2023-12-14') : Object{
if($type == 'B'){
if($start == null){
$akrual = Gadai::on($this->cawangan['mysql'])->where([['sttebus',''],['tagbaru',1]])->sum('tunggakanonepercent');
$norujukan = Gadai::on($this->cawangan['mysql'])->where('sttebus','T')->where('tagbaru',1)->pluck('norujukan');
$keuntungan = TransaksiKeuntungan::on('mysql7')
->whereIn('norujukan',$norujukan)
->sum('onepercent_rebet');
}else{
$akrual = Gadai::on($this->cawangan['mysql'])
->where([['tagpalsu','=',0],['t_gadai','<=',$start],['sttebus','=',''],['tagbaru',1]])
->orWhere([['tagbaru',1],['tagpalsu','=',0],['t_update','>',$start],['sttebus','!=',''],['t_gadai','<=',$start]])
->orderBy('t_gadai', 'ASC')
->orderBy('sirig', 'ASC')
->get();
$test = $this->calculateTotalProfit($akrual,$start);
return response()->json($test);
}
}else if($type == 'L'){
$akrual = Gadai::on($this->cawangan['mysql'])->where([['sttebus',''],['tagbaru',1],['t_update','>=',$start],['t_update','<=',$end]])->sum('tunggakanonepercent');
$norujukan = Gadai::on($this->cawangan['mysql'])->where('sttebus','T')->where('tagbaru',1)->where('t_update','>=',$start)->where('t_update','<=',$end)->pluck('norujukan');
//Keuntungan Pada Bukan Bulan Yang Sama
$keuntungan = TransaksiKeuntungan::on('mysql7')
->whereIn('norujukan',$norujukan)
->whereDate('tarikh_bayaran','>=',$start)
->whereDate('tarikh_bayaran','<=',$end)
->sum('onepercent_rebet');
}
$totalkeuntungan = $keuntungan + $akrual;
return $totalkeuntungan;
}
public function getTotalUjrah($type = 'B',$start = '2023-12-14',$end = '2023-12-14') : Float{
if($type == 'B'){
$akrual = Gadai::on($this->cawangan['mysql'])->where([['sttebus',''],['tagbaru',1]])->sum('tunggakanujrah');
$norujukan = Gadai::on($this->cawangan['mysql'])->where('sttebus','T')->where('tagbaru',1)->pluck('norujukan');
$ujrah = TransaksiKeuntungan::on('mysql7')
->whereIn('norujukan',$norujukan)
->sum('ujrah_rebet');
}else if($type == 'L'){
$akrual = Gadai::on($this->cawangan['mysql'])->where([['sttebus',''],['tagbaru',1],['t_update','>=',$start],['t_update','<=',$end]])->sum('tunggakanujrah');
$norujukan = Gadai::on($this->cawangan['mysql'])->where('sttebus','T')->where('tagbaru',1)->pluck('norujukan');
$ujrah = TransaksiKeuntungan::on('mysql7')
->whereIn('norujukan',$norujukan)
->whereDate('tarikh_bayaran','>=',$start)
->whereDate('tarikh_bayaran','<=',$end)
->sum('ujrah_rebet');;
}
$totalujrah = $ujrah + $akrual;
return $totalujrah;
}
public function calculateTotalProfit($akrual,$tarikh){
$chunkSize = 100;
$summationonepercent = 0;
$summationujrah = 0;
$count = 0;
$summationbkpjm = 0;
$array_test = [];
$akrual->chunk($chunkSize)->each(function ($chunk) use(&$array_test,$tarikh,&$summationonepercent,&$summationujrah,&$count,&$summationbkpjm) {
// Process each chunk of items
foreach ($chunk as $item) {
$trans_keun = TransaksiKeuntungan::on('mysql7')->where([['norujukan','=',$item->norujukan],['bayaran_pembiayaan','>=',0]])->whereDate('tarikh_bayaran','<=',$tarikh)->get();
$calculation = new V2Calculation();
// if($item->norujukan == 'KB2240115-0013')
// {
// dd($trans_keun);
// }
if($trans_keun->isNotEmpty()){
$bakipinjaman = $item->pinjaman;
$last_transaction = Carbon::parse($trans_keun->last()->tarikh_bayaran)->toDateString();
if($last_transaction > $tarikh){
$last_transaction = $tarikh;
}
$trans_keun->each(function($trans) use(&$bakipinjaman){
$bakipinjaman -= $trans['bayaran_pembiayaan'];
});
$kiraan = $calculation->kiraanKeuntunganRebet($bakipinjaman,$item->nilaimarhun,$item->kadarupah,(($bakipinjaman/$item->nilaimarhun) * 100));
$tempoh = $this->kiraanTarikhJBG($item->t_gadai,$tarikh);
$tempoh_last_transaction = $this->kiraanTarikhJBG($item->t_gadai,$last_transaction);
$tempoh_belum_bayar = $tempoh - $tempoh_last_transaction;
$onepercent = $calculation->getRoundedMethod($kiraan['onepercent'] * $tempoh_belum_bayar);
$ujrah = $calculation->getRoundedMethod($kiraan['ujrah'] * $tempoh_belum_bayar);
$summationonepercent += $onepercent;
$summationujrah += $ujrah;
$summationbkpjm += $bakipinjaman;
array_push($array_test,['norujukan' => $item->norujukan,'ujrah' => $ujrah,'onepercent' => $onepercent,'pinjaman' => $item->pinjaman, 'bakipjm' => $bakipinjaman]);
}else{
$kiraan = $calculation->kiraanKeuntunganRebet($item->pinjaman,$item->nilaimarhun,$item->kadarupah,(($item->pinjaman/$item->nilaimarhun) * 100));
$tempoh = $this->kiraanTarikhJBG($item->t_gadai,$tarikh);
$onepercent = $calculation->getRoundedMethod($kiraan['onepercent'] * $tempoh);
$ujrah = $calculation->getRoundedMethod($kiraan['ujrah'] * $tempoh);
$summationonepercent += $onepercent;
$summationujrah += $ujrah;
$summationbkpjm += $item->pinjaman;
// if($item->norujukan == 'KB2240108-0020')
// {
// dd($item->bakipjm);
// }
array_push($array_test,['norujukan' => $item->norujukan,'ujrah' => $ujrah,'onepercent' => $onepercent,'pinjaman' => $item->pinjaman, 'bakipjm' => $item->pinjaman]);
}
$count++;
}
});
// return response()->json($array_test);
dd($summationonepercent,$summationujrah,$count,$summationbkpjm,$array_test);
dd('test');
}
public function getAllCawanganAccruedIncome(Request $request){
$cawangan = Cawangan::on('mysql7')->where('version','v2')->get();
$array_cawangan = [];
foreach($cawangan as $caw){
$akru = AkruNetPecahan::on($caw['mysql'])->where('tahun',$request->year)->orderBy('bulan')->orderBy('tahun')->get()->toArray();
for($i=0;$i<=11;$i++){
if(isset($akru[$i])){
$array_cawangan[$caw['details_caw']]['ujrah'][$i] = $akru[$i]['pend_akru_ujrah'];
$array_cawangan[$caw['details_caw']]['onepercent'][$i] = $akru[$i]['pend_akru_1persen'];
}else{
$array_cawangan[$caw['details_caw']]['ujrah'][$i] = 0;
$array_cawangan[$caw['details_caw']]['onepercent'][$i] = 0;
}
}
}
return $array_cawangan;
}
public function calculateAccruedIncome(Request $request){
/* (A) Stok Audit Bulan Sekarang | (B) Stok Audit Bulan Sebelum | (C) Keuntungan Bayaran Semasa Pecahan | (D) = (B) - (C) | (E) = (A) - (D) */
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$request->kodcaw)->first();
$date = new Carbon($request->tarikh);
$date_sebelum = clone $date;
$date_sebelum = $date_sebelum->firstOfMonth();
$month_sebelum = $date_sebelum->subMonth()->format('m');
$month_sekarang = $date->format('m');
$year_generate = $date->format('Y');
/* generate for month */
$first_month_current = new Carbon($request->tarikh);
$first_month_current = $first_month_current->firstOfMonth();
$last_month_current = new Carbon($request->tarikh);
$last_month_current = $last_month_current->lastOfMonth();
/* A */
if($date->isToday()){
$audit_now = Gadai::on($cawangan['mysql'])
->where([['tagpalsu','=',0],['t_gadai','<=',$request->tarikh],['sttebus','=','']])
->orWhere([['tagpalsu','=',0],['t_update','>',$request->tarikh],['sttebus','!=',''],['t_gadai','<=',$request->tarikh]])
->orderBy('t_gadai', 'ASC')
->orderBy('sirig', 'ASC');
$onepercent_current = $audit_now->sum('tunggakanonepercent');
$ujrah_current = $audit_now->sum('tunggakanujrah');
}else{
$result_audit_current = $this->StokAuditGenerateTerakru($month_sekarang,$cawangan,$year_generate);
$onepercent_current = $result_audit_current->sum('utgonepercent');
$ujrah_current = $result_audit_current->sum('ujrah');
}
/* B */
$result_audit_previous = $this->StokAuditGenerateTerakru($month_sebelum,$cawangan,$year_generate);
$onepercent_previous = $result_audit_previous->sum('utgonepercent');
$ujrah_previous = $result_audit_previous->sum('ujrah');
/* C */
$keuntungan_semasa = $this->CurrentProfit($first_month_current->toDateString(),$last_month_current->toDateString(),$request->kodcaw);
/* D & E */
$accrual_income_onepercent = $onepercent_current - ($onepercent_previous - $keuntungan_semasa['onepercent']);
$accrual_income_ujrah = $ujrah_current - ($ujrah_previous - $keuntungan_semasa['ujrah']);
$available_akru = AkruNetPecahan::on($cawangan['mysql'])
->where('bulan', (int)$month_sekarang)
->where('tahun', $year_generate)
->get()->toArray();
if(sizeof($available_akru) == 0)
{
$akrunet = new AkruNetPecahan();
$akrunet->setConnection($cawangan['mysql']);
$akrunet->tahun = $year_generate;
$akrunet->bulan = (int)$month_sekarang;
$akrunet->persen_semasa = $onepercent_current;
$akrunet->ujrah_semasa = $ujrah_current;
$akrunet->persen_sebelum = $onepercent_previous;
$akrunet->ujrah_sebelum = $ujrah_previous;
$akrunet->keuntungan_semasa_1persen = $keuntungan_semasa['onepercent'];
$akrunet->keuntungan_semasa_ujrah = $keuntungan_semasa['ujrah'];
$akrunet->baki_keun_blm_byr_1persen = ($onepercent_previous - $keuntungan_semasa['onepercent']);
$akrunet->baki_keun_blm_byr_ujrah = ($ujrah_previous - $keuntungan_semasa['ujrah']);
$akrunet->pend_akru_1persen = $accrual_income_onepercent;
$akrunet->pend_akru_ujrah = $accrual_income_ujrah;
$akrunet->save();
}else{
if($available_akru[0]['pend_akru_1persen'] !== $accrual_income_onepercent){
AkruNetPecahan::on($cawangan['mysql'])
->where('bulan','=',(int)$month_sekarang)
->where('tahun',$year_generate)
->update([
'persen_semasa' => $onepercent_current,
'ujrah_semasa' => $ujrah_current,
'persen_sebelum' => $onepercent_previous,
'ujrah_sebelum' => $ujrah_previous,
'keuntungan_semasa_1persen' => $keuntungan_semasa['onepercent'],
'keuntungan_semasa_ujrah' => $keuntungan_semasa['ujrah'],
'baki_keun_blm_byr_1persen' => ($onepercent_previous - $keuntungan_semasa['onepercent']),
'baki_keun_blm_byr_ujrah' => ($ujrah_previous - $keuntungan_semasa['ujrah']),
'pend_akru_1persen' => $accrual_income_onepercent,
'pend_akru_ujrah' => $accrual_income_ujrah,
]);
}
}
$array_result = ['onepercent_current' => $onepercent_current,'ujrah_current' => $ujrah_current,
'onepercent_previous' => $onepercent_previous,'ujrah_previous' => $ujrah_previous,
'current_profit' => $keuntungan_semasa, 'accrual_income_onepercent' => $accrual_income_onepercent,
'accrual_income_ujrah' => $accrual_income_ujrah];
return $array_result;
}
public function CurrentProfit($start,$end,$kodcaw){
$start = new Carbon($start);
$year = $start->format('Y');
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first();
$collection_trans = TransaksiKeuntungan::on('mysql7')
->leftJoin('transaction as trans', function($join)
{
$join->on('transaksi_keuntungan.norujukan', '=', 'trans.norujukan');
$join->on('transaksi_keuntungan.tarikh_bayaran', '=', 'trans.created_at');
})
->where('trans.kodcaw','=',$kodcaw)
->whereDate('transaksi_keuntungan.tarikh_bayaran' ,'<=', $end)
->whereDate('transaksi_keuntungan.tarikh_bayaran' ,'>=', $start)
->whereYear('transaksi_keuntungan.tarikh_bayaran','=',$year)
->get();
$array_norujukan = $collection_trans->pluck('norujukan')->toArray();
$collection_gadai = Gadai::on($cawangan['mysql'])->whereIn('norujukan',$array_norujukan)->get();
/* filtering untuk gadai yang ditebus pada bukan bulan yang sama */
$keuntungan_semasa_collection = $collection_trans->filter(function ($trans) use ($collection_gadai) {
foreach ($collection_gadai as $gadai) {
if($gadai->norujukan === $trans->norujukan){
$t_gadai = Carbon::parse($gadai->t_gadai);
$t_bayaran = Carbon::parse($trans->tarikh_bayaran);
if ($t_gadai->month === $t_bayaran->month) {
return false;
}
}
}
return true;
});
$ujrah = $this->filterCollection($keuntungan_semasa_collection,'A','ujrah');
$onepercent = $this->filterCollection($keuntungan_semasa_collection,'A','onepercent');
$ujrah_rebet = $this->filterCollection($keuntungan_semasa_collection,'T','ujrah_rebet');
$onepercent_rebet = $this->filterCollection($keuntungan_semasa_collection,'T','onepercent_rebet');
$total_onepercent = $onepercent + $onepercent_rebet;
$total_ujrah = $ujrah + $ujrah_rebet;
return ['ujrah' => $total_ujrah,'onepercent' => $total_onepercent];
}
private function kiraanTarikhJBG($tarikhgadai,$tarikh){
$tarikh_gadai = Carbon::parse($tarikhgadai. ' 00:00:00');
$tarikh = new Carbon($tarikh);
$tahun_gadai = $tarikh_gadai->year;
$bulan_gadai = $tarikh_gadai->month;
$hari_gadai = $tarikh_gadai->day;
$tahun_semasa = $tarikh->year;
$bulan_semasa = $tarikh->month;
$hari_semasa = $tarikh->day;
if($hari_semasa >= $hari_gadai){
$beza_hari = $hari_semasa - $hari_gadai + 1;
}else if($hari_semasa < $hari_gadai){
$bulan_semasa = $bulan_semasa - 1;
$beza_hari = ($hari_semasa + 30) - $hari_gadai + 1;
}
$extensivemonth_gadai = 0;
if($beza_hari >= 1 && $beza_hari <= 15){
$extensivemonth_gadai = 0.5;
}else if($beza_hari >= 16){
$extensivemonth_gadai = 1;
}else{
$extensivemonth_gadai = 0;
}
$beza_tahun = $tahun_semasa - $tahun_gadai;
$beza_bulan = ($bulan_semasa + ($beza_tahun * 12)) - $bulan_gadai;
$tempoh_gadai = $beza_bulan + $extensivemonth_gadai;
return $tempoh_gadai;
}
private function StokAuditGenerateTerakru($Month = null, $cawangan = [], $year_generate = null) : Object{
switch($Month){
case '01': return StokAudit1::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '02': return StokAudit2::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '03': return StokAudit3::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '04': return StokAudit4::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '05': return StokAudit5::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '06': return StokAudit6::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '07': return StokAudit7::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '08': return StokAudit8::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '09': return StokAudit9::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '10': return StokAudit10::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '11': return StokAudit11::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
case '12': return StokAudit12::on($cawangan['mysql'])->where('tahun',$year_generate);
break;
}
}
private function filterCollection($collection,$type,$sumtype) : Float{
return $collection->filter(function ($item) use($type) {
return $item->trans_type === $type;
})->sum($sumtype);
}
}