Merge branch 'staging' of https://git.putrakuningan.com/daengdeni/lpj into tender
This commit is contained in:
@@ -2,271 +2,279 @@
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
// use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
// use Maatwebsite\Excel\Concerns\WithColumnFormatting;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithStyles;
|
||||
use Maatwebsite\Excel\Concerns\WithColumnWidths;
|
||||
use Maatwebsite\Excel\Concerns\WithEvents;
|
||||
use Maatwebsite\Excel\Events\AfterSheet;
|
||||
|
||||
class KertasKerjaExport implements FromCollection, WithHeadings, WithStyles, WithColumnWidths, WithEvents
|
||||
// use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||
// use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
// use Maatwebsite\Excel\Concerns\WithStyles;
|
||||
// use Maatwebsite\Excel\Concerns\WithColumnWidths;
|
||||
// use Maatwebsite\Excel\Concerns\WithEvents;
|
||||
// use Maatwebsite\Excel\Events\AfterSheet;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Maatwebsite\Excel\Concerns\FromView;
|
||||
class KertasKerjaExport implements FromView
|
||||
{
|
||||
|
||||
// class KertasKerjaExport implements FromCollection, WithHeadings, WithStyles, WithColumnWidths, WithEvents
|
||||
// {
|
||||
protected $data;
|
||||
|
||||
protected $headerInfo;
|
||||
|
||||
public function __construct($data, $headerInfo)
|
||||
public function __construct($data)
|
||||
{
|
||||
$this->data = $data;
|
||||
$this->headerInfo = $headerInfo;
|
||||
}
|
||||
|
||||
public function collection()
|
||||
public function view(): View
|
||||
{
|
||||
$rows = [];
|
||||
|
||||
$nomor = 1;
|
||||
$fields = [
|
||||
'jenis_aset' => 'Jenis Aset',
|
||||
'luas_tanah' => 'Luas Tanah (M²)',
|
||||
'luas_bangunan' => 'Luas Bangunan (M²)',
|
||||
'harga' => 'Harga Transaksi/Penawaran',
|
||||
'tanggal_penawaran' => 'Tanggal Penawaran/Transaksi',
|
||||
'diskon' => 'Diskon %',
|
||||
'esitmasi_harga' => 'Esitmasi Harga Transaksi (Rp)',
|
||||
'no_telepon' => 'Telepon Contact Person',
|
||||
'nama_nara_sumbr' => 'Nama Nara Sumber',
|
||||
'status_nara_sumbr' => 'Status Nara Sumber',
|
||||
'waktu_transaksi' => 'Waktu Transaksi/Penawaran',
|
||||
'alamat' => 'Alamat Titik Gps',
|
||||
|
||||
'jalan' => 'Jalan',
|
||||
'desa' => 'Desa/Kelurahan',
|
||||
'kecamatan' => 'Kecamatan',
|
||||
'kabupaten' => 'Kabupaten',
|
||||
'provinsi' => 'Provinsi',
|
||||
|
||||
'jarak_pembanding' => 'Jarak Pembanding dengan Objek',
|
||||
'elevasi' => 'Estimasi Ranking Tanah',
|
||||
'peruntukan' => 'Estiamsi Rangkin Bangunan'
|
||||
|
||||
];
|
||||
|
||||
foreach ($fields as $key => $label) {
|
||||
$rows[] = [
|
||||
$nomor++,
|
||||
$label,
|
||||
$this->data['objek'][$key] ?? '',
|
||||
$this->data['pembanding1'][$key] ?? '',
|
||||
$this->data['pembanding2'][$key] ?? '',
|
||||
$this->data['pembanding3'][$key] ?? ''
|
||||
];
|
||||
}
|
||||
|
||||
// B. Perhitungan Penyesuaian
|
||||
$rows[] = [''];
|
||||
$rows[] = [''];
|
||||
$rows[] = ['B. Estimasi Nilai Tanah Pembanding dengan Teknik Penyisaan Tanah untuk mendapatkan per meter persegi estimasi Nilai Tanah Pembanding'];
|
||||
$rows[] = ['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3'];
|
||||
$nostimasi = 1;
|
||||
$filedEstimasi = [
|
||||
'estimasi' => 'Estimasi Biaya Pengganti Baru Bangunan (Rp)',
|
||||
'estimasi_spl' => 'Estimasi Biaya Pengganti Baru SPL (Rp)',
|
||||
'penyusutan' => 'Penyusutan Fisik Banguna',
|
||||
|
||||
'a' => 'a. rincian ttipe bangunan (MAPPI)',
|
||||
'b' => 'b. umur ekonomis (MAPPI)',
|
||||
'c' => 'c. estimasi Tahun tahun visual dengan mempertimbangkan renovasi',
|
||||
'd' => 'd. Sehingga sisa umur efektif',
|
||||
'e' => 'e. kondisi bagunan',
|
||||
'f' => 'f.sehinggan penyusutan fisik',
|
||||
'penyusutan_fungsi' => 'Penyusutan fungsi Bangunan (%)',
|
||||
'penyusutan_ekonomi' => 'Penyusutan Ekonomi Bangunan (%)',
|
||||
'total_penyusutan' => 'Total Penyusutan (%)',
|
||||
'estimasi_nilai' => 'Estimasi Nilai Bangunan dan SPL (Rp)',
|
||||
'estimasi_tanah' => 'Estimasi Nilai Tanah Pembanding (Rp)',
|
||||
'estimasi_nilai' => 'Estimasi Nilai Tanah Pembanding (Rp)',
|
||||
];
|
||||
|
||||
foreach ($filedEstimasi as $key => $label) {
|
||||
$rows[] = [
|
||||
$nostimasi++,
|
||||
$label,
|
||||
$this->data['estimasi'][$key] ?? '',
|
||||
$this->data['estimasi1'][$key] ?? '',
|
||||
$this->data['estimasi2'][$key] ?? '',
|
||||
$this->data['estimasi3'][$key] ?? ''
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
$row[] = [''];
|
||||
$row[] = [''];
|
||||
$rows[] = ['INDIKASI NILAI TANAHATAS OBJEK PENILAIAN'];
|
||||
|
||||
$indikasi=[
|
||||
'luas_tanah' => 'Luas Tanah ',
|
||||
'indikasi_per' => 'INDIKASI TANAH PER M2 (RP/M2)',
|
||||
'indikasi_total' => 'INDIKASI TANAH TOTAL(RP)',
|
||||
'varian' => 'VARIANT(%)',
|
||||
];
|
||||
|
||||
foreach ($indikasi as $key => $label) {
|
||||
$rows[] = [
|
||||
$label,
|
||||
$this->data['indikasi'][$key] ?? '',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
// C. Peta Lokasi
|
||||
$rows[] = [''];
|
||||
$rows[] = [''];
|
||||
$rows[] = ['C. Peta Lokasi'];
|
||||
$rows[] = [$this->data['foto_objek']['foto_objek_peta'] ?? ''];
|
||||
|
||||
// D. Foto Objek dan Data Pembanding
|
||||
$rows[] = [''];
|
||||
$rows[] = ['D. Foto Objek dan Data Pembanding'];
|
||||
$rows[] = [
|
||||
$this->data['foto_objek1']['foto_objek'] ?? '',
|
||||
$this->data['foto_objek2']['foto_objek'] ?? '',
|
||||
'', '', ''
|
||||
];
|
||||
|
||||
// E. Foto Objek
|
||||
$rows[] = [''];
|
||||
$rows[] = ['E. Foto Objek'];
|
||||
$rows[] = [
|
||||
$this->data['foto']['foto_objek'] ?? '',
|
||||
$this->data['foto']['foto_objek'] ?? '',
|
||||
'', '', ''
|
||||
];
|
||||
|
||||
return collect($rows);
|
||||
return view('lpj::component.kertas-kerja', [
|
||||
'data' => $this->data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
['KERTAS KERJA PENILAIAN'],
|
||||
['Pendekatan Pasar'],
|
||||
['Metode Perbandingan Data Pasar'],
|
||||
['Tanggal Penilaian: ' . ($this->headerInfo['tanggal_penilaian'] ?? '')],
|
||||
['Nama Pemilik Aset: ' . ($this->headerInfo['nama_pemilik'] ?? '')],
|
||||
['Nama Pemberi Tugas: ' . ($this->headerInfo['nama_pemberi_tugas'] ?? '')],
|
||||
['Lokasi: ' . ($this->headerInfo['lokasi_lengkap'] ?? '')],
|
||||
['Nama Debitur: ' . ($this->headerInfo['nama_debitur'] ?? '')],
|
||||
[''],
|
||||
['A. INFORMASI UMUM'],
|
||||
['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3']
|
||||
// public function collection()
|
||||
// {
|
||||
// $rows = [];
|
||||
|
||||
// $nomor = 1;
|
||||
// $fields = [
|
||||
// 'jenis_aset' => 'Jenis Aset',
|
||||
// 'luas_tanah' => 'Luas Tanah (M²)',
|
||||
// 'luas_bangunan' => 'Luas Bangunan (M²)',
|
||||
// 'harga' => 'Harga Transaksi/Penawaran',
|
||||
// 'tanggal_penawaran' => 'Tanggal Penawaran/Transaksi',
|
||||
// 'diskon' => 'Diskon %',
|
||||
// 'esitmasi_harga' => 'Esitmasi Harga Transaksi (Rp)',
|
||||
// 'no_telepon' => 'Telepon Contact Person',
|
||||
// 'nama_nara_sumbr' => 'Nama Nara Sumber',
|
||||
// 'status_nara_sumbr' => 'Status Nara Sumber',
|
||||
// 'waktu_transaksi' => 'Waktu Transaksi/Penawaran',
|
||||
// 'alamat' => 'Alamat Titik Gps',
|
||||
|
||||
// 'jalan' => 'Jalan',
|
||||
// 'desa' => 'Desa/Kelurahan',
|
||||
// 'kecamatan' => 'Kecamatan',
|
||||
// 'kabupaten' => 'Kabupaten',
|
||||
// 'provinsi' => 'Provinsi',
|
||||
|
||||
// 'jarak_pembanding' => 'Jarak Pembanding dengan Objek',
|
||||
// 'elevasi' => 'Estimasi Ranking Tanah',
|
||||
// 'peruntukan' => 'Estiamsi Rangkin Bangunan'
|
||||
|
||||
// ];
|
||||
|
||||
// foreach ($fields as $key => $label) {
|
||||
// $rows[] = [
|
||||
// $nomor++,
|
||||
// $label,
|
||||
// $this->data['objek'][$key] ?? '',
|
||||
// $this->data['pembanding1'][$key] ?? '',
|
||||
// $this->data['pembanding2'][$key] ?? '',
|
||||
// $this->data['pembanding3'][$key] ?? ''
|
||||
// ];
|
||||
// }
|
||||
|
||||
// // B. Perhitungan Penyesuaian
|
||||
// $rows[] = [''];
|
||||
// $rows[] = [''];
|
||||
// $rows[] = ['B. Estimasi Nilai Tanah Pembanding dengan Teknik Penyisaan Tanah untuk mendapatkan per meter persegi estimasi Nilai Tanah Pembanding'];
|
||||
// $rows[] = ['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3'];
|
||||
// $nostimasi = 1;
|
||||
// $filedEstimasi = [
|
||||
// 'estimasi' => 'Estimasi Biaya Pengganti Baru Bangunan (Rp)',
|
||||
// 'estimasi_spl' => 'Estimasi Biaya Pengganti Baru SPL (Rp)',
|
||||
// 'penyusutan' => 'Penyusutan Fisik Banguna',
|
||||
|
||||
// 'a' => 'a. rincian ttipe bangunan (MAPPI)',
|
||||
// 'b' => 'b. umur ekonomis (MAPPI)',
|
||||
// 'c' => 'c. estimasi Tahun tahun visual dengan mempertimbangkan renovasi',
|
||||
// 'd' => 'd. Sehingga sisa umur efektif',
|
||||
// 'e' => 'e. kondisi bagunan',
|
||||
// 'f' => 'f.sehinggan penyusutan fisik',
|
||||
// 'penyusutan_fungsi' => 'Penyusutan fungsi Bangunan (%)',
|
||||
// 'penyusutan_ekonomi' => 'Penyusutan Ekonomi Bangunan (%)',
|
||||
// 'total_penyusutan' => 'Total Penyusutan (%)',
|
||||
// 'estimasi_nilai' => 'Estimasi Nilai Bangunan dan SPL (Rp)',
|
||||
// 'estimasi_tanah' => 'Estimasi Nilai Tanah Pembanding (Rp)',
|
||||
// 'estimasi_nilai' => 'Estimasi Nilai Tanah Pembanding (Rp)',
|
||||
// ];
|
||||
|
||||
// foreach ($filedEstimasi as $key => $label) {
|
||||
// $rows[] = [
|
||||
// $nostimasi++,
|
||||
// $label,
|
||||
// $this->data['estimasi'][$key] ?? '',
|
||||
// $this->data['estimasi1'][$key] ?? '',
|
||||
// $this->data['estimasi2'][$key] ?? '',
|
||||
// $this->data['estimasi3'][$key] ?? ''
|
||||
|
||||
// ];
|
||||
// }
|
||||
|
||||
|
||||
];
|
||||
}
|
||||
public function registerEvents(): array
|
||||
{
|
||||
return [
|
||||
AfterSheet::class => function (AfterSheet $event) {
|
||||
// Styling untuk header utama
|
||||
// $row[] = [''];
|
||||
// $row[] = [''];
|
||||
// $rows[] = ['INDIKASI NILAI TANAHATAS OBJEK PENILAIAN'];
|
||||
|
||||
// $indikasi=[
|
||||
// 'luas_tanah' => 'Luas Tanah ',
|
||||
// 'indikasi_per' => 'INDIKASI TANAH PER M2 (RP/M2)',
|
||||
// 'indikasi_total' => 'INDIKASI TANAH TOTAL(RP)',
|
||||
// 'varian' => 'VARIANT(%)',
|
||||
// ];
|
||||
|
||||
// foreach ($indikasi as $key => $label) {
|
||||
// $rows[] = [
|
||||
// $label,
|
||||
// $this->data['indikasi'][$key] ?? '',
|
||||
// ];
|
||||
// }
|
||||
|
||||
|
||||
// Styling untuk setiap section header
|
||||
$sectionRows = [10, 34, 56, 46, 52]; // Sesuaikan dengan posisi setiap section
|
||||
foreach ($sectionRows as $row) {
|
||||
$event->sheet->getStyle("A{$row}:F{$row}")->getFill()
|
||||
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
|
||||
->getStartColor()->setRGB('E2EFDA');
|
||||
}
|
||||
// // C. Peta Lokasi
|
||||
// $rows[] = [''];
|
||||
// $rows[] = [''];
|
||||
// $rows[] = ['C. Peta Lokasi'];
|
||||
// $rows[] = [$this->data['foto_objek']['foto_objek_peta'] ?? ''];
|
||||
|
||||
// Merge cells untuk headers
|
||||
$event->sheet->mergeCells('A1:E1');
|
||||
$event->sheet->mergeCells('A2:E2');
|
||||
$event->sheet->mergeCells('A4:E4');
|
||||
$event->sheet->mergeCells('A5:E5');
|
||||
$event->sheet->mergeCells('A6:E6');
|
||||
$event->sheet->mergeCells('A7:E7');
|
||||
$event->sheet->mergeCells('A8:E8');
|
||||
// // D. Foto Objek dan Data Pembanding
|
||||
// $rows[] = [''];
|
||||
// $rows[] = ['D. Foto Objek dan Data Pembanding'];
|
||||
// $rows[] = [
|
||||
// $this->data['foto_objek1']['foto_objek'] ?? '',
|
||||
// $this->data['foto_objek2']['foto_objek'] ?? '',
|
||||
// '', '', ''
|
||||
// ];
|
||||
|
||||
// Alignment
|
||||
$event->sheet->getStyle('A1:E8')->getAlignment()
|
||||
->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);
|
||||
}
|
||||
];
|
||||
}
|
||||
public function columnWidths(): array
|
||||
{
|
||||
return [
|
||||
'A' => 5,
|
||||
'B' => 30,
|
||||
'C' => 30,
|
||||
'D' => 30,
|
||||
'E' => 30,
|
||||
'F' => 30,
|
||||
];
|
||||
}
|
||||
// // E. Foto Objek
|
||||
// $rows[] = [''];
|
||||
// $rows[] = ['E. Foto Objek'];
|
||||
// $rows[] = [
|
||||
// $this->data['foto']['foto_objek'] ?? '',
|
||||
// $this->data['foto']['foto_objek'] ?? '',
|
||||
// '', '', ''
|
||||
// ];
|
||||
|
||||
public function styles(Worksheet $sheet)
|
||||
{
|
||||
return [
|
||||
// Style for the main header
|
||||
// return collect($rows);
|
||||
// }
|
||||
|
||||
// Style for section headers
|
||||
10 => ['font' => ['bold' => true]], // A. Informasi Umum
|
||||
34 => ['font' => ['bold' => true]], // B. Estimasi Nilai Tanah
|
||||
35 => ['font' => ['bold' => true]], // C. Peta Lokasi
|
||||
57 => ['font' => ['bold' => true]], // D. Foto Objek dan Pembanding
|
||||
60 => ['font' => ['bold' => true]], // E. Foto Objek
|
||||
|
||||
// Default styling for columns
|
||||
'A:J' => [
|
||||
'alignment' => ['horizontal' => 'left', 'vertical' => 'center'],
|
||||
'wrapText' => true,
|
||||
],
|
||||
|
||||
// Style for other sections (like photo and map sections)
|
||||
|
||||
// Style for the other headers
|
||||
'A11:F11' => [
|
||||
'font' => ['bold' => true],
|
||||
'fill' => ['fillType' => 'solid', 'color' => ['rgb' => 'E2EFDA']],
|
||||
'borders' => [
|
||||
'allBorders' => [
|
||||
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
]
|
||||
]
|
||||
],
|
||||
'A12:F31' => [
|
||||
'borders' => [
|
||||
'allBorders' => [
|
||||
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
]
|
||||
]
|
||||
],
|
||||
// public function headings(): array
|
||||
// {
|
||||
// return [
|
||||
// ['KERTAS KERJA PENILAIAN'],
|
||||
// ['Pendekatan Pasar'],
|
||||
// ['Metode Perbandingan Data Pasar'],
|
||||
// ['Tanggal Penilaian: ' . ($this->headerInfo['tanggal_penilaian'] ?? '')],
|
||||
// ['Nama Pemilik Aset: ' . ($this->headerInfo['nama_pemilik'] ?? '')],
|
||||
// ['Nama Pemberi Tugas: ' . ($this->headerInfo['nama_pemberi_tugas'] ?? '')],
|
||||
// ['Lokasi: ' . ($this->headerInfo['lokasi_lengkap'] ?? '')],
|
||||
// ['Nama Debitur: ' . ($this->headerInfo['nama_debitur'] ?? '')],
|
||||
// [''],
|
||||
// ['A. INFORMASI UMUM'],
|
||||
// ['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3']
|
||||
|
||||
|
||||
'A35:F35' => [
|
||||
'font' => ['bold' => true],
|
||||
'fill' => ['fillType' => 'solid', 'color' => ['rgb' => 'E2EFDA']],
|
||||
'borders' => [
|
||||
'allBorders' => [
|
||||
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
]
|
||||
]
|
||||
],
|
||||
'A35:F49' => [
|
||||
'borders' => [
|
||||
'allBorders' => [
|
||||
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
]
|
||||
]
|
||||
],
|
||||
// ];
|
||||
// }
|
||||
// public function registerEvents(): array
|
||||
// {
|
||||
// return [
|
||||
// AfterSheet::class => function (AfterSheet $event) {
|
||||
// // Styling untuk header utama
|
||||
|
||||
// end header
|
||||
];
|
||||
}
|
||||
|
||||
// // Styling untuk setiap section header
|
||||
// $sectionRows = [10, 34, 56, 46, 52]; // Sesuaikan dengan posisi setiap section
|
||||
// foreach ($sectionRows as $row) {
|
||||
// $event->sheet->getStyle("A{$row}:F{$row}")->getFill()
|
||||
// ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
|
||||
// ->getStartColor()->setRGB('E2EFDA');
|
||||
// }
|
||||
|
||||
// // Merge cells untuk headers
|
||||
// $event->sheet->mergeCells('A1:E1');
|
||||
// $event->sheet->mergeCells('A2:E2');
|
||||
// $event->sheet->mergeCells('A4:E4');
|
||||
// $event->sheet->mergeCells('A5:E5');
|
||||
// $event->sheet->mergeCells('A6:E6');
|
||||
// $event->sheet->mergeCells('A7:E7');
|
||||
// $event->sheet->mergeCells('A8:E8');
|
||||
|
||||
// // Alignment
|
||||
// $event->sheet->getStyle('A1:E8')->getAlignment()
|
||||
// ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);
|
||||
// }
|
||||
// ];
|
||||
// }
|
||||
// public function columnWidths(): array
|
||||
// {
|
||||
// return [
|
||||
// 'A' => 5,
|
||||
// 'B' => 30,
|
||||
// 'C' => 30,
|
||||
// 'D' => 30,
|
||||
// 'E' => 30,
|
||||
// 'F' => 30,
|
||||
// ];
|
||||
// }
|
||||
|
||||
// public function styles(Worksheet $sheet)
|
||||
// {
|
||||
// return [
|
||||
// // Style for the main header
|
||||
|
||||
// // Style for section headers
|
||||
// 10 => ['font' => ['bold' => true]], // A. Informasi Umum
|
||||
// 34 => ['font' => ['bold' => true]], // B. Estimasi Nilai Tanah
|
||||
// 35 => ['font' => ['bold' => true]], // C. Peta Lokasi
|
||||
// 57 => ['font' => ['bold' => true]], // D. Foto Objek dan Pembanding
|
||||
// 60 => ['font' => ['bold' => true]], // E. Foto Objek
|
||||
|
||||
// // Default styling for columns
|
||||
// 'A:J' => [
|
||||
// 'alignment' => ['horizontal' => 'left', 'vertical' => 'center'],
|
||||
// 'wrapText' => true,
|
||||
// ],
|
||||
|
||||
// // Style for other sections (like photo and map sections)
|
||||
|
||||
// // Style for the other headers
|
||||
// 'A11:F11' => [
|
||||
// 'font' => ['bold' => true],
|
||||
// 'fill' => ['fillType' => 'solid', 'color' => ['rgb' => 'E2EFDA']],
|
||||
// 'borders' => [
|
||||
// 'allBorders' => [
|
||||
// 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
// ]
|
||||
// ]
|
||||
// ],
|
||||
// 'A12:F31' => [
|
||||
// 'borders' => [
|
||||
// 'allBorders' => [
|
||||
// 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
// ]
|
||||
// ]
|
||||
// ],
|
||||
|
||||
|
||||
// 'A35:F35' => [
|
||||
// 'font' => ['bold' => true],
|
||||
// 'fill' => ['fillType' => 'solid', 'color' => ['rgb' => 'E2EFDA']],
|
||||
// 'borders' => [
|
||||
// 'allBorders' => [
|
||||
// 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
// ]
|
||||
// ]
|
||||
// ],
|
||||
// 'A35:F49' => [
|
||||
// 'borders' => [
|
||||
// 'allBorders' => [
|
||||
// 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
// ]
|
||||
// ]
|
||||
// ],
|
||||
|
||||
// // end header
|
||||
// ];
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@@ -498,7 +498,7 @@ class KJPPController extends Controller
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
$data = $query->with('city')->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
@@ -9,7 +9,7 @@ use App\Http\Controllers\Controller;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\KertasKerjaExport;
|
||||
use App\Http\Controllers\SurveyorController;
|
||||
use Modules\Lpj\Http\Controllers\SurveyorController;
|
||||
|
||||
class PenilaiController extends Controller
|
||||
{
|
||||
@@ -62,22 +62,43 @@ class PenilaiController extends Controller
|
||||
$basicData = $data->getCommonData();
|
||||
|
||||
$permohonan = Permohonan::with(['debiture.documents.jenisjaminan', 'region.teams.teamsUsers.user', 'penilaian'])->find($id);
|
||||
return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'basicData'));
|
||||
$jaminanId = $permohonan->debiture->documents->first()->jenis_jaminan_id;
|
||||
$inspeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first();
|
||||
$forminspeksi = null;
|
||||
if ($inspeksi) {
|
||||
$forminspeksi = json_decode($inspeksi->data_form, true);
|
||||
}
|
||||
return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'basicData', 'forminspeksi', 'inspeksi'));
|
||||
}
|
||||
|
||||
public function standard($id)
|
||||
{
|
||||
$permohonan = Permohonan::with(['debiture.documents.jenisjaminan', 'region.teams.teamsUsers.user', 'penilaian'])->find($id);
|
||||
return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan'));
|
||||
|
||||
$jaminanId = $permohonan->debiture->documents->first()->jenis_jaminan_id;
|
||||
|
||||
$inspeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first();
|
||||
$forminspeksi = null;
|
||||
if ($inspeksi) {
|
||||
$forminspeksi = json_decode($inspeksi->data_form, true);
|
||||
}
|
||||
|
||||
$data = new SurveyorController();
|
||||
$basicData = $data->getCommonData();
|
||||
|
||||
return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi'));
|
||||
}
|
||||
|
||||
public function resume(){
|
||||
return view('lpj::resume.index');
|
||||
public function resume($id)
|
||||
{
|
||||
$permohonan = Permohonan::with(['debiture.documents.jenisjaminan', 'region.teams.teamsUsers.user', 'penilaian'])->find($id);
|
||||
return view('lpj::penilai.components.resume', compact('permohonan'));
|
||||
}
|
||||
|
||||
public function memo(){
|
||||
public function memo()
|
||||
{
|
||||
return view('lpj::resume.index');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -192,19 +213,24 @@ class PenilaiController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
public function kertas_kerja($id, $jeniJaminan)
|
||||
public function kertas_kerja($id, $jaminanId)
|
||||
{
|
||||
$data = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first();
|
||||
|
||||
$headerInfo = [
|
||||
'tanggal_penilaian' => '',
|
||||
'nama_pemilik' => '',
|
||||
'nama_pemberi_tugas' => '',
|
||||
'lokasi_lengkap' => '',
|
||||
'nama_debitur' => ''
|
||||
];
|
||||
// $data = null;
|
||||
// $headerInfo = [
|
||||
// 'tanggal_penilaian' => '',
|
||||
// 'nama_pemilik' => '',
|
||||
// 'nama_pemberi_tugas' => '',
|
||||
// 'lokasi_lengkap' => '',
|
||||
// 'nama_debitur' => ''
|
||||
// ];
|
||||
|
||||
return Excel::download(new KertasKerjaExport($data, $headerInfo), 'kertas-kerja.xlsx');
|
||||
// $datas = json_decode($data->data_pembanding);
|
||||
// return response()->json(['data' =>$datas ]);
|
||||
|
||||
// return view('lpj::component.kertas-kerja', compact('data'));
|
||||
return Excel::download(new KertasKerjaExport($data), 'kertas-kerja.xlsx');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -164,7 +164,6 @@ class SurveyorController extends Controller
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Data berhasil disimpan',
|
||||
'data' => $processedData
|
||||
], 200);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
@@ -178,30 +177,38 @@ class SurveyorController extends Controller
|
||||
|
||||
private function getActionSpecificRules($data, $action, $request): array
|
||||
{
|
||||
$pisah = explode(',', $action);
|
||||
|
||||
$allRules = [
|
||||
'tanah' => $this->getTanahData($data, $request),
|
||||
'bangunan' => $this->getBangunanData($data, $request),
|
||||
'kapal' => $this->getKapalData($data, $request),
|
||||
'kendaraan' => $this->getKendaraanData($data, $request),
|
||||
'mesin' => $this->getMesinData($data, $request),
|
||||
'pesawat' => $this->getPesawatData($data, $request),
|
||||
'alat-berat' => $this->getAlatBeratData($data, $request),
|
||||
'apartemen-kantor' => $this->getUnitData($data, $request),
|
||||
'lingkungan' => $this->getLingkunganData($data, $request),
|
||||
'fakta' => $this->getFactData($data, $request),
|
||||
$allowedActions = [
|
||||
'apartemen-kantor' => 'getUnitData',
|
||||
'tanah' => 'getTanahData',
|
||||
'bangunan' => 'getBangunanData',
|
||||
'kapal' => 'getKapalData',
|
||||
'kendaraan' => 'getKendaraanData',
|
||||
'mesin' => 'getMesinData',
|
||||
'pesawat' => 'getPesawatData',
|
||||
'alat-berat' => 'getAlatBeratData',
|
||||
'lingkungan' => 'getLingkunganData',
|
||||
'fakta' => 'getFactData'
|
||||
];
|
||||
|
||||
$rules = [];
|
||||
$hasAssetDescriptionRules = false;
|
||||
|
||||
$pisah = array_filter(
|
||||
explode(',', $action),
|
||||
function($act) use ($allowedActions) {
|
||||
return isset($allowedActions[trim($act)]);
|
||||
}
|
||||
);
|
||||
|
||||
foreach ($pisah as $act) {
|
||||
if (isset($allRules[$act])) {
|
||||
$rules = array_merge($rules, $allRules[$act]);
|
||||
if ($act == 'tanah' || $act == 'bangunan' || $act == 'apartemen-kantor') {
|
||||
$hasAssetDescriptionRules = true;
|
||||
}
|
||||
$act = trim($act);
|
||||
$method = $allowedActions[$act];
|
||||
|
||||
$actionRules = $this->$method($data, $request);
|
||||
$rules = array_merge($rules, $actionRules);
|
||||
|
||||
if (in_array($act, ['apartemen-kantor', 'tanah', 'bangunan'])) {
|
||||
$hasAssetDescriptionRules = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,28 +224,39 @@ class SurveyorController extends Controller
|
||||
{
|
||||
try {
|
||||
$maxSize = getMaxFileSize('Foto');
|
||||
$validatedData = $request->validate([
|
||||
'foto_denah' => 'required|file|mimes:jpeg,jpg,png,pdf,svg|max:'. $maxSize,
|
||||
$validationRules = [
|
||||
'luas' => 'required|numeric',
|
||||
'permohonan_id' => 'required',
|
||||
'jenis_jaminan_id' => 'required'
|
||||
]);
|
||||
];
|
||||
|
||||
$validatedData['foto_denah'] = $this->uploadFile($request->file('foto_denah'), 'foto_denah');
|
||||
if ($request->hasFile('foto_denah')) {
|
||||
$maxSize = getMaxFileSize('Foto');
|
||||
$validationRules['foto_denah'] = 'file|mimes:jpeg,jpg,png,pdf,svg|max:'. $maxSize;
|
||||
}
|
||||
|
||||
$validatedData = $request->validate($validationRules);
|
||||
|
||||
$formatJsonDenah = [
|
||||
'foto_denah' => $validatedData['foto_denah'],
|
||||
'luas' => $validatedData['luas'],
|
||||
];
|
||||
|
||||
if ($request->hasFile('foto_denah')) {
|
||||
$formatJsonDenah['foto_denah'] = $this->uploadFile($request->file('foto_denah'), 'foto_denah');
|
||||
}
|
||||
|
||||
|
||||
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
|
||||
->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))
|
||||
->first();
|
||||
|
||||
if ($inspeksi) {
|
||||
$existingDenah = json_decode($inspeksi->denah_form, true) ?? [];
|
||||
|
||||
$updatedDenah = array_merge($existingDenah, $formatJsonDenah);
|
||||
|
||||
$inspeksi->update([
|
||||
'denah_form' => json_encode($formatJsonDenah)
|
||||
'denah_form' => json_encode($updatedDenah)
|
||||
]);
|
||||
} else {
|
||||
Inspeksi::create([
|
||||
@@ -537,7 +555,7 @@ class SurveyorController extends Controller
|
||||
$penilaian->update([
|
||||
'authorized_status' => 1,
|
||||
]);
|
||||
|
||||
|
||||
$data['status'] = 'success';
|
||||
$data['message']= 'Jadwal '.$request->noReg.' berhasil di aprove';
|
||||
} catch (\Exception $e) {
|
||||
@@ -573,7 +591,7 @@ class SurveyorController extends Controller
|
||||
->first();
|
||||
|
||||
if ($inspeksi) {
|
||||
$existingData = $inspeksi->data_pembanding ?? [];
|
||||
$existingData = json_decode($inspeksi->data_pembanding, true) ?? [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -582,8 +600,8 @@ class SurveyorController extends Controller
|
||||
|
||||
|
||||
$existingFoto = null;
|
||||
if ($existingData && isset($existingData[$i]['foto_objek'])) {
|
||||
$existingFoto = $existingData[$i]['foto_objek'];
|
||||
if ($existingData && isset($existingData['data_pembanding'][$i]['foto_objek'])) {
|
||||
$existingFoto = $existingData['data_pembanding'][$i]['foto_objek'];
|
||||
}
|
||||
|
||||
// Penanganan foto pembanding
|
||||
@@ -602,8 +620,8 @@ class SurveyorController extends Controller
|
||||
|
||||
return $dataPembanding;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private function formatSinglePembanding($request, $index)
|
||||
{
|
||||
$fields = [
|
||||
@@ -613,12 +631,12 @@ class SurveyorController extends Controller
|
||||
'peruntukan', 'penawaran_transaksi', 'nomor_tlp',
|
||||
'kordinat_lat', 'kordinat_lng', 'jenis_aset','foto_objek'
|
||||
];
|
||||
|
||||
|
||||
$pembanding = [];
|
||||
foreach ($fields as $field) {
|
||||
$inputName = "{$field}_pembanding";
|
||||
$inputValue = $request->input($inputName);
|
||||
|
||||
|
||||
// Pastikan input adalah array dan index valid
|
||||
if (is_array($inputValue) && isset($inputValue[$index])) {
|
||||
$pembanding[$field] = $inputValue[$index];
|
||||
@@ -627,10 +645,10 @@ class SurveyorController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
return $pembanding;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private function handleupdateOrDeleteFile($file, $type, $prefix)
|
||||
@@ -662,54 +680,54 @@ class SurveyorController extends Controller
|
||||
'status_nara_sumber', 'harga', 'nama_nara_sumber',
|
||||
'kordinat_lat', 'kordinat_lng', 'jenis_aset',
|
||||
];
|
||||
|
||||
|
||||
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
|
||||
->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))
|
||||
->first();
|
||||
|
||||
|
||||
if ($inspeksi) {
|
||||
$needsSave = false;
|
||||
|
||||
|
||||
// Handle foto_form
|
||||
$fotoForm = json_decode($inspeksi->foto_form, true) ?: [];
|
||||
if (!isset($fotoForm['object_jaminan'])) {
|
||||
$fotoForm['object_jaminan'] = [['foto_objek' => null]];
|
||||
$needsSave = true;
|
||||
}
|
||||
|
||||
|
||||
// Handle data_form
|
||||
$dataForm = json_decode($inspeksi->data_form, true) ?: [];
|
||||
|
||||
|
||||
// Inisialisasi struktur data jika belum ada
|
||||
if(!isset($dataForm['bangunan'])) {
|
||||
$dataForm['bangunan'] = [];
|
||||
$needsSave = true;
|
||||
}
|
||||
|
||||
|
||||
if(!isset($dataForm['tanah'])) {
|
||||
$dataForm['tanah'] = [];
|
||||
$needsSave = true;
|
||||
}
|
||||
|
||||
|
||||
if (!isset($dataForm['asset'])) {
|
||||
$dataForm['asset'] = [];
|
||||
$needsSave = true;
|
||||
}
|
||||
|
||||
|
||||
// Update data dengan mempertahankan struktur sesuai/tidak sesuai
|
||||
foreach ($fields as $field) {
|
||||
if ($request->filled($field)) {
|
||||
$newValue = $request->input($field);
|
||||
|
||||
|
||||
// Fields untuk tanah
|
||||
if (in_array($field, ['luas_tanah'])) {
|
||||
$cekLuas = $dataForm['tanah']['luas_tanah'] == 'sesuai' ? 'sesuai' : 'tidak sesuai';
|
||||
$cekLuas = $dataForm['tanah']['luas_tanah'] == 'sesuai' ? 'sesuai' : 'tidak sesuai';
|
||||
$dataForm['tanah'][$field][$cekLuas] = $newValue;
|
||||
}
|
||||
// Fields untuk bangunan
|
||||
else if (in_array($field, ['luas_tanah_bagunan'])) {
|
||||
|
||||
$cekBanguan = $dataForm['bangunan']['luas_tanah_bagunan'] == 'sesuai' ? 'sesuai' : 'tidak sesuai';
|
||||
$cekBanguan = $dataForm['bangunan']['luas_tanah_bagunan'] == 'sesuai' ? 'sesuai' : 'tidak sesuai';
|
||||
$dataForm['bangunan'][$field][$cekBanguan] = $newValue;
|
||||
}
|
||||
// Fields untuk alamat dalam asset
|
||||
@@ -718,12 +736,12 @@ class SurveyorController extends Controller
|
||||
if (!isset($dataForm['asset']['alamat'])) {
|
||||
$dataForm['asset']['alamat'] = [];
|
||||
}
|
||||
|
||||
|
||||
$alamatStatus = $dataForm['asset']['alamat'] == 'sesuai' ? 'sesuai' : 'tidak sesuai';
|
||||
if (!isset($dataForm['asset']['alamat'][$alamatStatus])) {
|
||||
$dataForm['asset']['alamat'][$alamatStatus] = [];
|
||||
}
|
||||
|
||||
|
||||
$dataForm['asset']['alamat'][$alamatStatus][$field] = $newValue;
|
||||
}
|
||||
// Jenis asset dalam asset
|
||||
@@ -737,19 +755,19 @@ class SurveyorController extends Controller
|
||||
else {
|
||||
$dataForm['asset'][$field] = $newValue;
|
||||
}
|
||||
|
||||
|
||||
$needsSave = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ($needsSave) {
|
||||
$inspeksi->foto_form = json_encode($fotoForm);
|
||||
$inspeksi->data_form = json_encode($dataForm);
|
||||
$inspeksi->save();
|
||||
}
|
||||
|
||||
|
||||
$existingFoto = $fotoForm['object_jaminan'][0]['foto_objek'] ?? null;
|
||||
|
||||
|
||||
// Gabungkan data dari tanah, bangunan, dan asset
|
||||
$objekPenilaian = array_merge(
|
||||
['foto_objek' => $existingFoto],
|
||||
@@ -772,7 +790,7 @@ class SurveyorController extends Controller
|
||||
return $carry;
|
||||
}, [])
|
||||
);
|
||||
|
||||
|
||||
} else {
|
||||
// Inisialisasi data baru
|
||||
$objekPenilaian = array_reduce($fields, function ($carry, $field) use ($request) {
|
||||
@@ -780,10 +798,10 @@ class SurveyorController extends Controller
|
||||
return $carry;
|
||||
}, ['foto_objek' => null]);
|
||||
}
|
||||
|
||||
|
||||
return $objekPenilaian;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private function saveInspeksi($formattedData)
|
||||
@@ -855,6 +873,7 @@ class SurveyorController extends Controller
|
||||
'data_pembanding' => $this->formatDataPembanding($request)
|
||||
];
|
||||
|
||||
|
||||
$inspeksi = $this->saveInspeksi($formattedData);
|
||||
|
||||
DB::commit();
|
||||
@@ -1023,7 +1042,6 @@ class SurveyorController extends Controller
|
||||
if (json_last_error() !== JSON_ERROR_NONE) {
|
||||
throw new \Exception('Error decoding comparison data: ' . json_last_error_msg());
|
||||
}
|
||||
|
||||
}
|
||||
$fotoForm = json_decode($inspeksi->foto_form, true);
|
||||
|
||||
@@ -1037,8 +1055,6 @@ class SurveyorController extends Controller
|
||||
$districts = District::where('city_code', $this->getCodeAlamat('city_code', $inspectionData))->get();
|
||||
$villages = Village::where('district_code', $this->getCodeAlamat('district_code', $inspectionData))->get();
|
||||
|
||||
|
||||
|
||||
return view('lpj::surveyor.components.data-pembanding', compact(
|
||||
'permohonan',
|
||||
'id',
|
||||
@@ -1050,7 +1066,8 @@ class SurveyorController extends Controller
|
||||
'cities',
|
||||
'districts',
|
||||
'villages',
|
||||
'provinces'
|
||||
'provinces',
|
||||
'inspeksi'
|
||||
));
|
||||
|
||||
} catch (\Exception $e) {
|
||||
@@ -1544,7 +1561,7 @@ class SurveyorController extends Controller
|
||||
|
||||
|
||||
|
||||
private function getCommonData()
|
||||
public function getCommonData()
|
||||
{
|
||||
return [
|
||||
'branches' => Branch::all(),
|
||||
@@ -1660,7 +1677,7 @@ class SurveyorController extends Controller
|
||||
true
|
||||
),
|
||||
'hadap_mata_angin' => [
|
||||
$data['hadap_mata_angin'] => ($data['hadap_mata_angin'] == 'sesuai') ? $data['hadap_mata_angin_sesuai'] : $data['hadap_mata_angin_tidak_sesuai']
|
||||
$data['hadap_mata_angin'] => $data['hadap_mata_angin'] == 'sesuai' ? $data['hadap_mata_angin_sesuai'] : $data['hadap_mata_angin_tidak_sesuai'] ?? null
|
||||
],
|
||||
'bentuk_tanah' => $this->getFieldData(
|
||||
$data,
|
||||
@@ -1791,11 +1808,9 @@ class SurveyorController extends Controller
|
||||
'jarak_tps' => $data['jarak_tps'] ?? null,
|
||||
'nama_tps' => $data['nama_tps'] ?? null,
|
||||
'merupakan_daerah' => $data['merupakan_daerah'] ?? null,
|
||||
'fasilitas_dekat_object' => $this->getFieldData(
|
||||
$data,
|
||||
'fasilitas_dekat_object',
|
||||
false,
|
||||
'lainnya'
|
||||
'fasilitas_dekat_object' => $this->mapArrayWithInputs(
|
||||
$data['fasilitas_dekat_object'] ?? [],
|
||||
$data['fasilitas_dekat_object_input'] ?? []
|
||||
),
|
||||
]
|
||||
];
|
||||
|
||||
@@ -76,7 +76,7 @@ class FormSurveyorRequest extends FormRequest
|
||||
'hadap_mata_angin' => 'required',
|
||||
'hadap_mata_angin_sesuai' => 'nullable',
|
||||
'hadap_mata_angin_tidak_sesuai' => 'nullable',
|
||||
'bentuk_tanah' => 'nullable|array',
|
||||
'bentuk_tanah' => 'required|array',
|
||||
'bentuk_tanah_lainnya' => 'nullable',
|
||||
'kontur_tanah' => 'required|array',
|
||||
'ketinggian_jalan' => 'required|array',
|
||||
@@ -102,8 +102,8 @@ class FormSurveyorRequest extends FormRequest
|
||||
'luas_tanah_bangunan_sesuai' => 'nullable',
|
||||
'luas_tanah_bagunan' => 'required',
|
||||
'luas_tanah_bangunan_tidak_sesuai' => 'nullable',
|
||||
'jenis_bangunan' => 'required',
|
||||
'kondisi_bangunan' => 'nullable',
|
||||
'jenis_bangunan' => 'required|array',
|
||||
'kondisi_bangunan' => 'required|array',
|
||||
'sifat_bangunan' => 'required|array',
|
||||
'sifat_bangunan_input' => 'nullable|array',
|
||||
|
||||
@@ -167,7 +167,7 @@ class FormSurveyorRequest extends FormRequest
|
||||
'nama_tpu' => 'nullable',
|
||||
'merupakan_daerah' => 'nullable',
|
||||
'fasilitas_dekat_object' => 'nullable|array',
|
||||
'fasilitas_dekat_object_lainnya' => 'nullable',
|
||||
'fasilitas_dekat_object_input' => 'nullable|array',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace Modules\Lpj\Models;
|
||||
|
||||
use Modules\Location\Models\Province;
|
||||
use Modules\Location\Models\City;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
@@ -25,4 +25,12 @@ class KJPP extends Model
|
||||
{
|
||||
return $this->hasMany(PenawaranDetailTender::class, 'kjpp_rekanan_id', 'id');
|
||||
}
|
||||
|
||||
public function city()
|
||||
{
|
||||
return $this->belongsTo(City::class, 'city_code', 'code');
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user