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
92 changes: 92 additions & 0 deletions app/Exports/PresenceExport.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithTitle;
use App\Models\Presence;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;

class PresenceExport implements FromCollection, WithHeadings, WithTitle
{
protected $userId;
protected $companyId;

public function __construct(Request $request)
{
$this->userId = decrypt($request->query('user'));
$this->companyId = decrypt($request->query('company'));
}

public function collection()
{
$userId = $this->userId;
$companyId = $this->companyId;

// Fetch the presences based on the user_id and company_id
$presences = Presence::where('user_id', $userId)
->where('company_id', $companyId)
->orderBy('date', 'asc')
->get();

return $presences->map(function ($presence) {
return [
'Tanggal' => $presence->date,
'Jam Masuk' => $presence->check_in,
'Jam Keluar' => $presence->check_out,
'Status' => $presence->is_approved ? 'Sudah Disetujui' : 'Belum Disetujui',
];
});
}

public function headings(): array
{
return [
['Nama', 'Kelas', 'Company'],
['', '', ''],
['Tanggal', 'Jam Masuk', 'Jam Keluar', 'Status']
];
}

public function title(): string
{
return 'Presences Data';
}

public function startCell(): string
{
return 'A3';
}

public function styles(Worksheet $sheet)
{
$user = User::find($this->userId);

$sheet->setCellValue('A1', 'Nama: ' . $user->name);
$sheet->setCellValue('B1', 'Kelas: ' . ($user->courses()->first()?->name ?? 'N/A'));
$sheet->setCellValue('C1', 'Company: ' . $user->companies()->find($this->companyId)->name);

// Atur style untuk baris pertama
$sheet->getStyle('A1:C1')->applyFromArray([
'font' => [
'bold' => true,
],
]);

$sheet->getStyle('A3:D3')->applyFromArray([
'font' => [
'bold' => true,
],
'fill' => [
'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
'startColor' => [
'argb' => 'FFD9D9D9',
],
],
]);
}
}
8 changes: 8 additions & 0 deletions app/Http/Controllers/Api/ApplianceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,14 @@ public function editDate(Request $request, $id)
}
}

$user->presences()->where('company_id', $id)
->where('date', '>', $endDate)
->delete();

$user->journals()->where('company_id', $id)
->where('date', '>', $endDate)
->delete();

} catch (\Exception $e) {
return response()->json([
'message' => 'Error while updating date',
Expand Down
145 changes: 140 additions & 5 deletions app/Http/Controllers/Api/ExportController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

class ExportController extends Controller
{
public function exportJournal(Request $request, $id)
public function pdfSingleCompany(Request $request, $id)
{
$user = auth()->user();
$courseName = $user->courses->first()?->name;
Expand All @@ -31,8 +31,12 @@ public function exportJournal(Request $request, $id)
if (!$company) {
return response()->json(['error' => 'Company not found!'], 404);
}
$companyName = $company?->name ?? 'N/A';

$internDate = $user->internDates()->where('company_id', $companyId)->first();

$startDate = $internDate ? Carbon::parse($internDate->start_date)->translatedFormat('j F Y') : 'N/A';
$endDate = $internDate ? Carbon::parse($internDate->end_date)->translatedFormat('j F Y') : 'N/A';

$presences = $user->presences()
->where('company_id', $companyId)
->whereDate('date', '<=', Carbon::now())
Expand All @@ -57,15 +61,35 @@ public function exportJournal(Request $request, $id)
return response()->json(['error' => 'No journals found!'], 404);
}

$parentAddress = $request->input('parent_address') ?? $user->address;
$directors = $request->input('directors', []);
$hrds = $request->input('hrds', []);
$schoolMentors = $request->input('school_mentors', []);
$companyMentors = $request->input('company_mentors', []);

$formFields = [
'namasiswa' => $user->name,
'namasiswa' => $user->name,
'kelas' => $courseLevel,
'nis' => $request->input('nis'),
'nis_nisn' => $request->input('nis') . '/' . $request->input('nisn'),
'gol_darah' => $request->input('blood_type'),
'alamat_siswa' => $user->address,
'jurusan' => $user->departments->first()?->description,
'instansi_nama' => $companyName,
'kelasjurusan' => $courseName,
'ttl' => $formattedDateOfBirth,
'gender' => $gender,
'namaortu' => $request->input('parent_name'),
'alamat_ortu' => $parentAddress,
'tgl_export' => Carbon::now()->translatedFormat('l, j F Y'),
'instansi_nama' => $company->name,
'instansi_bidang' => $company->category,
'instansi_alamat' => $company->address,
'instansi_tglmulai' => $startDate,
'instansi_tglselesai' => $endDate,
'instansi_direktur' => $directors[0]['name'] ?? 'N/A',
'instansi_hrd' => $hrds[0]['name'] ?? 'N/A',
'instansi_psekolah' => $schoolMentors[0]['name'] ?? 'N/A',
'instansi_piduka' => $companyMentors[0]['name'] ?? 'N/A',
];

foreach ($presences as $index => $presence) {
Expand Down Expand Up @@ -98,8 +122,119 @@ public function exportJournal(Request $request, $id)
$tempPath = storage_path('storage/journals/' . $fileName);
$outputPath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $fileName;
$pdf = new Pdf($templatePath);
$pdf->fillForm($formFields)->flatten()->saveAs($outputPath);
$result = $pdf->fillForm($formFields)->flatten()->saveAs($outputPath);
if (!$result) {
$error = $pdf->getError();
return response()->json(['error' => 'Failed to generate PDF: ' . $error], 500);
}

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

public function pdfMultipleCompany(Request $request)
{
$user = auth()->user();
$courseName = $user->courses->first()?->name;
$courseLevel = $courseName ? explode(' ', $courseName)[0] : 'N/A';

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

$gender = match ($user->gender) {
'male' => 'Laki-Laki',
'female' => 'Perempuan'
};

$parentAddress = $request->input('parent_address') ?? $user->address;

$companies = $user->companies;

if ($companies->isEmpty()) {
return response()->json(['error' => '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'),
'gol_darah' => $request->input('blood_type'),
'alamat_siswa' => $user->address,
'jurusan' => $user->departments->first()?->description,
'kelasjurusan' => $courseName,
'ttl' => $formattedDateOfBirth,
'gender' => $gender,
'namaortu' => $request->input('parent_name'),
'alamat_ortu' => $parentAddress,
'tgl_export' => Carbon::now()->translatedFormat('l, j F Y'),
];

$directors = $request->input('directors', []);
$hrds = $request->input('hrds', []);
$school_mentors = $request->input('school_mentors', []);
$company_mentors = $request->input('company_mentors', []);

foreach ($companies as $index => $company) {
$companyIndex = $index + 1;

$formFields["instansi{$companyIndex}_nama"] = $company->name;
$formFields["instansi{$companyIndex}_bidang"] = $company->category;
$formFields["instansi{$companyIndex}_alamat"] = $company->address;
$formFields["instansi{$companyIndex}_hrd"] = $company->contact_person;
$formFields["instansi{$companyIndex}_tglmulai"] = Carbon::parse($company->internDates->first()->start_date)->translatedFormat('j F Y');
$formFields["instansi{$companyIndex}_tglselesai"] = Carbon::parse($company->internDates->first()->end_date)->translatedFormat('j F Y');
$formFields["instansi{$companyIndex}_direktur"] = $directors[$index]['name'] ?? 'N/A';
$formFields["instansi{$companyIndex}_hrd"] = $hrds[$index]['name'] ?? 'N/A';
$formFields["instansi{$companyIndex}_psekolah"] = $school_mentors[$index]['name'] ?? 'N/A';
$formFields["instansi{$companyIndex}_piduka"] = $company_mentors[$index]['name'] ?? 'N/A';

$presences = $user->presences()
->where('company_id', $company->id)
->whereDate('date', '<=', Carbon::now())
->orderBy('date', 'asc')
->get()
->filter(fn($presence) => !is_null($presence->check_in))
->values();

foreach ($presences as $presenceIndex => $presence) {
$formFields["{$companyIndex}_tanggal" . ($presenceIndex + 1)] = Carbon::parse($presence->date)->translatedFormat('l, j F Y');
$formFields["{$companyIndex}_checkin" . ($presenceIndex + 1)] = $presence->check_in;
$formFields["{$companyIndex}_checkout" . ($presenceIndex + 1)] = $presence->check_out ?? 'N/A';
}

$journals = $user->journals()
->where('company_id', $company->id)
->whereDate('date', '<=', Carbon::now())
->orderBy('date', 'asc')
->get()
->filter(fn($journal) => !is_null($journal->work_type))
->values();

foreach ($journals as $journalIndex => $journal) {
$formFields["{$companyIndex}_no" . ($journalIndex + 1)] = $journalIndex + 1;
$formFields["{$companyIndex}_bidang" . ($journalIndex + 1)] = $journal->work_type;
$formFields["{$companyIndex}_uraian" . ($journalIndex + 1)] = $journal->description;
$formFields["{$companyIndex}_tgl_jurnal" . ($journalIndex + 1)] = Carbon::parse($journal->date)->translatedFormat('l, j F Y');
}
}

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

$fileName = $user->id . time() . '.pdf';
$tempPath = storage_path('storage/journals/' . $fileName);
$outputPath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $fileName;
$pdf = new Pdf($templatePath);
$result = $pdf->fillForm($formFields)->flatten()->saveAs($outputPath);
if (!$result) {
$error = $pdf->getError();
return response()->json(['error' => 'Failed to generate PDF: ' . $error], 500);
}

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

}
78 changes: 78 additions & 0 deletions app/Http/Controllers/Api/FaqController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Faq;
use Illuminate\Http\Request;

class FaqController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
try {
$faqs = Faq::all();
} catch (\Exception $e) {
return response()->json([
'message' => 'Error while getting FAQs',
'error' => $e->getMessage(),
], 500);
}

return response()->json([
'message' => 'FAQs retrieved successfully',
'faqs' => $faqs,
], 200);
}

/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}

/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}

/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}

/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}

/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}

/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}
Loading
Loading