Skip to content

Commit 3bdc179

Browse files
authored
Merge pull request #20 from seiyanz16/main
Enhance Certificate Export, Add NIS Field, and Introduce Study Program
2 parents d2e5b7b + 080ad0b commit 3bdc179

20 files changed

Lines changed: 747 additions & 77 deletions

app/Http/Controllers/Api/ApplianceController.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ public function editDate(Request $request, $id)
7777
$startDate = Carbon::parse($request->start_date);
7878
$endDate = Carbon::parse($request->end_date);
7979

80+
if ($startDate->greaterThanOrEqualTo($endDate)) {
81+
return response()->json([
82+
'message' => 'The start date cannot be later than or equal to the end date.',
83+
], 400);
84+
}
85+
8086
// Check if the start and end dates overlap with any other company's internship dates
8187
$overlapCheck = $user->internDates()->where('company_id', '!=', $id)
8288
->where(function ($query) use ($startDate, $endDate) {

app/Http/Controllers/Api/ExportController.php

Lines changed: 112 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Http\Controllers\Api;
44

55
// use ZipArchive;
6+
use Barryvdh\DomPDF\Facade\Pdf as DomPdfFacade;
67
use mikehaertl\pdftk\Pdf;
78
use Carbon\Carbon;
89

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

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

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

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

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

6465
$parentAddress = $request->input('parent_address') ?? $user->address;
@@ -70,8 +71,8 @@ public function pdfSingleCompany(Request $request, $id)
7071
$formFields = [
7172
'namasiswa' => $user->name,
7273
'kelas' => $courseLevel,
73-
'nis' => $request->input('nis'),
74-
'nis_nisn' => $request->input('nis') . '/' . $request->input('nisn'),
74+
'nis' => $user->nis,
75+
'nis_nisn' => $user->nis . '/' . $request->input('nisn'),
7576
'gol_darah' => $request->input('blood_type'),
7677
'alamat_siswa' => $user->address,
7778
'jurusan' => $user->departments->first()?->description,
@@ -115,7 +116,7 @@ public function pdfSingleCompany(Request $request, $id)
115116
}
116117

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

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

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

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

157158
$formFields = [
158159
'namasiswa' => $user->name,
159160
'kelas' => $courseLevel,
160-
'nis' => $request->input('nis'),
161-
'nis_nisn' => $request->input('nis') . '/' . $request->input('nisn'),
161+
'nis' => $user->nis,
162+
'nis_nisn' => $user->nis . '/' . $request->input('nisn'),
162163
'gol_darah' => $request->input('blood_type'),
163164
'alamat_siswa' => $user->address,
164165
'jurusan' => $user->departments->first()?->description,
@@ -221,7 +222,7 @@ public function pdfMultipleCompany(Request $request)
221222

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

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

237238
return response()->download($outputPath, $fileName)->deleteFileAfterSend(true);
238239
}
239-
240+
public function exportCertificate(Request $request, $id)
241+
{
242+
$user = auth()->user();
243+
$company = $user->companies()->find($id);
244+
245+
if (!$company) {
246+
return response()->json(['message' => 'Company not found!'], 404);
247+
}
248+
249+
$internDate = $user->internDates()->where('company_id', $id)->first();
250+
$scores = $user->scores()->where('company_id', $id)->get();
251+
252+
if ($scores->isEmpty()) {
253+
return response()->json(['message' => 'Scores not found! Call the mentor to add scores first!'], 400);
254+
}
255+
256+
$averageScore = $scores->avg('score') ?? 0;
257+
// $technicalScore = $scores->where('type', 'teknis')->avg('score') ?? 0;
258+
// $nonTechnicalScore = $scores->where('type', 'non-teknis')->avg('score') ?? 0;
259+
260+
$formattedDateOfBirth = $user->date_of_birth
261+
? Carbon::parse($user->date_of_birth)->translatedFormat('j F Y')
262+
: 'N/A';
263+
264+
$formFields = [
265+
'nama_siswa' => $user->name,
266+
'ttl' => $formattedDateOfBirth,
267+
'nis' => $user->nis,
268+
'program_studi' => $user->departments->first()?->study_program,
269+
'jurusan' => $user->departments->first()?->description,
270+
'instansi_nama' => $company->name,
271+
'tgl_mulai' => $internDate ? Carbon::parse($internDate->start_date)->translatedFormat('j F Y') : 'N/A',
272+
'tgl_selesai' => $internDate ? Carbon::parse($internDate->end_date)->translatedFormat('j F Y') : 'N/A',
273+
'tgl_export' => Carbon::now()->translatedFormat('j F Y'),
274+
'instansi_direktur' => $company->contact_person,
275+
'nilai_all' => number_format($averageScore, 2),
276+
];
277+
278+
$templatePath = public_path('template-pdf/template_certificate_infront.pdf');
279+
280+
if (!file_exists($templatePath)) {
281+
return response()->json(['message' => 'PDF template not found!'], 404);
282+
}
283+
284+
$fileName = $user->id . '_certificate_' . time() . '.pdf';
285+
$outputPathFront = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'front_' . $fileName;
286+
$pdfFront = new Pdf($templatePath);
287+
$resultFront = $pdfFront->fillForm($formFields)->flatten()->saveAs($outputPathFront);
288+
289+
if (!$resultFront) {
290+
return response()->json(['message' => 'Failed to generate front page PDF: ' . $pdfFront->getError()], 500);
291+
}
292+
293+
// Generate halaman belakang (back) dengan DomPDF
294+
$technicalScores = $scores->where('type', 'teknis');
295+
$nonTechnicalScores = $scores->where('type', 'non-teknis');
296+
297+
foreach ($technicalScores as $score) {
298+
$score->letter = $this->convertScoreToLetter($score->score);
299+
}
300+
foreach ($nonTechnicalScores as $score) {
301+
$score->letter = $this->convertScoreToLetter($score->score);
302+
}
303+
304+
$pdfBack = DomPdfFacade::loadView('pdf.certificate_back', [
305+
'technicalScores' => $technicalScores,
306+
'nonTechnicalScores' => $nonTechnicalScores,
307+
'avgScore' => number_format($averageScore, 2),
308+
])->setPaper('a4', 'landscape');
309+
310+
$outputPathBack = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'back_' . $fileName;
311+
$pdfBack->save($outputPathBack);
312+
313+
// Gabungkan PDF depan & belakang
314+
$mergedPdfPath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $fileName;
315+
$pdf = new Pdf();
316+
$mergeResult = $pdf->addFile($outputPathFront)
317+
->addFile($outputPathBack)
318+
->saveAs($mergedPdfPath);
319+
320+
if (!$mergeResult) {
321+
return response()->json(['message' => 'Failed to merge PDF files: ' . $pdf->getError()], 500);
322+
}
323+
324+
return response()->download($mergedPdfPath, $fileName)->deleteFileAfterSend(true);
325+
}
326+
327+
private function convertScoreToLetter($score)
328+
{
329+
if ($score >= 90) {
330+
return 'Sangat Baik';
331+
} elseif ($score >= 75) {
332+
return 'Baik';
333+
} elseif ($score >= 60) {
334+
return 'Cukup';
335+
} else {
336+
return 'Kurang';
337+
}
338+
}
240339
}

app/Http/Controllers/Api/UserController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public function update(Request $request)
8181
'date_of_birth' => 'date',
8282
'bio' => 'max:255',
8383
'skills' => 'nullable',
84+
'nis' => 'required|string|unique:users,nis,' . $user->id,
8485
]);
8586

8687
$user->update($request->all());

app/Http/Controllers/DepartmentController.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,16 @@ public function store(Request $request)
138138
'name' => 'required|max:255',
139139
'description' => 'nullable|max:255',
140140
'logo' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
141-
'school_id' => 'required|exists:schools,id'
141+
'school_id' => 'required|exists:schools,id',
142+
'study_program' => 'nullable|string|max:255',
142143
]);
143144

144145
try {
145146
$department = Department::create([
146147
'name' => $request->name,
147148
'description' => $request->description,
148149
'school_id' => $request->school_id,
150+
'study_program' => $request->study_program
149151
]);
150152

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

218221
try {
219222
$department = Department::find($id);
220223
$department->update([
221224
'name' => $request->name,
222225
'description' => $request->description,
226+
'study_program' => $request->study_program
223227
]);
224228

225229
if ($request->hasFile('logo')) {

app/Http/Controllers/StudentController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ public function update(Request $request, $id)
216216

217217
$request->validate([
218218
'name' => 'required|string|max:255',
219+
'nis' => 'required|string|unique:users,nis,' . $id,
219220
'skills' => 'nullable|string',
220221
'course_id' => 'required|exists:courses,id',
221222
'companies.*.start_date' => 'nullable|date',
@@ -232,6 +233,7 @@ public function update(Request $request, $id)
232233
$user->update([
233234
'name' => $request->name,
234235
'skills' => $request->skills,
236+
'nis' => $request->nis
235237
]);
236238
$user->courses()->sync($request->course_id);
237239

app/Models/Department.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Department extends Model
1515
'logo',
1616
'status',
1717
'school_id',
18+
'study_program',
1819
];
1920

2021
public function school()

app/Models/User.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class User extends Authenticatable implements MustVerifyEmail
3232
'date_of_birth',
3333
'status',
3434
'skills',
35+
'nis',
3536
'resume',
3637
'password_by_admin',
3738
'last_login',

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"license": "MIT",
1010
"require": {
1111
"php": "^8.0.2",
12+
"barryvdh/laravel-dompdf": "^3.1",
1213
"cviebrock/eloquent-sluggable": "^10.0",
1314
"guzzlehttp/guzzle": "^7.2",
1415
"laravel/fortify": "^1.14",

0 commit comments

Comments
 (0)