fix: perbaikkan tampilan dan print out lpj setalah migrate db old ke db new

This commit is contained in:
majid
2025-05-05 10:13:09 +07:00
parent bf7e6275e3
commit 3853b5d6eb
28 changed files with 525 additions and 404 deletions

View File

@@ -28,7 +28,7 @@ function formatTanggalIndonesia($date, $time = false)
} catch (\Throwable $e) { } catch (\Throwable $e) {
return $date; return $date;
} }
} }
@@ -562,3 +562,31 @@ function ubahNomorHp($nomorHp) {
return "Nomor HP tidak valid"; return "Nomor HP tidak valid";
} }
} }
function parsePembandingMigration($keterangan) {
$keterangan = preg_replace('/[-]{5,}/', '',$keterangan); // Hapus ------
$keterangan = preg_replace('/[.]{5,}/', '',$keterangan); // Hapus .....
$keterangan = preg_replace('/\s+/', ' ',$keterangan);
$keterangan = preg_replace('/\s*\n\s*/', "\n",$keterangan);
// Pecah teks per baris untuk diproses
$lines = explode("\n",$keterangan);
$cleaned = [];
foreach ($lines as $line) {
$line = trim($line);
if (!empty($line)) {
// Format angka dalam format Rp. 123.456.789
$line = preg_replace_callback('/Rp\.\s*([\d.,]+)/', function($matches) {
$angka = str_replace(['.', ','], '', $matches[1]);
return 'Rp. ' . number_format((int)$angka, 0, ',', '.');
}, $line);
$cleaned[] = $line;
}
}
return implode("\n", $cleaned);
}

View File

@@ -306,6 +306,7 @@ class ActivityController extends Controller
$query = Permohonan::query(); $query = Permohonan::query();
// Apply search filter if provided // Apply search filter if provided
$query = $query->orderBy('nomor_registrasi', 'desc');
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search'); $search = $request->get('search');
$query->where(function ($q) use ($search) { $query->where(function ($q) use ($search) {
@@ -324,7 +325,9 @@ class ActivityController extends Controller
}); });
} }
// Default sorting if no sort provided
// Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder'); $order = $request->get('sortOrder');
$column = $request->get('sortField'); $column = $request->get('sortField');
@@ -333,20 +336,13 @@ class ActivityController extends Controller
$query->orderBy('nomor_registrasi', 'asc'); $query->orderBy('nomor_registrasi', 'asc');
} }
// Get total count of records before pagination // Get the total count of records
$totalRecords = $query->count(); $totalRecords = $query->count();
$size = $request->get('size', 10);
// Pagination if ($size == 0) {
if ($request->has('page') && $request->has('size')) { $size = 10;
$page = (int) $request->get('page', 1);
$size = (int) $request->get('size', 10);
$offset = ($page - 1) * $size;
$query->skip($offset)->take($size);
} }
// Get filtered count
$filteredRecords = $query->count();
// Filter by region if user is senior-officer // Filter by region if user is senior-officer
if ($regionId) { if ($regionId) {
$query->whereHas('region', function ($q) use ($regionId) { $query->whereHas('region', function ($q) use ($regionId) {
@@ -361,37 +357,36 @@ class ActivityController extends Controller
}); });
} }
$totalRecords = $query->count();
// Pagination
// Apply pagination if provided
if ($request->has('page') && $request->has('size')) { if ($request->has('page') && $request->has('size')) {
$page = (int) $request->get('page', 1); $page = $request->get('page');
$size = (int) $request->get('size', 10); $size = $request->get('size');
$offset = ($page - 1) * $size; $offset = ($page - 1) * $size; // Calculate the offset
$query->skip($offset)->take($size); $query->skip($offset)->take($size);
} }
// Get filtered count // Get the filtered count of records
$filteredRecords = $query->count(); $filteredRecords = $query->count();
// Get data with necessary relationships // Get data with necessary relationships
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan','nilaiPlafond'])->get(); $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan','nilaiPlafond'])->get();
// Calculate total pages // Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size', 10)); $pageCount = ceil($totalRecords / $size);
// Calculate the current page number
$currentPage = max(1, $request->get('page', 1));
// Return the response data as a JSON object
// Calculate total pages
$pageCount = ceil($totalRecords / $request->get('size', 10));
return response()->json([ return response()->json([
'draw' => $request->get('draw'), 'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords, 'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords, 'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount, 'pageCount' => $pageCount,
'page' => $request->get('page', 1), 'page' => $currentPage,
'totalCount' => $totalRecords, 'totalCount' => $totalRecords,
'data' => $data, 'data' => $data,
]); ]);

View File

@@ -406,7 +406,9 @@
// Remove values from $legalitasJaminan that are in $currentLegalitasJaminan // Remove values from $legalitasJaminan that are in $currentLegalitasJaminan
$legalitasJaminan = array_diff($legalitasJaminan, $currentLegalitasJaminan->pluck('code')->toArray()); $legalitasJaminan = is_array($legalitasJaminan)
? array_diff($legalitasJaminan, $currentLegalitasJaminan->pluck('code')->toArray())
: [];
$legalitas = JenisLegalitasJaminan::whereIn('code', $legalitasJaminan)->get(); $legalitas = JenisLegalitasJaminan::whereIn('code', $legalitasJaminan)->get();
} }

View File

@@ -93,7 +93,7 @@ class LaporanPenilaiJaminanController extends Controller
// dd($startDate); // dd($startDate);
// Retrieve data from the database // Retrieve data from the database
$query = Permohonan::query(); $query = Permohonan::query();
$query = $query->orderBy('nomor_registrasi', 'desc');
// Apply search filter if provided // Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search'); $search = $request->get('search');
@@ -107,7 +107,7 @@ class LaporanPenilaiJaminanController extends Controller
->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%') ->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%')
->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); ->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
if (!empty($paramsSearch->tanggal_awal) && !empty($paramsSearch->tanggal_akhir)) { if (!empty($paramsSearch->tanggal_awal) && !empty($paramsSearch->tanggal_akhir)) {
$q->whereBetween('tanggal_permohonan', [$paramsSearch->tanggal_awal, $paramsSearch->tanggal_akhir]); $q->whereBetween('tanggal_permohonan', [$paramsSearch->tanggal_awal, $paramsSearch->tanggal_akhir]);
} }
@@ -122,62 +122,50 @@ class LaporanPenilaiJaminanController extends Controller
// Default sorting if no sort provided // Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder'); $order = $request->get('sortOrder');
$column = $request->get('sortField'); $column = $request->get('sortField');
$query->orderBy($column, $order); $query->orderBy($column, $order);
} else {
$query->orderBy('nomor_registrasi', 'asc');
} }
// Get total count of records before pagination
$totalRecords = $query->count();
// Pagination // Get the total count of records
$totalRecords = $query->count();
$size = $request->get('size', 10);
if ($size == 0) {
$size = 10;
}
// Apply pagination if provided
if ($request->has('page') && $request->has('size')) { if ($request->has('page') && $request->has('size')) {
$page = (int) $request->get('page', 1); $page = $request->get('page');
$size = (int) $request->get('size', 10); $size = $request->get('size');
$offset = ($page - 1) * $size; $offset = ($page - 1) * $size; // Calculate the offset
$query->skip($offset)->take($size); $query->skip($offset)->take($size);
} }
// Get filtered count // Get the filtered count of records
$filteredRecords = $query->count(); $filteredRecords = $query->count();
$totalRecords = $query->count();
// Pagination
if ($request->has('page') && $request->has('size')) {
$page = (int) $request->get('page', 1);
$size = (int) $request->get('size', 10);
$offset = ($page - 1) * $size;
$query->skip($offset)->take($size);
}
// Get filtered count
$filteredRecords = $query->count();
// Get data with necessary relationships // Get data with necessary relationships
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai'])->get(); $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai'])->get();
// Calculate total pages // Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size', 10)); $pageCount = ceil($totalRecords / $size);
// Calculate the current page number
$currentPage = max(1, $request->get('page', 1));
// Return the response data as a JSON object
// Calculate total pages
$pageCount = ceil($totalRecords / $request->get('size', 10));
return response()->json([ return response()->json([
'draw' => $request->get('draw'), 'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords, 'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords, 'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount, 'pageCount' => $pageCount,
'page' => $request->get('page', 1), 'page' => $currentPage,
'totalCount' => $totalRecords, 'totalCount' => $totalRecords,
'data' => $data, 'data' => $data,
]); ]);

View File

@@ -12,10 +12,34 @@ class MasterDataSurveyorSeeder extends Seeder
public function run(): void public function run(): void
{ {
$nameTable =[ $nameTable = [
'faasilitas' 'fasilitas_objek',
] 'gol_mas_sekitar',
'jenis_bangunan',
'jenis_kapal',
'jenis_kendaraan',
'jenis_pesawat',
'kondisi_bangunan',
'kondisi_fisik_tanah',
'kontur_tanah',
'lalu_lintas_lokasi',
'lantai',
'merupakan_daerah',
'perkerasan_jalan',
'sifat_bangunan',
'model_alat_berat',
'posisi_kavling',
'posisi_unit',
'tingkat_keramaian',
'sarana_pelengkap',
'spek_kategori_bangunan',
'spek_bangunan',
'terletak_diarea',
'view_unit'
];
DB::unprepared(file_get_contents(__DIR__ . '/sql/teams.sql')); foreach ($nameTable as $table) {
DB::unprepared(file_get_contents(__DIR__ . '/sql/' . $table . '.sql'));
}
} }
} }

View File

@@ -12,17 +12,17 @@ use Modules\Lpj\Models\Permohonan;
class MigrationPembandingSeeder extends Seeder class MigrationPembandingSeeder extends Seeder
{ {
protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_penilai_pembanding_error_2.csv'; protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_penilai_pembanding_error.csv';
/** /**
* Run the database seeds. * Run the database seeds.
*/ */
public function run() public function run()
{ {
// Path ke file csv // Path ke file csv
$filePath = realpath(__DIR__ . '/csv/inspeksi/mig_penilai_pembanding_2.csv'); $filePath = realpath(__DIR__ . '/csv/inspeksi/mig_penilai_pembanding.csv');
if (!$filePath) { if (!$filePath) {
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_penilai_pembanding_2.csv'); Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_penilai_pembanding.csv');
$this->command->error('File csv tidak ditemukan.'); $this->command->error('File csv tidak ditemukan.');
return; return;
} }
@@ -141,9 +141,10 @@ class MigrationPembandingSeeder extends Seeder
// Pastikan kolom penting tersedia // Pastikan kolom penting tersedia
$urutan = (int)($row['mig_urutan'] ?? 999); $urutan = (int)($row['mig_urutan'] ?? 999);
$sumber = trim($row['mig_keterangan'] ?? ''); $sumber = trim($row['mig_keterangan'] ?? '');
$pembanding = trim($row['mig_pembanding'] ?? '');
$linkGambar = trim($row['mig_path'] ?? ''); $linkGambar = trim($row['mig_path'] ?? '');
if (empty($sumber) || empty($linkGambar)) { if (empty($pembanding) || empty($linkGambar)) {
continue; continue;
} }
@@ -151,6 +152,7 @@ class MigrationPembandingSeeder extends Seeder
$pembandingList[] = [ $pembandingList[] = [
'urutan' => $urutan, 'urutan' => $urutan,
'sumber' => $sumber, 'sumber' => $sumber,
'keterangan' => $pembanding,
'foto_objek' => $linkGambar 'foto_objek' => $linkGambar
]; ];
} }

View File

@@ -38,7 +38,7 @@
Pemohon: Pemohon:
</h3> </h3>
<span class="text-2sm text-gray-700"> <span class="text-2sm text-gray-700">
{{ $permohonan->user->nik }} | {{ $permohonan->user->name }} | {{ $permohonan->user->branch->name }} {{ $permohonan->user->nik ?? '' }} | {{ $permohonan->user->name ?? '' }} | {{ $permohonan->user->branch->name ?? '' }}
</span> </span>
</div> </div>

View File

@@ -46,7 +46,7 @@
Pemohon: Pemohon:
</h3> </h3>
<span class="text-2sm text-gray-700"> <span class="text-2sm text-gray-700">
{{ $permohonan->user->nik }} | {{ $permohonan->user->name }} | {{ $permohonan->user->branch->name }} {{ $permohonan->user->nik ?? '' }} | {{ $permohonan->user->name ?? '' }} | {{ $permohonan->user->branch->name ?? '' }}
</span> </span>
</div> </div>
@@ -84,7 +84,7 @@
Nilai Plafond: Nilai Plafond:
</h3> </h3>
<span class="text-2sm text-gray-700"> <span class="text-2sm text-gray-700">
{{ $permohonan->nilaiPlafond->name }} {{ $permohonan->nilaiPlafond->name ?? '' }}
</span> </span>
</div> </div>
@@ -293,7 +293,7 @@
<tr> <tr>
<td> <td>
<span class="text-2xs text-gray-600 uppercase pl-3"> <span class="text-2xs text-gray-600 uppercase pl-3">
{{ $loop->index+1 }}. Nomor : {{ $dokumen_nomor[$index] }} {{ $loop->index+1 }}. Nomor : {{ $dokumen_nomor[$index] ?? '' }}
</span> </span>
</td> </td>
<td class="text-left"> <td class="text-left">

View File

@@ -17,7 +17,7 @@
@foreach ($value as $key => $item) @foreach ($value as $key => $item)
@if (!empty($item)) @if (!empty($item))
<tr> <tr>
<td style="padding: 2px;"> <td style="padding: 2px;" style="width:25%;">
{{ formatLabel($key) }} {{ formatLabel($key) }}
</td> </td>
<td style="width:1%; padding: 2px; vertical-align: top;">:</td> <td style="width:1%; padding: 2px; vertical-align: top;">:</td>

View File

@@ -95,7 +95,7 @@
@foreach($dokumen_jaminan as $index => $dokumen) @foreach($dokumen_jaminan as $index => $dokumen)
<div class="flex items-center justify-between flex-wrap my-2.5 gap-2"> <div class="flex items-center justify-between flex-wrap my-2.5 gap-2">
<span class="text-2xs text-gray-600 uppercase pl-3"> <span class="text-2xs text-gray-600 uppercase pl-3">
{{ $loop->index+1 }}. Nomor : {{ $dokumen_nomor[$index] }} {{ $loop->index+1 }}. Nomor : {{ $dokumen_nomor[$index] ?? '' }}
</span> </span>
<div> <div>
@if(in_array(Auth::user()->roles[0]->name,['administrator','pemohon-eo'])) @if(in_array(Auth::user()->roles[0]->name,['administrator','pemohon-eo']))

View File

@@ -157,11 +157,7 @@
<span class="sort-icon"></span> <span class="sort-icon"></span>
</span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tujuan_penilaian_id">
<span class="sort"><span class="sort-label">Jenis Jaminan</span>
<span class="sort-icon"></span>
</span>
</th>
<th class="min-w-[150px]" data-datatable-column="laporan"> <th class="min-w-[150px]" data-datatable-column="laporan">
<span class="sort"><span class="sort-label">Laporan</span> <span class="sort"><span class="sort-label">Laporan</span>
<span class="sort-icon"></span> <span class="sort-icon"></span>
@@ -265,13 +261,7 @@
`${data.tujuan_penilaian.name}` : '-'; `${data.tujuan_penilaian.name}` : '-';
}, },
}, },
jenis_jaminan_id: {
title: 'Jenis Jaminan',
render: (item, data) => {
const jenisJaminan = data.dokumenjaminan.map(d => d.jenis_jaminan.name).join(', ');
return jenisJaminan || '-';
}
},
laporan: { laporan: {
title: 'Status', title: 'Status',
render: (item, data) => { render: (item, data) => {

View File

@@ -37,7 +37,15 @@
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="hidden" name="debiture_id" value="{{ $debitur->id ?? '' }}"> <input type="hidden" name="debiture_id" value="{{ $debitur->id ?? '' }}">
<p class="text-base text-gray-700">{{ $debitur->name }} | {{ $debitur->address.', '.$debitur->village->name.', '.$debitur->city->name.', '.$debitur->province->name.', '.$debitur->postal_code }}</p> <p class="text-base text-gray-700">
{{ $debitur->name ?? '' }} | {{ $debitur->address ?? '' }}
{{ $debitur->village?->name ?? '' }}
{{ $debitur->city?->name ?? '' }}
{{ $debitur->province?->name ?? '' }}
{{ $debitur->country?->name ?? '' }},
{{ $debitur->postal_code ?? '' }}
</p>
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">

View File

@@ -34,6 +34,7 @@
</td> </td>
</tr> </tr>
@if (!empty($forminspeksi['fakta']['keterangan'])) @if (!empty($forminspeksi['fakta']['keterangan']))
<tr> <tr>
<td width="25%" style="vertical-align: top;">Catatan yang Perlu <td width="25%" style="vertical-align: top;">Catatan yang Perlu
@@ -56,6 +57,7 @@
</table> </table>
@endif @endif
</td> </td>
</tr> </tr>
@endif @endif
</table> </table>

View File

@@ -35,41 +35,50 @@
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $lingkungan['lebar_perkerasan_jalan'] ?? '-' }} m</td> <td style="padding: 2px; vertical-align: top;">{{ $lingkungan['lebar_perkerasan_jalan'] ?? '-' }} m</td>
</tr> </tr>
{{-- mulai --}}
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Perkerasan Jalan</td> <td style="padding: 2px; vertical-align: top;">Perkerasan Jalan</td>
<td style="padding: 2px; vertical-align: top;">: <td style="padding: 2px; vertical-align: top;">:
</td> </td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['perkerasan_jalan']['perkerasan_jalan'] ?? ['-']) }} {{ implode(', ', $lingkungan['perkerasan_jalan']['perkerasan_jalan'] ?? $lingkungan['perkerasan_jalan'] ?? ['-']) }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Lalu Lintas</td> <td style="padding: 2px; vertical-align: top;">Lalu Lintas</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ implode(', ', $lingkungan['lalu_lintas'] ?? ['-']) }} <td style="padding: 2px; vertical-align: top;">{{
$lingkungan['lalu_lintas']
? (is_array($lingkungan['lalu_lintas'])
? implode(', ', $lingkungan['lalu_lintas'])
: $lingkungan['lalu_lintas'])
: '-'
}}
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Golongan Masyarakat Sekitar</td> <td style="padding: 2px; vertical-align: top;">Golongan Masyarakat Sekitar</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ implode(', ', $lingkungan['gol_mas_sekitar'] ?? ['-']) }} <td style="padding: 2px; vertical-align: top;">{{ implode(', ', $lingkungan['gol_mas_sekitar'] ?? $lingkungan['gol_mas_sekitar'] ?? ['-']) }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Tingkat Keramaian</td> <td style="padding: 2px; vertical-align: top;">Tingkat Keramaian</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['tingkat_keramaian'] ?? ['-']) }} {{ implode(', ', $lingkungan['tingkat_keramaian']['tingkat_keramaian'] ?? $lingkungan['tingkat_keramaian'] ?? ['-']) }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Terletak di Area</td> <td style="padding: 2px; vertical-align: top;">Terletak di Area</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['terletak_diarea']['terletak_diarea'] ?? ['-']) }} {{ implode(', ', $lingkungan['terletak_diarea']['terletak_diarea'] ?? $lingkungan['terletak_diarea'] ?? ['-']) }}
</td> </td>
</tr> </tr>
{{-- batas --}}
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Kondisi Bangunan Sekitar</td> <td style="padding: 2px; vertical-align: top;">Kondisi Bangunan Sekitar</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>

View File

@@ -84,7 +84,10 @@
position: relative; position: relative;
z-index: 1; z-index: 1;
} }
.break-before {
page-break-before: always;
break-before: page;
}
.border { .border {
border: 1px solid #000; border: 1px solid #000;
} }
@@ -93,10 +96,11 @@
page-break-inside: avoid; page-break-inside: avoid;
page-break-before: auto; page-break-before: auto;
page-break-after: auto; page-break-after: auto;
} }
</style> </style>
</head> </head>
@php {{-- @php
$data = ''; $data = '';
foreach ($permohonan->documents as $dokumen) { foreach ($permohonan->documents as $dokumen) {
$data .= $dokumen->jenisJaminan->name . ', '; $data .= $dokumen->jenisJaminan->name . ', ';
@@ -126,7 +130,7 @@
$penilaiUser = User::where('id', $penilai->userPenilaiTeam->id)->first(); $penilaiUser = User::where('id', $penilai->userPenilaiTeam->id)->first();
$data = rtrim($data, ', '); $data = rtrim($data, ', ');
@endphp @endphp --}}
<body style="width: 90%; margin: auto;"> <body style="width: 90%; margin: auto;">

View File

@@ -11,7 +11,8 @@
<main class="content"> <main class="content">
<div style="text-align: center; margin-top: 5px;"> <div style="text-align: center; margin-top: 5px;">
<h4 style="text-transform: uppercase; font-size: 16px; margin: 0;">LAPORAN PENILAIAN ATAS <h4 style="text-transform: uppercase; font-size: 16px; margin: 0;">LAPORAN PENILAIAN ATAS
{{ $data }}</h4> {{ $data }}
</h4>
<p style="font-size: 12px; margin: 5px 0;">NO: {{ $nomorLaporan }}</p> <p style="font-size: 12px; margin: 5px 0;">NO: {{ $nomorLaporan }}</p>
</div> </div>
<hr /> <hr />
@@ -35,13 +36,14 @@
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Permintaan Cabang</td> <td style="padding: 2px; vertical-align: top;">Permintaan Cabang</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $permohonan->debiture->branch->name ?? '' }} <td style="padding: 2px; vertical-align: top;">
{{ $permohonan->debiture->branch->name ?? '' }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Permintaan (AO)</td> <td style="padding: 2px; vertical-align: top;">Permintaan (AO)</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $permohonan->user->name }}</td> <td style="padding: 2px; vertical-align: top;">{{ $permohonan->user->name ?? '-' }}</td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">No Order</td> <td style="padding: 2px; vertical-align: top;">No Order</td>
@@ -597,35 +599,41 @@
<td style="padding: 2px; vertical-align: top;">: <td style="padding: 2px; vertical-align: top;">:
</td> </td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['perkerasan_jalan']['perkerasan_jalan'] ?? ['-']) }} {{ implode(', ', $lingkungan['perkerasan_jalan']['perkerasan_jalan'] ?? $lingkungan['perkerasan_jalan'] ?? ['-']) }}
</td> </td>
</tr> </tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Lalu Lintas</td> <tr>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">Lalu Lintas</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">:</td>
{{ implode(', ', $lingkungan['lalu_lintas'] ?? ['-']) }}</td> <td style="padding: 2px; vertical-align: top;">{{
</tr> $lingkungan['lalu_lintas']
<tr> ? (is_array($lingkungan['lalu_lintas'])
<td style="padding: 2px; vertical-align: top;">Golongan Masyarakat Sekitar</td> ? implode(', ', $lingkungan['lalu_lintas'])
<td style="padding: 2px; vertical-align: top;">:</td> : $lingkungan['lalu_lintas'])
<td style="padding: 2px; vertical-align: top;"> : '-'
{{ implode(', ', $lingkungan['gol_mas_sekitar'] ?? ['-']) }} }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Tingkat Keramaian</td> <td style="padding: 2px; vertical-align: top;">Golongan Masyarakat Sekitar</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">{{ implode(', ', $lingkungan['gol_mas_sekitar'] ?? $lingkungan['gol_mas_sekitar'] ?? ['-']) }}
{{ implode(', ', $lingkungan['tingkat_keramaian'] ?? ['-']) }} </td>
</td> </tr>
</tr> <tr>
<tr> <td style="padding: 2px; vertical-align: top;">Tingkat Keramaian</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['tingkat_keramaian']['tingkat_keramaian'] ?? $lingkungan['tingkat_keramaian'] ?? ['-']) }}
</td>
</tr>
< <tr>
<td style="padding: 2px; vertical-align: top;">Terletak di Area</td> <td style="padding: 2px; vertical-align: top;">Terletak di Area</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['terletak_diarea']['terletak_diarea'] ?? ['-']) }} {{ implode(', ', $lingkungan['terletak_diarea']['terletak_diarea'] ?? $lingkungan['terletak_diarea'] ?? ['-']) }}
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -779,6 +787,10 @@
</div> </div>
</td> </td>
</tr> </tr>
@if (isset($lpjData['likuidasi']) && $lpjData['likuidasi_nilai_2'] > 0)
<tr> <tr>
<td colspan="3" style="padding: 8px; text-align: left; font-weight: bold;"> <td colspan="3" style="padding: 8px; text-align: left; font-weight: bold;">
b. Total Nilai Likuidasi b. Total Nilai Likuidasi
@@ -796,6 +808,7 @@
{{ $lpjData['likuidasi_nilai_2'] ?? '' }} {{ $lpjData['likuidasi_nilai_2'] ?? '' }}
</td> </td>
</tr> </tr>
@endif
</table> </table>
</td> </td>
</tr> </tr>
@@ -810,6 +823,7 @@
</tr> </tr>
<tr> <tr>
<table> <table>
@if (isset($forminspeksi['fakta']['fakta_positif']) && count($forminspeksi['fakta']['fakta_positif']) > 0)
<tr> <tr>
<td width="25%" style="vertical-align: top;"><strong>Faktor Positif</strong></td> <td width="25%" style="vertical-align: top;"><strong>Faktor Positif</strong></td>
<td> <td>
@@ -824,6 +838,8 @@
@endisset @endisset
</td> </td>
</tr> </tr>
@endif
@if (isset($forminspeksi['fakta']['fakta_negatif']) && count($forminspeksi['fakta']['fakta_negatif']) > 0)
<tr> <tr>
<td width="25%" style="vertical-align: top;"><strong>Faktor Negatif</strong></td> <td width="25%" style="vertical-align: top;"><strong>Faktor Negatif</strong></td>
<td> <td>
@@ -838,6 +854,8 @@
@endisset @endisset
</td> </td>
</tr> </tr>
@endif
@if (isset($forminspeksi['fakta']['batas_batas_input']) && count($forminspeksi['fakta']['batas_batas_input']) > 0)
<tr> <tr>
<td width="25%" style="vertical-align: top;"><strong>Batas batas</strong></td> <td width="25%" style="vertical-align: top;"><strong>Batas batas</strong></td>
<td> <td>
@@ -848,6 +866,7 @@
@endforeach @endforeach
</td> </td>
</tr> </tr>
@endif
<tr> <tr>
<td width="25%" style="vertical-align: top;"><strong>Informasi Dinas Tata Ruang</strong> <td width="25%" style="vertical-align: top;"><strong>Informasi Dinas Tata Ruang</strong>
</td> </td>
@@ -940,29 +959,32 @@
<tr> <tr>
<table style="width: 100%; border-collapse: collapse; text-align: center;"> <table style="width: 100%; border-collapse: collapse; text-align: center;">
@php @php
use Modules\Usermanagement\Models\User; use Modules\Usermanagement\Models\User;
$penilaiUser = User::where('id', $penilai->userPenilaiTeam->id)->first();
$imagePathPenilai = storage_path(
'app/public/signatures/' . $penilaiUser->id . '/' . $penilaiUser->sign,
);
$soUser = User::where('id', $senior_officer->id)->first(); // Penilai
$imagePathSo = storage_path('app/public/signatures/' . $soUser->id . '/' . $soUser->sign); $penilaiUser = isset($penilai->userPenilaiTeam) ? $penilai->userPenilaiTeam : null;
$imagePathPenilai = $penilaiUser && $penilaiUser->sign
? storage_path('app/public/signatures/' . $penilaiUser->id . '/' . $penilaiUser->sign)
: null;
$imagePathEO = storage_path( // Senior Officer
'app/public/signatures/' . $soUser = $permohonan->approval_so ? User::find($permohonan->approval_so) : null;
User::role('EO Appraisal')->first()->id . $imagePathSo = $soUser && $soUser->sign
'/' . ? storage_path('app/public/signatures/' . $soUser->id . '/' . $soUser->sign)
User::role('EO Appraisal')->first()->sign, : null;
);
$imagePathDD = storage_path( // Executive Officer
'app/public/signatures/' . $eoUser = $permohonan->approval_eo ? User::find($permohonan->approval_eo) : null;
User::role('DD Appraisal')->first()->id . $imagePathEO = $eoUser && $eoUser->sign
'/' . ? storage_path('app/public/signatures/' . $eoUser->id . '/' . $eoUser->sign)
User::role('DD Appraisal')->first()->sign, : null;
);
@endphp // Deputy Director
$ddUser = $permohonan->approval_dd ? User::find($permohonan->approval_dd) : null;
$imagePathDD = $ddUser && $ddUser->sign
? storage_path('app/public/signatures/' . $ddUser->id . '/' . $ddUser->sign)
: null;
@endphp
<tr> <tr>
<td style=" padding: 4px;height: 50px"> <td style=" padding: 4px;height: 50px">
@if (file_exists($imagePathPenilai)) @if (file_exists($imagePathPenilai))

View File

@@ -324,6 +324,7 @@
</tr> </tr>
<!-- Total Nilai Likuidasi --> <!-- Total Nilai Likuidasi -->
@if (isset($lpjData['likuidasi']) && $lpjData['likuidasi_nilai_2'] > 0)
<tr> <tr>
<td colspan="3" style="padding: 8px; text-align: left"> <td colspan="3" style="padding: 8px; text-align: left">
2. Total Nilai Likuidasi 2. Total Nilai Likuidasi
@@ -341,6 +342,7 @@
{{ $lpjData['likuidasi_nilai_2'] ?? '' }} {{ $lpjData['likuidasi_nilai_2'] ?? '' }}
</td> </td>
</tr> </tr>
@endif
</table> </table>
</div> </div>
@php @php
@@ -375,27 +377,29 @@
@php @php
use Modules\Usermanagement\Models\User; use Modules\Usermanagement\Models\User;
$penilaiUser = User::where('id', $penilai->userPenilaiTeam->id)->first(); // Penilai
$imagePathPenilai = storage_path( $penilaiUser = isset($penilai->userPenilaiTeam) ? $penilai->userPenilaiTeam : null;
'app/public/signatures/' . $penilaiUser->id . '/' . $penilaiUser->sign, $imagePathPenilai = $penilaiUser && $penilaiUser->sign
); ? storage_path('app/public/signatures/' . $penilaiUser->id . '/' . $penilaiUser->sign)
: null;
$soUser = User::where('id', $senior_officer->id)->first(); // Senior Officer
$imagePathSo = storage_path('app/public/signatures/' . $soUser->id . '/' . $soUser->sign); $soUser = $permohonan->approval_so ? User::find($permohonan->approval_so) : null;
$imagePathSo = $soUser && $soUser->sign
? storage_path('app/public/signatures/' . $soUser->id . '/' . $soUser->sign)
: null;
$imagePathEO = storage_path( // Executive Officer
'app/public/signatures/' . $eoUser = $permohonan->approval_eo ? User::find($permohonan->approval_eo) : null;
User::role('EO Appraisal')->first()->id . $imagePathEO = $eoUser && $eoUser->sign
'/' . ? storage_path('app/public/signatures/' . $eoUser->id . '/' . $eoUser->sign)
User::role('EO Appraisal')->first()->sign, : null;
);
$imagePathDD = storage_path( // Deputy Director
'app/public/signatures/' . $ddUser = $permohonan->approval_dd ? User::find($permohonan->approval_dd) : null;
User::role('DD Appraisal')->first()->id . $imagePathDD = $ddUser && $ddUser->sign
'/' . ? storage_path('app/public/signatures/' . $ddUser->id . '/' . $ddUser->sign)
User::role('DD Appraisal')->first()->sign, : null;
);
@endphp @endphp
<tr> <tr>
<td style=" padding: 4px;height: 50px"> <td style=" padding: 4px;height: 50px">

View File

@@ -11,7 +11,8 @@
} }
} }
$fields = [ if ($inspeksi->is_mig != 1) {
$fields = [
'jenis_aset' => 'Jenis properti', 'jenis_aset' => 'Jenis properti',
'hak_properti' => 'Status Hak Tanah', 'hak_properti' => 'Status Hak Tanah',
'address' => 'Alamat Lokasi', 'address' => 'Alamat Lokasi',
@@ -22,16 +23,28 @@
'luas_bangunan' => 'Luas Bangunan', 'luas_bangunan' => 'Luas Bangunan',
'tanggal' => 'Tanggal Data', 'tanggal' => 'Tanggal Data',
'kordinat' => 'Titik Kordinat', 'kordinat' => 'Titik Kordinat',
]; ];
}
@endphp @endphp
@foreach ($exportData as $index => $data) @foreach (array_slice($exportData, 0, 3) as $index => $data)
<table style="width: 100%; margin-bottom: 15px; border-bottom: 1px solid #ddd;"> <table style="width: 100%; margin-bottom: 15px; border-bottom: 1px solid #ddd;">
<tr> <tr>
<td style="font-weight: bold; padding-bottom: 8px;"> <td style="font-weight: bold; padding-bottom: 8px;">
Pembanding {{ substr($index, -1) }} Pembanding {{ substr($index, -1) }}
</td> </td>
</tr> </tr>
@if ($inspeksi->is_mig == 1)
<tr>
<td style="width: 33%; vertical-align: top;">Keterangan</td>
<td style="width: 5%; vertical-align: top;">:</td>
<td style="width: 62%;">
{{isset($data['keterangan']) ? parsePembandingMigration($data['keterangan']) : '' }}
</td>
</tr>
@else
@foreach ($fields as $key => $label) @foreach ($fields as $key => $label)
<tr> <tr>
<td style="width: 33%;">{{ $label }}</td> <td style="width: 33%;">{{ $label }}</td>
@@ -63,6 +76,7 @@
</td> </td>
</tr> </tr>
@endforeach @endforeach
@endif
</table> </table>
@endforeach @endforeach
</td> </td>

View File

@@ -321,7 +321,7 @@
</div> </div>
</div> </div>
@if($permohonan->jenisPenilaian->name=="Eksternal") {{-- @if($permohonan->jenisPenilaian->name=="Eksternal")
@if(isset($permohonan->laporanExternal->file_resume) || isset($permohonan->laporanExternal->file_laporan)) @if(isset($permohonan->laporanExternal->file_resume) || isset($permohonan->laporanExternal->file_laporan))
<div class="dropdown" data-dropdown="true" data-dropdown-trigger="click"> <div class="dropdown" data-dropdown="true" data-dropdown-trigger="click">
<button class="dropdown-toggle btn btn-primary"> <button class="dropdown-toggle btn btn-primary">
@@ -358,7 +358,7 @@
</div> </div>
</div> </div>
@endif @endif
@endif @endif --}}
@endif @endif
</div> </div>

View File

@@ -216,7 +216,7 @@
</button> </button>
@endif @endif
@if (Auth::user()->hasAnyRole(['administrator', 'EO Appraisal']) && $authorization->approve_so && $authorization->approve_eo == null && in_array($permohonan->nilai_plafond_id, [1, 2,3,4]) && $permohonan->status === 'proses-paparan') @if (Auth::user()->hasAnyRole(['administrator', 'EO Appraisal']) && $authorization->approve_so && $authorization->approve_eo == null && in_array($permohonan->nilai_plafond_id, [1, 2, 3, 4]) && $permohonan->status === 'proses-paparan')
<button onclick="otorisatorData({{ $authorization->id }},'EO')" type="button" <button onclick="otorisatorData({{ $authorization->id }},'EO')" type="button"
class="btn btn-primary"> class="btn btn-primary">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
@@ -224,7 +224,7 @@
</button> </button>
@endif @endif
@if (Auth::user()->hasAnyRole(['administrator', 'DD Appraisal']) && $authorization->approve_eo && $authorization->approve_dd == null && in_array($permohonan->nilai_plafond_id, [4]) &&$permohonan->status === 'proses-paparan') @if (Auth::user()->hasAnyRole(['administrator', 'DD Appraisal']) && $authorization->approve_eo && $authorization->approve_dd == null && in_array($permohonan->nilai_plafond_id, [2, 4]) &&$permohonan->status === 'proses-paparan')
<button onclick="otorisatorData({{ $authorization->id }},'DD')" type="button" <button onclick="otorisatorData({{ $authorization->id }},'DD')" type="button"
class="btn btn-primary"> class="btn btn-primary">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>

View File

@@ -150,13 +150,13 @@
user_id: { user_id: {
title: 'User Pemohon', title: 'User Pemohon',
render: (item, data) => { render: (item, data) => {
return `${data.user.name}`; return `${data?.user?.name || '-'}`;
}, },
}, },
branch_id: { branch_id: {
title: 'Cabang Pemohon', title: 'Cabang Pemohon',
render: (item, data) => { render: (item, data) => {
return `${data.branch.name}`; return `${data?.branch?.name || '-'}`;
}, },
}, },
debitur_id: { debitur_id: {

View File

@@ -51,7 +51,7 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Tanggal Survey</label> <label class="form-label max-w-56">Tanggal Survey</label>
<div class="flex flex-wrap items-base line w-full"> <div class="flex flex-wrap items-base line w-full">
<p class="text-2sm text-gray-700">{{ $permohonan->created_at->format('d/m/Y') }}</p> <p class="text-2sm text-gray-700"> {{ $permohonan->created_at ? $permohonan->created_at->format('d/m/Y') : '' }}</p>
</div> </div>
</div> </div>

View File

@@ -81,10 +81,12 @@
</div> </div>
@php @php
use Modules\Usermanagement\Models\User; use Modules\Usermanagement\Models\User;
$cabangUser = User::where('id', $permohonan->user->id)->first(); $cabangUser = null;
if ($permohonan->user) {
$cabangUser = User::where('id', $permohonan->user->id)->first();
}
// print_r($cabangUser->sign); // print_r($cabangUser->sign);
@endphp @endphp
@endsection @endsection
@@ -95,122 +97,122 @@
console.log(datas); console.log(datas);
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const signaturePads = {}; const signaturePads = {};
const types = ['penilai', 'cabang', 'debitur', 'kjpp']; const types = ['penilai', 'cabang', 'debitur', 'kjpp'];
// Initialize all signature pads // Initialize all signature pads
types.forEach(type => initSignaturePad(type)); types.forEach(type => initSignaturePad(type));
function initSignaturePad(type) { function initSignaturePad(type) {
const canvas = document.getElementById(`signature-pad-${type}`); const canvas = document.getElementById(`signature-pad-${type}`);
if (!canvas) return; if (!canvas) return;
// Improved canvas sizing with strict boundary control // Improved canvas sizing with strict boundary control
function resizeCanvas() { function resizeCanvas() {
const container = canvas.closest('.signature-pad-container'); const container = canvas.closest('.signature-pad-container');
const containerWidth = container.clientWidth; const containerWidth = container.clientWidth;
// Set canvas style dimensions // Set canvas style dimensions
canvas.style.width = '100%'; canvas.style.width = '100%';
canvas.style.height = `${containerWidth * 0.5}px`; // 2:1 aspect ratio canvas.style.height = `${containerWidth * 0.5}px`; // 2:1 aspect ratio
// Set actual canvas dimensions with high DPI support // Set actual canvas dimensions with high DPI support
const ratio = window.devicePixelRatio || 1; const ratio = window.devicePixelRatio || 1;
canvas.width = containerWidth * ratio; canvas.width = containerWidth * ratio;
canvas.height = (containerWidth * 0.5) * ratio; canvas.height = (containerWidth * 0.5) * ratio;
// Scale canvas context // Scale canvas context
const ctx = canvas.getContext('2d'); const ctx = canvas.getContext('2d');
ctx.scale(ratio, ratio); ctx.scale(ratio, ratio);
// Clear and redraw existing signature if any // Clear and redraw existing signature if any
if (signaturePads[type] && !signaturePads[type].isEmpty()) { if (signaturePads[type] && !signaturePads[type].isEmpty()) {
const signaturePad = signaturePads[type]; const signaturePad = signaturePads[type];
const imageData = signaturePad.toData(); const imageData = signaturePad.toData();
signaturePad.clear(); signaturePad.clear();
signaturePad.fromData(imageData); signaturePad.fromData(imageData);
} }
}
// Create signature pad with boundary and scaling control
const signaturePad = new SignaturePad(canvas, {
backgroundColor: 'rgba(255, 255, 255, 0)',
penColor: 'rgb(0, 0, 0)',
minWidth: 0.5,
maxWidth: 2.5,
throttle: 16,
dotSize: 2,
// Custom function to control signature drawing
onBegin: (event) => {
const ctx = canvas.getContext('2d');
const rect = canvas.getBoundingClientRect();
const scaleX = canvas.width / rect.width;
const scaleY = canvas.height / rect.height;
// Ensure drawing stays within canvas
if (
event.clientX < rect.left ||
event.clientX > rect.right ||
event.clientY < rect.top ||
event.clientY > rect.bottom
) {
return false;
} }
// Create signature pad with boundary and scaling control
const signaturePad = new SignaturePad(canvas, {
backgroundColor: 'rgba(255, 255, 255, 0)',
penColor: 'rgb(0, 0, 0)',
minWidth: 0.5,
maxWidth: 2.5,
throttle: 16,
dotSize: 2,
// Custom function to control signature drawing
onBegin: (event) => {
const ctx = canvas.getContext('2d');
const rect = canvas.getBoundingClientRect();
const scaleX = canvas.width / rect.width;
const scaleY = canvas.height / rect.height;
// Ensure drawing stays within canvas
if (
event.clientX < rect.left ||
event.clientX > rect.right ||
event.clientY < rect.top ||
event.clientY > rect.bottom
) {
return false;
}
}
});
signaturePads[type] = signaturePad;
// Initial resize
resizeCanvas();
// Load existing signature
if (type === 'penilai' || type === 'cabang') {
loadPenilaiAndCabangSignature(type, signaturePad);
} else {
loadSignature(type, signaturePad);
}
// Add event listeners
addEventListeners(type, signaturePad);
// Add resize listener
window.addEventListener('resize', () => {
resizeCanvas();
});
} }
});
signaturePads[type] = signaturePad;
// Initial resize function drawSignature(signaturePad, imageUrl) {
resizeCanvas(); const image = new Image();
image.crossOrigin = 'Anonymous';
image.onload = function() {
const ctx = signaturePad.canvas.getContext('2d');
const canvasWidth = signaturePad.canvas.width;
const canvasHeight = signaturePad.canvas.height;
// Load existing signature // Clear previous content
if (type === 'penilai' || type === 'cabang') { ctx.clearRect(0, 0, canvasWidth, canvasHeight);
loadPenilaiAndCabangSignature(type, signaturePad);
} else {
loadSignature(type, signaturePad);
}
// Add event listeners // Calculate scaling to fit within canvas while maintaining aspect ratio
addEventListeners(type, signaturePad); const scale = Math.min(
canvasWidth / image.width,
canvasHeight / image.height
);
// Add resize listener const scaledWidth = image.width * scale;
window.addEventListener('resize', () => { const scaledHeight = image.height * scale;
resizeCanvas();
});
}
function drawSignature(signaturePad, imageUrl) { // Center the image
const image = new Image(); const x = (canvasWidth - scaledWidth) / 2;
image.crossOrigin = 'Anonymous'; const y = (canvasHeight - scaledHeight) / 2;
image.onload = function() {
const ctx = signaturePad.canvas.getContext('2d');
const canvasWidth = signaturePad.canvas.width;
const canvasHeight = signaturePad.canvas.height;
// Clear previous content // Draw the scaled and centered image
ctx.clearRect(0, 0, canvasWidth, canvasHeight); ctx.drawImage(image, x, y, scaledWidth, scaledHeight);
};
// Calculate scaling to fit within canvas while maintaining aspect ratio image.onerror = function() {
const scale = Math.min( console.error('Error loading signature image');
canvasWidth / image.width, };
canvasHeight / image.height image.src = imageUrl;
); }
const scaledWidth = image.width * scale;
const scaledHeight = image.height * scale;
// Center the image
const x = (canvasWidth - scaledWidth) / 2;
const y = (canvasHeight - scaledHeight) / 2;
// Draw the scaled and centered image
ctx.drawImage(image, x, y, scaledWidth, scaledHeight);
};
image.onerror = function() {
console.error('Error loading signature image');
};
image.src = imageUrl;
}
function addEventListeners(type, signaturePad) { function addEventListeners(type, signaturePad) {
document.getElementById(`save-${type}`)?.addEventListener('click', () => saveSignature(type, document.getElementById(`save-${type}`)?.addEventListener('click', () => saveSignature(type,
@@ -237,7 +239,7 @@
(type === 'penilai' ? (type === 'penilai' ?
`{{ asset('storage/signatures/' . Auth::user()->id . '/' . Auth::user()->sign) }}` : `{{ asset('storage/signatures/' . Auth::user()->id . '/' . Auth::user()->sign) }}` :
(type === 'cabang' ? (type === 'cabang' ?
`{{ asset('storage/signatures/' . $cabangUser->id . '/' . $cabangUser->sign) }}` : `{{ asset('storage/signatures/' . $cabangUser?->id . '/' . $cabangUser?->sign) }}` :
'')) : '')) :
signaturePad.toDataURL('image/png', 1.0); // Use full quality signaturePad.toDataURL('image/png', 1.0); // Use full quality
@@ -332,13 +334,13 @@
} else { } else {
const signUrl = type === 'penilai' ? const signUrl = type === 'penilai' ?
`{{ asset('storage/signatures/' . Auth::user()->id . '/' . Auth::user()->sign) }}` : `{{ asset('storage/signatures/' . Auth::user()->id . '/' . Auth::user()->sign) }}` :
`{{ asset('storage/signatures/' . $cabangUser->id . '/' . $cabangUser->sign) }}`; `{{ asset('storage/signatures/' . $cabangUser?->id . '/' . $cabangUser?->sign) }}`;
drawSignature(signaturePad, signUrl); drawSignature(signaturePad, signUrl);
const defaultName = type === 'penilai' ? const defaultName = type === 'penilai' ?
`{{ Auth::user()->name }}` : `{{ Auth::user()->name }}` :
`{{ $cabangUser->name }}`; `{{ $cabangUser?->name }}`;
if (nameInputElement) { if (nameInputElement) {
nameInputElement.value = defaultName; nameInputElement.value = defaultName;
} }
@@ -362,7 +364,7 @@
(type === 'penilai' ? (type === 'penilai' ?
`{{ asset('storage/signatures/' . Auth::user()->id . '/' . Auth::user()->sign) }}` : `{{ asset('storage/signatures/' . Auth::user()->id . '/' . Auth::user()->sign) }}` :
(type === 'cabang' ? (type === 'cabang' ?
`{{ asset('storage/signatures/' . $cabangUser->id . '/' . $cabangUser->sign) }}` : `{{ asset('storage/signatures/' . $cabangUser?->id . '/' . $cabangUser?->sign) }}` :
'')) : '')) :
signaturePad.toDataURL('image/png'); signaturePad.toDataURL('image/png');
@@ -519,17 +521,17 @@
const formData = new FormData(form); const formData = new FormData(form);
const fotoFields = [ const fotoFields = [
'foto_gistaru', 'foto_gistaru',
'foto_bhumi', 'foto_bhumi',
'foto_argis_region', 'foto_argis_region',
'foto_tempat', 'foto_tempat',
'foto_sentuh_tanahku', 'foto_sentuh_tanahku',
'upload_gs' 'upload_gs'
]; ];
fotoFields.forEach((field) => { fotoFields.forEach((field) => {
formData.delete(field); formData.delete(field);
}); });
$.ajax({ $.ajax({
url: '{{ route('surveyor.store') }}', url: '{{ route('surveyor.store') }}',
type: 'POST', type: 'POST',

View File

@@ -54,7 +54,7 @@
@endif @endif
</td> </td>
</tr> </tr>
@if (!empty($forminspeksi['fakta']['rute_menuju']))
<tr> <tr>
<td width="20%" style="vertical-align: top;">Rute Munuju</td> <td width="20%" style="vertical-align: top;">Rute Munuju</td>
<td width="1%" style="vertical-align: top;">:</td> <td width="1%" style="vertical-align: top;">:</td>
@@ -62,8 +62,11 @@
<p>{{ $forminspeksi['fakta']['rute_menuju'] ?? '' }}</p> <p>{{ $forminspeksi['fakta']['rute_menuju'] ?? '' }}</p>
</td> </td>
</tr> </tr>
@endif
@if (!empty($forminspeksi['fakta']['batas_batas_input']))
<tr> <tr>
<td width="20%" style="vertical-align: top;">Batas Batas </td> <td width="20%" style="vertical-align: top;">Batas Batas </td>
<td width="1%" style="vertical-align: top;">:</td> <td width="1%" style="vertical-align: top;">:</td>
@@ -71,13 +74,15 @@
@foreach ($forminspeksi['fakta']['batas_batas_input'] ?? [] as $arah => $batas) @foreach ($forminspeksi['fakta']['batas_batas_input'] ?? [] as $arah => $batas)
@if ($batas) @if ($batas)
<p> - {{ $arah }} : {{ $batas }}</p> <p> - {{ $arah }} : {{ $batas }}</p>
@endif @endif
@endforeach @endforeach
</td> </td>
</tr> </tr>
@endif
@if (!empty($forminspeksi['fakta']['kondisi_lingkungan']))
<tr> <tr>
<td width="20%" style="vertical-align: top;">Kondisi lain terkait lingkungan </td> <td width="20%" style="vertical-align: top;">Kondisi lain terkait lingkungan </td>
<td width="1%" style="vertical-align: top;">:</td> <td width="1%" style="vertical-align: top;">:</td>
@@ -89,6 +94,9 @@
@endforeach @endforeach
</td> </td>
</tr> </tr>
@endif
@if (!empty($forminspeksi['fakta']['kondisi_lain_bangunan']))
<tr> <tr>
<td width="20%" style="vertical-align: top;">Kondisi lain terkait Bangunan </td> <td width="20%" style="vertical-align: top;">Kondisi lain terkait Bangunan </td>
<td width="1%" style="vertical-align: top;">:</td> <td width="1%" style="vertical-align: top;">:</td>
@@ -99,6 +107,8 @@
@endforeach @endforeach
</td> </td>
</tr> </tr>
@endif
@if (!empty($forminspeksi['fakta']['informasi_dokument']))
<tr> <tr>
<td width="20%" style="vertical-align: top;">Informasi Terkait Dokumen </td> <td width="20%" style="vertical-align: top;">Informasi Terkait Dokumen </td>
<td width="1%" style="vertical-align: top;">:</td> <td width="1%" style="vertical-align: top;">:</td>
@@ -110,7 +120,7 @@
</td> </td>
</tr> </tr>
@endif
</table> </table>

View File

@@ -5,7 +5,7 @@
<table> <table>
<tr> <tr>
<td> <td>
Jakarta {{ formatTanggalIndonesia($permohonan->penilaian->waktu_penilaian) }} {{ $permohonan->debiture->branch->name ?? '' }} {{ formatTanggalIndonesia($permohonan->penilaian->waktu_penilaian) }}
</td> </td>
</tr> </tr>

View File

@@ -1,103 +1,108 @@
<div class="no-break" > @php
<table $informasi = [
style="width: 100%; border: 1px solid #000; border-collapse: collapse; "> 'peruntukan',
<tr> 'kdb',
<td style="text-align: center; margin-top: 5px;"> 'kdh',
<h2 style="text-transform: uppercase; text-align: center; margin: 0;">Informasi Dinas Tata Ruang</h2> 'gsb',
</td> 'max_lantai',
</tr> 'klb',
</table> 'gss',
<table> 'pelebaran_jalan',
'nama_petugas',
];
$fotoTypes = [
'upload_gs',
'foto_sentuh_tanahku',
'foto_gistaru',
'foto_bhumi',
'foto_argis_region',
'foto_tempat',
];
<tr> $customLabels = [
<td width="20%" style="vertical-align: top;">Informasi Dinas Tata Ruang </td> 'upload_gs' => 'Gambar Situasi',
<td width="1%" style="vertical-align: top;">:</td> 'foto_sentuh_tanahku' => 'Sentuh Tanahku',
<td style="vertical-align: top;"> 'foto_gistaru' => 'Gistaru',
@php 'foto_bhumi' => 'Bhumi',
$informasi = [ 'foto_argis_region' => 'Blad Tata Ruang ',
'peruntukan', 'foto_tempat' => 'Peta Lokasi',
'kdb', ];
'kdh',
'gsb',
'max_lantai',
'klb',
'gss',
'pelebaran_jalan',
'nama_petugas',
];
@endphp
@foreach ($informasi as $key) // Periksa apakah ada informasi dinas tata ruang yang valid
@if (isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-') $hasInformasi = collect($informasi)->some(fn($key) => isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-');
@php
$displayKey = ucfirst(str_replace('_', ' ', $key));
if (strlen($key) == 3) {
$displayKey = strtoupper($key);
}
@endphp
<p> - {{ $displayKey }}: {{ $forminspeksi['fakta'][$key] }}</p>
@endif
@endforeach
</td>
</tr>
@php // Periksa apakah ada foto yang valid
$fotoTypes = [ $hasValidPhotos = collect($fotoTypes)->some(function ($type) use ($forminspeksi) {
'upload_gs', $imagePath = $forminspeksi[$type] ?? null;
'foto_sentuh_tanahku', return $imagePath && file_exists(storage_path('app/public/' . $imagePath));
'foto_gistaru', });
'foto_bhumi',
'foto_argis_region',
'foto_tempat',
];
$customLabels = [ // Periksa apakah ada catatan yang perlu diperhatikan
'upload_gs' => 'Gambar Situasi', $hasNotes = !empty($forminspeksi['fakta']['keterangan'] ?? []);
'foto_sentuh_tanahku' => 'Sentuh Tanahku', @endphp
'foto_gistaru' => 'Gistaru',
'foto_bhumi' => 'Bhumi',
'foto_argis_region' => 'Blad Tata Ruang ',
'foto_tempat' => 'Peta Lokasi',
];
// Memindahkan foto_tempat ke depan jika ada
if (($key = array_search('upload_gs', $fotoTypes)) !== false) {
unset($fotoTypes[$key]);
array_unshift($fotoTypes, 'upload_gs');
}
// Filter fotoTypes untuk memastikan hanya yang memiliki imagePath valid
$validPhotoTypes = array_filter($fotoTypes, function ($type) use ($forminspeksi) {
return isset($forminspeksi[$type]) && !empty($forminspeksi[$type]) && is_string($forminspeksi[$type]);
});
@endphp
@foreach ($validPhotoTypes as $type)
@php
$imagePath = $forminspeksi[$type] ?? null;
$imageUrl = is_string($imagePath) ? asset('storage/' . $imagePath) : null;
@endphp @if ($hasInformasi || $hasValidPhotos || $hasNotes)
@if ($imagePath && file_exists(storage_path('app/public/' . $imagePath))) <div class="no-break">
<table style="width: 100%; border: 1px solid #000; border-collapse: collapse;">
<tr>
<td style="text-align: center; margin-top: 5px;">
<h2 style="text-transform: uppercase; text-align: center; margin: 0;">Informasi Dinas Tata Ruang</h2>
</td>
</tr>
</table>
<table>
@if ($hasInformasi)
<tr> <tr>
<td style="20%"> {{ $customLabels[$type] ?? '' }}</td> <td width="20%" style="vertical-align: top;">Informasi Dinas Tata Ruang</td>
<td width="1%" style="vertical-align: top;"></td> <td width="1%" style="vertical-align: top;">:</td>
<td style="width: 79%"> <td style="vertical-align: top;">
<img src="{{ storage_path('app/public/' . $imagePath) }}" alt="{{ $imageUrl }}" @foreach ($informasi as $key)
style="max-height: 400px; height: auto; max-width: 100%;"> @if (isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-')
@php
$displayKey = ucfirst(str_replace('_', ' ', $key));
if (strlen($key) == 3) {
$displayKey = strtoupper($key);
}
@endphp
<p>- {{ $displayKey }}: {{ $forminspeksi['fakta'][$key] }}</p>
@endif
@endforeach
</td> </td>
</tr> </tr>
@endif @endif
@endforeach
<tr>
<td width="20%" style="vertical-align: top;">Catatan yang Perlu Diperhatikan </td>
<td width="1%" style="vertical-align: top;">:</td>
<td style="vertical-align: top;">
@foreach ($forminspeksi['fakta']['keterangan'] ?? [] as $informasi) @if ($hasValidPhotos)
<p>{!! nl2br(e($informasi)) !!}</p> @foreach ($fotoTypes as $type)
@php
$imagePath = $forminspeksi[$type] ?? null;
$imageUrl = is_string($imagePath) ? asset('storage/' . $imagePath) : null;
@endphp
@if ($imagePath && file_exists(storage_path('app/public/' . $imagePath)))
<tr>
<td style="20%"> {{ $customLabels[$type] ?? '' }}</td>
<td width="1%" style="vertical-align: top;"></td>
<td style="width: 79%">
<img src="{{ storage_path('app/public/' . $imagePath) }}" alt="{{ $imageUrl }}"
style="max-height: 400px; height: auto; max-width: 100%;">
</td>
</tr>
@endif
@endforeach @endforeach
@endif
</td> @if ($hasNotes)
</tr> <tr>
<td width="20%" style="vertical-align: top;">Catatan yang Perlu Diperhatikan</td>
</table> <td width="1%" style="vertical-align: top;">:</td>
</div> <td style="vertical-align: top;">
@foreach ($forminspeksi['fakta']['keterangan'] ?? [] as $informasi)
<p>{!! nl2br(e($informasi)) !!}</p>
@endforeach
</td>
</tr>
@endif
</table>
</div>
@endif

View File

@@ -69,22 +69,26 @@
<tr> <tr>
@foreach ($basicData['laluLintasLokasi'] as $index => $item) @foreach ($basicData['laluLintasLokasi'] as $index => $item)
@if ($index % 3 == 0 && $index > 0) @if ($index % 3 == 0 && $index > 0)
</tr>
<tr>
@endif
<td class="checkbox-item">
<label class="checkbox-label">
<input type="checkbox"
{{ isset($forminspeksi['lingkungan']['lalu_lintas'])
&& is_array($forminspeksi['lingkungan']['lalu_lintas'])
&& in_array($item->name, $forminspeksi['lingkungan']['lalu_lintas'])
? 'checked' : '' }}>
{{ $item->name }}
</label>
</td>
@endforeach
</tr> </tr>
<tr> </table>
@endif @endif
<td class="checkbox-item">
<label class="checkbox-label">
<input type="checkbox"
{{ isset($forminspeksi['lingkungan']['lalu_lintas']) && in_array($item->name, $forminspeksi['lingkungan']['lalu_lintas']) ? 'checked' : '' }}>
{{ $item->name }}
</label>
</td> </td>
@endforeach
</tr> </tr>
</table>
@endif
</td>
</tr>
<tr> <tr>
<td style="vertical-align: top;">Golongan Masyarakat Sekitar</td> <td style="vertical-align: top;">Golongan Masyarakat Sekitar</td>

View File

@@ -255,12 +255,19 @@
<td style="width: 1%; padding: 2px; vertical-align: top;">:</td> <td style="width: 1%; padding: 2px; vertical-align: top;">:</td>
<td style="vertical-align: top; padding: 2px;"> <td style="vertical-align: top; padding: 2px;">
@if (isset($forminspeksi['asset']['debitur_perwakilan']) && !empty($forminspeksi['asset']['debitur_perwakilan'])) @if (isset($forminspeksi['asset']['debitur_perwakilan']) && !empty($forminspeksi['asset']['debitur_perwakilan']))
@foreach ($forminspeksi['asset']['debitur_perwakilan'] as $key => $item) @if (is_array($forminspeksi['asset']['debitur_perwakilan']))
<p style="margin: 0; padding:0;"> @foreach ($forminspeksi['asset']['debitur_perwakilan'] as $key => $item)
{{ $item }} <p style="margin: 0; padding:0;">
</p> {{ $item }}
@endforeach </p>
@endif @endforeach
@else
<p style="margin: 0; padding:0;">
{{ $forminspeksi['asset']['debitur_perwakilan'] }}
</p>
@endif
@endif
</td> </td>
</tr> </tr>
</table> </table>
@@ -383,12 +390,13 @@
<td style="width: 25%; padding: 2px; vertical-align: top;">Titik Kordinat</td> <td style="width: 25%; padding: 2px; vertical-align: top;">Titik Kordinat</td>
<td style="width: 1%; vertical-align: top;">:</td> <td style="width: 1%; vertical-align: top;">:</td>
<td style="vertical-align: top; width: 79%;"> <td style="vertical-align: top; width: 79%;">
{{ isset($forminspeksi['asset']['kordinat_lat']) ? $forminspeksi['asset']['kordinat_lat'] : '' }} {{ isset($forminspeksi['asset']['kordinat_lat']) && !empty($forminspeksi['asset']['kordinat_lat']) ? $forminspeksi['asset']['kordinat_lat'] : '-' }}
, ,
{{ isset($forminspeksi['asset']['kordinat_lng']) ? $forminspeksi['asset']['kordinat_lng'] : '' }} {{ isset($forminspeksi['asset']['kordinat_lng']) && !empty($forminspeksi['asset']['kordinat_lng']) ? $forminspeksi['asset']['kordinat_lng'] : '-' }}
</td> </td>
</tr> </tr>
</table> </table>
<div class="no-break" > <div class="no-break" >
<table <table
style="width: 100%; border: 1px solid #000; border-collapse: collapse; "> style="width: 100%; border: 1px solid #000; border-collapse: collapse; ">