Merge branch 'staging' into feature/senior-officer

This commit is contained in:
majid
2024-11-19 11:00:58 +07:00
20 changed files with 664 additions and 233 deletions

View File

@@ -1,119 +1,150 @@
<?php
use Carbon\Carbon;
use Modules\Lpj\Models\PenawaranDetailTender;
use Modules\Lpj\Models\PenawaranTender;
function formatTanggalIndonesia($date)
{
$carbonDate = Carbon::parse($date);
$indonesianMonths = [
'Januari',
'Februari',
'Maret',
'April',
'Mei',
'Juni',
'Juli',
'Agustus',
'September',
'Oktober',
'November',
'Desember',
];
$month = $indonesianMonths[$carbonDate->month - 1];
return $carbonDate->format('d') . ' ' . $month . ' ' . $carbonDate->format('Y');
}
use Carbon\Carbon;
use Modules\Lpj\Models\HolidayCalendar;
use Modules\Lpj\Models\PenawaranDetailTender;
use Modules\Lpj\Models\PenawaranTender;
function formatRupiah($number)
{
$number = (float) $number;
return 'Rp ' . number_format($number, 2, ',', '.');
}
function formatTanggalIndonesia($date)
{
$carbonDate = Carbon::parse($date);
$indonesianMonths = [
'Januari',
'Februari',
'Maret',
'April',
'Mei',
'Juni',
'Juli',
'Agustus',
'September',
'Oktober',
'November',
'Desember',
];
$month = $indonesianMonths[$carbonDate->month - 1];
return $carbonDate->format('d') . ' ' . $month . ' ' . $carbonDate->format('Y');
}
function formatTanggalIndonesia2($date)
{
Carbon::setLocale('id');
$waktu = Carbon::parse($date);
return $waktu->translatedFormat('d F Y') . ' pukul ' . $waktu->format('H.i') . ' WIB';
}
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 ?? '');
}
function formatRupiah($number)
{
$number = (float)$number;
return 'Rp ' . number_format($number, 2, ',', '.');
}
// 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());
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());
$allow = true;
if ($todays_date >= $start_date && $todays_date <= $end_date) {
//Penawaran dibuka
$allow = true;
} else {
if ($todays_date < $start_date) {
//Penawaran Belum dibuka
if ($todays_date >= $start_date && $todays_date <= $end_date) {
//Penawaran dibuka
$allow = true;
} else {
//Penawaran sudah ditutup
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;
}
return $allow;
}
// convert
function convertSlug($slug)
{
$words = explode('-', $slug);
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');
foreach ($words as $index => $word) {
$words[$index] = strtoupper($word);
}
// 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 implode(' ', $words);
}
return $allow;
}
// andy add
// convert
function convertSlug($slug) {
$words = explode('-', $slug);
function hitungHariKerja($tanggalMulai, $tanggalSelesai)
{
$tanggalMulai = Carbon::parse($tanggalMulai)->startOfDay();
$tanggalSelesai = Carbon::parse($tanggalSelesai)->endOfDay();
foreach ($words as $index => $word) {
$words[$index] = strtoupper($word);
$hariKerja = 0;
$tanggalSekarang = $tanggalMulai->copy();
// Ambil semua tanggal libur dari tabel holiday calendar
$tanggalLibur = HolidayCalendar::whereBetween('date', [$tanggalMulai, $tanggalSelesai])->pluck('date')->map(
function ($item) {
return Carbon::parse($item)->format('Y-m-d');
},
)->toArray();
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'), $tanggalLibur)) {
$hariKerja++;
}
$tanggalSekarang->addDay();
}
return $hariKerja;
}
return implode(' ', $words);
}
// andy add

View File

@@ -3,13 +3,20 @@
namespace Modules\Lpj\Http\Controllers;
use Exception;
use Barryvdh\DomPDF\PDF;
use Illuminate\Http\Request;
use Modules\Lpj\Models\KJPP;
use Modules\Location\Models\City;
use Illuminate\Support\Facades\DB;
use Modules\Lpj\Models\Permohonan;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Location\Models\Village;
use Modules\Lpj\Models\JenisLaporan;
use Modules\Location\Models\District;
use Modules\Location\Models\Province;
use Illuminate\Support\Facades\Storage;
use Modules\Lpj\Models\PenawaranTender;
use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Models\TujuanPenilaianKJPP;
@@ -66,12 +73,14 @@ class TenderController extends Controller
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
// Add created_by/updated_by from the authenticated user
$userId = auth()->user()->id;
$userId = Auth::user()->id;
$validated['nomor_registrasi'] = $permohonan->nomor_registrasi;
$validated['status'] = $request->input('status') ?? 'tender';
$validated['updated_by'] = $userId; // Updating the record
$validated['end_date'] = $request->input('end_date') . ' 17:00:00';
// dd($validated['end_date']);
$permohonan->update($validated);
// Adding created_by for the new PenawaranTender record
@@ -117,6 +126,15 @@ class TenderController extends Controller
$penawaranExists = PenawaranTender::where('nomor_registrasi', $noreg)->exists();
$penawaran1 = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
if (!$penawaran1) {
return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with('error', 'Penawaran dengan nomor registrasi ini belum dibuat. Silahkan isi terlebih dahulu!');
}
if ($penawaran1->status != 'tender') {
return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!');
}
// dd($penawaran1->id);
if ($penawaran1) {
$penawaran = $penawaran1;
@@ -141,8 +159,18 @@ class TenderController extends Controller
{
// Find the specific penawaran by its ID
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
if (!$penawaran) {
return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with('error', 'Penawaran dengan nomor registrasi ini belum dibuat. Silahkan isi terlebih dahulu!');
}
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
if ($penawaran->status != 'tender') {
return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!');
}
$status = StatusPermohonan::all();
$tujuan_penilaian_kjpp = TujuanPenilaianKJPP::all();
$jenis_laporan = JenisLaporan::all();
@@ -152,6 +180,8 @@ class TenderController extends Controller
$kjpp = KJPP::all();
// dd($penawaran);
return view('lpj::penawaran.edit', compact('status', 'tujuan_penilaian_kjpp', 'jenis_laporan', 'kjpp', 'penawaran', 'noreg', 'kjpps', 'permohonan'));
}
@@ -171,13 +201,15 @@ class TenderController extends Controller
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
// Ambil ID user yang sedang login
$userId = auth()->user()->id;
$userId = Auth::user()->id;
// Jangan ubah created_by untuk data yang sudah ada
$validated['nomor_registrasi'] = $penawaran->nomor_registrasi;
$validated['status'] = $request->input('status') ?? 'tender';
$validated['created_by'] = $userId;
$validated['updated_by'] = $userId; // Hanya update 'updated_by'
$validated['end_date'] = $request->input('end_date') . ' 17:00:00';
// dd($validated['end_date']);
// Update data penawaran dan permohonan
$penawaran->update($validated);
@@ -228,7 +260,7 @@ class TenderController extends Controller
DB::commit();
return redirect()
->route('tender.penawaran.index')
->route('tender.penawaran.ulang.index')
->with('success', 'Data Penawaran updated successfully');
} catch (Exception $e) {
// Rollback jika ada kesalahan
@@ -247,19 +279,46 @@ class TenderController extends Controller
public function showSuratTender($noreg)
{
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
// Kalau tidak ketemu nomor registrasi dengan tabel penawaran
if (!$penawaran) {
return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])
->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!');
}
if ($penawaran->status != 'tender') {
return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!');
}
// Kalau tidak ada dokumen jaminan maka di arahkan ke halaman dokumen jaminan
if ($permohonan->debiture->documents->isEmpty()) {
return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])
->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!');
}
foreach ($permohonan->debiture->documents as $document) {
$village_permohonan = $document->village_code;
$district_permohonan = $document->district_code;
$city_permohonan = $document->city_code;
$province_permohonan = $document->province_code;
}
$villages = Village::where('code', $village_permohonan)->get();
$districts = District::where('code', $district_permohonan)->get();
$cities = City::where('code', $city_permohonan)->get();
$provinces = Province::where('code', $province_permohonan)->get();
date_default_timezone_set('Asia/Jakarta');
$now = date('Y-m-d H:i:s');
// Jika batas tanggal penawaran sudah lewat
if ($penawaran->end_date < date('Y-m-d')) {
if ($penawaran->end_date < $now) {
return redirect()->route('tender.penawaran.editPenawaran', ['noreg' => $noreg])
->with('error', 'Sudah Kadaluarsa. Silahkan perpanjang tanggal penawaran terlebih dahulu!');
}
return view('lpj::penawaran.surat_tender', compact('penawaran', 'noreg'));
return view('lpj::penawaran.surat_tender', compact('penawaran', 'noreg', 'permohonan', 'villages', 'districts', 'cities', 'provinces'));
}
public function datatablesPenawaran(Request $request)
@@ -414,4 +473,31 @@ class TenderController extends Controller
// Kembalikan hasil pengecekan sebagai JSON
return response()->json(['exists' => $exists]);
}
public function downloadSuratTender($noreg)
{
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
if ($penawaran->status != 'tender') {
return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!');
}
foreach ($permohonan->debiture->documents as $document) {
$village_permohonan = $document->village_code;
$district_permohonan = $document->district_code;
$city_permohonan = $document->city_code;
$province_permohonan = $document->province_code;
}
$villages = Village::where('code', $village_permohonan)->get();
$districts = District::where('code', $district_permohonan)->get();
$cities = City::where('code', $city_permohonan)->get();
$provinces = Province::where('code', $province_permohonan)->get();
$pdf = app('dompdf.wrapper'); // create an instance of the PDF class
$pdf->loadView('lpj::penawaran.surat_tender_download', compact('penawaran', 'permohonan', 'villages', 'districts', 'cities', 'provinces'));
return $pdf->download('surat_tender' . time() . '.pdf');
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace Modules\Lpj\Models;
use Modules\Basicdata\Models\HolidayCalendar as BasicdataHolidayCalendar;
class HolidayCalendar extends BasicdataHolidayCalendar
{
}

View File

@@ -22,4 +22,9 @@ class PenawaranDetailTender extends Model
{
return $this->belongsTo(PenawaranTender::class, 'penawaran_id', 'id');
}
public function kjpp(): BelongsTo
{
return $this->belongsTo(KJPP::class, 'kjpp_rekanan_id', 'id');
}
}

View File

@@ -34,7 +34,7 @@ class PenawaranTender extends Model
// menambahkan relasi tujuan penilaian KJPP
public function tujuanPenilaianKjpp()
{
return $this->belongsTo(TujuanPenilaianKJPP::class, 'tujuan_penilaian_kjpp_id','id');
return $this->belongsTo(TujuanPenilaianKJPP::class, 'tujuan_penilaian_kjpp_id', 'id');
}
public function permohonan()
@@ -46,6 +46,4 @@ class PenawaranTender extends Model
{
return $this->belongsTo(JenisLaporan::class, 'jenis_laporan_id', 'id');
}
}

View File

@@ -2,6 +2,7 @@
namespace Modules\Lpj\Models;
use Illuminate\Support\Facades\Storage;
use Modules\Lpj\Database\Factories\PermohonanFactory;
use Modules\Lpj\Services\PermohonanHistoryService;
use Modules\Usermanagement\Models\User;
@@ -39,7 +40,6 @@ class Permohonan extends Base
'registrasi_at',
'jenis_penilaian_id',
'region_id',
'attachment'
];
protected static function boot()
@@ -70,12 +70,7 @@ class Permohonan extends Base
$fileName = time() . '_' . $file->getClientOriginalName();
$filePath = $file->storeAs('permohonan_attachments', $fileName, 'public');
// Delete old file if it exists
if ($permohonan->attachment) {
Storage::disk('public')->delete($permohonan->attachment);
}
$permohonan->attachment = $filePath;
$permohonan->dokumen = $filePath;
}
}
@@ -87,7 +82,7 @@ class Permohonan extends Base
$keterangan = request()->input('keterangan'); // Get keterangan from request
$beforeRequest = $action === 'updated' ? $permohonan->getOriginal() : [];
$afterRequest = $permohonan->toArray();
$file = $permohonan->attachment ? Storage::disk('public')->path($permohonan->attachment) : null;
$file = $permohonan->dokumen ? Storage::disk('public')->path($permohonan->dokumen) : null;
$historyService->createHistory(
$permohonan,

View File

@@ -7,15 +7,8 @@ use Modules\Lpj\Models\PermohonanHistory;
class PermohonanHistoryService
{
public function createHistory(Permohonan $permohonan, string $status, ?string $keterangan, array $beforeRequest, array $afterRequest, ?string $file = null)
public function createHistory(Permohonan $permohonan, string $status, ?string $keterangan, array $beforeRequest, array $afterRequest, ?string $filePath = null)
{
$filePath = null;
if ($file) {
$filePath = $file->store('permohonan_history_files', 'public');
}
try {
$history = PermohonanHistory::create([
'permohonan_id' => $permohonan->id,

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('penawaran', function (Blueprint $table) {
$table->datetime('end_date')->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('penawaran', function (Blueprint $table) {
$table->date('end_date')->change();
});
}
};

View File

@@ -12,34 +12,34 @@ class LpjDatabaseSeeder extends Seeder
public function run(): void
{
$this->call([
BranchSeeder::class,
CurrencySeeder::class,
JenisFasilitasKreditSeeder::class,
JenisLegalitasJaminanSeeder::class,
JenisJaminanSeeder::class,
JenisDokumenSeeder::class,
TujuanPenilaianSeeder::class,
NilaiPlatformSeeder::class,
HubunganPemilikJaminanSeeder::class,
HubunganPenghuniJaminanSeeder::class,
ArahMataAnginSeeder::class,
StatusPermohonanSeeder::class,
RegionSeeder::class,
TeamsSeeder::class,
TeamUsersSeeder::class,
JenisPenilaianSeeder::class,
TujuanPenilaianKJPPSeeder::class,
IjinUsahaSeeder::class,
JenisLaporanSeeder::class,
DebitureSeeder::class,
PermohonanSeeder::class,
// BranchSeeder::class,
// CurrencySeeder::class,
// JenisFasilitasKreditSeeder::class,
// JenisLegalitasJaminanSeeder::class,
// JenisJaminanSeeder::class,
// JenisDokumenSeeder::class,
// TujuanPenilaianSeeder::class,
// NilaiPlatformSeeder::class,
// HubunganPemilikJaminanSeeder::class,
// HubunganPenghuniJaminanSeeder::class,
// ArahMataAnginSeeder::class,
// StatusPermohonanSeeder::class,
// RegionSeeder::class,
// TeamsSeeder::class,
// TeamUsersSeeder::class,
// JenisPenilaianSeeder::class,
// TujuanPenilaianKJPPSeeder::class,
// IjinUsahaSeeder::class,
// JenisLaporanSeeder::class,
// DebitureSeeder::class,
// PermohonanSeeder::class,
PemilikJaminanSeeder::class,
DokumenJaminanSeeder::class,
DetailDokumenJaminanSeeder::class,
KJPPSeeder::class,
PenawaranSeeder::class,
DetailPenawaranSeeder::class,
PenilaianSeeder::class,
// DokumenJaminanSeeder::class,
// DetailDokumenJaminanSeeder::class,
// KJPPSeeder::class,
// PenawaranSeeder::class,
// DetailPenawaranSeeder::class,
// PenilaianSeeder::class,
]);
}
}

View File

@@ -69,7 +69,7 @@
"classes": "",
"attributes": [],
"permission": "",
"roles": ["administrator", "admin"],
"roles": ["administrator", "admin","EO Appraisal","DD Appraisal"],
"sub": [
{
"title": "Otorisasi Penawaran",
@@ -77,7 +77,7 @@
"classes": "",
"attributes": [],
"permission": "",
"roles": ["administrator", "admin"]
"roles": ["administrator", "admin","EO Appraisal","DD Appraisal"]
}
]
},

View File

@@ -15,8 +15,6 @@
Tambah Data Penawaran
</h3>
<div class="flex items-center gap-2">
<a href="{{ route('tender.penawaran.show', $noreg) }}" class="btn btn-xs btn-primary"
title="Detail"><i class="ki-outline ki-abstract-26"></i> Detail</a>
<a href="{{ route('tender.penawaran.index') }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i>
Back</a>

View File

@@ -19,7 +19,7 @@
<a href="{{ route('tender.penawaran.show', $noreg) }}" class="btn btn-xs btn-primary" title="Detail">
<i class="ki-outline ki-abstract-26"></i> Detail
</a>
<a href="{{ route('tender.penawaran.index') }}" class="btn btn-xs btn-info">
<a href="{{ route('tender.penawaran.ulang.index') }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back
</a>
</div>
@@ -39,8 +39,13 @@
Nama KJPP Sebelumnya
</label>
<div class="flex flex-wrap items-baseline w-full">
@php
$nama_kjpp = $penawaran->nama_kjpp_sebelumnya;
$nama = explode(' - ', $nama_kjpp)[1] ?? '';
@endphp
<input class="flex w-full text-gray-600 font-medium text-sm input-custom" type="text"
name="nama_kjpp_sebelumnya" readonly value="{{ $penawaran->nama_kjpp_sebelumnya ?? '' }}">
name="nama_kjpp_sebelumnya" readonly value="{{ $nama !== null ? $nama : '' }}">
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
@@ -49,7 +54,8 @@
</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="flex w-full text-gray-600 font-medium text-sm input-custom" type="text"
name="biaya_kjpp_sebelumnya" readonly value="{{ $penawaran->biaya_kjpp_sebelumnya ?? '' }}">
name="biaya_kjpp_sebelumnya" readonly
value="{{ $penawaran->biaya_kjpp_sebelumnya !== null ? formatRupiah($penawaran->biaya_kjpp_sebelumnya) : '' }}">
</div>
<label class="form-label max-w-56">
Tanggal Penilaian Sebelumnya
@@ -57,7 +63,7 @@
<div class="flex flex-wrap items-baseline w-full">
<input class="flex w-full text-gray-600 font-medium text-sm input-custom" type="text"
name="tanggal_penilaian_sebelumnya" readonly
value="{{ $penawaran->tanggal_penilaian_sebelumnya ?? '' }}">
value="{{ $penawaran->tanggal_penilaian_sebelumnya !== null ? formatTanggalIndonesia($penawaran->tanggal_penilaian_sebelumnya) : '' }}">
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
@@ -132,8 +138,8 @@
</div>
-
<div class="flex flex-wrap items-baseline w-full">
<input class="input @error('end_date') border-danger @enderror" type="date" name="end_date"
value="{{ old('end_date', $penawaran->end_date) }}">
<input class="input @error('end_date') border-danger @enderror" type="date" name="end_date"
value="{{ old('end_date', $penawaran->end_date ? date('Y-m-d', strtotime($penawaran->end_date)) : '') }}">
@error('end_date')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror

View File

@@ -134,9 +134,6 @@
} else {
// Jika tidak ada, tampilkan tombol "Tambah Penawaran"
actionDiv.innerHTML = `
<a class="btn btn-sm btn-icon btn-clear btn-warning" title="Detail" href="/tender/penawaran/${nomor_registrasi}/show">
<i class="ki-outline ki-eye"></i>
</a>
<a href="/tender/penawaran/${nomor_registrasi}/create" class="btn btn-sm btn-icon btn-clear btn-primary" title="Penawaran">
<i class="ki-outline ki-notepad-edit"></i>
</a>

View File

@@ -20,8 +20,14 @@
<a href="{{ route('tender.penawaran.createPenawaran', $noreg) }}" class="btn btn-xs btn-primary"
title="Penawaran"><i class="ki-filled ki-arrow-circle-right"></i> Tambah Penawaran</a>
@endif
<a href="{{ route('tender.penawaran.index') }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> Back</a>
@if ($penawaranExists)
<a href="{{ route('tender.penawaran.ulang.index') }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> Back</a>
@endif
@if (!$penawaranExists)
<a href="{{ route('tender.penawaran.index') }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> Back</a>
@endif
</div>
</div>
<div class="card-body grid gap-5">

View File

@@ -12,43 +12,148 @@
Surat Tender
</h3>
<div class="flex items-center gap-2">
@if (isset($penawaran->nomor_registrasi))
<a href="{{ route('tender.penawaran.editPenawaran', $noreg) }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> Back</a>
@else
<a href="{{ route('tender.penawaran.createPenawaran', $noreg) }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> Back</a>
@endif
<a href="{{ route('tender.penawaran.downloadSuratTender', $noreg) }}" class="btn btn-xs btn-light">
<img src="{{ asset('img/pdf.png') }}" width="25" alt="pdf"></img>Download
</span>
@if (isset($penawaran->nomor_registrasi))
<a href="{{ route('tender.penawaran.editPenawaran', $noreg) }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> Back</a>
@else
<a href="{{ route('tender.penawaran.createPenawaran', $noreg) }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> Back</a>
@endif
</div>
</div>
<div class="card-body grid gap-5">
<p>Dear
<span class="font-bold">{{ ucwords(auth()->user()->name) ?? 'Tidak Ada' }}</span>
<span class="font-bold">
@php
$allPeople = [];
foreach ($penawaran->penawaranKjpp as $kjpp) {
if ($kjpp->kjpp->nama_pic_admin) {
$allPeople[] = ucwords($kjpp->kjpp->nama_pic_admin);
}
if ($kjpp->kjpp->detail_nama_pic_admin) {
try {
$decoded = json_decode($kjpp->kjpp->detail_nama_pic_admin);
if ($decoded) {
foreach ($decoded as $admin) {
if (isset($admin->nama_pic_admin)) {
$allPeople[] = ucwords($admin->nama_pic_admin);
}
}
}
} catch (\Exception $e) {
// Handle invalid JSON silently
}
}
}
$allPeople = array_filter($allPeople);
$totalPeople = count($allPeople);
@endphp
@if ($totalPeople > 0)
@foreach ($allPeople as $index => $person)
{{ $person }}{{ $index === $totalPeople - 2 ? ' dan ' : ($index < $totalPeople - 2 ? ' , ' : '') }}
@endforeach
@else
Tidak Ada
@endif
</span>
</p>
<p>Mohon untuk dibuatkan proposal jasa appraisal atas nama <span
class="font-bold">{{ ucwords($penawaran->permohonan->user->name) }}</span>, tujuan penilaian
class="font-bold">{{ ucwords($permohonan->debiture->name) }}</span>, tujuan penilaian
untuk <span class="font-bold">
@foreach ($penawaran->tujuanPenilaianKJPP as $tujuanPenilaianKJPP)
{{ $tujuanPenilaianKJPP->name }}
@endforeach
{{ $penawaran->tujuanPenilaianKJPP->name }}
</span>, laporan dalam bentuk <span class="font-bold">{{ $penawaran->jenisLaporan->name }}</span>,
dengan data-data sebagai berikut :</p>
<ul>
<li>Aset Jaminan: <span class="font-bold">[otomasi dari tabel permohonan]</span></li>
<li>Lokasi Jaminan: <span class="font-bold">[otomasi dari tabel permohonan]</span></li>
<li>LT / LB: <span class="font-bold">[otomasi dari tabel permohonan]</span></li>
<li>Aset Jaminan:
<span class="font-bold">
@foreach ($permohonan->debiture->documents as $document)
{{ $document->jenisJaminan->name }}
@endforeach
</span>
</li>
<li>Lokasi Jaminan:
<span class="font-bold">
@foreach ($permohonan->debiture->documents as $document)
{{ $document->address }}
@if (isset($document->jenisJaminan))
, Kel.
@foreach ($villages as $village)
{{ $village->name }}
@endforeach
, Kec.
@foreach ($districts as $district)
{{ $district->name }}
@endforeach
,
@foreach ($cities as $city)
{{ ucwords(strtolower($city->name)) }}
@endforeach
,
@foreach ($provinces as $province)
{{ $province->name }}
@endforeach
@endif
@endforeach
</span>
</li>
<li>Luas Tanah / Luas Bangunan:
<span class="font-bold">
@php
$luas_tanah = null;
$luas_bangunan = null;
@endphp
@foreach ($permohonan->debiture->documents as $document)
@foreach ($document->detail as $detail)
@php
$details = json_decode($detail->details);
@endphp
@if (is_object($details))
@if (isset($details->luas_tanah) && is_numeric($details->luas_tanah))
@php $luas_tanah = $details->luas_tanah; @endphp
@endif
@if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan))
@php $luas_bangunan = $details->luas_bangunan; @endphp
@endif
@endif
@endforeach
@endforeach
@if ($luas_tanah !== null && $luas_bangunan !== null)
{{ $luas_tanah }} m<sup>2</sup> / {{ $luas_bangunan }} m<sup>2</sup>
@elseif ($luas_tanah !== null)
{{ $luas_tanah }} m<sup>2</sup>
@elseif ($luas_bangunan !== null)
{{ $luas_bangunan }} m<sup>2</sup>
@endif
</span>
</li>
</ul>
<p>Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.</p>
<p>Mohon proposal dapat saya terima segera, sebelum
<span class="font-bold">{{ formatTanggalIndonesia($penawaran->end_date) }} pukul 17.00 WIB</span>
<span class="font-bold">{{ formatTanggalIndonesia2($penawaran->end_date) }}</span>
</p>
<p>Best Regards,
<span class="font-bold">[otomasi dari nama dan tanda tangan user penginput]</span>
Sub Direktorat Appraisal
<div class="font-bold">
<img src="{{ asset('storage/signatures/' . $permohonan->user->id . '/' . $permohonan->user->sign) }}"
alt="{{ $permohonan->user->name }}" width="200">
<p>
{{ $permohonan->user->name }}
</p>
</div>
Sub Direktorat Appraisal
</p>
<p>PT. Bank Artha Graha Internasional, Tbk.<br>
Gedung Bank Artha Graha, Lantai 3<br>
Jl. Kwiitang Raya No 24-26, Jakarta Pusat - 10420.<br>
Jl. Kwitang Raya No 24-26, Jakarta Pusat - 10420.<br>
Telp. 021 - 3903040 (H)</p>
</div>
</div>

View File

@@ -0,0 +1,178 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Surat Tender | {{ formatTanggalIndonesia(now()) }}</title>
<style>
body {
font-family: Calibri;
margin: 20px;
color: #333;
}
.container {
max-width: 800px;
margin: auto;
line-height: 1.6;
}
.content {
margin-top: 20px;
white-space: pre-line;
/* To handle line breaks in text */
}
.content-max {
margin-top: 20px;
max-width: 800px;
}
.flex-wrap {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.important {
font-weight: bold;
color: black;
}
.signature {
margin-top: 40px;
font-family: 'Brush Script MT', cursive;
font-size: 1.2em;
}
.footer {
margin-top: 20px;
font-size: 0.9em;
color: #555;
}
</style>
</head>
<body>
<div class="container">
Dear <span class="important">
@php
$allPeople = [];
foreach ($penawaran->penawaranKjpp as $kjpp) {
if ($kjpp->kjpp->nama_pic_admin) {
$allPeople[] = ucwords($kjpp->kjpp->nama_pic_admin);
}
if ($kjpp->kjpp->detail_nama_pic_admin) {
try {
$decoded = json_decode($kjpp->kjpp->detail_nama_pic_admin);
if ($decoded) {
foreach ($decoded as $admin) {
if (isset($admin->nama_pic_admin)) {
$allPeople[] = ucwords($admin->nama_pic_admin);
}
}
}
} catch (\Exception $e) {
// Handle invalid JSON silently
}
}
}
$allPeople = array_filter($allPeople);
$totalPeople = count($allPeople);
@endphp
@if ($totalPeople > 0)
@foreach ($allPeople as $index => $person)
{{ $person }}{{ $index === $totalPeople - 2 ? ' dan ' : ($index < $totalPeople - 2 ? ' , ' : '') }}
@endforeach
@else
Tidak Ada
@endif
</span>
<div class="content">
Mohon untuk dibuatkan proposal jasa appraisal atas nama <span
class="important">{{ $permohonan->debiture->name }}</span>, tujuan penilaian untuk <span
class="important">{{ $penawaran->tujuanPenilaianKJPP->name }}</span>, laporan dalam bentuk <span
class="important">{{ $penawaran->jenisLaporan->name }}</span>, dengan data-data sebagai berikut:
</div>
<div class="content-max">
Aset Jaminan: @foreach ($permohonan->debiture->documents as $document)
{{ $document->jenisJaminan->name }}
@endforeach
<span class="flex-wrap">Lokasi Jaminan: @foreach ($permohonan->debiture->documents as $document)
{{ $document->address }}, Kel. @foreach ($villages as $village)
{{ $village->name }}
@endforeach, Kec. @foreach ($districts as $district)
{{ $district->name }}
@endforeach,@foreach ($cities as $city)
{{ ucwords(strtolower($city->name)) }}
@endforeach,@foreach ($provinces as $province)
{{ $province->name }}
@endforeach
@endforeach
</span>
Luas Tanah / Luas Bangunan:
@php
$luas_tanah = null;
$luas_bangunan = null;
@endphp
@foreach ($permohonan->debiture->documents as $document)
@foreach ($document->detail as $detail)
@php
$details = json_decode($detail->details);
@endphp
@if (is_object($details))
@if (isset($details->luas_tanah) && is_numeric($details->luas_tanah))
@php $luas_tanah = $details->luas_tanah; @endphp
@endif
@if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan))
@php $luas_bangunan = $details->luas_bangunan; @endphp
@endif
@endif
@endforeach
@endforeach
@if ($luas_tanah !== null && $luas_bangunan !== null)
{{ $luas_tanah }} m<sup>2</sup> / {{ $luas_bangunan }} m<sup>2</sup>
@elseif ($luas_tanah !== null)
{{ $luas_tanah }} m<sup>2</sup>
@elseif ($luas_bangunan !== null)
{{ $luas_bangunan }} m<sup>2</sup>
@endif
</div>
<div class="content">
Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi. <br />
Mohon proposal dapat saya terima segera, sebelum <span
class="important">{{ formatTanggalIndonesia2($penawaran->end_date) }}</span>
</div>
<div class="signature">
Best Regards,<br />
<img src="{{ public_path('storage/signatures/' . $permohonan->user->id . '/' . $permohonan->user->sign) }}"
alt="{{ $permohonan->user->name }}" width="200">
<p>
{{ $permohonan->user->name }}
</p>
</div>
<div class="footer">
PT. Bank Artha Graha Internasional, Tbk.<br>
Gedung Bank Artha Graha, Lantai 3<br>
Jl. Kwitang Raya No 24-26, Jakarta Pusat - 10420.<br>
Telp. 021 - 3903040 (H)
</div>
</div>
</body>
</html>

View File

@@ -9,7 +9,7 @@
@include('lpj::component.detail-jaminan',['backLink' => 'authorization.index'])
<div class="card">
<form action="{{ route('authorization.update', $permohonan->id) }}" method="POST" id="authorizationForm">
<form action="{{ route('authorization.update', $permohonan->id) }}" method="POST" id="authorizationForm" enctype="multipart/form-data">
<input type="hidden" name="_method" value="PUT">
@csrf
<div class="card-body lg:py-7.5">
@@ -27,7 +27,7 @@
Upload File Revisi
</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="file" class="file-input" id="revisionFile" name="revisionFile">
<input type="file" class="file-input" id="revisionFile" name="attachment">
<em class="alert text-danger text-sm hidden" id="file-message"></em>
</div>
</div>
@@ -65,7 +65,7 @@
keteranganMessage.textContent = '';
}
if (!revisionFile.files.length) {
if (event.submitter === revisiBtn && !revisionFile.files.length) {
event.preventDefault();
fileMessage.textContent = 'File revisi harus diunggah.';
fileMessage.classList.remove('hidden');

View File

@@ -6,7 +6,7 @@
@section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
@include('lpj::component.detail-jaminan',['backLink' => 'prmohonan.index'])
@include('lpj::component.detail-jaminan', ['backLink' => 'permohonan.index'])
<div class="card">
<form action="{{ route('permohonan.print', $permohonan->id) }}" method="GET">

View File

@@ -1,17 +1,18 @@
<?php
use Illuminate\Support\Facades\Route;
use Modules\Lpj\Http\Controllers\SpkController;
use Modules\Lpj\Http\Controllers\RegistrasiController;
use Modules\Lpj\Http\Controllers\ProsesPenawaranController;
use Modules\Lpj\Http\Controllers\ProsesPenawaranUlangController;
use Modules\Lpj\Http\Controllers\OtorisasiPenawaranController;
use Modules\Lpj\Http\Controllers\SpkController;
use Modules\Lpj\Http\Controllers\RegistrasiFinalController;
use Modules\Lpj\Http\Controllers\OtorisasiPenawaranController;
use Modules\Lpj\Http\Controllers\ProsesPenawaranUlangController;
Route::middleware(['auth'])->group(function () {
// andy add
// Route::name('registrasi.')->prefix('registrasi')->group(function () {
Route::controller(RegistrasiController::class)->group(function(){
Route::controller(RegistrasiController::class)->group(function () {
// Route::get('/', [RegistrasiController::class, 'index'])->name('registrasi.index');
Route::get('/registrasi', 'index')->name('registrasi.index');
Route::get('/registrasi/datatables', 'dataForDatatables')->name('registrasi.datatables');
@@ -23,49 +24,45 @@ Route::middleware(['auth'])->group(function () {
Route::post('registrasi/setData', 'setData')->name('registrasi.setData');
Route::get('/registrasi/{registrasi}/edit', 'edit')->name('registrasi.edit');
Route::put('/registrasi/{registrasi}', 'update')->name('registrasi.update');
});
// andy add
Route::name('tender.')->prefix('tender')->group(function () {
// Proses Penawaran
Route::controller(ProsesPenawaranController::class)->group(function(){
// Proses Penawaran
Route::controller(ProsesPenawaranController::class)->group(function () {
Route::get('prosespenawaran', 'index')->name('prosespenawaran.index');
Route::get('prosespenawaran/datatables', 'dataForDatatables')->name('prosespenawaran.datatables');
Route::get('prosespenawaran/datatableskjppList_1', 'dataForDatatablesKJPPList_1')->name('prosespenawaran.datatableskjppList_1');
Route::get('/prosespenawaran/{prosespenawaran}', 'show')->name('prosespenawaran.show');
Route::get('prosespenawaran/{prosespenawaran}/edit', 'edit')->name('prosespenawaran.edit');
// show data
Route::get('/prosespenawaran/{prosespenawaran}', 'show')->name('prosespenawaran.show');
Route::post('prosespenawaran/setData', 'setData')->name('prosespenawaran.setData');
Route::post('prosespenawaran/setData', 'setData')->name('prosespenawaran.setData');
Route::get('prosespenawaran/{prosespenawaran}/edit', 'edit')->name('prosespenawaran.edit');
// update one
Route::put('/prosespenawaran/{prosespenawaran}', 'update')->name('prosespenawaran.update');
// update all
Route::put('/prosespenawaranAll/{prosespenawaranAll}', 'updateAll')->name('prosespenawaran.updateAll');
// update draft
Route::put('/prosespenawaranDraft/{prosespenawaranDraft}', 'updateDraft')->name('prosespenawaran.updateDraft');
// delete KJPP, status set = 0
Route::put('/prosespenawaranKJPPStatus/{prosespenawaranKJPPStatus}', 'updateKJPPStatus')->name('prosespenawaran.updateKJPPStatus');
// update one
Route::put('/prosespenawaran/{prosespenawaran}', 'update')->name('prosespenawaran.update');
// update all
Route::put('/prosespenawaranAll/{prosespenawaranAll}', 'updateAll')->name('prosespenawaran.updateAll');
// update draft
Route::put('/prosespenawaranDraft/{prosespenawaranDraft}', 'updateDraft')->name('prosespenawaran.updateDraft');
// delete KJPP, status set = 0
Route::put('/prosespenawaranKJPPStatus/{prosespenawaranKJPPStatus}', 'updateKJPPStatus')->name('prosespenawaran.updateKJPPStatus');
// add KJPP to detail_penawaran
Route::post('prosespenawaran/store', 'store')->name('prosespenawaran.store');
Route::post('prosespenawaran/storeUlang', 'storeUlang')->name('prosespenawaran.storeUlang');
// edit proses penawaran ulang
Route::get('prosespenawaran/{prosespenawaran}/editulang', 'editulang')->name('prosespenawaran.editulang');
Route::post('prosespenawaran/setDataUlang', 'setDataUlang')->name('prosespenawaran.setDataUlang');
Route::put('/prosespenawaran2/{prosespenawaran2}', 'updateulang')->name('prosespenawaran.updateulang');
Route::put('/prosespenawaranKJPPStatusUlang/{prosespenawaranKJPPStatusUlang}', 'updateKJPPStatusUlang')->name('prosespenawaran.updateKJPPStatusUlang');
// add KJPP to detail_penawaran
Route::post('prosespenawaran/store', 'store')->name('prosespenawaran.store');
Route::post('prosespenawaran/storeUlang', 'storeUlang')->name('prosespenawaran.storeUlang');
// edit proses penawaran ulang
Route::get('prosespenawaran/{prosespenawaran}/editulang', 'editulang')->name('prosespenawaran.editulang');
Route::post('prosespenawaran/setDataUlang', 'setDataUlang')->name('prosespenawaran.setDataUlang');
Route::put('/prosespenawaran2/{prosespenawaran2}', 'updateulang')->name('prosespenawaran.updateulang');
Route::put('/prosespenawaranKJPPStatusUlang/{prosespenawaranKJPPStatusUlang}', 'updateKJPPStatusUlang')->name('prosespenawaran.updateKJPPStatusUlang');
});
// Proses Penawaran Ulang
Route::controller(ProsesPenawaranUlangController::class)->group(function(){
Route::controller(ProsesPenawaranUlangController::class)->group(function () {
Route::get('prosespenawaranulang', 'index')->name('prosespenawaranulang.index');
Route::get('prosespenawaranulang/datatables', 'dataForDatatables')->name('prosespenawaranulang.datatables');
Route::get('prosespenawaranulang/{prosespenawaranulang}/edit', 'edit')->name('prosespenawaranulang.edit');
@@ -78,12 +75,11 @@ Route::middleware(['auth'])->group(function () {
Route::put('/prosespenawaranulang/{prosespenawaranulang}', 'update')->name('prosespenawaranulang.update');
// delete KJPP, status set = 0
Route::put('/prosespenawaranulangKJPPStatus/{prosespenawaranulangKJPPStatus}', 'updateKJPPStatus')->name('prosespenawaranulang.updateKJPPStatus');
});
});
Route::name('otorisasitender.')->prefix('otorisasitender')->group(function () {
Route::controller(OtorisasiPenawaranController::class)->group(function(){
Route::controller(OtorisasiPenawaranController::class)->group(function () {
Route::get('penawaran', 'index')->name('penawaran.index');
Route::get('penawaran/datatables', 'dataForDatatables')->name('penawaran.datatables');
Route::get('penawaran/{penawaran}/edit', 'edit')->name('penawaran.edit');
@@ -94,11 +90,10 @@ Route::middleware(['auth'])->group(function () {
// update KJPP data, detail penawaran
Route::put('/otorisasiPenawaranKJPP/{penawaran}', 'otorisasiPenawaranKJPP')->name('penawaran.otorisasiPenawaranKJPP');
});
});
Route::controller(SpkController::class)->group(function(){
Route::controller(SpkController::class)->group(function () {
Route::get('/spk/dokumennya', 'dokumennya')->name('spk.dokumennya');
Route::get('/spk', 'index')->name('spk.index');
@@ -110,7 +105,7 @@ Route::middleware(['auth'])->group(function () {
Route::get('spk/{spk}/download', 'download')->name('spk.download');
});
Route::controller(RegistrasiFinalController::class)->group(function(){
Route::controller(RegistrasiFinalController::class)->group(function () {
Route::get('/registrasifinal', 'index')->name('registrasifinal.index');
Route::get('/registrasifinal/datatables', 'dataForDatatables')->name('registrasifinal.datatables');
Route::get('/registrasifinal/{registrasifinal}', 'show')->name('registrasifinal.show');
@@ -121,4 +116,3 @@ Route::middleware(['auth'])->group(function () {
Route::put('/registrasifinal/{registrasifinal}', 'update')->name('registrasifinal.update');
});
});

View File

@@ -393,6 +393,7 @@ Route::middleware(['auth'])->group(function () {
Route::get('penawaran/{noreg}/suratTender', [TenderController::class, 'showSuratTender'])->name(
'penawaran.showSuratTender'
);
Route::get('penawaran/{noreg}/suratTender/downloadpdf', [TenderController::class, 'downloadSuratTender'])->name('penawaran.downloadSuratTender');
// Penawaran Ulang
Route::get('penawaran/ulang', [TenderController::class, 'penawaran_ulang_index'])->name(