33namespace App \Http \Controllers \Api ;
44
55// use ZipArchive;
6+ use Barryvdh \DomPDF \Facade \Pdf as DomPdfFacade ;
67use mikehaertl \pdftk \Pdf ;
78use 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}
0 commit comments