<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\DB;
use App\Models\FileDokumentasi;
use File;
class RincianKegiatan extends Model
{
use HasFactory, SoftDeletes;
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
use \Znck\Eloquent\Traits\BelongsToThrough;
protected $guarded = [];
protected $fillable = [
'proker_sub_kegiatan_id',
'kode_rekening',
'uraian',
'volume',
'satuan',
'pagu',
'volume_murni',
'satuan_murni',
'pagu_murni',
'volume_pergeseran',
'satuan_pergeseran',
'pagu_pergeseran',
'volume_perubahan',
'satuan_perubahan',
'pagu_perubahan',
'volume_perubahan_pergeseran',
'satuan_perubahan_pergeseran',
'pagu_perubahan_pergeseran',
'tanggal_akhir_pemilihan_penyedia',
'tanggal_mulai_pemilihan_penyedia',
'tanggal_akhir_pelaksanaan',
'tanggal_mulai_pelaksanaan',
'tanggal_akhir_pemanfaatan',
'tanggal_mulai_pemanfaatan',
'rincian_sub_bidang_id',
'status_gabungan',
'status_mendesak',
'strategis',
'sumber_dana_id',
'latitude',
'longitude',
'kategori',
'kunci_rincian',
'jenis_umk_id',
'pengadaan',
'umkm',
];
protected $casts = [
'pagu'=>'integer',
'volume'=>'float',
'pagu_murni'=>'integer',
'volume_murni'=>'float',
'pagu_pergeseran'=>'integer',
'volume_pergeseran'=>'float',
'pagu_perubahan'=>'integer',
'volume_perubahan'=>'float',
'pagu_perubahan_pergeseran'=>'integer',
'volume_perubahan_pergeseran'=>'float',
];
public function ProkerSubKegiatan(){
return $this->belongsTo(ProkerSubKegiatan::class);
}
public function RealisasiRincianKegiatan(){
return $this->hasOne(RealisasiRincianKegiatan::class,'rincian_kegiatan_id');
}
public function DetailRincianKegiatan(){
return $this->hasMany(DetailRincianKegiatan::class,'rincian_kegiatan_id');
}
public function SumberDana(){
return $this->belongsTo(SumberDana::class);
}
public function RincianBidang(){
return $this->belongsToThrough(RincianBidang::class, RincianSubBidang::class);
}
public function RincianSubBidang(){
return $this->belongsTo(RincianSubBidang::class);
}
public function RealisasiFisik()
{
return $this->hasManyThrough(RealisasiFisik::class, RealisasiRincianKegiatan::class);
}
public function RealisasiKeuangan()
{
return $this->hasManyThrough(RealisasiKeuangan::class, RealisasiRincianKegiatan::class);
}
public function permasalahanTindakLanjut()
{
return $this->hasManyThrough(PermasalahanTindakLanjut::class, RealisasiRincianKegiatan::class);
}
public function Proker(){
return $this->belongsToThrough(Proker::class, [ProkerProgram::class, ProkerKegiatan::class, ProkerSubKegiatan::class]);
}
public function Program(){
return $this->belongsToThrough(ProkerProgram::class, [ProkerKegiatan::class, ProkerSubKegiatan::class]);
}
public function Kegiatan(){
return $this->belongsToThrough(ProkerKegiatan::class, [ProkerSubKegiatan::class]);
}
public function Opd(){
return $this->belongsToThrough(Opd::class, [Proker::class, ProkerProgram::class, ProkerKegiatan::class, ProkerSubKegiatan::class]);
}
public function subrincianSubBidang()
{
return $this->belongsTo(RincianSubBidang::class, 'rincian_sub_bidang_id');
}
public function unaryRincianKegiatan()
{
return $this->hasMany(RincianKegiatan::class, 'rincian_kegiatan_id');
}
public function jenisUmk()
{
return $this->belongsTo(JenisUmk::class, 'jenis_umk_id');
}
// public function getPaguMurniAttribute()
// {
// return $this->attributes['pagu'];
// }
// public function getVolumeMurniAttribute()
// {
// return $this->attributes['volume'];
// }
// public function getSatuanMurniAttribute()
// {
// return $this->attributes['satuan'];
// }
// public function getPaguAttribute()
// {
// return $this->attributes['pagu_perubahan_pergeseran'] ??
// $this->attributes['pagu_perubahan'] ??
// $this->attributes['pagu_pergeseran'] ??
// $this->attributes['pagu'];
// }
// public function getVolumeAttribute()
// {
// return $this->attributes['volume_perubahan_pergeseran'] ??
// $this->attributes['volume_perubahan'] ??
// $this->attributes['volume_pergeseran'] ??
// $this->attributes['volume'];
// }
// public function getSatuanAttribute()
// {
// return $this->attributes['satuan_perubahan_pergeseran'] ??
// $this->attributes['satuan_perubahan'] ??
// $this->attributes['satuan_pergeseran'] ??
// $this->attributes['satuan'];
// }
public function getPersentaseFisikAttribute(){
if ($this->volume > 0) {
return ($this->pagu*($this->rincian_kegiatan_realisasi_fisik_sum/$this->volume)*100);
}else{
return 0;
}
}
public function getKeuanganAttribute(){
$result = 0;
if($this->RealisasiRincianKegiatan){
$result += $this->RealisasiRincianKegiatan->keuangan;
}
return $result;
}
public function getKeuTw($triwulan, $tahun){
$result = 0;
$data = $this->RealisasiRincianKegiatan; // Ambil satu objek saja
if ($data) { // Cek apakah data ada (bukan null)
$result += $data->getKeuTw($triwulan, $tahun);
}
return $result;
}
public function getFisikAttribute(){
// $result = 0;
// if($this->RealisasiRincianKegiatan){
// $result += $this->RealisasiRincianKegiatan->fisik;
// }
// return $result;
return $this->RealisasiRincianKegiatan->fisik ?? 0;
}
public function getKontrakAttribute(){
$result = 0;
if($this->RealisasiRincianKegiatan){
$result += (float) $this->RealisasiRincianKegiatan->nilai_kontrak;
}
return $result;
}
public function getFisikPercentAttribute(){
return $this->RealisasiRincianKegiatan->fisik->sum('realisasi');
}
public function scopeFilter($query,$request){
if ($request->month) {
$query->whereHas('RealisasiRincianKegiatan.realisasiFisik',function($q)use($request){
$q->whereMonth('tanggal_realisasi',$request->month);
})->orWhereHas('RealisasiRincianKegiatan.realisasiKeuangan',function($q)use($request){
$q->whereMonth('tanggal_realisasi',$request->month);
});
}
return $query;
}
public function getPaguBerjalanAttribute(){
if ($this->RealisasiRincianKegiatan->nilai_kontrak > 0) {
return $this->pagu;
// $count = $this->RealisasiRincianKegiatan->realisasiFisik->count() + $this->RealisasiRincianKegiatan->realisasiKeuangan->count();
// if ($count > 0) {
// return $this->pagu;
// }else{
// return 0;
// }
}else{
return 0;
}
}
public function getPaguSwakelolaAttribute(){
if ($this->RealisasiRincianKegiatan) {
if ($this->pengadaan == 1 && $this->RealisasiRincianKegiatan->metode == 'swakelola') {
return $this->pagu;
}else{
return 0;
}
}else{
return 0;
}
}
public function getPaguPengadaanLangsungAttribute(){
if ($this->RealisasiRincianKegiatan) {
if ($this->pengadaan == 1 && $this->RealisasiRincianKegiatan->metode == 'pengadaan langsung') {
return $this->pagu;
}else{
return 0;
}
}else{
return 0;
}
}
public function getPaguPengadaanDikecualikanAttribute(){
if ($this->RealisasiRincianKegiatan) {
if ($this->pengadaan == 1 && $this->RealisasiRincianKegiatan->metode == 'pengadaan dikecualikan') {
return $this->pagu;
}else{
return 0;
}
}else{
return 0;
}
}
public function getPaguEpurchasingAttribute(){
if ($this->RealisasiRincianKegiatan) {
if ($this->pengadaan == 1 && $this->RealisasiRincianKegiatan->metode == 'e-purchasing') {
return $this->pagu;
}else{
return 0;
}
}else{
return 0;
}
}
public function getPaguPenunjukanLangsungAttribute(){
if ($this->RealisasiRincianKegiatan) {
if ($this->pengadaan == 1 && $this->RealisasiRincianKegiatan->metode == 'penunjukan langsung') {
return $this->pagu;
}else{
return 0;
}
}else{
return 0;
}
}
public function getPaguTenderCepatAttribute(){
if ($this->RealisasiRincianKegiatan) {
if ($this->pengadaan == 1 && $this->RealisasiRincianKegiatan->metode == 'tender cepat') {
return $this->pagu;
}else{
return 0;
}
}else{
return 0;
}
}
public function getPaguTenderAttribute(){
if ($this->RealisasiRincianKegiatan) {
if ($this->pengadaan == 1 && $this->RealisasiRincianKegiatan->metode == 'tender') {
return $this->pagu;
}else{
return 0;
}
}else{
return 0;
}
}
public function getPaguSeleksiAttribute(){
if ($this->RealisasiRincianKegiatan) {
if ($this->pengadaan == 1 && $this->RealisasiRincianKegiatan->metode == 'seleksi') {
return $this->pagu;
}else{
return 0;
}
}else{
return 0;
}
}
public function getPaguPengadaanAttribute(){
if ($this->RealisasiRincianKegiatan) {
if ($this->pengadaan == 1) {
return $this->pagu;
}else{
return 0;
}
}else{
return 0;
}
}
public function getCustomNilaiKontrakAttribute(){
return isset($this->RealisasiRincianKegiatan)?$this->RealisasiRincianKegiatan->CustomNilaiKontrak:0;
}
public function getPaguBelumBerjalanAttribute(){
$pagu = 0;
if ($this->RealisasiRincianKegiatan) {
// if ($this->RealisasiRincianKegiatan->realisasiFisik->count() > 0 && $this->RealisasiRincianKegiatan->realisasiKeuangan->count() > 0) {
// if ($this->RealisasiRincianKegiatan->nilai_kontrak == 0) {
// if ($this->RealisasiRincianKegiatan->realisasiFisik->sum('realisasi') == null && $this->RealisasiRincianKegiatan->realisasiKeuangan->sum('realisasi') == null) {
if ($this->RealisasiRincianKegiatan->nilai_kontrak == 0) {
$pagu = $this->pagu;
}else{
$pagu = 0;
}
}else{
$pagu = 0;
}
return $pagu;
}
public function getTkdnAkumulasiAttribute(){
return (($this->pagu * $this->RealisasiRincianKegiatan->tkdn));
}
// booted function
protected static function booted()
{
static::created(function ($RincianKegiatan) {
// Check if 'pagu' attribute has changed
if ($RincianKegiatan->isDirty('pagu') or
$RincianKegiatan->isDirty('pagu_murni') or
$RincianKegiatan->isDirty('pagu_pergeseran') or
$RincianKegiatan->isDirty('pagu_perubahan') or
$RincianKegiatan->isDirty('pagu_perubahan_pergeseran') or
$RincianKegiatan->isDirty('volume') or
$RincianKegiatan->isDirty('volume_murni') or
$RincianKegiatan->isDirty('volume_pergeseran') or
$RincianKegiatan->isDirty('volume_perubahan') or
$RincianKegiatan->isDirty('volume_perubahan_pergeseran') or
$RincianKegiatan->isDirty('satuan') or
$RincianKegiatan->isDirty('satuan_murni') or
$RincianKegiatan->isDirty('satuan_pergeseran') or
$RincianKegiatan->isDirty('satuan_perubahan') or
$RincianKegiatan->isDirty('satuan_perubahan_pergeseran')) {
DB::beginTransaction();
try {
if (!is_null($RincianKegiatan->pagu_perubahan_pergeseran)) {
$RincianKegiatan->pagu = $RincianKegiatan->pagu_perubahan_pergeseran;
$RincianKegiatan->volume = $RincianKegiatan->volume_perubahan_pergeseran;
$RincianKegiatan->satuan = $RincianKegiatan->satuan_perubahan_pergeseran;
} elseif (!is_null($RincianKegiatan->pagu_perubahan)) {
$RincianKegiatan->pagu = $RincianKegiatan->pagu_perubahan;
$RincianKegiatan->volume = $RincianKegiatan->volume_perubahan;
$RincianKegiatan->satuan = $RincianKegiatan->satuan_perubahan;
} elseif (!is_null($RincianKegiatan->pagu_pergeseran)) {
$RincianKegiatan->pagu = $RincianKegiatan->pagu_pergeseran;
$RincianKegiatan->satuan = $RincianKegiatan->satuan_pergeseran;
$RincianKegiatan->volume = $RincianKegiatan->volume_pergeseran;
} elseif (!is_null($RincianKegiatan->pagu_murni)) {
// This condition is not necessary as it's always true
$RincianKegiatan->pagu = $RincianKegiatan->pagu_murni;
$RincianKegiatan->volume = $RincianKegiatan->volume_murni;
$RincianKegiatan->satuan = $RincianKegiatan->satuan_murni;
}
$RincianKegiatan->saveQuietly();
DB::commit();
} catch (\Exception $ex) {
DB::rollback();
return response()->json(['error' => $ex->getMessage()], 500);
}
}
});
static::updated(function ($RincianKegiatan) {
// Check if 'pagu' attribute has changed
// dd($RincianKegiatan->isDirty('volume_murni'));
if ($RincianKegiatan->isDirty('pagu') or
$RincianKegiatan->isDirty('pagu_murni') or
$RincianKegiatan->isDirty('pagu_pergeseran') or
$RincianKegiatan->isDirty('pagu_perubahan') or
$RincianKegiatan->isDirty('pagu_perubahan_pergeseran') or
$RincianKegiatan->isDirty('volume') or
$RincianKegiatan->isDirty('volume_murni') or
$RincianKegiatan->isDirty('volume_pergeseran') or
$RincianKegiatan->isDirty('volume_perubahan') or
$RincianKegiatan->isDirty('volume_perubahan_pergeseran') or
$RincianKegiatan->isDirty('satuan') or
$RincianKegiatan->isDirty('satuan_murni') or
$RincianKegiatan->isDirty('satuan_pergeseran') or
$RincianKegiatan->isDirty('satuan_perubahan') or
$RincianKegiatan->isDirty('satuan_perubahan_pergeseran')) {
DB::beginTransaction();
try {
if (!is_null($RincianKegiatan->pagu_perubahan_pergeseran)) {
$RincianKegiatan->pagu = $RincianKegiatan->pagu_perubahan_pergeseran;
$RincianKegiatan->volume = $RincianKegiatan->volume_perubahan_pergeseran;
$RincianKegiatan->satuan = $RincianKegiatan->satuan_perubahan_pergeseran;
} elseif (!is_null($RincianKegiatan->pagu_perubahan)) {
$RincianKegiatan->pagu = $RincianKegiatan->pagu_perubahan;
$RincianKegiatan->volume = $RincianKegiatan->volume_perubahan;
$RincianKegiatan->satuan = $RincianKegiatan->satuan_perubahan;
} elseif (!is_null($RincianKegiatan->pagu_pergeseran)) {
$RincianKegiatan->pagu = $RincianKegiatan->pagu_pergeseran;
$RincianKegiatan->satuan = $RincianKegiatan->satuan_pergeseran;
$RincianKegiatan->volume = $RincianKegiatan->volume_pergeseran;
} elseif (!is_null($RincianKegiatan->pagu_murni)) {
// This condition is not necessary as it's always true
$RincianKegiatan->pagu = $RincianKegiatan->pagu_murni;
$RincianKegiatan->volume = $RincianKegiatan->volume_murni;
$RincianKegiatan->satuan = $RincianKegiatan->satuan_murni;
}
$RincianKegiatan->saveQuietly();
DB::commit();
} catch (\Exception $ex) {
DB::rollback();
return response()->json(['error' => $ex->getMessage()], 500);
}
}
});
// booted function ketika delete rincian kegiatan maka realisasirinciankegiatan, realisasi fisik, realisasikeuangan akan terhapus juga
static::deleting(function ($RincianKegiatan) {
DB::beginTransaction();
try {
// cek jika merupakan force delete
if ($RincianKegiatan->isForceDeleting()) {
$RincianKegiatan->RealisasiRincianKegiatan()->onlyTrashed()->each(function ($realisasiRincianKegiatan) {
// cek jika realisasi fisik tidak null
if ($realisasiRincianKegiatan->realisasiFisik()->onlyTrashed()) {
$realisasiRincianKegiatan->realisasiFisik()->onlyTrashed()->forceDelete();
}
// cek jika realisasi keuangan tidak null
if ($realisasiRincianKegiatan->realisasiKeuangan()->onlyTrashed()) {
$realisasiRincianKegiatan->realisasiKeuangan()->onlyTrashed()->forceDelete();
}
// cek jika permasalahan dan tindak lanjut tidak null
if ($realisasiRincianKegiatan->permasalahanTindakLanjut()->onlyTrashed()) {
$realisasiRincianKegiatan->permasalahanTindakLanjut()->onlyTrashed()->forceDelete();
}
$file = FileDokumentasi::where('realisasi_rincian_kegiatan_id', $realisasiRincianKegiatan->id)->first();
if ($file) {
$path = public_path('/assets/document/');
File::delete($path . $file->file_name);
$file->forceDelete();
}
$realisasiRincianKegiatan->forceDelete();
// $RincianKegiatan->RealisasiRincianKegiatan()->onlyTrashed()->forceDelete();
});
} else {
// cek jika realisasi rincian kegiatan tidak null
if ($RincianKegiatan->RealisasiRincianKegiatan) {
// cek jika realisasi fisik tidak null
if ($RincianKegiatan->RealisasiRincianKegiatan->realisasiFisik()) {
$RincianKegiatan->RealisasiRincianKegiatan->realisasiFisik()->delete();
}
// cek jika realisasi keuangan tidak null
if ($RincianKegiatan->RealisasiRincianKegiatan->realisasiKeuangan()) {
$RincianKegiatan->RealisasiRincianKegiatan->realisasiKeuangan()->delete();
}
// cek jika realisasi permasalahan dan tidak lanjut tidak null
if ($RincianKegiatan->RealisasiRincianKegiatan->permasalahanTindakLanjut()) {
$RincianKegiatan->RealisasiRincianKegiatan->permasalahanTindakLanjut()->delete();
}
$RincianKegiatan->RealisasiRincianKegiatan()->delete();
}
}
DB::commit();
} catch (\Illuminate\Database\QueryException $ex) {
dd($ex->getMessage(), $ex->errorInfo);
DB::rollback();
return response()->json(['error' => $ex->getMessage()], 500);
}
});
static::restored(function ($RincianKegiatan) {
DB::beginTransaction();
try {
$RincianKegiatan->RealisasiRincianKegiatan()->onlyTrashed()->restore();
$RincianKegiatan->RealisasiRincianKegiatan()->each(function ($realisasiRincianKegiatan) {
// $realisasiRincianKegiatan->restore();
if ($realisasiRincianKegiatan->realisasiFisik) {
$realisasiRincianKegiatan->realisasiFisik()->onlyTrashed()->restore();
}
if ($realisasiRincianKegiatan->realisasiKeuangan) {
$realisasiRincianKegiatan->realisasiKeuangan()->onlyTrashed()->restore();
}
if ($realisasiRincianKegiatan->permasalahanTindakLanjut) {
$realisasiRincianKegiatan->permasalahanTindakLanjut()->onlyTrashed()->restore();
}
});
DB::commit();
} catch (\Exception $ex) {
DB::rollback();
return response()->json(['error' => $ex->getMessage()], 500);
}
});
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]