Perubahan yang dilakukan: - Menghapus validasi input pada method `preview()` untuk mendukung fleksibilitas data preview - Mengganti eager loading dari `tujuanPenilaian` menjadi `jenisPenilaian` agar sesuai dengan kebutuhan data dinamis - Menambahkan method chaining `->get()` pada akhir query untuk memastikan eksekusi query yang benar - Menambahkan field `jenisPenilaian` ke dalam memoData agar template dapat menampilkan instruksi pembayaran secara dinamis - Mengimplementasikan checkbox visual yang disabled dengan hidden input untuk tetap mengirim data saat form submit - Memisahkan antara checkbox untuk tampilan (disabled) dan input data (hidden) untuk meningkatkan UX - Mengubah lebar label dari 80px menjadi 200px pada template PDF dan preview untuk layout yang lebih baik - Mengganti informasi jaminan menjadi statis "Tanah & Bangunan" pada template PDF dan preview - Menambahkan conditional rendering untuk menampilkan instruksi pembayaran sesuai dengan jenis penilaian (Internal/KJPP) - Menyesuaikan layout dan formatting pada template PDF dan preview agar lebih konsisten secara visual - Menambahkan logika text dinamis untuk jenis penilaian pada bagian instruksi pembayaran - Mengoptimalkan struktur query agar lebih efisien dan menghindari duplikasi Tujuan perubahan: - Mendukung proses memo penyelesaian dengan jenis penilaian yang lebih fleksibel (Internal/KJPP) - Meningkatkan pengalaman pengguna dengan tampilan checkbox yang jelas namun tetap menyimpan data dengan aman - Menyederhanakan layout dan formatting agar lebih profesional dan konsisten di preview maupun PDF - Memastikan proses generate memo berjalan sesuai kebutuhan bisnis dengan instruksi pembayaran yang tepat
559 lines
20 KiB
PHP
559 lines
20 KiB
PHP
<?php
|
|
|
|
namespace Modules\Lpj\Http\Controllers;
|
|
|
|
use Exception;
|
|
use Modules\Lpj\Models\Noc;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Modules\Lpj\Models\Permohonan;
|
|
use Illuminate\Support\Facades\Log;
|
|
use App\Http\Controllers\Controller;
|
|
use Barryvdh\DomPDF\Facade\Pdf;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
class MemoController extends Controller
|
|
{
|
|
public $user;
|
|
|
|
/**
|
|
* Menampilkan halaman index memo penyelesaian
|
|
*
|
|
* @return \Illuminate\View\View
|
|
*/
|
|
public function index()
|
|
{
|
|
Log::info('MemoController: Mengakses halaman index memo penyelesaian');
|
|
return view('lpj::memo.index');
|
|
}
|
|
|
|
/**
|
|
* Menampilkan form untuk membuat memo penyelesaian dengan data yang dipilih
|
|
*
|
|
* @param Request $request
|
|
* @return \Illuminate\View\View
|
|
*/
|
|
public function create(Request $request)
|
|
{
|
|
Log::info('MemoController: Mengakses halaman create memo penyelesaian');
|
|
|
|
$selectedIds = $request->get('selected_ids', []);
|
|
|
|
// Pastikan $selectedIds selalu berupa array
|
|
if (is_string($selectedIds)) {
|
|
$selectedIds = explode(',', $selectedIds);
|
|
}
|
|
|
|
// Filter array untuk menghilangkan nilai kosong
|
|
$selectedIds = array_filter($selectedIds, function($id) {
|
|
return !empty(trim($id));
|
|
});
|
|
|
|
$permohonanList = [];
|
|
$totalBiayaPJ = 0;
|
|
|
|
if (!empty($selectedIds) && count($selectedIds) > 0) {
|
|
try {
|
|
$permohonanList = Permohonan::with([
|
|
'user',
|
|
'debiture',
|
|
'branch',
|
|
'tujuanPenilaian',
|
|
'penilaian',
|
|
'jenisFasilitasKredit',
|
|
'documents.inspeksi',
|
|
'penilai',
|
|
'documents.detail',
|
|
'noc'
|
|
])->whereIn('id', $selectedIds)->get();
|
|
|
|
// Hitung total biaya PJ dari nominal_bayar di tabel NOC
|
|
$totalBiayaPJ = Noc::whereIn('permohonan_id', $selectedIds)
|
|
->sum('nominal_bayar');
|
|
|
|
Log::info('MemoController: Total Biaya PJ dihitung: ' . $totalBiayaPJ);
|
|
|
|
} catch (Exception $e) {
|
|
Log::error('MemoController: Error saat mengambil data permohonan - ' . $e->getMessage());
|
|
return redirect()->back()->with('error', 'Terjadi kesalahan saat memuat data');
|
|
}
|
|
}
|
|
|
|
return view('lpj::memo.create', compact('permohonanList', 'totalBiayaPJ'));
|
|
}
|
|
|
|
/**
|
|
* Menyimpan memo penyelesaian yang telah dibuat
|
|
*
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
Log::info('MemoController: Memulai proses penyimpanan memo penyelesaian');
|
|
|
|
DB::beginTransaction();
|
|
|
|
try {
|
|
// Validasi input
|
|
$request->validate([
|
|
'permohonan_ids' => 'required|array',
|
|
'permohonan_ids.*' => 'exists:permohonan,id',
|
|
'memo_number' => 'required|string|max:255',
|
|
'payment_date' => 'required|date',
|
|
'memo_date' => 'required|date'
|
|
]);
|
|
|
|
$permohonanIds = $request->permohonan_ids;
|
|
$memoNumber = $request->memo_number;
|
|
$paymentDate = $request->payment_date;
|
|
$memoDate = $request->memo_date;
|
|
|
|
// Update status permohonan yang dipilih
|
|
foreach ($permohonanIds as $permohonanId) {
|
|
$permohonan = Permohonan::find($permohonanId);
|
|
if ($permohonan) {
|
|
$permohonan->status = 'memo-penyelesaian';
|
|
$permohonan->memo_penyelesaian_number = $memoNumber;
|
|
$permohonan->memo_penyelesaian_date = $memoDate;
|
|
$permohonan->memo_penyelesaian_payment_date = $paymentDate;
|
|
$permohonan->memo_penyelesaian_created_at = now();
|
|
//$permohonan->save();
|
|
|
|
Log::info('MemoController: Berhasil update permohonan ID: ' . $permohonanId);
|
|
}
|
|
}
|
|
|
|
DB::commit();
|
|
Log::info('MemoController: Berhasil menyimpan memo penyelesaian untuk ' . count($permohonanIds) . ' permohonan');
|
|
|
|
return redirect()->route('memo.index')
|
|
->with('success', 'Memo penyelesaian berhasil dibuat untuk ' . count($permohonanIds) . ' permohonan');
|
|
|
|
} catch (Exception $e) {
|
|
DB::rollback();
|
|
Log::error('MemoController: Error saat menyimpan memo penyelesaian - ' . $e->getMessage());
|
|
|
|
return redirect()->back()
|
|
->withInput()
|
|
->with('error', 'Terjadi kesalahan saat menyimpan memo penyelesaian: ' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Menampilkan detail memo penyelesaian
|
|
*
|
|
* @param int $id
|
|
* @return \Illuminate\View\View
|
|
*/
|
|
public function show($id)
|
|
{
|
|
Log::info('MemoController: Mengakses detail memo penyelesaian ID: ' . $id);
|
|
|
|
$permohonan = Permohonan::with([
|
|
'user',
|
|
'debiture',
|
|
'branch',
|
|
'tujuanPenilaian',
|
|
'penilaian',
|
|
'jenisFasilitasKredit',
|
|
'documents.inspeksi',
|
|
'penilai',
|
|
'documents.detail',
|
|
'noc'
|
|
])->findOrFail($id);
|
|
|
|
return view('lpj::memo.show', compact('permohonan'));
|
|
}
|
|
|
|
/**
|
|
* Mengambil data untuk datatables pada halaman memo penyelesaian
|
|
*
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function dataForDatatables(Request $request)
|
|
{
|
|
Log::info('MemoController: Mengambil data untuk datatables');
|
|
|
|
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
|
Log::warning('MemoController: User tidak memiliki permission untuk melihat data');
|
|
// abort(403, 'Sorry! You are not allowed to view users.');
|
|
}
|
|
|
|
// Mengambil data dari database dengan kondisi yang sama seperti LaporanController
|
|
$query = Permohonan::query()
|
|
->whereIn('status', ['proses-laporan', 'done', 'paparan', 'proses-paparan', 'memo-penyelesaian'])
|
|
->whereNotNull('approval_so_at')
|
|
->whereNotNull('approval_eo_at')
|
|
->where(function ($q) {
|
|
$q->whereIn('nilai_plafond_id', [1, 4])
|
|
->whereNotNull('approval_dd_at')
|
|
->orWhereIn('nilai_plafond_id', [2, 3]);
|
|
})
|
|
->whereHas('noc'); // Hanya tampilkan permohonan yang memiliki NOC
|
|
|
|
|
|
$query = $query->orderBy('nomor_registrasi', 'desc');
|
|
|
|
// Apply search filter jika ada
|
|
if ($request->has('search') && !empty($request->get('search'))) {
|
|
$searchParams = explode('|', $request->get('search'));
|
|
|
|
$filterJenisPenilaian = $searchParams[0] ?? '';
|
|
$searchTerm = $searchParams[1] ?? '';
|
|
|
|
// Filter berdasarkan jenis penilaian
|
|
if (!empty($filterJenisPenilaian)) {
|
|
$query->where('jenis_penilaian_id', $filterJenisPenilaian);
|
|
Log::info('Applied jenis penilaian filter', ['filter' => $filterJenisPenilaian]);
|
|
}
|
|
|
|
$query->where(function ($q) use ($searchTerm) {
|
|
$q->where('nomor_registrasi', 'LIKE', '%' . $searchTerm . '%');
|
|
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $searchTerm . '%');
|
|
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $searchTerm . '%');
|
|
$q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $searchTerm . '%');
|
|
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $searchTerm . '%');
|
|
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $searchTerm . '%');
|
|
$q->orWhere('status', 'LIKE', '%' . $searchTerm . '%');
|
|
});
|
|
}
|
|
|
|
// Apply sorting jika ada
|
|
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
|
$order = $request->get('sortOrder');
|
|
$column = $request->get('sortField');
|
|
$query->orderBy($column, $order);
|
|
}
|
|
|
|
// Mendapatkan total count records
|
|
$totalRecords = $query->count();
|
|
$size = $request->get('size', 10);
|
|
if ($size == 0) {
|
|
$size = 10;
|
|
}
|
|
|
|
// Apply pagination jika ada
|
|
if ($request->has('page') && $request->has('size')) {
|
|
$page = $request->get('page');
|
|
$size = $request->get('size');
|
|
$offset = ($page - 1) * $size;
|
|
|
|
$query->skip($offset)->take($size);
|
|
}
|
|
|
|
// Mendapatkan filtered count records
|
|
$filteredRecords = $query->count();
|
|
|
|
// Mendapatkan data untuk halaman saat ini
|
|
$data = $query->with([
|
|
'user',
|
|
'debiture',
|
|
'branch',
|
|
'tujuanPenilaian',
|
|
'jenisPenilaian',
|
|
'penilaian',
|
|
'jenisFasilitasKredit',
|
|
'documents.inspeksi',
|
|
'penilai',
|
|
'documents.detail',
|
|
'noc'
|
|
])->get();
|
|
|
|
// Menghitung page count
|
|
$pageCount = ceil($totalRecords / $size);
|
|
|
|
// Menghitung current page number
|
|
$currentPage = max(1, $request->get('page', 1));
|
|
|
|
Log::info('MemoController: Berhasil mengambil data datatables - Total: ' . $totalRecords . ', Filtered: ' . $filteredRecords);
|
|
|
|
// Return response data sebagai JSON object
|
|
return response()->json([
|
|
'draw' => $request->get('draw'),
|
|
'recordsTotal' => $totalRecords,
|
|
'recordsFiltered' => $filteredRecords,
|
|
'pageCount' => $pageCount,
|
|
'page' => $currentPage,
|
|
'totalCount' => $totalRecords,
|
|
'data' => $data,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Mengambil total biaya PJ berdasarkan permohonan yang dipilih
|
|
*
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function getTotalBiayaPJ(Request $request)
|
|
{
|
|
Log::info('MemoController: Mengambil total biaya PJ');
|
|
|
|
try {
|
|
$permohonanIds = $request->get('permohonan_ids', []);
|
|
|
|
// Pastikan $permohonanIds selalu berupa array
|
|
if (is_string($permohonanIds)) {
|
|
$permohonanIds = explode(',', $permohonanIds);
|
|
}
|
|
|
|
// Filter array untuk menghilangkan nilai kosong
|
|
$permohonanIds = array_filter($permohonanIds, function($id) {
|
|
return !empty(trim($id));
|
|
});
|
|
|
|
$totalBiayaPJ = 0;
|
|
|
|
if (!empty($permohonanIds) && count($permohonanIds) > 0) {
|
|
// Hitung total biaya PJ dari nominal_bayar di tabel NOC
|
|
$totalBiayaPJ = \Modules\Lpj\Models\Noc::whereIn('permohonan_id', $permohonanIds)
|
|
->sum('nominal_bayar');
|
|
}
|
|
|
|
Log::info('MemoController: Total Biaya PJ berhasil dihitung: ' . $totalBiayaPJ);
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'total_biaya_pj' => $totalBiayaPJ,
|
|
'total_biaya_pj_formatted' => 'Rp ' . number_format($totalBiayaPJ, 0, ',', '.')
|
|
]);
|
|
|
|
} catch (Exception $e) {
|
|
Log::error('MemoController: Error saat menghitung total biaya PJ - ' . $e->getMessage());
|
|
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Terjadi kesalahan saat menghitung total biaya PJ'
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Menampilkan preview memo penyelesaian sebelum menyimpan
|
|
*
|
|
* @param Request $request
|
|
* @return \Illuminate\View\View
|
|
*/
|
|
public function preview(Request $request)
|
|
{
|
|
Log::info('MemoController: Mengakses halaman preview memo penyelesaian');
|
|
|
|
|
|
$permohonanIds = $request->permohonan_ids;
|
|
$memoNumber = $request->memo_number;
|
|
$paymentDate = $request->payment_date;
|
|
$memoDate = $request->memo_date;
|
|
|
|
try {
|
|
// Ambil data permohonan yang dipilih
|
|
$permohonanList = Permohonan::with([
|
|
'user',
|
|
'debiture',
|
|
'branch',
|
|
'penilaian',
|
|
'jenisPenilaian',
|
|
'jenisFasilitasKredit',
|
|
'documents.inspeksi',
|
|
'penilai',
|
|
'documents.detail',
|
|
'noc'
|
|
])->whereIn('id', $permohonanIds);
|
|
|
|
// Hitung total biaya PJ dari nominal_bayar di tabel NOC
|
|
$totalBiayaPJ = Noc::whereIn('permohonan_id', $permohonanIds)
|
|
->sum('nominal_bayar');
|
|
|
|
// Data untuk template memo
|
|
$memoData = [
|
|
'memo_number' => $memoNumber,
|
|
'memo_date' => $memoDate,
|
|
'payment_date' => $paymentDate,
|
|
'total_biaya_pj' => $totalBiayaPJ,
|
|
'permohonan_list' => $permohonanList->get(),
|
|
'debitur_count' => $permohonanList->get()->count(),
|
|
'jaminan_info' => $this->getJaminanInfo($permohonanList->get()),
|
|
'jenisPenilaian' => $permohonanList->pluck('jenis_penilaian_id')->first()
|
|
];
|
|
|
|
$permohonanList= $permohonanList->get();
|
|
|
|
Log::info('MemoController: Data preview memo berhasil disiapkan');
|
|
|
|
return view('lpj::memo.preview', compact('memoData', 'permohonanList', 'totalBiayaPJ'));
|
|
|
|
} catch (Exception $e) {
|
|
Log::error('MemoController: Error saat menyiapkan preview memo - ' . $e->getMessage());
|
|
return redirect()->back()
|
|
->withInput()
|
|
->with('error', 'Terjadi kesalahan saat menyiapkan preview memo: ' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Generate PDF memo penyelesaian dan simpan ke database
|
|
*
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function generatePdf(Request $request)
|
|
{
|
|
Log::info('MemoController: Memulai generate PDF memo penyelesaian');
|
|
|
|
DB::beginTransaction();
|
|
|
|
try {
|
|
// Validasi input
|
|
|
|
$permohonanIds = $request->permohonan_ids;
|
|
$memoNumber = $request->memo_number;
|
|
$paymentDate = $request->payment_date;
|
|
$memoDate = $request->memo_date;
|
|
|
|
// Ambil data permohonan yang dipilih
|
|
$permohonanList = Permohonan::with([
|
|
'user',
|
|
'debiture',
|
|
'branch',
|
|
'penilaian',
|
|
'jenisPenilaian',
|
|
'jenisFasilitasKredit',
|
|
'documents.inspeksi',
|
|
'penilai',
|
|
'documents.detail',
|
|
'noc'
|
|
])->whereIn('id', $permohonanIds);
|
|
|
|
// Hitung total biaya PJ dari nominal_bayar di tabel NOC
|
|
$totalBiayaPJ = Noc::whereIn('permohonan_id', $permohonanIds)
|
|
->sum('nominal_bayar');
|
|
|
|
// Data untuk template memo
|
|
$memoData = [
|
|
'memo_number' => $memoNumber,
|
|
'memo_date' => $memoDate,
|
|
'payment_date' => $paymentDate,
|
|
'total_biaya_pj' => $totalBiayaPJ,
|
|
'permohonan_list' => $permohonanList->get(),
|
|
'debitur_count' => $permohonanList->get()->count(),
|
|
'jaminan_info' => $this->getJaminanInfo($permohonanList->get()),
|
|
'jenisPenilaian' => $permohonanList->pluck('jenis_penilaian_id')->first()
|
|
];
|
|
|
|
$permohonanList= $permohonanList->get();
|
|
|
|
// Generate PDF dari template
|
|
$pdf = Pdf::loadView('lpj::memo.pdf-template', compact('memoData', 'permohonanList', 'totalBiayaPJ'))
|
|
->setPaper('a4', 'portrait')
|
|
->setOptions([
|
|
'defaultFont' => 'Times-Roman',
|
|
'isRemoteEnabled' => true,
|
|
'isHtml5ParserEnabled' => true,
|
|
'isPhpEnabled' => true,
|
|
'dpi' => 150,
|
|
'defaultPaperSize' => 'a4',
|
|
'chroot' => public_path(),
|
|
]);
|
|
|
|
// Nama file PDF
|
|
$fileName = 'memo-penyelesaian-' . str_replace(['/', ' '], ['-', '-'], $memoNumber) . '-' . date('Y-m-d-H-i-s') . '.pdf';
|
|
$filePath = 'memo-penyelesaian/' . $fileName;
|
|
|
|
// Simpan PDF ke storage
|
|
Storage::disk('public')->put($filePath, $pdf->output());
|
|
|
|
// Update status permohonan yang dipilih
|
|
// Update data di tabel NOC untuk setiap permohonan
|
|
foreach ($permohonanIds as $permohonanId) {
|
|
// Cari NOC berdasarkan permohonan_id
|
|
$noc = Noc::where('permohonan_id', $permohonanId)->first();
|
|
|
|
if ($noc) {
|
|
// Update field memo penyelesaian di tabel NOC
|
|
$noc->memo_penyelesaian = $filePath;
|
|
$noc->memo_penyelesaian_number = $memoNumber;
|
|
$noc->memo_penyelesaian_date = $memoDate;
|
|
$noc->memo_penyelesaian_payment_date = $paymentDate;
|
|
$noc->memo_penyelesaian_created_at = now();
|
|
$noc->save();
|
|
|
|
Log::info('MemoController: Berhasil update NOC untuk permohonan ID: ' . $permohonanId);
|
|
} else {
|
|
Log::warning('MemoController: NOC tidak ditemukan untuk permohonan ID: ' . $permohonanId);
|
|
}
|
|
}
|
|
|
|
DB::commit();
|
|
Log::info('MemoController: Berhasil generate PDF dan menyimpan memo penyelesaian untuk ' . count($permohonanIds) . ' permohonan');
|
|
|
|
// Return PDF untuk download
|
|
return $pdf->download('memo-penyelesaian-' . $memoNumber . '.pdf');
|
|
|
|
} catch (Exception $e) {
|
|
DB::rollback();
|
|
Log::error('MemoController: Error saat generate PDF memo penyelesaian - ' . $e->getMessage());
|
|
|
|
return redirect()->back()
|
|
->with('error', 'Terjadi kesalahan saat generate PDF memo penyelesaian: ' . $e->getMessage())
|
|
->withInput();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Helper function untuk mendapatkan informasi jaminan
|
|
*
|
|
* @param $permohonanList
|
|
* @return string
|
|
*/
|
|
private function getJaminanInfo($permohonanList)
|
|
{
|
|
$jaminanTypes = [];
|
|
foreach ($permohonanList as $permohonan) {
|
|
if ($permohonan->tujuanPenilaian) {
|
|
$jaminanTypes[] = $permohonan->tujuanPenilaian->name;
|
|
}
|
|
}
|
|
|
|
$uniqueJaminan = array_unique($jaminanTypes);
|
|
return implode(' & ', $uniqueJaminan);
|
|
}
|
|
/**
|
|
* Download PDF memo penyelesaian
|
|
*
|
|
* @param int $id - ID permohonan
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function downloadPdf($id)
|
|
{
|
|
Log::info('MemoController: Download PDF memo penyelesaian untuk permohonan ID: ' . $id);
|
|
|
|
try {
|
|
// Cari NOC berdasarkan permohonan_id
|
|
$noc = Noc::where('permohonan_id', $id)->first();
|
|
|
|
if (!$noc || !$noc->memo_penyelesaian) {
|
|
Log::warning('MemoController: PDF memo penyelesaian tidak ditemukan untuk permohonan ID: ' . $id);
|
|
return redirect()->back()->with('error', 'File PDF memo penyelesaian tidak ditemukan.');
|
|
}
|
|
|
|
// Cek apakah file ada di storage
|
|
if (!Storage::disk('public')->exists($noc->memo_penyelesaian)) {
|
|
Log::warning('MemoController: File PDF tidak ada di storage: ' . $noc->memo_penyelesaian);
|
|
return redirect()->back()->with('error', 'File PDF tidak ditemukan di server.');
|
|
}
|
|
|
|
// Download file
|
|
$fileName = 'memo-penyelesaian-' . $noc->memo_penyelesaian_number . '.pdf';
|
|
|
|
Log::info('MemoController: Berhasil download PDF memo penyelesaian: ' . $fileName);
|
|
|
|
return Storage::disk('public')->download($noc->memo_penyelesaian, $fileName);
|
|
|
|
} catch (Exception $e) {
|
|
Log::error('MemoController: Error saat download PDF memo penyelesaian - ' . $e->getMessage());
|
|
return redirect()->back()->with('error', 'Terjadi kesalahan saat mengunduh file PDF.');
|
|
}
|
|
}
|
|
}
|