<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Session;
use App\Models\Duplikasi\DupProgram;
use App\Models\RealisasiRincianKegiatan;
class Opd extends Model
{
use HasFactory, SoftDeletes;
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
protected $guarded = [];
public function proker(){
return $this->hasMany(Proker::class);
}
public function ProkerProgram(){
return $this->hasManyThrough(ProkerProgram::class, Proker::class);
}
public function ProkerKegiatan(){
return $this->hasManyDeep(ProkerKegiatan::class, [Proker::class, ProkerProgram::class]);
}
public function ProkerSubKegiatan(){
return $this->hasManyDeep(ProkerSubKegiatan::class, [Proker::class, ProkerProgram::class, ProkerKegiatan::class]);
}
public function RincianKegiatan(){
return $this->hasManyDeep(RincianKegiatan::class, [Proker::class, ProkerProgram::class, ProkerKegiatan::class, ProkerSubKegiatan::class]);
}
public function RealisasiRincianKegiatan(){
return $this->hasManyDeep(RealisasiRincianKegiatan::class, [Proker::class, ProkerProgram::class, ProkerKegiatan::class, ProkerSubKegiatan::class, RincianKegiatan::class]);
}
public function RealisasiFisik(){
return $this->hasManyDeep(RealisasiFisik::class, [Proker::class, ProkerProgram::class, ProkerKegiatan::class, ProkerSubKegiatan::class, RincianKegiatan::class, RealisasiRincianKegiatan::class]);
}
public function RealisasiKeuangan(){
return $this->hasManyDeep(RealisasiKeuangan::class, [Proker::class, ProkerProgram::class, ProkerKegiatan::class, ProkerSubKegiatan::class, RincianKegiatan::class, RealisasiRincianKegiatan::class]);
}
public function getTkdnAkumulasiAttribute()
{
return $this->Proker->sum('TkdnAkumulasi');
}
public function getPhysicalPercentageByMonth($month, $year)
{
$totalPercentage = 0;
$count = 0;
// Ambil semua proker_kegiatans yang terkait dengan OPD ini
$prokerKegiatans = $this->prokers()->with('prokerPrograms.prokerKegiatans')->get()
->pluck('prokerPrograms')
->flatten()
->pluck('prokerKegiatans')
->flatten();
// Loop melalui setiap proker_kegiatan dan hitung persentase fisiknya
foreach ($prokerKegiatans as $prokerKegiatan) {
// Ambil semua rincian_kegiatans dan realisasi_rincian_kegiatans yang terkait dengan proker_kegiatan ini
$rincianKegiatans = $prokerKegiatan->rincianKegiatans()
->with(['realisasiRincianKegiatans' => function ($query) use ($month, $year) {
$query->whereMonth('tanggal_realisasi', $month)
->whereYear('tanggal_realisasi', $year);
}])
->get();
// Loop melalui setiap rincian_kegiatan dan hitung persentase fisiknya
foreach ($rincianKegiatans as $rincianKegiatan) {
$realisasiFisik = $rincianKegiatan->realisasiRincianKegiatans->sum('realisasi');
// Hitung persentase fisik jika volume lebih dari 0
if ($rincianKegiatan->volume > 0) {
$persentaseFisik = ($rincianKegiatan->pagu * ($realisasiFisik / $rincianKegiatan->volume)) * 100;
} else {
$persentaseFisik = 0;
}
$totalPercentage += $persentaseFisik;
$count++;
}
}
// Hitung rata-rata persentase fisik
if ($count > 0) {
$averagePercentage = $totalPercentage / $count;
} else {
$averagePercentage = 0;
}
return $averagePercentage;
}
// public function dupProgram(){
// return $this->hasMany(DupProgram::class,'opd_id');
// }
public function getAnggaranAttribute(){
$result = 0;
foreach ($this->proker as $data) {
$result += $data->anggaran;
}
return $result;
}
public function getFisikAttribute(){
$result = 0;
foreach ($this->Proker as $data) {
$result += $data->fisik;
}
return $result;
}
public function getKeuanganAttribute(){
$result = 0;
foreach ($this->Proker as $data) {
$result += $data->keuangan;
}
return $result;
}
public function ppk(){
return $this->hasMany(Ppk::class,'opd_id');
}
public function kpa(){
return $this->hasMany(Kpa::class,'opd_id');
}
public function setYearAttribute($value)
{
$this->attributes['year'] = $value;
}
public function dupProgram(){
return $this->hasMany(DupProgram::class,'opd_id');
}
public function getDupanggaranAttribute(){
return $this->dupProgram->map(function($item,$key){
return $item->anggaran;
})->sum();
}
public function getPaguByYearAttribute($value)
{
# method ini wajib mendapat data dari method set Year;
# silakan kawan-kawan optimasi jika perlu 😁🙏;
try {
return $this->proker
->where('tahun',$this->attributes['year'])
->map(function($item,$key){
return $item->ProkerProgram->map(function($item,$key){
return $item->ProkerKegiatan->map(function($item,$key){
return $item->ProkerSubKegiatan->map(function($item,$key){
return $item->RincianKegiatan->map(function($item,$key){
return $item->pagu;
})->sum();
})->sum();
})->sum();
})->sum();
})->sum();
} catch (\Exception $e) {
return 0;
}
}
public function getRincianRealisasiAttribute(){
try {
// return $this->proker
// ->map(function($item,$key){
// return $item->ProkerProgram->map(function($item,$key){
// return $item->ProkerKegiatan->map(function($item,$key){
// return $item->ProkerSubKegiatan->map(function($item,$key){
// return $item->RincianKegiatan->map(function($item,$key){
// return $item->RealisasiRincianKegiatan;
// })->filter(function($data,$key){
// return $data != null;
// })->sum('nilai_kontrak');
// })->sum();
// })->sum();
// })->sum();
// })->sum();
$ids = $this->id;
return RealisasiRincianKegiatan::whereHas('RincianKegiatan.ProkerSubKegiatan.ProkerKegiatan.ProkerProgram.Proker.Opd',function($query)use($ids){
$query->where('id',$ids);
})->sum('nilai_kontrak');
} catch (\Exception $e) {
return 0;
}
}
public function getPercentPaguAttribute($value){
if (is_null(Session::get('total_pagu'))) {
if (!Session::get('total_pagu') > 0) {
$jum = self::select('id','nama_perangkat_daerah')->get()->map(function($item,$key){
return $item->anggaran;
})->sum();
Session::put('total_pagu',$jum);
}
}
$total = Session::get('total_pagu');
if ($this->keuangan > 0) {
return ($this->anggaran/$total)*100;
}else{
return 0;
}
}
public function getPercentFisikAttribute(){
return $this->proker->map(function($item,$key){
return $item->percentfisik;
})->sum();
}
public function scopeFilter($query,$request){
if ($request->opd) {
$query->where('id',$request->opd);
}
if ($request->tahun) {
$query->whereHas('proker',function($query)use($request){
$query->where('tahun',$request->tahun);
});
}
if ($request->month) {
$query->whereHas('proker.ProkerProgram.ProkerKegiatan.ProkerSubKegiatan.RincianKegiatan.RealisasiRincianKegiatan.realisasiFisik',function($query)use($request){
$query->whereMonth('tanggal_realisasi',$request->month);
})->orWhereHas('proker.ProkerProgram.ProkerKegiatan.ProkerSubKegiatan.RincianKegiatan.RealisasiRincianKegiatan.realisasiKeuangan',function($query)use($request){
$query->whereMonth('tanggal_realisasi',$request->month);
});
}
return $query;
}
public function getVolumeAttribute(){
return $this->proker->sum('volume');
}
public function getTestingAttribute(){
// return $this->anggaran;
return $this->anggaran * (($this->fisik/$this->volume)*100);
// return ($this->anggaran * (($this->fisik/$this->volume)*100)/$this->anggaran);
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]