translatedFormat('d F Y'); } return $waktu->translatedFormat('d F Y') . ' pukul ' . $waktu->format('H.i') . ' WIB'; } function formatRupiah($number) { $number = (float) $number; return 'Rp ' . number_format($number, 2, ',', '.'); } function formatAlamat($alamat) { return ($alamat->address ? $alamat->address . ', ' : '') . (isset($alamat->village) ? $alamat->village->name . ', ' : '') . (isset($alamat->city) ? $alamat->city->name . ', ' : '') . (isset($alamat->province) ? $alamat->province->name . ', ' : '') . ($alamat->postal_code ?? ''); } // andy add function checkActiveDateRangePenawaran($id) { $penawaran = PenawaranTender::find($id); $start_date = strtotime($penawaran->start_date); $end_date = strtotime($penawaran->end_date); // $todays_date = strtotime(now()); $todays_date = strtotime("+1 day", strtotime(now())); $allow = true; if ($todays_date >= $start_date && $todays_date <= $end_date) { //Penawaran dibuka $allow = true; } else { if ($todays_date < $start_date) { //Penawaran Belum dibuka $allow = true; } else { //Penawaran sudah ditutup $allow = false; } } return $allow; } function checkKelengkapanDetailKJPP($id) { $allow = true; // DB::enableQueryLog(); // detail_penawaran apakah isian biaya_penawaran, attachment, dokumen_persetujuan sudah lengkap? $query = PenawaranDetailTender::select('id')->where('penawaran_id', '=', $id)->where('status', '=', 1)->where( function ($query) { // no_proposal $query->orWhere('no_proposal', '', ""); $query->orWhereNull('no_proposal'); // tgl_proposal $query->orWhere('tgl_proposal', '', ""); $query->orWhereNull('tgl_proposal'); $query->orWhere('biaya_penawaran', '', ""); $query->orWhereNull('biaya_penawaran'); $query->orWhere('attachment', '', ""); $query->orWhereNull('attachment'); $query->orWhere('dokumen_persetujuan', '', ""); $query->orWhereNull('dokumen_persetujuan'); }, )->get(); // $sql = DB::getQueryLog(); if (sizeof($query) > 0) { $allow = false; } return $allow; } // convert function convertSlug($slug) { $words = explode('-', $slug); foreach ($words as $index => $word) { $words[$index] = strtoupper($word); } return implode(' ', $words); } // generate last penawaran.code function onLastnumberCodePenawaran(): string { // ambil code terakhir $maxCode = PenawaranTender::max('code'); // chek data penawaran terakhir --> mengurutkan data berdasarkan kolom `created_at` secara DESC // $penawaran = PenawaranTender::latest()->first(); $penawaran = PenawaranTender::where('code', '=', $maxCode)->first(); $code_penawaran_last = ''; // nomor di set 0001 $noUrutAkhirString = sprintf("%04s", 1); if ($penawaran) { $isNum = substr($maxCode, 2); // memastikan string ke 3 s/d 8 adalan numiric $isNP = substr($maxCode, 0, 2); if ((8 == strlen($maxCode)) && ("NP" == $isNP) && (isNumeric($isNum))) { $code_penawaran_last = substr($maxCode, -4); $year_penawaran_last = Carbon::parse($penawaran->created_at)->year; $year_now = Carbon::now()->year; if ($year_now == $year_penawaran_last) { $noUrutAkhirString = sprintf("%04s", abs($code_penawaran_last + 1)); } // jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 0001 } } return 'NP' . Carbon::now()->format('y') . $noUrutAkhirString; } function isNumeric($str) { return ctype_digit($str); } // generate last penawaran.no_spk function onLastnumberCodePenawaranSPK($jenis_laporan_code): string { // 20241124_001 ==> spk_no_core // XXX / PJ / JKT / MONTH-ROM / FR|SR / 2024 // 001 / PJ / JKT / XI / FR / 2024 $maxCode = PenawaranTender::max('spk_no_core'); $penawaran = PenawaranTender::where('spk_no_core', '=', $maxCode)->first(); $no_spk_penawaran_last = ''; $year_penawaran_last = ''; $year_now = Carbon::now()->year; // nomor di set 001 $noUrutAkhirString = sprintf("%03s", 1); if ($penawaran) { $no_spk_penawaran_last = substr($maxCode, -3); $year_penawaran_last = substr($maxCode, 0, 4); if ($year_now == $year_penawaran_last) { $noUrutAkhirString = sprintf("%03s", abs($no_spk_penawaran_last + 1)); } // jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 001 } $month = onRomawi(Carbon::now()->month); $lastSPK = $noUrutAkhirString.' / PJ / JKT / '. $month .' / ' .$jenis_laporan_code.' / '.$year_now; return $lastSPK; } function onRomawi(int $bln): string { switch ($bln) { case 1: return "I"; break; case 2: return "II"; break; case 3: return "III"; break; case 4: return "IV"; break; case 5: return "V"; break; case 6: return "VI"; break; case 7: return "VII"; break; case 8: return "VIII"; break; case 9: return "IX"; break; case 10: return "X"; break; case 11: return "XI"; break; case 12: return "XII"; break; } } function penyebut($nilai) { $nilai = abs($nilai); $huruf = array("", "satu", "dua", "tiga", "empat", "lima", "enam", "tujuh", "delapan", "sembilan", "sepuluh", "sebelas"); $temp = ""; if ($nilai < 12) { $temp = " ". $huruf[$nilai]; } elseif ($nilai < 20) { $temp = penyebut($nilai - 10). " belas"; } elseif ($nilai < 100) { $temp = penyebut($nilai / 10)." puluh". penyebut($nilai % 10); } elseif ($nilai < 200) { $temp = " seratus" . penyebut($nilai - 100); } elseif ($nilai < 1000) { $temp = penyebut($nilai / 100) . " ratus" . penyebut($nilai % 100); } elseif ($nilai < 2000) { $temp = " seribu" . penyebut($nilai - 1000); } elseif ($nilai < 1000000) { $temp = penyebut($nilai / 1000) . " ribu" . penyebut($nilai % 1000); } elseif ($nilai < 1000000000) { $temp = penyebut($nilai / 1000000) . " juta" . penyebut($nilai % 1000000); } elseif ($nilai < 1000000000000) { $temp = penyebut($nilai / 1000000000) . " milyar" . penyebut(fmod($nilai, 1000000000)); } elseif ($nilai < 1000000000000000) { $temp = penyebut($nilai / 1000000000000) . " trilyun" . penyebut(fmod($nilai, 1000000000000)); } return $temp; } function terbilang($nilai) { if ($nilai < 0) { $hasil = "minus ". trim(penyebut($nilai)); } else { $hasil = trim(penyebut($nilai)); } return $hasil; } // andy add function hitungHariKerja($tanggalMulai, $tanggalSelesai) { $tanggalMulai = Carbon::parse($tanggalMulai)->startOfDay(); $tanggalSelesai = Carbon::parse($tanggalSelesai)->endOfDay(); $hariKerja = 0; $tanggalSekarang = $tanggalMulai->copy(); while ($tanggalSekarang <= $tanggalSelesai) { // Cek apakah hari ini bukan Sabtu atau Minggu dan bukan hari libur if (!$tanggalSekarang->isWeekend() && !in_array($tanggalSekarang->format('Y-m-d'), holidays())) { $hariKerja++; } $tanggalSekarang->addDay(); } return $hariKerja; } function holidays() { return HolidayCalendar::pluck('date')->map( function ($item) { return Carbon::parse($item)->format('Y-m-d'); }, )->toArray(); } function countPermohonanForUser($userId) { $validStatuses = ['assign', 'proses-laporan', 'done']; $result = Penilaian::whereHas('userPenilai', function ($query) use ($userId) { $query->where('user_id', $userId); }) ->whereHas('permohonan', function ($query) use ($validStatuses) { $query->whereIn('status', $validStatuses); }) ->get() ->groupBy(function ($item) { // Pastikan mengakses properti dari model yang valid return $item->userPenilai->first()->user_id . '-' . $item->permohonan->id; }) ->map(function ($group) { return [ 'statuses' => $group->pluck('permohonan.status')->unique()->values()->all(), ]; }); return $result->count(); } function getMaxFileSize($jenis) { $jenisDokumen = JenisDokumen::where('name', $jenis)->first(); if (!$jenisDokumen) { return 2048; } //konversi ke KB (1 MB = 1024 KB) $maxSizeInKB = (int) $jenisDokumen->max_size * 1024; return $maxSizeInKB; } function getUser($userId) { return User::find($userId); } function generateLpjUniqueCode($randomLength = 6) { $year = date('y'); $month = str_pad(date('m'), 2, '0', STR_PAD_LEFT); $day = str_pad(date('d'), 2, '0', STR_PAD_LEFT); // Generate random numbers $randomNumber = str_pad(mt_rand(0, pow(10, $randomLength) - 1), $randomLength, '0', STR_PAD_LEFT); // Concatenate components to create the custom code return $year . $month . $day . $randomNumber; } function checkRegionUserName($userId) { $region = TeamsUsers::where('user_id', $userId)->first(); if ($region) { return $region->team->regions->name; } else { return null; } } function getNomorLaporan($permohonanId, $documentId){ $laporan = Laporan::where([ 'permohonan_id' => $permohonanId, 'dokumen_jaminan_id' => $documentId, ])->first(); return $laporan->nomor_laporan ?? null; } function getCustomField($param){ if(is_numeric($param)){ $field = CustomField::find($param); } else { $field = CustomField::where(['name' => $param])->first(); } if($field){ return $field; } else { return null; } }