Merge branch 'staging' into feature/senior-officer
This commit is contained in:
@@ -36,7 +36,8 @@ use Modules\Lpj\Models\HolidayCalendar;
|
||||
|
||||
$start_date = strtotime($penawaran->start_date);
|
||||
$end_date = strtotime($penawaran->end_date);
|
||||
$todays_date = strtotime(now());
|
||||
// $todays_date = strtotime(now());
|
||||
$todays_date = strtotime("+1 day", strtotime(now()));
|
||||
|
||||
$allow = true;
|
||||
if ($todays_date >= $start_date && $todays_date <= $end_date) {
|
||||
@@ -103,7 +104,8 @@ use Modules\Lpj\Models\HolidayCalendar;
|
||||
}
|
||||
|
||||
// generate last penawaran.code
|
||||
function onLastnumberCodePenawaran(): string
|
||||
function onLastnumberCodePenawaran()
|
||||
: string
|
||||
{
|
||||
// chek data penawaran terakhir --> mengurutkan data berdasarkan kolom `created_at` secara DESC
|
||||
$maxCode = PenawaranTender::max('code');
|
||||
@@ -111,19 +113,18 @@ use Modules\Lpj\Models\HolidayCalendar;
|
||||
$penawaran = PenawaranTender::where('code', '=', $maxCode)->first();
|
||||
$code_penawaran_last = '';
|
||||
$noUrutAkhirString = sprintf("%04s", 1);
|
||||
if($penawaran)
|
||||
{
|
||||
if ($penawaran) {
|
||||
$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)
|
||||
{
|
||||
if ($year_now == $year_penawaran_last) {
|
||||
$noUrutAkhirString = sprintf("%04s", abs($code_penawaran_last + 1));
|
||||
}
|
||||
}
|
||||
|
||||
return 'NP' . Carbon::now()->format('y') . $noUrutAkhirString;
|
||||
}
|
||||
|
||||
// andy add
|
||||
|
||||
|
||||
@@ -135,16 +136,9 @@ use Modules\Lpj\Models\HolidayCalendar;
|
||||
$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)) {
|
||||
if (!$tanggalSekarang->isWeekend() && !in_array($tanggalSekarang->format('Y-m-d'), holidays())) {
|
||||
$hariKerja++;
|
||||
}
|
||||
$tanggalSekarang->addDay();
|
||||
@@ -152,3 +146,12 @@ use Modules\Lpj\Models\HolidayCalendar;
|
||||
|
||||
return $hariKerja;
|
||||
}
|
||||
|
||||
function holidays()
|
||||
{
|
||||
return HolidayCalendar::pluck('date')->map(
|
||||
function ($item) {
|
||||
return Carbon::parse($item)->format('Y-m-d');
|
||||
},
|
||||
)->toArray();
|
||||
}
|
||||
|
||||
@@ -2,22 +2,21 @@
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Carbon\Carbon;
|
||||
use Exception;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Models\KJPP;
|
||||
use Modules\Lpj\Models\PenawaranDetailTender;
|
||||
use Modules\Lpj\Models\PenawaranDetailTenderLog;
|
||||
use Modules\Lpj\Models\PenawaranTender;
|
||||
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
|
||||
class OtorisasiPenawaranController extends Controller
|
||||
@@ -40,22 +39,30 @@ class OtorisasiPenawaranController extends Controller
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query =PenawaranTender::query()
|
||||
->select('penawaran.*',
|
||||
$query = PenawaranTender::query()->select(
|
||||
'penawaran.*',
|
||||
'debitures.name as debitures_name',
|
||||
'permohonan.tanggal_permohonan',
|
||||
'users.name as user_pemohon',
|
||||
'branches.name as branches_name',
|
||||
'tujuan_penilaian.name as tujuan_penilaian_name',
|
||||
'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name')
|
||||
->leftJoin('permohonan', 'permohonan.nomor_registrasi', '=', 'penawaran.nomor_registrasi')
|
||||
->leftJoin('debitures', 'debitures.id', '=', 'permohonan.debiture_id')
|
||||
->leftJoin('users', 'users.id', '=', 'permohonan.user_id')
|
||||
->leftJoin('branches', 'branches.id', '=', 'permohonan.branch_id')
|
||||
->leftJoin('tujuan_penilaian', 'tujuan_penilaian.id','=','permohonan.tujuan_penilaian_id')
|
||||
->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id','=','penawaran.tujuan_penilaian_kjpp_id')
|
||||
->where('penawaran.status','=','proposal-tender')
|
||||
->withCount('penawarandetails');
|
||||
'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name',
|
||||
)->leftJoin('permohonan', 'permohonan.nomor_registrasi', '=', 'penawaran.nomor_registrasi')->leftJoin(
|
||||
'debitures',
|
||||
'debitures.id',
|
||||
'=',
|
||||
'permohonan.debiture_id',
|
||||
)->leftJoin('users', 'users.id', '=', 'permohonan.user_id')->leftJoin(
|
||||
'branches',
|
||||
'branches.id',
|
||||
'=',
|
||||
'permohonan.branch_id',
|
||||
)->leftJoin('tujuan_penilaian', 'tujuan_penilaian.id', '=', 'permohonan.tujuan_penilaian_id')->leftJoin(
|
||||
'tujuan_penilaian_kjpp',
|
||||
'tujuan_penilaian_kjpp.id',
|
||||
'=',
|
||||
'penawaran.tujuan_penilaian_kjpp_id',
|
||||
)->where('penawaran.status', '=', 'proposal-tender')->withCount('penawarandetails');
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
@@ -97,7 +104,6 @@ class OtorisasiPenawaranController extends Controller
|
||||
// format date
|
||||
$i = 0;
|
||||
foreach ($data as $obj) {
|
||||
|
||||
// tanggal_permohonan
|
||||
if ($obj->tanggal_permohonan) {
|
||||
$data[$i]->tanggal_permohonan = Carbon::parse($obj->tanggal_permohonan)->format('d M Y');
|
||||
@@ -105,10 +111,10 @@ class OtorisasiPenawaranController extends Controller
|
||||
|
||||
// date_range
|
||||
$data[$i]->date_range = "-";
|
||||
if ($obj->start_date && $obj->end_date)
|
||||
{
|
||||
$data[$i]->date_range = Carbon::parse($obj->start_date)->format('d M Y') . ' - ' .
|
||||
Carbon::parse($obj->end_date)->format('d M Y');
|
||||
if ($obj->start_date && $obj->end_date) {
|
||||
$data[$i]->date_range = Carbon::parse($obj->start_date)->format('d M Y') . ' - ' . Carbon::parse(
|
||||
$obj->end_date,
|
||||
)->format('d M Y');
|
||||
}
|
||||
|
||||
$i++;
|
||||
@@ -129,21 +135,22 @@ class OtorisasiPenawaranController extends Controller
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
// id ==> penawaran.id
|
||||
return view('lpj::otorisasipenawaran.edit', compact('id'));
|
||||
}
|
||||
|
||||
public function setData(Request $request): JsonResponse
|
||||
{
|
||||
$data = array();
|
||||
$penawaran = array();
|
||||
$penawrandetails = array();
|
||||
$penawarandetailLogs = array();
|
||||
$data = [];
|
||||
$penawaran = [];
|
||||
$penawrandetails = [];
|
||||
$penawarandetailLogs = [];
|
||||
|
||||
if (request()->ajax()) {
|
||||
$id = $request->id;
|
||||
@@ -165,6 +172,11 @@ class OtorisasiPenawaranController extends Controller
|
||||
$h=0;
|
||||
foreach($penawarandetailLogs as $obj1)
|
||||
{
|
||||
// tgl_proposal
|
||||
if ($obj1->tgl_proposal) {
|
||||
$penawarandetailLogs[$h]->tgl_proposal = Carbon::parse($obj1->tgl_proposal)->format('d M Y');
|
||||
}
|
||||
|
||||
if($obj1->dokumen_persetujuan && Storage::disk('public')->exists($obj1->dokumen_persetujuan))
|
||||
{
|
||||
$penawarandetailLogs_path = Storage::url($obj1->dokumen_persetujuan);
|
||||
@@ -178,6 +190,11 @@ class OtorisasiPenawaranController extends Controller
|
||||
$i=0;
|
||||
foreach($penawrandetails as $obj)
|
||||
{
|
||||
// tgl_proposal
|
||||
if ($obj->tgl_proposal) {
|
||||
$penawrandetails[$i]->tgl_proposal = Carbon::parse($obj->tgl_proposal)->format('d M Y');
|
||||
}
|
||||
|
||||
if($obj->dokumen_persetujuan && Storage::disk('public')->exists($obj->dokumen_persetujuan))
|
||||
{
|
||||
$penawrandetails_path = Storage::url($obj->dokumen_persetujuan);
|
||||
@@ -217,7 +234,7 @@ class OtorisasiPenawaranController extends Controller
|
||||
|
||||
public function otorisasiPenawaranKJPP(Request $request, $id): JsonResponse
|
||||
{
|
||||
$data = array();
|
||||
$data = [];
|
||||
$dataDetailPenawaranLog = [];
|
||||
if (request()->ajax()) {
|
||||
|
||||
@@ -257,7 +274,7 @@ class OtorisasiPenawaranController extends Controller
|
||||
]);
|
||||
|
||||
Permohonan::where('nomor_registrasi',$request->noReg)
|
||||
->update(['status'=>'spk',
|
||||
->update(['status'=>'persetujuan-penawaran',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
@@ -272,6 +289,8 @@ class OtorisasiPenawaranController extends Controller
|
||||
'detail_penawaran_id' =>$model->id,
|
||||
'kjpp_rekanan_id' =>$model->kjpp_rekanan_id,
|
||||
'penawaran_id' =>$model->penawaran_id,
|
||||
'no_proposal' =>$model->no_proposal,
|
||||
'tgl_proposal' =>$model->tgl_proposal,
|
||||
'biaya_penawaran' =>$model->biaya_penawaran,
|
||||
'attachment' =>$model->attachment,
|
||||
'dokumen_persetujuan' =>$model->dokumen_persetujuan,
|
||||
@@ -305,12 +324,12 @@ class OtorisasiPenawaranController extends Controller
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
$data['message']['message_error'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_ajax'] = array("no ajax request");
|
||||
$data['message']['message_error'] = array("no ajax request");
|
||||
}
|
||||
return response()->json($data);
|
||||
}
|
||||
@@ -320,4 +339,92 @@ class OtorisasiPenawaranController extends Controller
|
||||
$prosespenawaran = PenawaranTender::find($id);
|
||||
return view('lpj::otorisasipenawaran.show', compact('id','prosespenawaran'));
|
||||
}
|
||||
|
||||
public function penawaranulang(Request $request, $id): JsonResponse
|
||||
{
|
||||
// $id ==> penawaran.id
|
||||
$data = [];
|
||||
$dataDetailPenawaranLog=[];
|
||||
if (request()->ajax()) {
|
||||
|
||||
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
|
||||
// update detail_penawaran => detail_penawaran.status = 1 (untuk all KJPP)
|
||||
// update penawaran => penawaran.status ="tender", penawaran.updated_at, penawaran.updated_by
|
||||
// update permohonan => permohonan.status ="tender", permohonan.updated_at, permohonan.updated_by
|
||||
// insert detail_permohonan_log
|
||||
|
||||
PenawaranDetailTender::where('penawaran_id', $id)
|
||||
->update(['status' => 1,
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
PenawaranTender::where('id', $id)
|
||||
->update(['status'=>'tender',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
Permohonan::where('nomor_registrasi',$request->noReg)
|
||||
->update(['status'=>'tender',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
$detailPenawaran = PenawaranDetailTender::where('penawaran_id', $id)
|
||||
->distinct()
|
||||
->get();
|
||||
|
||||
// log
|
||||
if(sizeof($detailPenawaran)>0)
|
||||
{
|
||||
|
||||
foreach ($detailPenawaran as $model) {
|
||||
array_push($dataDetailPenawaranLog, [
|
||||
'detail_penawaran_id' =>$model->id,
|
||||
'kjpp_rekanan_id' =>$model->kjpp_rekanan_id,
|
||||
'penawaran_id' =>$model->penawaran_id,
|
||||
'no_proposal' =>$model->no_proposal,
|
||||
'tgl_proposal' =>$model->tgl_proposal,
|
||||
'biaya_penawaran' =>$model->biaya_penawaran,
|
||||
'attachment' =>$model->attachment,
|
||||
'dokumen_persetujuan' =>$model->dokumen_persetujuan,
|
||||
'status' =>$model->status,
|
||||
'authorized_status' =>$model->authorized_status,
|
||||
'authorized_at' =>$model->authorized_at,
|
||||
'authorized_at' =>$model->authorized_at,
|
||||
'created_at' =>$model->created_at,
|
||||
'updated_at' =>$model->updated_at,
|
||||
'deleted_at' =>$model->deleted_at,
|
||||
'created_by' =>$model->created_by,
|
||||
'updated_by' =>$model->updated_by,
|
||||
'deleted_by' =>$model->deleted_by
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
PenawaranDetailTenderLog::insert($dataDetailPenawaranLog);
|
||||
}
|
||||
// log
|
||||
|
||||
DB::commit();
|
||||
$data['detailPenawaran'] = $detailPenawaran;
|
||||
$data['status'] = 'success';
|
||||
$data['message']['message_success'] = array('Penawaran ulang successfully');
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error'] = array("Penawaran ulang failed..");
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error'] = array("no ajax request");
|
||||
}
|
||||
return response()->json($data);
|
||||
}
|
||||
}
|
||||
190
app/Http/Controllers/PersetujuanPenawaranController.php
Normal file
190
app/Http/Controllers/PersetujuanPenawaranController.php
Normal file
@@ -0,0 +1,190 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\PersetujuanPenawaran;
|
||||
|
||||
class PersetujuanPenawaranController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$persetujuanPenawarans = PersetujuanPenawaran::all();
|
||||
return view('lpj::persetujuan_penawaran.index', compact('persetujuanPenawarans'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(PersetujuanPenawaranRequest $request)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$validated['created_by'] = Auth::id();
|
||||
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::updateOrCreate(
|
||||
['penawaran_id' => $validated['penawaran_id']],
|
||||
$validated,
|
||||
);
|
||||
|
||||
$folderPath = 'persetujuan_penawaran/' . $validated['penawaran_id'];
|
||||
|
||||
if ($request->hasFile('file_persetujuan_penawaran')) {
|
||||
$persetujuanPenawaran->file_persetujuan_penawaran = $request->file('file_persetujuan_penawaran')->store(
|
||||
$folderPath,
|
||||
'public',
|
||||
);
|
||||
}
|
||||
|
||||
if ($request->hasFile('surat_representasi')) {
|
||||
$persetujuanPenawaran->surat_representasi = $request->file('surat_representasi')->store(
|
||||
$folderPath,
|
||||
'public',
|
||||
);
|
||||
}
|
||||
|
||||
if ($request->hasFile('bukti_bayar')) {
|
||||
$persetujuanPenawaran->bukti_bayar = $request->file('bukti_bayar')->store($folderPath, 'public');
|
||||
}
|
||||
|
||||
$persetujuanPenawaran->save();
|
||||
|
||||
// Update the status of the related permohonan to 'spk'
|
||||
$permohonan = Permohonan::find(request()->get('permohonan_id'));
|
||||
if ($permohonan) {
|
||||
$permohonan->status_bayar = request()->get('status_bayar');
|
||||
$permohonan->status = 'spk';
|
||||
$permohonan->save();
|
||||
}
|
||||
|
||||
return redirect()
|
||||
->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran berhasil disimpan.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('lpj::persetujuan_penawaran.create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
$permohonan = Permohonan::find($id);
|
||||
$permohonan->status='tender';
|
||||
return $permohonan->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
$permohonan = Permohonan::with(['debiture', 'penawaranTender.detail'])->find($id);
|
||||
|
||||
return view('lpj::persetujuan_penawaran.form', compact('permohonan'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(PersetujuanPenawaranRequest $request, PersetujuanPenawaran $persetujuanPenawaran)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$validated['updated_by'] = Auth::id();
|
||||
|
||||
$persetujuanPenawaran->update($validated);
|
||||
|
||||
return redirect()
|
||||
->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran updated successfully');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(PersetujuanPenawaran $persetujuanPenawaran)
|
||||
{
|
||||
$persetujuanPenawaran->delete();
|
||||
|
||||
return redirect()
|
||||
->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran deleted successfully');
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('persetujuan_penawaran.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view persetujuan penawaran.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query()->where(['status' => 'persetujuan-penawaran']);
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['debiture', 'penawaranTender.detail', 'penawaranTender.persetujuan'])->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -168,6 +168,7 @@ class ProsesPenawaranController extends Controller
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
// $id => penawaran.id
|
||||
return view('lpj::prosespenawaran.edit', compact('id'));
|
||||
}
|
||||
|
||||
@@ -232,11 +233,19 @@ class ProsesPenawaranController extends Controller
|
||||
*/
|
||||
public function update(Request $request, $id): JsonResponse
|
||||
{
|
||||
// $id => detail_penawaran.id
|
||||
// init
|
||||
$data = array();
|
||||
$dataPenawaranDetail = array();
|
||||
if (request()->ajax()) {
|
||||
|
||||
$penawarandetail = PenawaranDetailTender::find($id);
|
||||
// cek masa aktif penawaran
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($penawarandetail->penawaran_id);
|
||||
// cek status (penawaran.status = tender)
|
||||
$penawaran = PenawaranTender::find($penawarandetail->penawaran_id);
|
||||
if($checkActiveDateRange && ('tender'==$penawaran->status))
|
||||
{
|
||||
try {
|
||||
|
||||
$dataPenawaranDetail = ['updated_by' => Auth::id(),
|
||||
@@ -282,6 +291,12 @@ class ProsesPenawaranController extends Controller
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error_try_catch'] = array('Proses Penawarn KJPP failed.');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
@@ -319,15 +334,17 @@ class ProsesPenawaranController extends Controller
|
||||
*/
|
||||
public function updateAll(Request $request, $id): JsonResponse
|
||||
{
|
||||
// $id = penawaran.id
|
||||
// init
|
||||
$data = array();
|
||||
$dataPermohonan = array();
|
||||
$dataPenawaran = array();
|
||||
$penawaran = PenawaranTender::find($id);
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($id);
|
||||
|
||||
// cek masa aktif penawaran
|
||||
if($checkActiveDateRange)
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($id);
|
||||
// cek status (penawaran.status = tender)
|
||||
$penawaran = PenawaranTender::find($id);
|
||||
if($checkActiveDateRange && ('tender'==$penawaran->status))
|
||||
{
|
||||
|
||||
$checkKelengkapanDetailKJPP = checkKelengkapanDetailKJPP($id);
|
||||
@@ -376,13 +393,21 @@ class ProsesPenawaranController extends Controller
|
||||
|
||||
public function updateKJPPStatus(Request $request, $id): JsonResponse
|
||||
{
|
||||
// $id => detail_penawaran.id
|
||||
// init
|
||||
$data = array();
|
||||
$dataDetailPenawaran = array();
|
||||
|
||||
$detailpenawaran = PenawaranDetailTender::find($id);
|
||||
// cek masa aktif penawaran
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($detailpenawaran->penawaran_id);
|
||||
// cek status (penawaran.status = tender)
|
||||
$penawaran = PenawaranTender::find($detailpenawaran->penawaran_id);
|
||||
if($checkActiveDateRange && ('tender'==$penawaran->status))
|
||||
{
|
||||
try {
|
||||
$detailpenawaran = PenawaranDetailTender::findOrFail($id);
|
||||
$data['id']=$id;
|
||||
|
||||
// $data['id']=$id;
|
||||
|
||||
$dataDetailPenawaran = ['status' => '0',
|
||||
'updated_by' => Auth::id(),
|
||||
@@ -396,7 +421,13 @@ class ProsesPenawaranController extends Controller
|
||||
} catch (Exception $e) {
|
||||
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error_try_catch'] = array("Gagal delete Penawaran KJPP ".$request->kjppName);
|
||||
$data['message'] ['message_error'] = array("Gagal delete Penawaran KJPP ".$request->kjppName);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
@@ -416,6 +447,12 @@ class ProsesPenawaranController extends Controller
|
||||
$dataPenawaranDetail = array();
|
||||
$failed = 0;
|
||||
|
||||
// cek masa aktif penawaran
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($id);
|
||||
// cek status (penawaran.status = tender)
|
||||
$penawaran = PenawaranTender::find($id);
|
||||
if($checkActiveDateRange && ('tender'==$penawaran->status))
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try
|
||||
{
|
||||
@@ -501,6 +538,12 @@ class ProsesPenawaranController extends Controller
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error_try_catch'] = array('Proses Draft Penawaran KJPP failed.');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
@@ -511,6 +554,12 @@ class ProsesPenawaranController extends Controller
|
||||
$data = array();
|
||||
// $data['request']=$request->all();
|
||||
$dataPenawaranDetail = array();
|
||||
// cek masa aktif penawaran
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($request->penawaran_id);
|
||||
// cek status (penawaran.status = tender)
|
||||
$penawaran = PenawaranTender::find($request->penawaran_id);
|
||||
if($checkActiveDateRange && ('tender'==$penawaran->status))
|
||||
{
|
||||
try
|
||||
{
|
||||
$dataPenawaranDetail = [
|
||||
@@ -531,6 +580,12 @@ class ProsesPenawaranController extends Controller
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error_try_catch'] = array('Proses Tambah KJPP failed.');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
@@ -964,6 +1019,7 @@ class ProsesPenawaranController extends Controller
|
||||
|
||||
public function showPermohonan($id)
|
||||
{
|
||||
// $id => permohonan.id
|
||||
$permohonan = Permohonan::find($id);
|
||||
return view('lpj::prosespenawaran.showPermohonan', compact('id', 'permohonan'));
|
||||
}
|
||||
|
||||
@@ -34,8 +34,10 @@ use Illuminate\Support\Facades\Auth;
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query =Permohonan::query()->with(['penawaran','penawaran.tujuanPenilaianKjpp'])
|
||||
->where('permohonan.status','=','spk');
|
||||
// $query =Permohonan::query()->with(['penawaran','penawaran.tujuanPenilaianKjpp'])->where('permohonan.status','=','spk');
|
||||
// $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian','penilaian'])->get();
|
||||
$query =Permohonan::query()->with(['user', 'debiture', 'branch', 'tujuanPenilaian','penilaian','penawaran','penawaran.tujuanPenilaianKjpp'])->where('permohonan.status','=','spk');
|
||||
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
@@ -78,21 +80,27 @@ use Illuminate\Support\Facades\Auth;
|
||||
$i=0;
|
||||
foreach($data as $obj)
|
||||
{
|
||||
if($obj->tanggal_penilaian_sebelumnya)
|
||||
{
|
||||
$data[$i]->tanggal_penilaian_sebelumnya = Carbon::parse($obj->tanggal_penilaian_sebelumnya)->format('d F Y H:i:s');
|
||||
// tanggal_permohonan
|
||||
if ($obj->tanggal_permohonan) {
|
||||
$data[$i]->tanggal_permohonan = Carbon::parse($obj->tanggal_permohonan)->format('d M Y');
|
||||
}
|
||||
|
||||
if($obj->biaya_kjpp_sebelumnya)
|
||||
if($obj->penawaran->tanggal_penilaian_sebelumnya)
|
||||
{
|
||||
$data[$i]->biaya_kjpp_sebelumnya = formatRupiah($obj->biaya_kjpp_sebelumnya);
|
||||
$data[$i]->penawaran->tanggal_penilaian_sebelumnya = Carbon::parse($obj->penawaran->tanggal_penilaian_sebelumnya)->format('d F Y H:i:s');
|
||||
}
|
||||
|
||||
if($obj->penawaran->biaya_kjpp_sebelumnya)
|
||||
{
|
||||
$data[$i]->penawaran->biaya_kjpp_sebelumnya = formatRupiah($obj->penawaran->biaya_kjpp_sebelumnya);
|
||||
|
||||
}
|
||||
|
||||
// date_range
|
||||
if($obj->start_date && $obj->end_date)
|
||||
if($obj->penawaran->start_date && $obj->penawaran->end_date)
|
||||
{
|
||||
$data[$i]->date_range = Carbon::parse($obj->start_date)->format('d M Y').' - '.Carbon::parse($obj->end_date)->format('d M Y');
|
||||
$data[$i]->date_range = Carbon::parse($obj->penawaran->start_date)->format('d M Y').' - '.
|
||||
Carbon::parse($obj->penawaran->end_date)->format('d M Y');
|
||||
|
||||
}
|
||||
|
||||
@@ -107,7 +115,6 @@ use Illuminate\Support\Facades\Auth;
|
||||
$i++;
|
||||
}
|
||||
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
@@ -147,6 +154,8 @@ use Illuminate\Support\Facades\Auth;
|
||||
->where('detail_penawaran.status','=',1)
|
||||
->where('penawaran.id','=', $id)
|
||||
->select('penawaran.*', 'detail_penawaran.attachment as attachmentku',
|
||||
'detail_penawaran.no_proposal as detail_penawaran_no_proposal',
|
||||
'detail_penawaran.tgl_proposal as detail_penawaran_tgl_proposal',
|
||||
'detail_penawaran.biaya_penawaran as detail_penawaran_biaya_penawaran',
|
||||
'kjpp.name as kjpp_name',
|
||||
'kjpp.address as kjpp_address',
|
||||
@@ -161,6 +170,9 @@ use Illuminate\Support\Facades\Auth;
|
||||
|
||||
$data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->first();
|
||||
|
||||
if($penawaran->detail_penawaran_tgl_proposal)
|
||||
$penawaran->detail_penawaran_tgl_proposal = Carbon::parse($penawaran->detail_penawaran_tgl_proposal)->format('d F Y');
|
||||
|
||||
return view('lpj::spk.edit', compact('data', 'penawaran'));
|
||||
}
|
||||
|
||||
@@ -177,6 +189,9 @@ use Illuminate\Support\Facades\Auth;
|
||||
->where('detail_penawaran.status','=',1)
|
||||
->where('penawaran.id','=', $id)
|
||||
->select('penawaran.*', 'detail_penawaran.attachment as attachmentku',
|
||||
'detail_penawaran.no_proposal as detail_penawaran_no_proposal',
|
||||
'detail_penawaran.tgl_proposal as detail_penawaran_tgl_proposal',
|
||||
'detail_penawaran.biaya_penawaran as detail_penawaran_biaya_penawaran',
|
||||
'kjpp.name as kjpp_name',
|
||||
'kjpp.address as kjpp_address',
|
||||
'jenis_laporan.name as jenis_laporan_name'
|
||||
@@ -189,6 +204,9 @@ use Illuminate\Support\Facades\Auth;
|
||||
|
||||
$data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->first();
|
||||
|
||||
if($penawaran->detail_penawaran_tgl_proposal)
|
||||
$penawaran->detail_penawaran_tgl_proposal = Carbon::parse($penawaran->detail_penawaran_tgl_proposal)->format('d F Y');
|
||||
|
||||
$folderPath = 'uploads/spk/';
|
||||
$extension = '.pdf';
|
||||
$newFileName = "SPK_".$penawaran->nomor_registrasi."_".Auth::user()->id."_".time(). $extension;
|
||||
|
||||
@@ -23,6 +23,7 @@ use Modules\Lpj\Exports\PenawaranTenderExport;
|
||||
use Modules\Lpj\Http\Requests\TenderPenawaranRequest;
|
||||
use Modules\Lpj\Jobs\SendPenawaranKJPPTenderJob;
|
||||
use Modules\Lpj\Jobs\SendPenawaranTenderJob;
|
||||
use Modules\Lpj\Models\PenawaranEmailTenderLog;
|
||||
|
||||
class TenderController extends Controller
|
||||
{
|
||||
@@ -618,7 +619,9 @@ class TenderController extends Controller
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = PenawaranDetailTender::query()->where('penawaran_id', '=', $penawaran->id)->with(['kjpp', 'penawaran', 'emailTenderLog']);
|
||||
$query = PenawaranDetailTender::query()->where('penawaran_id', '=', $penawaran->id)->with(['kjpp', 'penawaran', 'penawaran.emailTenderLog']);
|
||||
|
||||
// dd($query);
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
@@ -641,23 +644,8 @@ class TenderController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['kjpp', 'penawaran', 'emailTenderLog'])->get();
|
||||
$data = $query->get();
|
||||
|
||||
// add column "No"
|
||||
$i = 0;
|
||||
@@ -670,20 +658,9 @@ class TenderController extends Controller
|
||||
$j++;
|
||||
}
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = 0 + 1;
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
@@ -800,8 +777,6 @@ class TenderController extends Controller
|
||||
|
||||
$dp1 = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->first();
|
||||
|
||||
// dd($dp1->kjpp);
|
||||
|
||||
foreach ($permohonan->debiture->documents as $document) {
|
||||
$village_permohonan = $document->village_code;
|
||||
$district_permohonan = $document->district_code;
|
||||
@@ -814,8 +789,20 @@ class TenderController extends Controller
|
||||
$cities = City::where('code', $city_permohonan)->get();
|
||||
$provinces = Province::where('code', $province_permohonan)->get();
|
||||
|
||||
try {
|
||||
$balikan = SendPenawaranKJPPTenderJob::dispatch(
|
||||
$subject = 'Send Penawaran K J P P Email';
|
||||
|
||||
$body_pdf = view('lpj::penawaran.kirimEmailKJPP', [
|
||||
'dp1' => $dp1,
|
||||
'penawaran' => $penawaran,
|
||||
'permohonan' => $permohonan,
|
||||
'kjpps' => $kjpps,
|
||||
'villages' => $villages,
|
||||
'districts' => $districts,
|
||||
'cities' => $cities,
|
||||
'provinces' => $provinces
|
||||
])->render();
|
||||
|
||||
SendPenawaranKJPPTenderJob::dispatch(
|
||||
$kjpps,
|
||||
$dp1,
|
||||
$penawaran,
|
||||
@@ -825,10 +812,66 @@ class TenderController extends Controller
|
||||
$cities,
|
||||
$provinces
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
return redirect()->route('tender.penawaran.ulang.index')->with('error', 'Email Penawaran Gagal Terkirim!');
|
||||
|
||||
try {
|
||||
// Proses log email
|
||||
foreach ($kjpps as $email) {
|
||||
// Cek apakah sudah ada log dengan status 'failed' untuk email ini
|
||||
$log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
|
||||
->where('to_email', $email)
|
||||
->where('status', 'failed')
|
||||
->first();
|
||||
|
||||
$log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
|
||||
->where('to_email', $email)
|
||||
->where('status', 'success')
|
||||
->first();
|
||||
|
||||
if ($log) {
|
||||
// Jika log ditemukan dan statusnya 'failed', update status menjadi 'success'
|
||||
$log->update([
|
||||
'status' => 'success',
|
||||
'error_message' => null, // Reset error_message saat status diubah menjadi success
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else if ($log1) {
|
||||
// Jika log ditemukan dan statusnya 'success' biarkan saja
|
||||
$log1->update([ // Reset error_message saat status diubah menjadi success
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else {
|
||||
// Jika tidak ada log gagal, buat log baru dengan status 'success'
|
||||
PenawaranEmailTenderLog::create([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'status' => 'success',
|
||||
'error_message' => null, // Tidak ada error message
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return redirect()->route('tender.penawaran.ulang.index')->with('success', 'Email Penawaran Berhasil Terkirim!');
|
||||
} catch (\Exception $e) {
|
||||
// Log email gagal
|
||||
foreach ($kjpps as $email) {
|
||||
PenawaranEmailTenderLog::create([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'status' => 'failed',
|
||||
'error_message' => $e->getMessage(),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
return redirect()->route('tender.penawaran.showKirimEmail', ['noreg' => $noreg])->with('error', 'Email Penawaran Gagal Terkirim!');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
70
app/Http/Requests/PersetujuanPenawaranRequest.php
Normal file
70
app/Http/Requests/PersetujuanPenawaranRequest.php
Normal file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class PersetujuanPenawaranRequest extends FormRequest
|
||||
{
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'penawaran_id' => 'nullable|exists:penawaran,id',
|
||||
'nomor_proposal_penawaran' => 'nullable|string|max:255',
|
||||
'tanggal_proposal_penawaran' => 'nullable|date',
|
||||
'biaya_final' => 'nullable|numeric|min:0',
|
||||
'sla_resume' => 'nullable|date',
|
||||
'sla_final' => 'nullable|date|after_or_equal:sla_resume',
|
||||
'file_persetujuan_penawaran' => 'nullable|file|mimes:pdf,doc,docx|max:10240',
|
||||
'surat_representasi' => 'nullable|file|mimes:pdf,doc,docx|max:10240',
|
||||
'bukti_bayar' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:10240',
|
||||
'status' => 'nullable|boolean',
|
||||
'authorized_status' => 'boolean',
|
||||
'authorized_at' => 'nullable|date',
|
||||
'authorized_by' => 'nullable|exists:users,id',
|
||||
'catatan' => 'nullable|string',
|
||||
];
|
||||
}
|
||||
|
||||
public function messages()
|
||||
{
|
||||
return [
|
||||
'penawaran_id.required' => 'Penawaran ID wajib diisi.',
|
||||
'penawaran_id.exists' => 'Penawaran ID tidak valid.',
|
||||
'nomor_proposal_penawaran.required' => 'Nomor proposal penawaran wajib diisi.',
|
||||
'tanggal_proposal_penawaran.required' => 'Tanggal proposal penawaran wajib diisi.',
|
||||
'tanggal_proposal_penawaran.date' => 'Tanggal proposal penawaran harus berupa tanggal yang valid.',
|
||||
'biaya_final.required' => 'Biaya final wajib diisi.',
|
||||
'biaya_final.numeric' => 'Biaya final harus berupa angka.',
|
||||
'biaya_final.min' => 'Biaya final tidak boleh kurang dari 0.',
|
||||
'sla_resume.required' => 'SLA Resume wajib diisi.',
|
||||
'sla_resume.date' => 'SLA Resume harus berupa tanggal yang valid.',
|
||||
'sla_final.required' => 'SLA Final wajib diisi.',
|
||||
'sla_final.date' => 'SLA Final harus berupa tanggal yang valid.',
|
||||
'sla_final.after_or_equal' => 'SLA Final harus sama dengan atau setelah SLA Resume.',
|
||||
'file_persetujuan_penawaran.file' => 'File Persetujuan Penawaran harus berupa file.',
|
||||
'file_persetujuan_penawaran.mimes' => 'File Persetujuan Penawaran harus berupa file PDF, DOC, atau DOCX.',
|
||||
'file_persetujuan_penawaran.max' => 'Ukuran File Persetujuan Penawaran tidak boleh lebih dari 10MB.',
|
||||
'surat_representasi.file' => 'Surat Representasi harus berupa file.',
|
||||
'surat_representasi.mimes' => 'Surat Representasi harus berupa file PDF, DOC, atau DOCX.',
|
||||
'surat_representasi.max' => 'Ukuran Surat Representasi tidak boleh lebih dari 10MB.',
|
||||
'bukti_bayar.file' => 'Bukti Bayar harus berupa file.',
|
||||
'bukti_bayar.mimes' => 'Bukti Bayar harus berupa file PDF, JPG, JPEG, atau PNG.',
|
||||
'bukti_bayar.max' => 'Ukuran Bukti Bayar tidak boleh lebih dari 10MB.',
|
||||
'region_id.required' => 'Region ID wajib diisi.',
|
||||
'region_id.exists' => 'Region ID tidak valid.',
|
||||
'status.required' => 'Status wajib diisi.',
|
||||
'status.boolean' => 'Status harus berupa nilai boolean.',
|
||||
'authorized_status.boolean' => 'Status otorisasi harus berupa nilai boolean.',
|
||||
'authorized_at.date' => 'Tanggal otorisasi harus berupa tanggal yang valid.',
|
||||
'authorized_by.exists' => 'ID pengguna yang mengotorisasi tidak valid.',
|
||||
'status_bayar.required' => 'Status bayar wajib diisi.',
|
||||
'status_bayar.in' => 'Status bayar harus berupa "sudah_bayar" atau "belum_bayar".',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -27,9 +27,4 @@ class PenawaranDetailTender extends Model
|
||||
{
|
||||
return $this->belongsTo(KJPP::class, 'kjpp_rekanan_id', 'id');
|
||||
}
|
||||
|
||||
public function emailTenderLog(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(PenawaranEmailTenderLog::class, 'penawaran_id', 'id', PenawaranTender::class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,4 +15,9 @@ class PenawaranEmailTenderLog extends Model
|
||||
* The attributes that are mass assignable.
|
||||
*/
|
||||
protected $guarded = ['id'];
|
||||
|
||||
public function penawaran()
|
||||
{
|
||||
return $this->belongsTo(PenawaranTender::class, 'penawaran_id', 'id');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,8 +24,17 @@ class PenawaranTender extends Model
|
||||
{
|
||||
return $this->hasMany(PenawaranDetailTender::class, 'penawaran_id', 'id')->where('status', '=', 1);
|
||||
}
|
||||
|
||||
public function detail(){
|
||||
return $this->belongsTo(PenawaranDetailTender::class, 'id', 'penawaran_id')->where('status', 1);
|
||||
}
|
||||
// andy add
|
||||
|
||||
public function emailTenderLog(): HasMany
|
||||
{
|
||||
return $this->hasMany(PenawaranEmailTenderLog::class, 'penawaran_id', 'id');
|
||||
}
|
||||
|
||||
public function penawaranKjpp()
|
||||
{
|
||||
return $this->hasMany(PenawaranDetailTender::class, 'penawaran_id');
|
||||
@@ -46,4 +55,8 @@ class PenawaranTender extends Model
|
||||
{
|
||||
return $this->belongsTo(JenisLaporan::class, 'jenis_laporan_id', 'id');
|
||||
}
|
||||
|
||||
public function persetujuan(){
|
||||
return $this->belongsTo(PersetujuanPenawaran::class, 'id', 'penawaran_id');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
|
||||
public function penawaranTender()
|
||||
{
|
||||
return $this->hasMany(PenawaranTender::class, 'nomor_registrasi');
|
||||
return $this->belongsTo(PenawaranTender::class, 'nomor_registrasi', 'nomor_registrasi');
|
||||
}
|
||||
|
||||
public function region()
|
||||
|
||||
57
app/Models/PersetujuanPenawaran.php
Normal file
57
app/Models/PersetujuanPenawaran.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Models;
|
||||
|
||||
use Modules\Usermanagemenet\Models\User;
|
||||
|
||||
class PersetujuanPenawaran extends Base
|
||||
{
|
||||
|
||||
protected $table = 'persetujuan_penawaran';
|
||||
|
||||
protected $fillable = [
|
||||
'penawaran_id',
|
||||
'nomor_proposal_penawaran',
|
||||
'tanggal_proposal_penawaran',
|
||||
'biaya_final',
|
||||
'sla_resume',
|
||||
'sla_final',
|
||||
'file_persetujuan_penawaran',
|
||||
'surat_representasi',
|
||||
'bukti_bayar',
|
||||
'status',
|
||||
'authorized_status',
|
||||
'authorized_at',
|
||||
'authorized_by',
|
||||
'status',
|
||||
'catatan',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'tanggal_proposal_penawaran' => 'date',
|
||||
'sla_resume' => 'date',
|
||||
'sla_final' => 'date',
|
||||
'biaya_final' => 'decimal:2',
|
||||
'status' => 'boolean',
|
||||
'authorized_status' => 'boolean',
|
||||
'authorized_at' => 'datetime',
|
||||
];
|
||||
|
||||
// Relationship with Penawaran
|
||||
public function penawaran()
|
||||
{
|
||||
return $this->belongsTo(PenawaranTender::class, 'penawaran_id');
|
||||
}
|
||||
|
||||
// Relationship with Region
|
||||
public function region()
|
||||
{
|
||||
return $this->belongsTo(Region::class);
|
||||
}
|
||||
|
||||
// Relationship with User (for authorized_by)
|
||||
public function authorizedBy()
|
||||
{
|
||||
return $this->belongsTo(User::class, 'authorized_by');
|
||||
}
|
||||
}
|
||||
@@ -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_email_tender_log', function (Blueprint $table) {
|
||||
$table->text('error_message')->nullable()->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('penawaran_email_tender_log', function (Blueprint $table) {
|
||||
$table->text('error_message')->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,47 @@
|
||||
<?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('persetujuan_penawaran', function (Blueprint $table) {
|
||||
$table->string('nomor_proposal_penawaran')->nullable()->change();
|
||||
$table->date('tanggal_proposal_penawaran')->nullable()->change();
|
||||
$table->string('biaya_final')->nullable()->change();
|
||||
$table->renameColumn('sls_resume', 'sla_resume');
|
||||
$table->datetime('sla_resume')->nullable()->change();
|
||||
$table->datetime('sla_final')->nullable()->change();
|
||||
$table->string('catatan')->nullable()->change();
|
||||
$table->string('attachment')->nullable()->change();
|
||||
$table->foreignId('region_id')->nullable()->change();
|
||||
$table->boolean('status')->nullable()->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down()
|
||||
: void
|
||||
{
|
||||
Schema::table('persetujuan_penawaran', function (Blueprint $table) {
|
||||
$table->string('nomor_proposal_penawaran')->nullable(false)->change();
|
||||
$table->date('tanggal_proposal_penawaran')->nullable(false)->change();
|
||||
$table->string('biaya_final')->nullable(false)->change();
|
||||
$table->renameColumn('sla_resume', 'sls_resume');
|
||||
$table->datetime('sls_resume')->nullable(false)->change();
|
||||
$table->datetime('sla_final')->nullable(false)->change();
|
||||
$table->string('catatan')->nullable(false)->change();
|
||||
$table->string('attachment')->nullable(false)->change();
|
||||
$table->foreignId('region_id')->nullable(false)->change();
|
||||
$table->boolean('status')->nullable(false)->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,30 @@
|
||||
<?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('persetujuan_penawaran', function (Blueprint $table) {
|
||||
$table->unsignedBigInteger('created_by')->nullable();
|
||||
$table->unsignedBigInteger('updated_by')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('persetujuan_penawaran', function (Blueprint $table) {
|
||||
$table->dropColumn('created_by');
|
||||
$table->dropColumn('updated_by');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class UpdatePersetujuanPenawaranTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('persetujuan_penawaran', function (Blueprint $table) {
|
||||
// Drop the existing attachment column
|
||||
$table->dropForeign(['region_id']);
|
||||
$table->dropColumn('attachment');
|
||||
|
||||
// Add new columns for file attachments
|
||||
$table->string('file_persetujuan_penawaran')->nullable();
|
||||
$table->string('surat_representasi')->nullable();
|
||||
$table->string('bukti_bayar')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('persetujuan_penawaran', function (Blueprint $table) {
|
||||
// Reverse the changes
|
||||
$table->string('attachment')->nullable();
|
||||
|
||||
$table->dropColumn('file_persetujuan_penawaran');
|
||||
$table->dropColumn('surat_representasi');
|
||||
$table->dropColumn('bukti_bayar');
|
||||
});
|
||||
}
|
||||
}
|
||||
349
module.json
349
module.json
@@ -5,8 +5,12 @@
|
||||
"description": "",
|
||||
"keywords": [],
|
||||
"priority": 0,
|
||||
"providers": ["Modules\\Lpj\\Providers\\LpjServiceProvider"],
|
||||
"files": ["app/Helpers/Lpj.php"],
|
||||
"providers": [
|
||||
"Modules\\Lpj\\Providers\\LpjServiceProvider"
|
||||
],
|
||||
"files": [
|
||||
"app/Helpers/Lpj.php"
|
||||
],
|
||||
"menu": {
|
||||
"main": [
|
||||
{
|
||||
@@ -16,7 +20,23 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Persetujuan Penawaran",
|
||||
"path": "persetujuan-penawaran",
|
||||
"icon": "ki-filled ki-questionnaire-tablet text-lg",
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Registrasi",
|
||||
@@ -25,7 +45,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Tender",
|
||||
@@ -34,7 +57,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"],
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
],
|
||||
"sub": [
|
||||
{
|
||||
"title": "Data Proses Penawaran",
|
||||
@@ -42,7 +68,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Data Penawaran Ulang",
|
||||
@@ -50,7 +79,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -61,7 +93,12 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin","EO Appraisal","DD Appraisal"],
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin",
|
||||
"EO Appraisal",
|
||||
"DD Appraisal"
|
||||
],
|
||||
"sub": [
|
||||
{
|
||||
"title": "Otorisasi Penawaran",
|
||||
@@ -69,7 +106,12 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin","EO Appraisal","DD Appraisal"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin",
|
||||
"EO Appraisal",
|
||||
"DD Appraisal"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -80,7 +122,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Registrasi Final",
|
||||
@@ -89,7 +134,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Pembatalan",
|
||||
@@ -98,7 +146,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Data Debitur",
|
||||
@@ -107,7 +159,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Authorization",
|
||||
@@ -116,7 +172,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Assignment",
|
||||
@@ -125,7 +184,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "senior-officer"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"senior-officer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Team Activity",
|
||||
@@ -134,7 +196,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","senior-officer"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"senior-officer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Otorisator",
|
||||
@@ -143,7 +208,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","senior-officer"],
|
||||
"roles": [
|
||||
"administrator",
|
||||
"senior-officer"
|
||||
],
|
||||
"sub": [
|
||||
{
|
||||
"title": "Pelaporan",
|
||||
@@ -151,7 +219,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","senior-officer"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"senior-officer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Pembayaran",
|
||||
@@ -159,7 +230,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","senior-officer"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"senior-officer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Pembatalan",
|
||||
@@ -167,7 +241,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","senior-officer"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"senior-officer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "SLA",
|
||||
@@ -175,7 +252,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","senior-officer"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"senior-officer"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -186,9 +266,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"title": "Activity",
|
||||
"path": "activity",
|
||||
@@ -211,7 +293,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Laporan",
|
||||
@@ -234,7 +319,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Standard",
|
||||
@@ -259,7 +347,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
}
|
||||
],
|
||||
"master": [
|
||||
@@ -284,7 +376,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Jenis Legalitas Jaminan",
|
||||
@@ -292,7 +388,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Jenis Aset",
|
||||
@@ -300,7 +400,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Jenis Dokumen",
|
||||
@@ -308,7 +412,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Tujuan Penilaian",
|
||||
@@ -316,7 +424,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Nilai Plafond",
|
||||
@@ -324,7 +436,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Hubungan Pemilik Jaminan",
|
||||
@@ -332,7 +448,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Hubungan Penghuni Jaminan",
|
||||
@@ -340,7 +460,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "pemohon-ao", "pemohon-eo"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"pemohon-ao",
|
||||
"pemohon-eo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Arah Mata Angin",
|
||||
@@ -348,7 +472,9 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator"]
|
||||
"roles": [
|
||||
"administrator"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Status Permohonan",
|
||||
@@ -356,7 +482,9 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator"]
|
||||
"roles": [
|
||||
"administrator"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Region",
|
||||
@@ -364,7 +492,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin", "senior-officer"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin",
|
||||
"senior-officer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Staff Appraisal",
|
||||
@@ -372,7 +504,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "senior-officer"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"senior-officer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Jenis Penilaian",
|
||||
@@ -380,7 +515,11 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin", "senior-officer"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin",
|
||||
"senior-officer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "KJPP",
|
||||
@@ -388,7 +527,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Jenis Laporan",
|
||||
@@ -396,7 +538,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Tujuan Penilaian KJPP",
|
||||
@@ -404,7 +549,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Ijin Usaha",
|
||||
@@ -412,7 +560,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "SLA",
|
||||
@@ -420,7 +571,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator", "admin"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Bentuk",
|
||||
@@ -428,7 +582,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Kontur Tanah",
|
||||
@@ -436,7 +593,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Posisi Kavling",
|
||||
@@ -444,7 +604,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Ketinggian Tanah",
|
||||
@@ -452,7 +615,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Kondisi Fisik Tanah",
|
||||
@@ -460,7 +626,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Jenis Bangunan",
|
||||
@@ -468,7 +637,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Kondisi Bangunan",
|
||||
@@ -476,7 +648,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Sifat Bangunan",
|
||||
@@ -484,16 +659,21 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"title": "Sarana Pelengkap",
|
||||
"path": "basicdata.sarana-pelengkap",
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
@@ -538,14 +718,16 @@
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
},
|
||||
|
||||
{
|
||||
"title": "Lalu Lintas Sekitar",
|
||||
"path": "basicdata.lalu-lintas-lokasi",
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Tingkat Keramaian",
|
||||
@@ -553,7 +735,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Masyarakat Sekitar",
|
||||
@@ -561,7 +746,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Lantai Unit",
|
||||
@@ -569,7 +757,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "View unit",
|
||||
@@ -577,7 +768,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Spesifikasi Bangunan",
|
||||
@@ -585,7 +779,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Kategori Speksikasi Bangunan",
|
||||
@@ -593,7 +790,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Perkerasan jalan",
|
||||
@@ -601,7 +801,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Jenis Pesawat",
|
||||
@@ -609,7 +812,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Jenis kapal",
|
||||
@@ -617,7 +823,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Jenis Kendaraan",
|
||||
@@ -625,7 +834,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Model Alat Berat",
|
||||
@@ -633,7 +845,10 @@
|
||||
"classes": "",
|
||||
"attributes": [],
|
||||
"permission": "",
|
||||
"roles": ["administrator","surveyor"]
|
||||
"roles": [
|
||||
"administrator",
|
||||
"surveyor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Terletak Di Area",
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
function hitungHariKerja(tanggalMulai, tanggalSelesai) {
|
||||
tanggalMulai = new Date(tanggalMulai);
|
||||
tanggalMulai.setHours(0, 0, 0, 0);
|
||||
tanggalSelesai = new Date(tanggalSelesai);
|
||||
tanggalSelesai.setHours(23, 59, 59, 999);
|
||||
|
||||
let hariKerja = 0;
|
||||
let tanggalSekarang = new Date(tanggalMulai);
|
||||
|
||||
// You'll need to implement a way to get holiday dates from your server
|
||||
// For this example, we'll assume you have a global variable holidayDates
|
||||
// that contains an array of holiday date strings in 'YYYY-MM-DD' format
|
||||
const tanggalLibur = window.holidayDates || [];
|
||||
|
||||
while (tanggalSekarang <= tanggalSelesai) {
|
||||
const dayOfWeek = tanggalSekarang.getDay();
|
||||
const dateString = tanggalSekarang.toISOString().split("T")[0];
|
||||
|
||||
// Check if it's not Saturday (6) or Sunday (0) and not a holiday
|
||||
if (
|
||||
dayOfWeek !== 0 &&
|
||||
dayOfWeek !== 6 &&
|
||||
!tanggalLibur.includes(dateString)
|
||||
) {
|
||||
hariKerja++;
|
||||
}
|
||||
|
||||
tanggalSekarang.setDate(tanggalSekarang.getDate() + 1);
|
||||
}
|
||||
|
||||
return hariKerja;
|
||||
}
|
||||
|
||||
// Make the function available globally
|
||||
window.hitungHariKerja = hitungHariKerja;
|
||||
|
||||
@@ -193,6 +193,7 @@
|
||||
</div>
|
||||
|
||||
@if($detail->details)
|
||||
@if($detail->jenisLegalitasJaminan->custom_field)
|
||||
@php $custom_field = json_decode($detail->details,true) @endphp
|
||||
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
|
||||
<label class="form-label max-w-56 capitalize">
|
||||
@@ -202,6 +203,8 @@
|
||||
<input class="input" type="text" name="custom_field[][$detail->jenisLegalitasJaminan->custom_field]" value="{{ $custom_field[$detail->jenisLegalitasJaminan->custom_field] }}">
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@else
|
||||
@if($detail->jenisLegalitasJaminan->custom_field)
|
||||
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
@section('content')
|
||||
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
|
||||
<!-- $id ==> penawaran.id -->
|
||||
<input type="hidden" id="id" name="id" value="{{ $id }}">
|
||||
<div class="card pb-2.5">
|
||||
<div class="card-header" id="basic_settings">
|
||||
@@ -63,6 +64,9 @@
|
||||
<div class="card min-w-full">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">Data KJPP</h3>
|
||||
<button type="button" class="btn btn-sm btn-danger" id="{{$route[1]}}_toPenawaranUlang">
|
||||
<i class="ki-filled ki-wrench"></i>Penawaran Ulang
|
||||
</button>
|
||||
</div>
|
||||
<div class="card-table scrollable-x-auto">
|
||||
<table class="table table-border align-middle text-gray-700 font-medium text-sm">
|
||||
|
||||
@@ -177,11 +177,12 @@
|
||||
actions: {
|
||||
title: 'Status',
|
||||
render: (item, data) => {
|
||||
// data.id ==> penawaran.id
|
||||
return `<div class="flex flex-nowrap justify-center">
|
||||
<a onclick="showOtorisasiPenawaranData(${data.id})" class="btn btn-sm btn-icon btn-clear btn-primary" title="Detail">
|
||||
<i class="ki-outline ki-eye"></i>
|
||||
</a>
|
||||
<a class="btn btn-sm btn-icon btn-clear btn-info" title="Proses Penawaran" href="otorisasitender/penawaran/${data.id}/edit">
|
||||
<a class="btn btn-sm btn-icon btn-clear btn-info" title="Otorisasi Penawaran" href="otorisasitender/penawaran/${data.id}/edit">
|
||||
<i class="ki-outline ki-notepad-edit"></i>
|
||||
</a>
|
||||
</div>`;
|
||||
|
||||
@@ -75,7 +75,7 @@ function otorisasiKJPP(penawaran_id, id, kjpp_id, kjppName, biaya_penawaran) {
|
||||
}
|
||||
else
|
||||
{
|
||||
Swal.fire('Error!', response.message.message_error_try_catch[0], 'error');
|
||||
Swal.fire('Error!', response.message.message_error[0], 'error');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -146,18 +146,33 @@
|
||||
i++;
|
||||
});
|
||||
}
|
||||
/*
|
||||
// update proses penawaran ulang & permohonan status
|
||||
$("#{{$route[1]}}_toEdit").click(function(e) {
|
||||
|
||||
// update status
|
||||
$("#{{$route[1]}}_toPenawaranUlang").click(function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
Swal.fire({
|
||||
title: ' ',
|
||||
text: "Yakin akan Penawaran ulang?",
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#3085d6',
|
||||
cancelButtonColor: '#d33',
|
||||
confirmButtonText: 'Yes'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed)
|
||||
{
|
||||
//define variable
|
||||
// $id ==> penawaran.id
|
||||
let token = "{{ csrf_token() }}";
|
||||
let useURL = "";
|
||||
let noReg = $("#textReg").text();
|
||||
let useURL = "{{ route($route[0].'.'.$route[1].'.penawaranulang',$id) }}";
|
||||
|
||||
var input_data = new Object();
|
||||
input_data._token = token;
|
||||
input_data.id = "{{ $id }}";
|
||||
input_data.noReg =noReg;
|
||||
// alert('url = ' + useURL);
|
||||
$.ajax({
|
||||
url: useURL,
|
||||
type: "PUT",
|
||||
@@ -168,19 +183,16 @@
|
||||
console.log(response);
|
||||
if('success' == response.status)
|
||||
{
|
||||
// toastr.success(response.message);
|
||||
toastrSuccess(response.message);
|
||||
setTimeout(function () {
|
||||
var url = "{{ route('tender.prosespenawaran.index') }}";
|
||||
swal.fire('Sukses Penawaran ulang!', response.message.message_success[0], 'success').then(() => {
|
||||
var url = "{{ route('otorisasitender.penawaran.index') }}";
|
||||
$(location).attr('href',url);
|
||||
// window.location.href = "https://www.newurl.com";
|
||||
}, 2000);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
// toastr.error(response.message);
|
||||
toastrError(response.message);
|
||||
Swal.fire('Error!', response.message.message_error[0], 'error');
|
||||
}
|
||||
|
||||
},
|
||||
error: function(response, textStatus, errorThrown) {
|
||||
// var errors = response.responseJSON.errors;
|
||||
@@ -189,8 +201,10 @@
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
});
|
||||
*/
|
||||
|
||||
|
||||
</script>
|
||||
@endpush
|
||||
@@ -24,7 +24,6 @@
|
||||
const apiUrl = element.getAttribute('data-api-url');
|
||||
const dataTableOptions = {
|
||||
apiEndpoint: apiUrl,
|
||||
pageSize: 5,
|
||||
columns: {
|
||||
no: {
|
||||
title: 'No',
|
||||
@@ -92,7 +91,31 @@
|
||||
status: {
|
||||
title: 'Status',
|
||||
render: (item, data) => {
|
||||
return `${data.emailTenderLog?.status ?? '-'}`
|
||||
// Cek jika ada email log
|
||||
if (data.penawaran.email_tender_log && data.penawaran.email_tender_log.length > 0) {
|
||||
// Buat full string KJPP untuk matching
|
||||
const kjppString = `${data.kjpp.code} | ${data.kjpp.name}`;
|
||||
|
||||
// Filter log berdasarkan string KJPP yang sesuai
|
||||
const log = data.penawaran.email_tender_log.find(log =>
|
||||
log.kjpp === kjppString
|
||||
);
|
||||
|
||||
if (log) {
|
||||
// Set warna badge berdasarkan status
|
||||
const statusColors = {
|
||||
'success': 'badge-success',
|
||||
'failed': 'badge-danger'
|
||||
};
|
||||
|
||||
const color = statusColors[log.status] || 'badge-secondary';
|
||||
|
||||
return `<span class="badge ${color} mb-1">${log.status}</span>`;
|
||||
}
|
||||
}
|
||||
|
||||
// Jika tidak ada log, tampilkan strip
|
||||
return '<span class="badge">-</span>';
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
|
||||
@@ -34,8 +34,7 @@
|
||||
</div>
|
||||
<div class="card-body grid gap-5">
|
||||
<div class="grid">
|
||||
<div class="card card-grid min-w-full" data-datatable="false" data-datatable-page-size="5"
|
||||
id="kjpp-table"
|
||||
<div class="card card-grid min-w-full" data-datatable="false" id="kjpp-table"
|
||||
data-api-url="{{ route('tender.penawaran.showKirimSurat.datatables', $noreg) }}">
|
||||
<div class="card-header py-5 flex-wrap">
|
||||
<div class="card-title">
|
||||
@@ -89,21 +88,6 @@
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="card-footer justify-center md:justify-between flex-col md:flex-row gap-3 text-gray-600 text-2sm font-medium">
|
||||
<div class="flex items-center gap-2">
|
||||
Show
|
||||
<select class="select select-sm w-16" data-datatable-size="true" name="perpage">
|
||||
</select>
|
||||
per page
|
||||
</div>
|
||||
<div class="flex items-center gap-4">
|
||||
<span data-datatable-info="true"> </span>
|
||||
<div class="pagination" data-datatable-pagination="true">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
126
resources/views/persetujuan_penawaran/form.blade.php
Normal file
126
resources/views/persetujuan_penawaran/form.blade.php
Normal file
@@ -0,0 +1,126 @@
|
||||
@extends('layouts.main')
|
||||
|
||||
@section('breadcrumbs')
|
||||
{{ Breadcrumbs::render(request()->route()->getName()) }}
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
|
||||
<div class="card pb-2.5">
|
||||
<div class="card-header" id="basic_settings">
|
||||
<div class="card-title flex flex-row gap-1.5">
|
||||
Persetujuan Penawaran
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<a href="{{ route('persetujuan-penawaran.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i> Back</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('persetujuan-penawaran.store') }}" method="POST" class="grid gap-5" enctype="multipart/form-data">
|
||||
@csrf
|
||||
<input type="hidden" name="permohonan_id" value="{{ $permohonan->id }}">
|
||||
<input type="hidden" name="penawaran_id" value="{{ $permohonan->penawaran->id ?? old('penawaran_id') }}">
|
||||
<input type="hidden" name="nomor_proposal_penawaran" value="{{ $permohonan->penawaran->detail->no_proposal ?? old('nomor_proposal_penawaran') }}">
|
||||
<input type="hidden" name="tanggal_proposal_penawaran" value="{{ $permohonan->penawaran->detail->tgl_proposal ?? old('tanggal_proposal_penawaran') }}">
|
||||
<input type="hidden" name="biaya_final" value="{{ $permohonan->penawaran->detail->biaya_penawaran ?? old('biaya_final') }}">
|
||||
|
||||
|
||||
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
|
||||
<label class="form-label max-w-56">
|
||||
Status Bayar
|
||||
</label>
|
||||
<div class="flex flex-wrap items-baseline w-full">
|
||||
<select class="input tomselect w-full @error('status_bayar') border-danger bg-danger-light @enderror" name="status_bayar" id="status_bayar">
|
||||
<option value="">Pilih Status Bayar</option>
|
||||
<option value="sudah_bayar" {{ (old('status_bayar') == 'sudah_bayar') || (isset($permohonan) && $permohonan->status_bayar == 'sudah_bayar') ? 'selected' : '' }}>Sudah Bayar</option>
|
||||
<option value="belum_bayar" {{ (old('status_bayar') == 'belum_bayar') || (isset($permohonan) && $permohonan->status_bayar == 'belum_bayar') ? 'selected' : '' }}>Belum Bayar</option>
|
||||
</select>
|
||||
@error('status_bayar')
|
||||
<em class="alert text-danger text-sm">{{ $message }}</em>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
|
||||
<label class="form-label max-w-56">
|
||||
SLA Resume
|
||||
</label>
|
||||
<div class="flex flex-wrap items-baseline w-full">
|
||||
<input type="date" name="sla_resume" id="sla_resume" class="input w-full @error('sla_resume') border-danger bg-danger-light @enderror" value="{{ old('sla_resume', $persetujuanPenawaran->sla_resume ?? '') }}">
|
||||
@error('sla_resume')
|
||||
<em class="alert text-danger text-sm">{{ $message }}</em>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
|
||||
<label class="form-label max-w-56">
|
||||
SLA Final
|
||||
</label>
|
||||
<div class="flex flex-wrap items-baseline w-full">
|
||||
<input type="date" name="sla_final" id="sla_final" class="input w-full @error('sla_final') border-danger bg-danger-light @enderror" value="{{ old('sla_final', $persetujuanPenawaran->sla_final ?? '') }}">
|
||||
@error('sla_final')
|
||||
<em class="alert text-danger text-sm">{{ $message }}</em>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
|
||||
<label class="form-label max-w-56">
|
||||
File Persetujuan Penawaran
|
||||
</label>
|
||||
<div class="flex flex-wrap items-baseline w-full">
|
||||
<input type="file" name="file_persetujuan_penawaran" id="file_persetujuan_penawaran" class="file-input w-full @error('file_persetujuan_penawaran') border-danger bg-danger-light @enderror" accept=".pdf,.doc,.docx">
|
||||
@error('file_persetujuan_penawaran')
|
||||
<em class="alert text-danger text-sm">{{ $message }}</em>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
|
||||
<label class="form-label max-w-56">
|
||||
Surat Representasi
|
||||
</label>
|
||||
<div class="flex flex-wrap items-baseline w-full">
|
||||
<input type="file" name="surat_representasi" id="surat_representasi" class="file-input w-full @error('surat_representasi') border-danger bg-danger-light @enderror" accept=".pdf,.doc,.docx">
|
||||
@error('surat_representasi')
|
||||
<em class="alert text-danger text-sm">{{ $message }}</em>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
|
||||
<label class="form-label max-w-56">
|
||||
Bukti Bayar
|
||||
</label>
|
||||
<div class="flex flex-wrap items-baseline w-full">
|
||||
<input type="file" name="bukti_bayar" id="bukti_bayar" class="file-input w-full @error('bukti_bayar') border-danger bg-danger-light @enderror" accept=".pdf,.jpg,.jpeg,.png">
|
||||
@error('bukti_bayar')
|
||||
<em class="alert text-danger text-sm">{{ $message }}</em>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
|
||||
<label class="form-label max-w-56">
|
||||
Catatan
|
||||
</label>
|
||||
<div class="flex flex-wrap items-baseline w-full">
|
||||
<textarea name="catatan" id="catatan" rows="4" class="textarea w-full @error('catatan') border-danger bg-danger-light @enderror" placeholder="Masukkan catatan">{{ old('catatan', $persetujuanPenawaran->catatan ?? '') }}</textarea>
|
||||
@error('catatan')
|
||||
<em class="alert text-danger text-sm">{{ $message }}</em>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
Proses
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
229
resources/views/persetujuan_penawaran/index.blade.php
Normal file
229
resources/views/persetujuan_penawaran/index.blade.php
Normal file
@@ -0,0 +1,229 @@
|
||||
@extends('layouts.main')
|
||||
|
||||
@section('breadcrumbs')
|
||||
{{ Breadcrumbs::render('persetujuan-penawaran') }}
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
|
||||
<div class="card card-grid min-w-full" data-datatable="false" data-datatable-page-size="5" data-datatable-state-save="false" id="persetujuan-penawaran-table" data-api-url="{{ route('persetujuan-penawaran.datatables') }}">
|
||||
<div class="card-header py-5 flex-wrap">
|
||||
<h3 class="card-title">
|
||||
Daftar Persetujuan Penawaran
|
||||
</h3>
|
||||
<div class="flex flex-wrap gap-2 lg:gap-5">
|
||||
<div class="flex">
|
||||
<label class="input input-sm"> <i class="ki-filled ki-magnifier"> </i>
|
||||
<input placeholder="Search Persetujuan Penawaran" id="search" type="text" value="">
|
||||
</label>
|
||||
</div>
|
||||
<div class="flex flex-wrap gap-2.5">
|
||||
<div class="h-[24px] border border-r-gray-200"></div>
|
||||
<a class="btn btn-sm btn-light" href="#"> Export to Excel </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="card-body">
|
||||
<div class="scrollable-x-auto">
|
||||
<table class="table table-auto table-border align-middle text-gray-700 font-medium text-sm" data-datatable-table="true">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="w-14">
|
||||
<input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox"/>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="nomor_registrasi">
|
||||
<span class="sort"> <span class="sort-label"> Nomor Registrasi </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="nama_debitur">
|
||||
<span class="sort"> <span class="sort-label"> Nama Debitur </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="nomor_proposal_penawaran">
|
||||
<span class="sort"> <span class="sort-label"> Nomor Proposal </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="tanggal_proposal_penawaran">
|
||||
<span class="sort"> <span class="sort-label"> Tanggal Proposal </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="dokumen_persetujuan">
|
||||
<span class="sort"> <span class="sort-label"> Dokumen Persetujuan </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="biaya_final">
|
||||
<span class="sort"> <span class="sort-label"> Biaya Final </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="sla_resume">
|
||||
<span class="sort"> <span class="sort-label"> SLA Resume </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="sla_final">
|
||||
<span class="sort"> <span class="sort-label"> SLA Final </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="catatan">
|
||||
<span class="sort"> <span class="sort-label"> Catatan </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[50px] text-center" data-datatable-column="actions">Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('scripts')
|
||||
<script type="text/javascript">
|
||||
function prosesData(data) {
|
||||
Swal.fire({
|
||||
title: 'Persetujuan Penawaran',
|
||||
text: "Apakah Anda yakin ingin menyetujui data penawaran ini?",
|
||||
icon: 'info',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#3085d6',
|
||||
cancelButtonColor: '#d33',
|
||||
confirmButtonText: 'Ya',
|
||||
cancelButtonText: 'Tidak'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
window.location.href = `persetujuan-penawaran/${data}/edit`;
|
||||
} else if (result.dismiss==='cancel') {
|
||||
$.ajaxSetup({
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': '{{ csrf_token() }}'
|
||||
}
|
||||
});
|
||||
|
||||
$.ajax(`persetujuan-penawaran/${data}`, {
|
||||
type: 'GET',
|
||||
data: {'status': 'tender'}
|
||||
}).then((response) => {
|
||||
swal.fire('Success!', 'Data Persetujuan telah dikembalikan untuk di kaji ulang', 'success').then(() => {
|
||||
window.location.reload();
|
||||
});
|
||||
}).catch((error) => {
|
||||
console.error('Error:', error);
|
||||
Swal.fire('Error!', 'An error occurred while deleting the file.', 'error');
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
const element = document.querySelector('#persetujuan-penawaran-table');
|
||||
const searchInput = document.getElementById('search');
|
||||
|
||||
const apiUrl = element.getAttribute('data-api-url');
|
||||
const dataTableOptions = {
|
||||
apiEndpoint: apiUrl,
|
||||
pageSize: 5,
|
||||
columns: {
|
||||
select: {
|
||||
render: (item, data, context) => {
|
||||
const checkbox = document.createElement('input');
|
||||
checkbox.className = 'checkbox checkbox-sm';
|
||||
checkbox.type = 'checkbox';
|
||||
checkbox.value = data.id.toString();
|
||||
checkbox.setAttribute('data-datatable-row-check', 'true');
|
||||
return checkbox.outerHTML.trim();
|
||||
},
|
||||
},
|
||||
nomor_registrasi: {
|
||||
title: 'Nomor Registrasi',
|
||||
},
|
||||
nama_debitur: {
|
||||
title: 'Nama Debitur',
|
||||
render: (item, data) => {
|
||||
return `${data.debiture.name}`;
|
||||
},
|
||||
},
|
||||
nomor_proposal_penawaran: {
|
||||
title: 'Nomor Proposal',
|
||||
render: (item, data) => {
|
||||
return `${data.penawaran_tender.detail.no_proposal}`;
|
||||
},
|
||||
},
|
||||
tanggal_proposal_penawaran: {
|
||||
title: 'Tanggal Proposal',
|
||||
render: (item, data) => {
|
||||
return window.formatTanggalIndonesia(`${data.penawaran_tender.detail.tgl_proposal}`);
|
||||
},
|
||||
|
||||
},
|
||||
dokumen_persetujuan: {
|
||||
title: 'Dokumen Persetujuan',
|
||||
render: (item, data) => {
|
||||
if (data.penawaran_tender.detail.dokumen_persetujuan) {
|
||||
return `<a href="${data.penawaran_tender.detail.dokumen_persetujuan}" download="${data.penawaran_tender.detail.dokumen_persetujuan}" target="_blank" class="badge badge-sm badge-outline">
|
||||
Download <i class="ki-filled ki-cloud-download"></i>
|
||||
</a>`;
|
||||
} else {
|
||||
return 'Tidak ada dokumen';
|
||||
}
|
||||
},
|
||||
},
|
||||
biaya_final: {
|
||||
title: 'Biaya Final',
|
||||
render: (item, data) => {
|
||||
return window.formatRupiah(`${data.penawaran_tender.detail.biaya_penawaran}`);
|
||||
},
|
||||
},
|
||||
sla_resume: {
|
||||
title: 'SLA Resume',
|
||||
render: (item, data) => {
|
||||
if(data.penawaran_tender.persetujuan) {
|
||||
if (data.penawaran_tender.persetujuan.sla_resume) {
|
||||
return window.formatTanggalIndonesia(`${data.penawaran_tender.persetujuan.sla_resume}`);
|
||||
}
|
||||
}
|
||||
return '-';
|
||||
},
|
||||
},
|
||||
sla_final: {
|
||||
title: 'SLA Final',
|
||||
render: (item, data) => {
|
||||
if(data.penawaran_tender.persetujuan) {
|
||||
if (data.penawaran_tender.persetujuan.sla_final) {
|
||||
return window.formatTanggalIndonesia(`${data.penawaran_tender.persetujuan.sla_final}`);
|
||||
}
|
||||
}
|
||||
return '-';
|
||||
}
|
||||
},
|
||||
catatan: {
|
||||
title: 'Catatan',
|
||||
render: (item, data) => {
|
||||
if(data.penawaran_tender.persetujuan) {
|
||||
return data.penawaran_tender.persetujuan.catatan;
|
||||
}
|
||||
return '-';
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
title: 'Action',
|
||||
render: (item, data) => {
|
||||
return `<div class="flex flex-nowrap justify-center">
|
||||
<a class="btn btn-sm btn-outline btn-info" onclick="prosesData(${data.id})">
|
||||
<i class="ki-filled ki-double-check"></i>
|
||||
</a>
|
||||
</div>`;
|
||||
},
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
let dataTable = new KTDataTable(element, dataTableOptions);
|
||||
// Custom search functionality
|
||||
searchInput.addEventListener('input', function () {
|
||||
const searchValue = this.value.trim();
|
||||
dataTable.search(searchValue, true);
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
@@ -65,6 +65,9 @@
|
||||
<div class="card min-w-full">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">Data KJPP</h3>
|
||||
<button type="button" class="btn btn-sm btn-danger" id="{{$route[1]}}_toProsesPenawaran">
|
||||
<i class="ki-filled ki-wrench"></i>Penawaran Ulang
|
||||
</button>
|
||||
</div>
|
||||
<div class="card-table scrollable-x-auto">
|
||||
<table class="table table-border align-middle text-gray-700 font-medium text-sm">
|
||||
|
||||
@@ -128,6 +128,9 @@
|
||||
<div class="card min-w-full">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">Data KJPP</h3>
|
||||
<button type="button" class="btn btn-sm btn-danger" id="{{$route[1]}}_toPenawaranUlang">
|
||||
<i class="ki-filled ki-wrench"></i>Penawaran Ulang
|
||||
</button>
|
||||
</div>
|
||||
<div class="card-table scrollable-x-auto">
|
||||
<table class="table table-border align-middle text-gray-700 font-medium text-sm">
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
}
|
||||
|
||||
function updateData(id, kjpp_id, kjppName){
|
||||
// id => detail_penawaran.id
|
||||
removeErrorCssMsg();
|
||||
let no_proposal = $("#{{$route[1]}}_no_proposal_"+id).val();
|
||||
let tgl_proposal = $("#{{$route[1]}}_tgl_proposal_"+id).val();
|
||||
@@ -92,6 +93,7 @@
|
||||
}
|
||||
|
||||
function deleteData(data, kjppName) {
|
||||
// data => detail_penawaran.id
|
||||
Swal.fire({
|
||||
title: 'Are you sure?',
|
||||
text: "You won't be able to revert KJPP "+kjppName+"!",
|
||||
@@ -126,7 +128,7 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
Swal.fire('Error!', response.message.message_error_try_catch[0], 'error');
|
||||
Swal.fire('Error!', response.message.message_error[0], 'error');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
|
||||
function setTablesKJPP1(datas)
|
||||
{
|
||||
// value.id => detail_penawaran.id
|
||||
let i=1;
|
||||
$.each(datas, function(key, value){
|
||||
var kjppName = value.kjpp_code+' - '+value.kjpp_name;
|
||||
@@ -288,6 +289,65 @@
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// update status
|
||||
$("#{{$route[1]}}_toProsesPenawaran").click(function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
Swal.fire({
|
||||
title: ' ',
|
||||
text: "Yakin akan Penawaran ulang?",
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#3085d6',
|
||||
cancelButtonColor: '#d33',
|
||||
confirmButtonText: 'Yes'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed)
|
||||
{
|
||||
//define variable
|
||||
// $id ==> penawaran.id
|
||||
let token = "{{ csrf_token() }}";
|
||||
let noReg = $("#textReg").text();
|
||||
let useURL = "{{ route('otorisasitender.penawaran.penawaranulang',$id) }}";
|
||||
|
||||
var input_data = new Object();
|
||||
input_data._token = token;
|
||||
input_data.id = "{{ $id }}";
|
||||
input_data.noReg =noReg;
|
||||
// alert('url = ' + useURL);
|
||||
$.ajax({
|
||||
url: useURL,
|
||||
type: "PUT",
|
||||
cache: false,
|
||||
data: input_data,
|
||||
dataType: "json",
|
||||
success: function(response) {
|
||||
console.log(response);
|
||||
if('success' == response.status)
|
||||
{
|
||||
swal.fire('Sukses Penawaran ulang!', response.message.message_success[0], 'success').then(() => {
|
||||
var url = "{{ route('tender.prosespenawaran.index') }}";
|
||||
$(location).attr('href',url);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Swal.fire('Error!', response.message.message_error[0], 'error');
|
||||
}
|
||||
|
||||
},
|
||||
error: function(response, textStatus, errorThrown) {
|
||||
// var errors = response.responseJSON.errors;
|
||||
// console.log(errors);
|
||||
console.log(response);
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
@@ -147,5 +147,63 @@
|
||||
$('#{{$route[1]}}_kjpps1').append(new Option(stringVal, value.id));
|
||||
});
|
||||
}
|
||||
|
||||
// update status
|
||||
$("#{{$route[1]}}_toPenawaranUlang").click(function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
Swal.fire({
|
||||
title: ' ',
|
||||
text: "Yakin akan Penawaran ulang?",
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#3085d6',
|
||||
cancelButtonColor: '#d33',
|
||||
confirmButtonText: 'Yes'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed)
|
||||
{
|
||||
//define variable
|
||||
// $id ==> penawaran.id
|
||||
let token = "{{ csrf_token() }}";
|
||||
let noReg = $("#textReg").text();
|
||||
let useURL = "{{ route('otorisasitender.penawaran.penawaranulang',$id) }}";
|
||||
|
||||
var input_data = new Object();
|
||||
input_data._token = token;
|
||||
input_data.id = "{{ $id }}";
|
||||
input_data.noReg =noReg;
|
||||
// alert('url = ' + useURL);
|
||||
$.ajax({
|
||||
url: useURL,
|
||||
type: "PUT",
|
||||
cache: false,
|
||||
data: input_data,
|
||||
dataType: "json",
|
||||
success: function(response) {
|
||||
console.log(response);
|
||||
if('success' == response.status)
|
||||
{
|
||||
swal.fire('Sukses Penawaran ulang!', response.message.message_success[0], 'success').then(() => {
|
||||
var url = "{{ route('tender.prosespenawaran.index') }}";
|
||||
$(location).attr('href',url);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Swal.fire('Error!', response.message.message_error[0], 'error');
|
||||
}
|
||||
|
||||
},
|
||||
error: function(response, textStatus, errorThrown) {
|
||||
// var errors = response.responseJSON.errors;
|
||||
// console.log(errors);
|
||||
console.log(response);
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -36,18 +36,38 @@
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="code">
|
||||
<span class="sort"> <span class="sort-label"> Kode Penawaran </span>
|
||||
<span class="sort"> <span class="sort-label"> Nomor Penawaran </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="start_date">
|
||||
<th class="min-w-[150px]" data-datatable-column="tanggal_permohonan">
|
||||
<span class="sort"> <span class="sort-label"> Tanggal Permohonan </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="user_id">
|
||||
<span class="sort"> <span class="sort-label"> User Pemohon </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="branch_id">
|
||||
<span class="sort"> <span class="sort-label"> Cabang Pemohon </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="debitur_id">
|
||||
<span class="sort"> <span class="sort-label"> Debitur </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="date_range">
|
||||
<span class="sort"> <span class="sort-label"> Tanggal Penawaran </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="tujuan_penilaian_kjpp_id">
|
||||
<th class="min-w-[150px]" data-datatable-column="tujuan_penilaian_id">
|
||||
<span class="sort"> <span class="sort-label"> Tujuan Penilaian </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="nama_kjpp_sebelumnya">
|
||||
<th class="min-w-[150px]" data-datatable-column="tujuan_penilaian_kjpp_id">
|
||||
<span class="sort"> <span class="sort-label"> Tujuan Penilaian KJPP </span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<th class="min-w-[150px]" data-datatable-column="kjpp_data">
|
||||
<span class="sort"> <span class="sort-label">KJPP Data</span>
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
@@ -84,15 +104,6 @@
|
||||
var url = "{{ url('/') }}"+url1;
|
||||
$(location).attr('href',url);
|
||||
}
|
||||
|
||||
function formatTanggalIndonesia(dateString) {
|
||||
const date = new Date(dateString);
|
||||
const day = date.getDate().toString().padStart(2, '0');
|
||||
const monthNames = ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'];
|
||||
const month = monthNames[date.getMonth()];
|
||||
const year = date.getFullYear();
|
||||
return `${day} ${month} ${year}`;
|
||||
}
|
||||
</script>
|
||||
<script type="module">
|
||||
const element = document.querySelector('#spk-table');
|
||||
@@ -117,7 +128,7 @@
|
||||
title: 'Nomor Registrasi',
|
||||
},
|
||||
code: {
|
||||
title: 'Kode Penawaran',
|
||||
title: 'Nomor Penawaran',
|
||||
render: (item, data) => {
|
||||
if(data.penawaran) {
|
||||
return `${data.penawaran.code}`;
|
||||
@@ -126,16 +137,41 @@
|
||||
return '-';
|
||||
},
|
||||
},
|
||||
date_range: {
|
||||
title: 'Tanggal Penawaran',
|
||||
tanggal_permohonan: {
|
||||
title: 'Tanggal Permohonan',
|
||||
},
|
||||
user_id: {
|
||||
title: 'User Pemohon',
|
||||
render: (item, data) => {
|
||||
const startDate = formatTanggalIndonesia(data.penawaran.start_date);
|
||||
const endDate = formatTanggalIndonesia(data.penawaran.end_date);
|
||||
return `${startDate} - ${endDate}`;
|
||||
return `${data.user.name}`;
|
||||
},
|
||||
},
|
||||
tujuan_penilaian_kjpp_name: {
|
||||
branch_id: {
|
||||
title: 'Cabang Pemohon',
|
||||
render: (item, data) => {
|
||||
return `${data.branch.name}`;
|
||||
},
|
||||
},
|
||||
debitur_id: {
|
||||
title: 'Debitur',
|
||||
render: (item, data) => {
|
||||
if (data.debiture) {
|
||||
return `${data.debiture.name}`;
|
||||
}
|
||||
return "-";
|
||||
},
|
||||
},
|
||||
date_range: {
|
||||
title: 'Tanggal Penawaran'
|
||||
},
|
||||
tujuan_penilaian_id: {
|
||||
title: 'Tujuan Penilaian',
|
||||
render: (item, data) => {
|
||||
return `${data.tujuan_penilaian.name}`;
|
||||
},
|
||||
},
|
||||
tujuan_penilaian_kjpp_id: {
|
||||
title: 'Tujuan Penilaian KJPP',
|
||||
render: (item, data) => {
|
||||
if(data.penawaran.tujuan_penilaian_kjpp) {
|
||||
return `${data.penawaran.tujuan_penilaian_kjpp.name}`;
|
||||
@@ -144,7 +180,7 @@
|
||||
return '-';
|
||||
},
|
||||
},
|
||||
nama_kjpp_sebelumnya: {
|
||||
kjpp_data: {
|
||||
title: 'Nama KJPP Terpilih',
|
||||
render: (item, data) => {
|
||||
return `${data.penawaran.nama_kjpp_sebelumnya}`+'<br />'
|
||||
|
||||
@@ -494,7 +494,6 @@ Breadcrumbs::for('basicdata.createData', function (BreadcrumbTrail $trail, $type
|
||||
$trail->parent('basicdata');
|
||||
|
||||
if ($type) {
|
||||
|
||||
$title = $basicDataRoutes[$type] ?? ucwords(str_replace('-', ' ', $type));
|
||||
$trail->push("Tambah $title");
|
||||
} else {
|
||||
@@ -507,7 +506,6 @@ Breadcrumbs::for('basicdata.editData', function (BreadcrumbTrail $trail, $type =
|
||||
$trail->parent('basicdata');
|
||||
|
||||
if ($type) {
|
||||
|
||||
$title = $basicDataRoutes[$type] ?? ucwords(str_replace('-', ' ', $type));
|
||||
$trail->push("Edit $title");
|
||||
} else {
|
||||
@@ -526,13 +524,11 @@ $otorisatorSurveyor = [
|
||||
|
||||
foreach ($otorisatorSurveyor as $route => $title) {
|
||||
Breadcrumbs::for("otorisator.{$route}", function (BreadcrumbTrail $trail) use ($route, $title) {
|
||||
|
||||
$trail->push($title, route("otorisator.{$route}.index"));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
Breadcrumbs::for('laporan', function (BreadcrumbTrail $trail) {
|
||||
$trail->push('Laporan', route('laporan.sederhana.index'));
|
||||
});
|
||||
@@ -576,5 +572,15 @@ Breadcrumbs::for('sla', function (BreadcrumbTrail $trail) {
|
||||
$trail->push('SLA', route('basicdata.sla.index'));
|
||||
});
|
||||
|
||||
|
||||
Breadcrumbs::for('persetujuan-penawaran', function (BreadcrumbTrail $trail) {
|
||||
$trail->push('Persetujuan Penawaran', route('persetujuan-penawaran.index'));
|
||||
});
|
||||
|
||||
Breadcrumbs::for('persetujuan-penawaran.edit', function (BreadcrumbTrail $trail) {
|
||||
$trail->parent('persetujuan-penawaran');
|
||||
$trail->push('Proses Persetujuan Penawaran');
|
||||
});
|
||||
|
||||
// add andy
|
||||
require __DIR__ . '/breadcrumbs_registrasi.php';
|
||||
|
||||
@@ -96,6 +96,9 @@ Route::middleware(['auth'])->group(function () {
|
||||
|
||||
// update KJPP data, detail penawaran
|
||||
Route::put('/otorisasiPenawaranKJPP/{penawaran}', 'otorisasiPenawaranKJPP')->name('penawaran.otorisasiPenawaranKJPP');
|
||||
|
||||
// revisi penawaran ulang
|
||||
Route::put('/penawaranulang/{penawaranulang}', 'penawaranulang')->name('penawaran.penawaranulang');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
126
routes/web.php
126
routes/web.php
@@ -1,36 +1,38 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Modules\Lpj\Http\Controllers\SLAController;
|
||||
use Modules\Lpj\Http\Controllers\KJPPController;
|
||||
use Modules\Lpj\Http\Controllers\TeamsController;
|
||||
use Modules\Lpj\Http\Controllers\RegionController;
|
||||
use Modules\Lpj\Http\Controllers\ResumeController;
|
||||
use Modules\Lpj\Http\Controllers\TenderController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanController;
|
||||
use Modules\Lpj\Http\Controllers\PenilaiController;
|
||||
use Modules\Lpj\Http\Controllers\ActivityController;
|
||||
use Modules\Lpj\Http\Controllers\DebitureController;
|
||||
use Modules\Lpj\Http\Controllers\SurveyorController;
|
||||
use Modules\Lpj\Http\Controllers\IjinUsahaController;
|
||||
use Modules\Lpj\Http\Controllers\PenilaianController;
|
||||
use Modules\Lpj\Http\Controllers\PermohonanController;
|
||||
use Modules\Lpj\Http\Controllers\JenisDokumenController;
|
||||
use Modules\Lpj\Http\Controllers\JenisJaminanController;
|
||||
use Modules\Lpj\Http\Controllers\JenisLaporanController;
|
||||
use Modules\Lpj\Http\Controllers\NilaiPlafondController;
|
||||
use Modules\Lpj\Http\Controllers\ArahMataAnginController;
|
||||
use Modules\Lpj\Http\Controllers\DebitureController;
|
||||
use Modules\Lpj\Http\Controllers\DokumenJaminanController;
|
||||
use Modules\Lpj\Http\Controllers\JenisPenilaianController;
|
||||
use Modules\Lpj\Http\Controllers\PemilikJaminanController;
|
||||
use Modules\Lpj\Http\Controllers\TujuanPenilaianController;
|
||||
use Modules\Lpj\Http\Controllers\StatusPermohonanController;
|
||||
use Modules\Lpj\Http\Controllers\TujuanPenilaianKJPPController;
|
||||
use Modules\Lpj\Http\Controllers\JenisFasilitasKreditController;
|
||||
use Modules\Lpj\Http\Controllers\JenisLegalitasJaminanController;
|
||||
// use Modules\Lpj\Http\Controllers\ActivityController;
|
||||
use Modules\Lpj\Http\Controllers\HubunganPemilikJaminanController;
|
||||
use Modules\Lpj\Http\Controllers\HubunganPenghuniJaminanController;
|
||||
use Modules\Lpj\Http\Controllers\IjinUsahaController;
|
||||
use Modules\Lpj\Http\Controllers\JenisDokumenController;
|
||||
use Modules\Lpj\Http\Controllers\JenisFasilitasKreditController;
|
||||
use Modules\Lpj\Http\Controllers\JenisJaminanController;
|
||||
use Modules\Lpj\Http\Controllers\JenisLaporanController;
|
||||
use Modules\Lpj\Http\Controllers\JenisLegalitasJaminanController;
|
||||
use Modules\Lpj\Http\Controllers\JenisPenilaianController;
|
||||
use Modules\Lpj\Http\Controllers\KJPPController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanController;
|
||||
use Modules\Lpj\Http\Controllers\NilaiPlafondController;
|
||||
use Modules\Lpj\Http\Controllers\PemilikJaminanController;
|
||||
use Modules\Lpj\Http\Controllers\PenilaianController;
|
||||
use Modules\Lpj\Http\Controllers\PenilaiController;
|
||||
use Modules\Lpj\Http\Controllers\PermohonanController;
|
||||
use Modules\Lpj\Http\Controllers\PersetujuanPenawaranController;
|
||||
use Modules\Lpj\Http\Controllers\RegionController;
|
||||
use Modules\Lpj\Http\Controllers\ResumeController;
|
||||
use Modules\Lpj\Http\Controllers\SLAController;
|
||||
use Modules\Lpj\Http\Controllers\StatusPermohonanController;
|
||||
use Modules\Lpj\Http\Controllers\SurveyorController;
|
||||
use Modules\Lpj\Http\Controllers\TeamsController;
|
||||
use Modules\Lpj\Http\Controllers\TenderController;
|
||||
use Modules\Lpj\Http\Controllers\TujuanPenilaianController;
|
||||
use Modules\Lpj\Http\Controllers\TujuanPenilaianKJPPController;
|
||||
|
||||
// use Modules\Lpj\Http\Controllers\ActivityController;
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -66,7 +68,8 @@ Route::middleware(['auth'])->group(function () {
|
||||
Route::resource('jenis-legalitas-jaminan', JenisLegalitasJaminanController::class);
|
||||
|
||||
Route::name('jenis-jaminan.')->prefix('jenis-jaminan')->group(function () {
|
||||
Route::get('legalitas/{id}/{jenisJaminanId}', [DokumenJaminanController::class, 'getLegalitasJaminan'])->name('legalitas');
|
||||
Route::get('legalitas/{id}/{jenisJaminanId}', [DokumenJaminanController::class, 'getLegalitasJaminan'])
|
||||
->name('legalitas');
|
||||
Route::get('restore/{id}', [JenisJaminanController::class, 'restore'])->name('restore');
|
||||
Route::get('datatables', [JenisJaminanController::class, 'dataForDatatables'])->name('datatables');
|
||||
Route::get('export', [JenisJaminanController::class, 'export'])->name('export');
|
||||
@@ -263,7 +266,9 @@ Route::middleware(['auth'])->group(function () {
|
||||
// End Activity Jenis Laporan route
|
||||
|
||||
// basic data surveyor
|
||||
Route::get('datatablesSurveyory/{type}', [SurveyorController::class, 'dataForDatatablesData'])->name('datatablesSurveyory');
|
||||
Route::get('datatablesSurveyory/{type}', [SurveyorController::class, 'dataForDatatablesData'])->name(
|
||||
'datatablesSurveyory',
|
||||
);
|
||||
Route::get('createData/{type}', [SurveyorController::class, 'createData'])->name('createData');
|
||||
Route::get('/{type}/{id}', [SurveyorController::class, 'editData'])->name('editData');
|
||||
Route::post('storeData/{type}', [SurveyorController::class, 'storeData'])->name('storeData');
|
||||
@@ -309,9 +314,7 @@ Route::middleware(['auth'])->group(function () {
|
||||
];
|
||||
|
||||
foreach ($headers as $type => $header) {
|
||||
Route::get($type, [SurveyorController::class, 'data'])
|
||||
->name($type . '.index')
|
||||
->defaults('type', $type);
|
||||
Route::get($type, [SurveyorController::class, 'data'])->name($type . '.index')->defaults('type', $type);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -320,7 +323,6 @@ Route::middleware(['auth'])->group(function () {
|
||||
Route::get('datatables', [DebitureController::class, 'dataForDatatables'])->name('datatables');
|
||||
Route::get('export', [DebitureController::class, 'export'])->name('export');
|
||||
|
||||
|
||||
Route::name('jaminan.')->prefix('{id}/jaminan')->group(function () {
|
||||
Route::get('download', [DokumenJaminanController::class, 'download'])->name('download');
|
||||
Route::get('bulk-download', [DokumenJaminanController::class, 'bulkDownload'])->name('bulk.download');
|
||||
@@ -402,18 +404,33 @@ Route::middleware(['auth'])->group(function () {
|
||||
'penawaran.datatables',
|
||||
);
|
||||
Route::get('penawaran/{noreg}/suratTender', [TenderController::class, 'showSuratTender'])->name(
|
||||
'penawaran.showSuratTender'
|
||||
'penawaran.showSuratTender',
|
||||
);
|
||||
Route::get('penawaran/{noreg}/suratTender/downloadpdf', [TenderController::class, 'downloadSuratTender'])->name('penawaran.downloadSuratTender');
|
||||
Route::get('penawaran/{noreg}/suratTender/downloadpdf', [TenderController::class, 'downloadSuratTender'])
|
||||
->name('penawaran.downloadSuratTender');
|
||||
// Kirim Email Penawaran
|
||||
Route::get('penawaran/{noreg}/showKirimEmail', [TenderController::class, 'showKirimEmail'])->name('penawaran.showKirimEmail');
|
||||
Route::get('penawaran/{noreg}/kirimEmailAll', [TenderController::class, 'kirimEmailAll'])->name('penawaran.kirimEmailAll');
|
||||
Route::get('penawaran/{noreg}/suratTenderKJPP/{id}', [TenderController::class, 'suratTenderKJPP'])->name('penawaran.suratTenderKJPP');
|
||||
Route::get('penawaran/{noreg}/suratTenderKJPP/{id}/kirimEmailKJPP', [TenderController::class, 'kirimEmailKJPP'])->name('penawaran.kirimEmailKJPP');
|
||||
Route::get('penawaran/suratTenderShow/{noreg}/datatables', [TenderController::class, 'dataTablesShowKirimSurat'])->name('penawaran.showKirimSurat.datatables');
|
||||
Route::get('penawaran/{noreg}/showKirimEmail', [TenderController::class, 'showKirimEmail'])->name(
|
||||
'penawaran.showKirimEmail',
|
||||
);
|
||||
Route::get('penawaran/{noreg}/kirimEmailAll', [TenderController::class, 'kirimEmailAll'])->name(
|
||||
'penawaran.kirimEmailAll',
|
||||
);
|
||||
Route::get('penawaran/{noreg}/suratTenderKJPP/{id}', [TenderController::class, 'suratTenderKJPP'])->name(
|
||||
'penawaran.suratTenderKJPP',
|
||||
);
|
||||
Route::get(
|
||||
'penawaran/{noreg}/suratTenderKJPP/{id}/kirimEmailKJPP',
|
||||
[TenderController::class, 'kirimEmailKJPP'],
|
||||
)->name('penawaran.kirimEmailKJPP');
|
||||
Route::get(
|
||||
'penawaran/suratTenderShow/{noreg}/datatables',
|
||||
[TenderController::class, 'dataTablesShowKirimSurat'],
|
||||
)->name('penawaran.showKirimSurat.datatables');
|
||||
// Download Surat Tender KJPP
|
||||
Route::get('penawaran/{noreg}/suratTenderKJPP/{id}/downloadSuratTenderKJPP', [TenderController::class, 'downloadSuratTenderKJPP'])
|
||||
->name('penawaran.downloadSuratTenderKJPP');
|
||||
Route::get(
|
||||
'penawaran/{noreg}/suratTenderKJPP/{id}/downloadSuratTenderKJPP',
|
||||
[TenderController::class, 'downloadSuratTenderKJPP'],
|
||||
)->name('penawaran.downloadSuratTenderKJPP');
|
||||
|
||||
// Penawaran Ulang
|
||||
Route::get('penawaran/ulang', [TenderController::class, 'penawaran_ulang_index'])->name(
|
||||
@@ -455,7 +472,9 @@ Route::middleware(['auth'])->group(function () {
|
||||
|
||||
Route::name('progres.')->prefix('progres')->group(function () {
|
||||
Route::get('/', [ActivityController::class, 'progres_activity'])->name('index');
|
||||
Route::get('/datatables/{id}', [ActivityController::class, 'dataTablesForActivity'])->name('datatables');
|
||||
Route::get('/datatables/{id}', [ActivityController::class, 'dataTablesForActivity'])->name(
|
||||
'datatables',
|
||||
);
|
||||
});
|
||||
|
||||
Route::get('/teams/{regionId}', [ActivityController::class, 'dataTablesForActivity']);
|
||||
@@ -467,16 +486,26 @@ Route::middleware(['auth'])->group(function () {
|
||||
|
||||
|
||||
Route::name('otorisator.')->prefix('otorisator')->group(function () {
|
||||
Route::get('pelaporan', [PenilaianController::class, 'otorisator'])->name('pelaporan.index')->defaults('type', 'pelaporan');
|
||||
Route::get('pembayaran', [PenilaianController::class, 'otorisator'])->name('pembayaran.index')->defaults('type', 'pembayaran');
|
||||
Route::get('pembatalan', [PenilaianController::class, 'otorisator'])->name('pembatalan.index')->defaults('type', 'pembatalan');
|
||||
Route::get('pelaporan', [PenilaianController::class, 'otorisator'])->name('pelaporan.index')->defaults(
|
||||
'type',
|
||||
'pelaporan',
|
||||
);
|
||||
Route::get('pembayaran', [PenilaianController::class, 'otorisator'])->name('pembayaran.index')->defaults(
|
||||
'type',
|
||||
'pembayaran',
|
||||
);
|
||||
Route::get('pembatalan', [PenilaianController::class, 'otorisator'])->name('pembatalan.index')->defaults(
|
||||
'type',
|
||||
'pembatalan',
|
||||
);
|
||||
Route::get('sla', [PenilaianController::class, 'otorisator'])->name('sla.index')->defaults('type', 'sla');
|
||||
Route::get('/datatables/{otorisator}', [PenilaianController::class, 'dataForAuthorization'])->name('datatables');
|
||||
Route::get('/datatables/{otorisator}', [PenilaianController::class, 'dataForAuthorization'])->name(
|
||||
'datatables',
|
||||
);
|
||||
Route::get('show/{id}', [PenilaianController::class, 'show'])->name('show');
|
||||
});
|
||||
|
||||
|
||||
|
||||
Route::name('surveyor.')->prefix('surveyor')->group(function () {
|
||||
Route::get('/', [SurveyorController::class, 'index'])->name('index');
|
||||
Route::get('{id}/show', [SurveyorController::class, 'show'])->name('show');
|
||||
@@ -508,6 +537,11 @@ Route::middleware(['auth'])->group(function () {
|
||||
|
||||
|
||||
});
|
||||
|
||||
Route::get('persetujuan-penawaran/datatables', [PersetujuanPenawaranController::class, 'dataForDatatables'])
|
||||
->name('persetujuan-penawaran.datatables');
|
||||
|
||||
Route::resource('persetujuan-penawaran', PersetujuanPenawaranController::class);
|
||||
});
|
||||
|
||||
require __DIR__ . '/registrasi.php';
|
||||
|
||||
@@ -1,26 +1,4 @@
|
||||
import {defineConfig} from 'vite';
|
||||
import laravel from 'laravel-vite-plugin';
|
||||
|
||||
export default defineConfig({
|
||||
build: {
|
||||
outDir: '../../public/build-lpj',
|
||||
emptyOutDir: true,
|
||||
manifest: true,
|
||||
},
|
||||
plugins: [
|
||||
laravel({
|
||||
publicDirectory: '../../public',
|
||||
buildDirectory: 'build-lpj',
|
||||
input: [
|
||||
__dirname + '/resources/assets/sass/app.scss',
|
||||
__dirname + '/resources/assets/js/app.js'
|
||||
],
|
||||
refresh: true,
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
//export const paths = [
|
||||
// 'Modules/Lpj/resources/assets/sass/app.scss',
|
||||
// 'Modules/Lpj/resources/assets/js/app.js',
|
||||
//];
|
||||
export const paths = [
|
||||
"Modules/Lpj/resources/assets/sass/app.scss",
|
||||
"Modules/Lpj/resources/assets/js/app.js",
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user