diff --git a/app/Http/Controllers/DataKompetensiController.php b/app/Http/Controllers/DataKompetensiController.php
index 52bdcfaf435d21d106b3096eae1b7ae48565ae3b..60405b2ca788d1269a40dd8d070e529c1faf5fe6 100644
--- a/app/Http/Controllers/DataKompetensiController.php
+++ b/app/Http/Controllers/DataKompetensiController.php
@@ -431,6 +431,97 @@ class DataKompetensiController extends APIBaseController
         }
     }
 
+    public function generateReport($id) {
+        $obj = DB::table('denormalized_pegawai')
+            ->join('kompetensi', 'denormalized_pegawai.id_user', '=', 'kompetensi.id_pegawai')
+            ->select([
+                'nama',
+                'nip',
+                'unit_kerja',
+                'pendidikan_terakhir',
+                'tanggal_lahir',
+                'posisi',
+                'tujuan',
+                'tanggal',
+                'kognitif_efisiensi_kecerdasan',
+                'kognitif_daya_nalar',
+                'kognitif_daya_asosiasi',
+                'kognitif_daya_analitis',
+                'kognitif_daya_antisipasi',
+                'kognitif_kemandirian_berpikir',
+                'kognitif_fleksibilitas',
+                'kognitif_daya_tangkap',
+                'interaksional_penempatan_diri',
+                'interaksional_percaya_diri',
+                'interaksional_daya_kooperatif',
+                'interaksional_penyesuaian_perasaan',
+                'emosional_stabilitas_emosi',
+                'emosional_toleransi_stres',
+                'emosional_pengendalian_diri',
+                'emosional_kemantapan_konsentrasi',
+                'sikap_kerja_hasrat_berprestasi',
+                'sikap_kerja_daya_tahan',
+                'sikap_kerja_keteraturan_kerja',
+                'sikap_kerja_pengerahan_energi_kerja',
+                'manajerial_efektivitas_perencanaan',
+                'manajerial_pengorganisasian_pelaksanaan',
+                'manajerial_intensitas_pengarahan',
+                'manajerial_kekuatan_pengawasan',
+            ])
+            ->where('denormalized_pegawai.id_user', '=', $id)
+            ->orderBy('tanggal', 'desc')
+            ->limit(1)
+            ->get();
+        
+        if (empty($obj) || $obj->count() == 0) {
+            return response('Data kompetensi tidak ditemukan', 404);
+        }
+        
+        $obj = $obj[0];
+
+        $storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix();
+        $path = $storagePath . 'templates/laporan_template.xlsx';
+
+        $objs = Excel::load($path, function ($excel) use ($obj) {
+            $excel->sheet('Psikogram', function($sheet) use ($obj) {
+                $sheet->getCell('B16')->setValue($obj->nama);
+                $sheet->getCell('C16')->setValue($obj->nip);
+                $sheet->getCell('D16')->setValue($obj->unit_kerja);
+                $sheet->getCell('E16')->setValue($obj->pendidikan_terakhir);
+                $sheet->getCell('F16')->setValue($obj->tanggal_lahir);
+                $sheet->getCell('G16')->setValue($obj->posisi);
+                $sheet->getCell('H16')->setValue($obj->tujuan);
+                $sheet->getCell('I16')->setValue($obj->tanggal);
+                $sheet->getCell('J16')->setValue(floor($obj->kognitif_efisiensi_kecerdasan));
+                $sheet->getCell('K16')->setValue(floor($obj->kognitif_daya_nalar));
+                $sheet->getCell('L16')->setValue(floor($obj->kognitif_daya_asosiasi));
+                $sheet->getCell('M16')->setValue(floor($obj->kognitif_daya_analitis));
+                $sheet->getCell('N16')->setValue(floor($obj->kognitif_daya_antisipasi));
+                $sheet->getCell('O16')->setValue(floor($obj->kognitif_kemandirian_berpikir));
+                $sheet->getCell('P16')->setValue(floor($obj->kognitif_fleksibilitas));
+                $sheet->getCell('Q16')->setValue(floor($obj->kognitif_daya_tangkap));
+                $sheet->getCell('S16')->setValue(floor($obj->interaksional_penempatan_diri));
+                $sheet->getCell('T16')->setValue(floor($obj->interaksional_percaya_diri));
+                $sheet->getCell('U16')->setValue(floor($obj->interaksional_daya_kooperatif));
+                $sheet->getCell('V16')->setValue(floor($obj->interaksional_penyesuaian_perasaan));
+                $sheet->getCell('X16')->setValue(floor($obj->emosional_stabilitas_emosi));
+                $sheet->getCell('Y16')->setValue(floor($obj->emosional_toleransi_stres));
+                $sheet->getCell('Z16')->setValue(floor($obj->emosional_pengendalian_diri));
+                $sheet->getCell('AA16')->setValue(floor($obj->emosional_kemantapan_konsentrasi));
+                $sheet->getCell('AC16')->setValue(floor($obj->sikap_kerja_hasrat_berprestasi));
+                $sheet->getCell('AD16')->setValue(floor($obj->sikap_kerja_daya_tahan));
+                $sheet->getCell('AE16')->setValue(floor($obj->sikap_kerja_keteraturan_kerja));
+                $sheet->getCell('AF16')->setValue(floor($obj->sikap_kerja_pengerahan_energi_kerja));
+                $sheet->getCell('AN16')->setValue(floor($obj->manajerial_efektivitas_perencanaan));
+                $sheet->getCell('AO16')->setValue(floor($obj->manajerial_pengorganisasian_pelaksanaan));
+                $sheet->getCell('AP16')->setValue(floor($obj->manajerial_intensitas_pengarahan));
+                $sheet->getCell('AQ16')->setValue(floor($obj->manajerial_kekuatan_pengawasan));
+            });
+            $excel->sheet('x', null);
+            $excel->calculate();
+        })->download('xlsx');
+    }
+
     private function authenticate($role)
     {
         if (Auth::check()) {
diff --git a/routes/api.php b/routes/api.php
index 82f4cb66dffd262edd40fb04baf06b79fb41fdc7..c25f7c716be73cddbb94b0a7b6b7cbb827ea19b1 100644
--- a/routes/api.php
+++ b/routes/api.php
@@ -29,6 +29,8 @@ Route::get('kompetensi/export', 'DataKompetensiController@export');
 
 Route::post('kompetensi/import', 'DataKompetensiController@import');
 
+Route::get('kompetensi/report/{id}', 'DataKompetensiController@generateReport');
+
 Route::resource('kompetensi', 'DataKompetensiController');
 
 Route::get('kinerja/export', 'DataKinerjaController@export');
diff --git a/storage/app/templates/laporan_template.xlsx b/storage/app/templates/laporan_template.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..c45ce394925ff79981a12e6b844aea21ed643d99
Binary files /dev/null and b/storage/app/templates/laporan_template.xlsx differ