<?php
namespace App\Http\Controllers\Admin;
use App\Exports\FormatImportPesertaExport;
use App\Facades\DataTable;
use App\Http\Controllers\Controller;
use App\Imports\PesertasImport;
use App\Models\Peserta;
use App\Models\User;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Inertia\Inertia;
use Maatwebsite\Excel\Facades\Excel;
use Barryvdh\DomPDF\Facade\Pdf;
use setasign\Fpdi\Fpdi;
class PesertaController extends Controller
{
public function print($id)
{
$peserta = Peserta::with(['kabupaten'])->findOrFail($id);
$data = [
'peserta' => $peserta,
'foto_ktp' => null,
'foto_kk' => null,
'file_bukti_usaha' => null,
'file_profil_usaha' => null,
'file_ijin_usaha' => null,
'is_bukti_usaha_image' => false,
'is_profil_usaha_image' => false,
'is_ijin_usaha_image' => false,
];
// Handle KTP photo
if ($peserta->foto_ktp) {
$data['foto_ktp'] = 'data:image/png;base64,' . base64_encode(
Storage::get($peserta->foto_ktp)
);
}
// Handle KK photo
if ($peserta->foto_kk) {
$data['foto_kk'] = 'data:image/png;base64,' . base64_encode(
Storage::get($peserta->foto_kk)
);
}
// Handle Bukti Usaha
if ($peserta->file_bukti_usaha) {
$mime = Storage::mimeType($peserta->file_bukti_usaha);
if (strpos($mime, 'image') !== false) {
$data['file_bukti_usaha'] = 'data:' . $mime . ';base64,' . base64_encode(
Storage::get($peserta->file_bukti_usaha)
);
$data['is_bukti_usaha_image'] = true;
}
}
// Handle Profil Usaha
if ($peserta->file_profil_usaha) {
$mime = Storage::mimeType($peserta->file_profil_usaha);
if (strpos($mime, 'image') !== false) {
$data['file_profil_usaha'] = 'data:' . $mime . ';base64,' . base64_encode(
Storage::get($peserta->file_profil_usaha)
);
$data['is_profil_usaha_image'] = true;
}
}
// Handle Ijin Usaha
if ($peserta->file_ijin_usaha) {
$mime = Storage::mimeType($peserta->file_ijin_usaha);
if (strpos($mime, 'image') !== false) {
$data['file_ijin_usaha'] = 'data:' . $mime . ';base64,' . base64_encode(
Storage::get($peserta->file_ijin_usaha)
);
$data['is_ijin_usaha_image'] = true;
}
}
$pdf = PDF::loadView('pdf.peserta-detail', $data);
// Get file attachments
$attachments = [];
foreach (['file_bukti_usaha', 'file_profil_usaha', 'file_ijin_usaha'] as $field) {
if ($peserta->$field) {
$mime = Storage::mimeType($peserta->$field);
if (strpos($mime, 'pdf') !== false) {
$attachments[] = [
'content' => Storage::get($peserta->$field),
'filename' => basename($peserta->$field)
];
}
}
}
// If there are PDF attachments, merge them with the main PDF
if (!empty($attachments)) {
$mainPdf = $pdf->output();
$merger = new \setasign\Fpdi\Tcpdf\Fpdi();
// Create temporary files
$mainTempFile = tempnam(sys_get_temp_dir(), 'main_');
file_put_contents($mainTempFile, $mainPdf);
// Add main PDF
$pageCount = $merger->setSourceFile($mainTempFile);
for ($i = 1; $i <= $pageCount; $i++) {
$merger->addPage();
$merger->useTemplate($merger->importPage($i));
}
unlink($mainTempFile);
// Add attachments
foreach ($attachments as $attachment) {
$tempFile = tempnam(sys_get_temp_dir(), 'attachment_');
file_put_contents($tempFile, $attachment['content']);
$pageCount = $merger->setSourceFile($tempFile);
for ($i = 1; $i <= $pageCount; $i++) {
$merger->addPage();
$merger->useTemplate($merger->importPage($i));
}
unlink($tempFile);
}
return response($merger->Output('S'))
->header('Content-Type', 'application/pdf')
->header('Content-Disposition', 'inline; filename="peserta-' . $peserta->id . '.pdf"');
}
return $pdf->stream('peserta-' . $peserta->id . '.pdf');
}
public function index()
{
$sort = str_replace(
['created_at'],
['created_at'],
request()->query('col')
);
$result = DataTable::query(Peserta::query())
->with(['user','kabupaten'])
->searchable(['nama_lengkap', 'email', 'nik','kabupaten.name','tahun'])
->applySort($sort)
->allowedSorts(['created_at'])
->make()->toArray();
return Inertia::render('Admin/Peserta/Index', [
'datatable' => $result,
]);
}
public function create()
{
return Inertia::render('Admin/Peserta/Create');
}
public function store(Request $request)
{
$request->validate([
'nik' => 'required|string|max:20|unique:' . Peserta::class . ',nik',
'nama_lengkap' => 'required|string|max:255',
]);
DB::beginTransaction();
try {
$usia = $request->usia;
if($usia == null && $request->tanggal_lahir != null){
$tglLahir = new DateTime($request->tanggal_lahir);
// Buat objek DateTime untuk tanggal sekarang
$hariIni = new DateTime('today');
// Hitung selisih antara tanggal sekarang dan tanggal lahir
$selisih = $hariIni->diff($tglLahir);
$usia = $selisih->y;
}
$peserta = Peserta::create([
'nama_lengkap' => $request->nama_lengkap,
'alamat' => $request->alamat,
'email' => $request->email,
'no_hp' => $request->no_hp,
'tanggal_lahir' => $request->tanggal_lahir != null ? date("Y-m-d",strtotime($request->tanggal_lahir)) : null,
'tempat_lahir' => $request->tempat_lahir,
'usia' => $usia,
'agama' => $request->agama,
'jenis_kelamin' => $request->jenis_kelamin,
'nik' => $request->nik,
'npwp' => $request->npwp,
'foto_ktp' => $request->hasFile('foto_ktp') ? $request->foto_ktp->store('private/foto_ktp') : null,
'foto_profil' => $request->hasFile('foto_profil') ? $request->foto_profil->store('public/foto_profil') : null,
'file_profil_usaha' => $request->hasFile('file_profil_usaha') ? $request->file_profil_usaha->store('private/profil_usaha') : null,
'file_ijin_usaha' => $request->hasFile('file_ijin_usaha') ? $request->file_ijin_usaha->store('private/ijin_usaha') : null,
'kriteria_usaha' => $request->kriteria_usaha,
'status_pekerjaan' => $request->status_pekerjaan,
'bidang_pekerjaan' => $request->bidang_pekerjaan,
'tempat_bekerja' => $request->tempat_bekerja,
'alamat_bekerja' => $request->alamat_bekerja,
'provinsi_id' => $request->provinsi_id,
'kabupaten_id' => $request->kabupaten_id,
'kecamatan_id' => $request->kecamatan_id,
'kelurahan_id' => $request->kelurahan_id,
'disabilitas' => $request->disabilitas != null,
'status_kawin' => $request->status_kawin,
'utusan_dari' => $request->utusan_dari,
'tahun' => $request->tahun,
]);
if ($peserta->user) {
$request->validate([
'email' => 'required|string|lowercase|email|max:255|unique:' . User::class . ',email',
]);
$peserta->user->update([
'email' => $request->email,
'nama' => $request->nama_lengkap
]);
if ($request->password != null && trim($request->password) != "" && $request->password == $request->password_confirmation) {
$peserta->user->update([
'password' => Hash::make($request->password),
]);
}
} else if ($request->email != null && $request->password != null && trim($request->password) != "" && $request->password == $request->password_confirmation) {
$request->validate([
'email' => 'required|string|lowercase|email|max:255|unique:' . User::class . ',email',
]);
$user = $peserta->user()->create([
'email' => $request->email,
'nama' => $request->nama_lengkap,
'password' => Hash::make($request->password),
'role' => 'peserta'
]);
$peserta->update([
'user_id' => $user->id
]);
}
DB::commit();
return redirect()->route('admin.peserta.index')->with('success', 'Berhasil menambah peserta ' . $peserta->nama_lengkap);
} catch (\Throwable $th) {
//throw $th;
DB::rollBack();
Log::error($th);
return redirect()->route('admin.peserta.create')->withInput($request->all())->with('error', 'Gagal menambah peserta '.$request->nama_lengkap);
}
}
public function show($id)
{
$peserta = Peserta::with('user', 'provinsi', 'kabupaten')->findOrFail($id);
return Inertia::render('Admin/Peserta/Show', [
'peserta' => $peserta,
]);
}
public function edit($id)
{
$peserta = Peserta::with('user', 'provinsi', 'kabupaten')->findOrFail($id);
return Inertia::render('Admin/Peserta/Edit', [
'peserta' => $peserta,
]);
}
public function update($id, Request $request)
{
$peserta = Peserta::with('user', 'provinsi', 'kabupaten')->findOrFail($id);
$request->validate([
'nik' => 'required|string|max:20|unique:' . Peserta::class . ',nik,' . $id,
'nama_lengkap' => 'required|string|max:255',
]);
DB::beginTransaction();
try {
$usia = $request->usia;
if($usia == null && $request->tanggal_lahir != null){
$tglLahir = new DateTime($request->tanggal_lahir);
// Buat objek DateTime untuk tanggal sekarang
$hariIni = new DateTime('today');
// Hitung selisih antara tanggal sekarang dan tanggal lahir
$selisih = $hariIni->diff($tglLahir);
$usia = $selisih->y;
}
$peserta->update([
'nama_lengkap' => $request->nama_lengkap,
'alamat' => $request->alamat,
'email' => $request->email,
'no_hp' => $request->no_hp,
'tanggal_lahir' => $request->tanggal_lahir != null ? date("Y-m-d",strtotime($request->tanggal_lahir)) : null,
'tempat_lahir' => $request->tempat_lahir,
'usia' => $usia,
'agama' => $request->agama,
'jenis_kelamin' => $request->jenis_kelamin,
'nik' => $request->nik,
'npwp' => $request->npwp,
'foto_ktp' => $request->hasFile('foto_ktp') ? $request->foto_ktp->store('private/foto_ktp') : $peserta->foto_ktp,
'foto_profil' => $request->hasFile('foto_profil') ? $request->foto_profil->store('public/foto_profil') : $peserta->foto_profil,
'file_profil_usaha' => $request->hasFile('file_profil_usaha') ? $request->file_profil_usaha->store('private/profil_usaha') : $peserta->file_profil_usaha,
'file_ijin_usaha' => $request->hasFile('file_ijin_usaha') ? $request->file_ijin_usaha->store('private/ijin_usaha') : $peserta->file_ijin_usaha,
'kriteria_usaha' => $request->kriteria_usaha,
'status_pekerjaan' => $request->status_pekerjaan,
'bidang_pekerjaan' => $request->bidang_pekerjaan,
'tempat_bekerja' => $request->tempat_bekerja,
'alamat_bekerja' => $request->alamat_bekerja,
'provinsi_id' => $request->provinsi_id,
'kabupaten_id' => $request->kabupaten_id,
'kecamatan_id' => $request->kecamatan_id,
'kelurahan_id' => $request->kelurahan_id,
'disabilitas' => $request->disabilitas != null,
'status_kawin' => $request->status_kawin,
'utusan_dari' => $request->utusan_dari,
'tahun' => $request->tahun,
]);
if ($peserta->user) {
$request->validate([
'email' => 'required|string|lowercase|email|max:255|unique:' . User::class . ',email,' . $peserta->user_id,
]);
$peserta->user->update([
'email' => $request->email,
'nama' => $request->nama_lengkap
]);
if ($request->password != null && trim($request->password) != "" && $request->password == $request->password_confirmation) {
$peserta->user->update([
'password' => Hash::make($request->password),
]);
}
} else if ($request->email != null && $request->password != null && trim($request->password) != "" && $request->password == $request->password_confirmation) {
$request->validate([
'email' => 'required|string|lowercase|email|max:255|unique:' . User::class . ',email,' . $peserta->user_id,
]);
$user = $peserta->user()->create([
'email' => $request->email,
'nama' => $request->nama_lengkap,
'password' => Hash::make($request->password),
'role' => 'peserta'
]);
$peserta->update([
'user_id' => $user->id
]);
}
DB::commit();
return redirect()->route('admin.peserta.index')->with('success', 'Berhasil mengubah peserta ' . $peserta->nama_lengkap);
} catch (\Throwable $th) {
//throw $th;
DB::rollBack();
Log::error($th);
return redirect()->route('admin.peserta.edit', $id)->withInput($request->all())->with('error', 'Gagal mengubah peserta ' . $peserta->nama_lengkap);
}
}
public function destroy($id)
{
$peserta = Peserta::with('user')->findOrFail($id);
DB::beginTransaction();
try {
if ($peserta->user) {
$peserta->user()->delete();
}
$peserta->delete();
DB::commit();
return redirect()->route('admin.peserta.index')->with('success', 'Berhasil menghapus peserta ' . $peserta->nama_lengkap);
} catch (\Throwable $th) {
//throw $th;
DB::rollBack();
Log::error($th);
return redirect()->route('admin.peserta.index')->with('error', 'Gagal menghapus peserta ' . $peserta->nama_lengkap);
}
}
public function importView()
{
return Inertia::render('Admin/Peserta/Import');
}
public function import(Request $request)
{
$request->validate([
'file'=> 'required|file|mimetypes:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
]);
$model = new PesertasImport();
$model->createLogin = (int)$request->buat_akun == 1 ? true : false;
$model->tahun = $request->tahun;
$model->fileName = $request->file('file');
$model->passwordKostum = $request->password_kustom;
try {
Excel::import($model, $request->file('file'));
if(count($model->errors) > 0){
return redirect()->route('admin.peserta.import-view')->with('success', 'Berhasil mengimport '.$model->totalImport.' peserta')->with('error', implode(", ", $model->errors));
}
return redirect()->route('admin.peserta.index')->with('success', 'Berhasil mengimport '.$model->totalImport.' peserta');
} catch (\Throwable $th) {
Log::error($th);
return redirect()->route('admin.peserta.import-view')->with('error', 'Gagal mengimport peserta');
}
}
public function downloadTemplateImport(){
return Excel::download(new FormatImportPesertaExport(), 'format-import-peserta.xlsx');
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]