Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/Http/Controllers/Api/ApplianceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ public function editDate(Request $request, $id)
$startDate = Carbon::parse($request->start_date);
$endDate = Carbon::parse($request->end_date);

if ($startDate->greaterThanOrEqualTo($endDate)) {
return response()->json([
'message' => 'The start date cannot be later than or equal to the end date.',
], 400);
}

// Check if the start and end dates overlap with any other company's internship dates
$overlapCheck = $user->internDates()->where('company_id', '!=', $id)
->where(function ($query) use ($startDate, $endDate) {
Expand Down
125 changes: 112 additions & 13 deletions app/Http/Controllers/Api/ExportController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace App\Http\Controllers\Api;

// use ZipArchive;
use Barryvdh\DomPDF\Facade\Pdf as DomPdfFacade;
use mikehaertl\pdftk\Pdf;
use Carbon\Carbon;

Expand All @@ -29,7 +30,7 @@ public function pdfSingleCompany(Request $request, $id)
$companyId = $id;
$company = $user->companies()->find($companyId);
if (!$company) {
return response()->json(['error' => 'Company not found!'], 404);
return response()->json(['message' => 'Company not found!'], 404);
}

$internDate = $user->internDates()->where('company_id', $companyId)->first();
Expand All @@ -46,7 +47,7 @@ public function pdfSingleCompany(Request $request, $id)
->values();

if ($presences->isEmpty()) {
return response()->json(['error' => 'No presences found!'], 404);
return response()->json(['message' => 'No presences found!'], 404);
}

$journals = $user->journals()
Expand All @@ -58,7 +59,7 @@ public function pdfSingleCompany(Request $request, $id)
->values();

if ($journals->isEmpty()) {
return response()->json(['error' => 'No journals found!'], 404);
return response()->json(['message' => 'No journals found!'], 404);
}

$parentAddress = $request->input('parent_address') ?? $user->address;
Expand All @@ -70,8 +71,8 @@ public function pdfSingleCompany(Request $request, $id)
$formFields = [
'namasiswa' => $user->name,
'kelas' => $courseLevel,
'nis' => $request->input('nis'),
'nis_nisn' => $request->input('nis') . '/' . $request->input('nisn'),
'nis' => $user->nis,
'nis_nisn' => $user->nis . '/' . $request->input('nisn'),
'gol_darah' => $request->input('blood_type'),
'alamat_siswa' => $user->address,
'jurusan' => $user->departments->first()?->description,
Expand Down Expand Up @@ -115,7 +116,7 @@ public function pdfSingleCompany(Request $request, $id)
}

if (!file_exists($templatePath)) {
return response()->json(['error' => 'PDF template not found!'], 404);
return response()->json(['message' => 'PDF template not found!'], 404);
}

$fileName = $user->id . time() . '.pdf';
Expand All @@ -125,7 +126,7 @@ public function pdfSingleCompany(Request $request, $id)
$result = $pdf->fillForm($formFields)->flatten()->saveAs($outputPath);
if (!$result) {
$error = $pdf->getError();
return response()->json(['error' => 'Failed to generate PDF: ' . $error], 500);
return response()->json(['message' => 'Failed to generate PDF: ' . $error], 500);
}

return response()->download($outputPath, $fileName)->deleteFileAfterSend(true);
Expand All @@ -151,14 +152,14 @@ public function pdfMultipleCompany(Request $request)
$companies = $user->companies;

if ($companies->isEmpty()) {
return response()->json(['error' => 'No companies associated with the user!'], 404);
return response()->json(['message' => 'No companies associated with the user!'], 404);
}

$formFields = [
'namasiswa' => $user->name,
'kelas' => $courseLevel,
'nis' => $request->input('nis'),
'nis_nisn' => $request->input('nis') . '/' . $request->input('nisn'),
'nis' => $user->nis,
'nis_nisn' => $user->nis . '/' . $request->input('nisn'),
'gol_darah' => $request->input('blood_type'),
'alamat_siswa' => $user->address,
'jurusan' => $user->departments->first()?->description,
Expand Down Expand Up @@ -221,7 +222,7 @@ public function pdfMultipleCompany(Request $request)

$templatePath = public_path('template-pdf/template_2-company.pdf');
if (!file_exists($templatePath)) {
return response()->json(['error' => 'PDF template not found!'], 404);
return response()->json(['message' => 'PDF template not found!'], 404);
}

$fileName = $user->id . time() . '.pdf';
Expand All @@ -231,10 +232,108 @@ public function pdfMultipleCompany(Request $request)
$result = $pdf->fillForm($formFields)->flatten()->saveAs($outputPath);
if (!$result) {
$error = $pdf->getError();
return response()->json(['error' => 'Failed to generate PDF: ' . $error], 500);
return response()->json(['message' => 'Failed to generate PDF: ' . $error], 500);
}

return response()->download($outputPath, $fileName)->deleteFileAfterSend(true);
}

public function exportCertificate(Request $request, $id)
{
$user = auth()->user();
$company = $user->companies()->find($id);

if (!$company) {
return response()->json(['message' => 'Company not found!'], 404);
}

$internDate = $user->internDates()->where('company_id', $id)->first();
$scores = $user->scores()->where('company_id', $id)->get();

if ($scores->isEmpty()) {
return response()->json(['message' => 'Scores not found! Call the mentor to add scores first!'], 400);
}

$averageScore = $scores->avg('score') ?? 0;
// $technicalScore = $scores->where('type', 'teknis')->avg('score') ?? 0;
// $nonTechnicalScore = $scores->where('type', 'non-teknis')->avg('score') ?? 0;

$formattedDateOfBirth = $user->date_of_birth
? Carbon::parse($user->date_of_birth)->translatedFormat('j F Y')
: 'N/A';

$formFields = [
'nama_siswa' => $user->name,
'ttl' => $formattedDateOfBirth,
'nis' => $user->nis,
'program_studi' => $user->departments->first()?->study_program,
'jurusan' => $user->departments->first()?->description,
'instansi_nama' => $company->name,
'tgl_mulai' => $internDate ? Carbon::parse($internDate->start_date)->translatedFormat('j F Y') : 'N/A',
'tgl_selesai' => $internDate ? Carbon::parse($internDate->end_date)->translatedFormat('j F Y') : 'N/A',
'tgl_export' => Carbon::now()->translatedFormat('j F Y'),
'instansi_direktur' => $company->contact_person,
'nilai_all' => number_format($averageScore, 2),
];

$templatePath = public_path('template-pdf/template_certificate_infront.pdf');

if (!file_exists($templatePath)) {
return response()->json(['message' => 'PDF template not found!'], 404);
}

$fileName = $user->id . '_certificate_' . time() . '.pdf';
$outputPathFront = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'front_' . $fileName;
$pdfFront = new Pdf($templatePath);
$resultFront = $pdfFront->fillForm($formFields)->flatten()->saveAs($outputPathFront);

if (!$resultFront) {
return response()->json(['message' => 'Failed to generate front page PDF: ' . $pdfFront->getError()], 500);
}

// Generate halaman belakang (back) dengan DomPDF
$technicalScores = $scores->where('type', 'teknis');
$nonTechnicalScores = $scores->where('type', 'non-teknis');

foreach ($technicalScores as $score) {
$score->letter = $this->convertScoreToLetter($score->score);
}
foreach ($nonTechnicalScores as $score) {
$score->letter = $this->convertScoreToLetter($score->score);
}

$pdfBack = DomPdfFacade::loadView('pdf.certificate_back', [
'technicalScores' => $technicalScores,
'nonTechnicalScores' => $nonTechnicalScores,
'avgScore' => number_format($averageScore, 2),
])->setPaper('a4', 'landscape');

$outputPathBack = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'back_' . $fileName;
$pdfBack->save($outputPathBack);

// Gabungkan PDF depan & belakang
$mergedPdfPath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $fileName;
$pdf = new Pdf();
$mergeResult = $pdf->addFile($outputPathFront)
->addFile($outputPathBack)
->saveAs($mergedPdfPath);

if (!$mergeResult) {
return response()->json(['message' => 'Failed to merge PDF files: ' . $pdf->getError()], 500);
}

return response()->download($mergedPdfPath, $fileName)->deleteFileAfterSend(true);
}

private function convertScoreToLetter($score)
{
if ($score >= 90) {
return 'Sangat Baik';
} elseif ($score >= 75) {
return 'Baik';
} elseif ($score >= 60) {
return 'Cukup';
} else {
return 'Kurang';
}
}
}
1 change: 1 addition & 0 deletions app/Http/Controllers/Api/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ public function update(Request $request)
'date_of_birth' => 'date',
'bio' => 'max:255',
'skills' => 'nullable',
'nis' => 'required|string|unique:users,nis,' . $user->id,
]);

$user->update($request->all());
Expand Down
6 changes: 5 additions & 1 deletion app/Http/Controllers/DepartmentController.php
Original file line number Diff line number Diff line change
Expand Up @@ -138,14 +138,16 @@ public function store(Request $request)
'name' => 'required|max:255',
'description' => 'nullable|max:255',
'logo' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'school_id' => 'required|exists:schools,id'
'school_id' => 'required|exists:schools,id',
'study_program' => 'nullable|string|max:255',
]);

try {
$department = Department::create([
'name' => $request->name,
'description' => $request->description,
'school_id' => $request->school_id,
'study_program' => $request->study_program
]);

if ($request->hasFile('logo')) {
Expand Down Expand Up @@ -213,13 +215,15 @@ public function update(Request $request, $id)
'name' => 'required|max:255',
'description' => 'nullable|max:255',
'logo' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'study_program' => 'nullable|string|max:255',
]);

try {
$department = Department::find($id);
$department->update([
'name' => $request->name,
'description' => $request->description,
'study_program' => $request->study_program
]);

if ($request->hasFile('logo')) {
Expand Down
2 changes: 2 additions & 0 deletions app/Http/Controllers/StudentController.php
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ public function update(Request $request, $id)

$request->validate([
'name' => 'required|string|max:255',
'nis' => 'required|string|unique:users,nis,' . $id,
'skills' => 'nullable|string',
'course_id' => 'required|exists:courses,id',
'companies.*.start_date' => 'nullable|date',
Expand All @@ -232,6 +233,7 @@ public function update(Request $request, $id)
$user->update([
'name' => $request->name,
'skills' => $request->skills,
'nis' => $request->nis
]);
$user->courses()->sync($request->course_id);

Expand Down
1 change: 1 addition & 0 deletions app/Models/Department.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class Department extends Model
'logo',
'status',
'school_id',
'study_program',
];

public function school()
Expand Down
1 change: 1 addition & 0 deletions app/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class User extends Authenticatable implements MustVerifyEmail
'date_of_birth',
'status',
'skills',
'nis',
'resume',
'password_by_admin',
'last_login',
Expand Down
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"license": "MIT",
"require": {
"php": "^8.0.2",
"barryvdh/laravel-dompdf": "^3.1",
"cviebrock/eloquent-sluggable": "^10.0",
"guzzlehttp/guzzle": "^7.2",
"laravel/fortify": "^1.14",
Expand Down
Loading
Loading