Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
forbidals
/
admin_panel
/
app
/
Http
/
Controllers
:
CertificateTemplateController.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php namespace App\Http\Controllers; use App\Repositories\CertificateTemplate\CertificateTemplateInterface; use App\Repositories\ClassSection\ClassSectionInterface; use App\Repositories\Exam\ExamInterface; use App\Repositories\FormField\FormFieldsInterface; use App\Repositories\SessionYear\SessionYearInterface; use App\Repositories\User\UserInterface; use App\Services\BootstrapTableService; use App\Services\CachingService; use App\Services\ResponseService; use Carbon\Carbon; use DB; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; use Throwable; use Illuminate\Support\Facades\Auth; class CertificateTemplateController extends Controller { /** * Display a listing of the resource. */ private CertificateTemplateInterface $certificateTemplate; private CachingService $cache; private UserInterface $user; private ClassSectionInterface $classSection; private ExamInterface $exam; private SessionYearInterface $sessionYear; private FormFieldsInterface $formFields; public function __construct(CertificateTemplateInterface $certificateTemplate, CachingService $cache, UserInterface $user, ClassSectionInterface $classSection, ExamInterface $exam, SessionYearInterface $sessionYear, FormFieldsInterface $formFields) { $this->certificateTemplate = $certificateTemplate; $this->cache = $cache; $this->user = $user; $this->classSection = $classSection; $this->exam = $exam; $this->sessionYear = $sessionYear; $this->formFields = $formFields; } public function index() { // ResponseService::noFeatureThenRedirect('ID Card - Certificate Generation'); ResponseService::noAnyPermissionThenRedirect(['certificate-create', 'certificate-list']); $formFields = $this->formFields->builder()->whereNot('type', 'file')->get(); return view('certificate.template', compact('formFields')); } /** * Show the form for creating a new resource. */ public function create() { // } /** * Store a newly created resource in storage. */ public function store(Request $request) { // ResponseService::noFeatureThenSendJson('ID Card - Certificate Generation'); ResponseService::noPermissionThenSendJson('certificate-create'); $request->validate([ 'name' => 'required', 'page_layout' => 'required', 'height' => 'required', 'width' => 'required', 'user_image_shape' => 'required', 'image_size' => 'required', 'description' => 'required', 'type' => 'required', ]); try { DB::beginTransaction(); $sessionYearId = $this->cache->getSessionYear()->id; $page_layout = 'A4 Landscape'; if ($request->height == 210 && $request->width == 297) { // A4 Landscape $page_layout = 'A4 Landscape'; } else if ($request->height == 297 && $request->width == 210) { // A4 Portrait $page_layout = 'A4 Portrait'; } else { // Custom $page_layout = 'Custom'; } $data = [ 'name' => $request->name, 'page_layout' => $page_layout, 'height' => $request->height, 'width' => $request->width, 'user_image_shape' => $request->user_image_shape, 'image_size' => $request->image_size, 'description' => $request->description, 'type' => $request->type, 'session_year_id' => $sessionYearId ]; if ($request->hasFile('background_image')) { $data['background_image'] = $request->background_image; } $certificateTemplate = $this->certificateTemplate->create($data); DB::commit(); ResponseService::successResponse('Data Stored Successfully'); } catch (Throwable $e) { DB::rollBack(); ResponseService::logErrorResponse($e, "Certificate Template Controller -> Store Method"); ResponseService::errorResponse(); } } /** * Display the specified resource. */ public function show($id) { // ResponseService::noFeatureThenRedirect('ID Card - Certificate Generation'); ResponseService::noPermissionThenSendJson('certificate-list'); $offset = request('offset', 0); $limit = request('limit', 10); $sort = request('sort', 'id'); $order = request('order', 'DESC'); $search = request('search'); $sessionYearId = $this->cache->getSessionYear()->id; $sql = $this->certificateTemplate->builder() ->where('session_year_id', $sessionYearId) ->when($search, function ($query) use ($search) { $query->where(function ($query) use ($search) { $query->where('id', 'LIKE', "%$search%") ->orwhere('name', 'LIKE', "%$search%") ->orwhere('type', 'LIKE', "%$search%"); }); }); $total = $sql->count(); if ($offset >= $total && $total > 0) { $lastPage = floor(($total - 1) / $limit) * $limit; // calculate last page offset $offset = $lastPage; } $sql->orderBy($sort, $order)->skip($offset)->take($limit); $res = $sql->get(); $bulkData = array(); $bulkData['total'] = $total; $rows = array(); $no = 1; foreach ($res as $row) { $operate = BootstrapTableService::button('fa fa-edit', route('certificate-template.edit', $row->id), ['btn-gradient-primary'], ['title' => trans('edit')]); $operate .= BootstrapTableService::button('fa fa-table-layout', route('certificate-template.design', $row->id), ['btn-gradient-info'], ['title' => trans('layout')]); $operate .= BootstrapTableService::deleteButton(route('certificate-template.destroy', $row->id)); $tempRow = $row->toArray(); $tempRow['no'] = $no++; $tempRow['operate'] = $operate; $rows[] = $tempRow; } $bulkData['rows'] = $rows; return response()->json($bulkData); } /** * Show the form for editing the specified resource. */ public function edit($id) { // ResponseService::noFeatureThenRedirect('ID Card - Certificate Generation'); ResponseService::noPermissionThenRedirect('certificate-edit'); $certificateTemplate = $this->certificateTemplate->findById($id); $formFields = $this->formFields->builder()->whereNot('type', 'file')->get(); return view('certificate.edit-template', compact('certificateTemplate', 'formFields')); } /** * Update the specified resource in storage. */ public function update(Request $request, $id) { // ResponseService::noFeatureThenSendJson('ID Card - Certificate Generation'); ResponseService::noPermissionThenSendJson('certificate-edit'); $request->validate([ 'name' => 'required', 'page_layout' => 'required', 'height' => 'required', 'width' => 'required', 'user_image_shape' => 'required', 'image_size' => 'required', 'description' => 'required', 'type' => 'required', ]); try { DB::beginTransaction(); $sessionYearId = $this->cache->getSessionYear()->id; $page_layout = 'A4 Landscape'; if ($request->height == 210 && $request->width == 297) { // A4 Landscape $page_layout = 'A4 Landscape'; } else if ($request->height == 297 && $request->width == 210) { // A4 Portrait $page_layout = 'A4 Portrait'; } else { // Custom $page_layout = 'Custom'; } $data = [ 'name' => $request->name, 'page_layout' => $page_layout, 'height' => $request->height, 'width' => $request->width, 'user_image_shape' => $request->user_image_shape, 'image_size' => $request->image_size, 'description' => $request->description, 'type' => $request->type, 'session_year_id' => $sessionYearId ]; if ($request->hasFile('background_image')) { $data['background_image'] = $request->background_image; } $this->certificateTemplate->update($id, $data); DB::commit(); ResponseService::successResponse('Data Stored Successfully'); } catch (Throwable $e) { DB::rollBack(); ResponseService::logErrorResponse($e, "Certificate Template Controller -> Store Method"); ResponseService::errorResponse(); } } /** * Remove the specified resource from storage. */ public function destroy($id) { // ResponseService::noFeatureThenRedirect('ID Card - Certificate Generation'); ResponseService::noPermissionThenSendJson('certificate-delete'); try { DB::beginTransaction(); $this->certificateTemplate->deleteById($id); DB::commit(); ResponseService::successResponse('Data Deleted Successfully'); } catch (Throwable $e) { DB::rollBack(); ResponseService::logErrorResponse($e, "Certificate Template Controller -> Destroy Method"); ResponseService::errorResponse(); } } public function design($id) { // ResponseService::noFeatureThenRedirect('ID Card - Certificate Generation'); ResponseService::noPermissionThenRedirect('certificate-edit'); try { $certificateTemplate = $this->certificateTemplate->findById($id); $settings = $this->cache->getSchoolSettings(); $style = json_decode($certificateTemplate->style, true); if (!isset($style['description'])) { $style['description'] = 'style="position:absolute; left: 145px;top: 255px"'; } if (!isset($style['title'])) { $style['title'] = 'style="position:absolute; left: 145px;top: 290px"'; } if (!isset($style['issue_date'])) { $style['issue_date'] = 'style="position:absolute; left: 100px;top: 100px"'; } if (!isset($style['signature'])) { $style['signature'] = 'style="position:absolute; left: 150px;top: 150px"'; } if (!isset($style['school_name'])) { $style['school_name'] = 'style="position:absolute; left: 480px;top: 60px"'; } if (!isset($style['school_address'])) { $style['school_address'] = 'style="position:absolute; left: 125px;top: 85px"'; } if (!isset($style['school_mobile'])) { $style['school_mobile'] = 'style="position:absolute; left: 125px;top: 130px"'; } if (!isset($style['school_email'])) { $style['school_email'] = 'style="position:absolute; left: 125px;top: 175px"'; } if (!isset($style['school_logo'])) { $style['school_logo'] = 'style="position:absolute; left: 525px;top: 75px"'; } if (!isset($style['user_image'])) { $style['user_image'] = 'style="position:absolute; left: 525px;top: 125px"'; } $height = $certificateTemplate->height * 3.7795275591; $width = $certificateTemplate->width * 3.7795275591; $layout = [ 'height' => $height . 'px', 'width' => $width . 'px' ]; return view('certificate.design', compact('certificateTemplate', 'settings', 'style', 'layout')); } catch (Throwable $e) { ResponseService::logErrorResponse($e, "Certificate Template Controller -> Design Method"); ResponseService::errorResponse(); } } public function design_store(Request $request, $id) { // ResponseService::noFeatureThenRedirect('ID Card - Certificate Generation'); ResponseService::noPermissionThenRedirect('certificate-edit'); try { $fields = ''; if ($request->school_data) { $fields = implode(",", $request->school_data); } $style = array(); foreach ($request->style as $key => $value) { $style[$key] = $value; } $value = [ 'style' => $style, 'fields' => $fields ]; $this->certificateTemplate->update($id, $value); ResponseService::successResponse('Data Updated Successfully'); } catch (Throwable $e) { ResponseService::logErrorResponse($e, "Certificate Template Controller -> Design Store Method"); ResponseService::errorResponse(); } } public function certificate() { ResponseService::noFeatureThenRedirect('ID Card - Certificate Generation'); ResponseService::noPermissionThenRedirect('certificate-list'); try { $classSections = $this->classSection->builder()->with('class.stream', 'class.shift', 'section', 'medium')->get()->pluck('full_name', 'id'); $exams = $this->exam->builder()->with('class.medium')->where('publish', 1)->get()->append(['prefix_name']); $session_year_id = $this->cache->getSessionYear()->id; $certificateTemplates = $this->certificateTemplate->builder()->whereNotNull('style')->where('type', 'Student')->where('session_year_id', $session_year_id)->pluck('name', 'id'); return view('certificate.student-list', compact('classSections', 'exams', 'certificateTemplates')); } catch (Throwable $e) { ResponseService::logErrorResponse($e, "Certificate Template Controller -> Certificate Store Method"); ResponseService::errorResponse(); } } public function certificate_generate(Request $request) { ResponseService::noFeatureThenRedirect('ID Card - Certificate Generation'); ResponseService::noPermissionThenRedirect('certificate-list'); $request->validate([ 'certificate_template_id' => 'required', 'user_id' => 'required' ], [ 'certificate_template_id.required' => 'The certificate template field is required', 'user_id.required' => 'Please select at least one record.' ]); try { $certificateTemplate = $this->certificateTemplate->findById($request->certificate_template_id); $height = $certificateTemplate->height * 3.7795275591; $width = $certificateTemplate->width * 3.7795275591; $layout = [ 'height' => $height . 'px', 'width' => $width . 'px' ]; $user_id = explode(",", $request->user_id); $users = $this->user->builder()->with([ 'student' => function ($q) use ($request) { $q->with('class_section.class.stream', 'class_section.class.shift', 'class_section.section', 'class_section.medium', 'guardian') ->when($request->exam_id, function ($q) use ($request) { $q->with([ 'exam_result' => function ($q) use ($request) { $q->where('exam_id', $request->exam_id)->with('exam:id,name'); } ]); }); } ])->whereIn('id', $user_id)->with('extra_student_details.form_field')->get(); $user_data = array(); foreach ($users as $key => $user) { $user_data[] = [ 'image' => $user->image, 'description' => $this->replacePlaceholders($certificateTemplate->description, $user, $request->exam_id) ]; } $users = $user_data; $style = json_decode($certificateTemplate->style, true); $settings = $this->cache->getSchoolSettings(); return view('certificate.certificate-pdf', compact('certificateTemplate', 'layout', 'users', 'style', 'settings')); } catch (Throwable $e) { ResponseService::logErrorResponse($e, "Certificate Template Controller -> Certificate Generate Store Method"); ResponseService::errorResponse(); } } private function replacePlaceholders($templateContent, $user, $exam_id = null) { $settings = $this->cache->getSchoolSettings(); $sessionYear = $this->cache->getSessionYear(); // Define the placeholders and their replacements $placeholders = [ '{full_name}' => $user->full_name, '{first_name}' => $user->first_name, '{last_name}' => $user->last_name, '{class_section}' => $user->student->class_section->full_name, '{student_mobile}' => $user->mobile, '{dob}' => $user->dob, '{roll_no}' => $user->student->roll_number, '{admission_no}' => $user->student->admission_no, '{current_address}' => $user->current_address, '{permanent_address}' => $user->permanent_address, '{gender}' => $user->gender, '{admission_date}' => $user->student->admission_date, '{guardian_name}' => $user->student->guardian->full_name, '{guardian_mobile}' => $user->student->guardian->mobile, '{guardian_email}' => $user->student->guardian->email, '{session_year}' => $sessionYear->name, ...$this->extraFormFields($user) // Add more placeholders as needed ]; $exam_data = array(); if ($exam_id && count($user->student->exam_result)) { $result = $user->student->exam_result[0]; $exam_data = [ '{exam}' => $result->exam->name, '{total_marks}' => $result->total_marks, '{obtain_marks}' => $result->obtained_marks, '{grade}' => $result->grade, ]; } $placeholders = array_merge($placeholders, $exam_data); // Replace the placeholders in the template content foreach ($placeholders as $placeholder => $replacement) { $templateContent = str_replace($placeholder, $replacement, $templateContent); } return $templateContent; } public function extraFormFields($user) { $extraStudentDetails = array(); foreach ($user->extra_student_details as $key => $formField) { if (in_array($formField->form_field->type, ['radio', 'text', 'number', 'textarea'])) { $extraStudentDetails['{' . $formField->form_field->name . '}'] = $formField->data; } if ($formField->form_field->type == 'checkbox') { $data = json_decode($formField->data); if ($data) { $extraStudentDetails['{' . $formField->form_field->name . '}'] = implode(", ", $data); } } if ($formField->form_field->type == 'dropdown') { if ($formField->form_field && isset($formField->form_field->default_values[$formField->data])) { $extraStudentDetails['{' . $formField->form_field->name . '}'] = $formField->form_field->default_values[$formField->data]; } } } return $extraStudentDetails; } public function staff_certificate() { ResponseService::noFeatureThenRedirect('ID Card - Certificate Generation'); ResponseService::noPermissionThenRedirect('certificate-list'); try { $session_year_id = $this->cache->getSessionYear()->id; $certificateTemplates = $this->certificateTemplate->builder()->whereNotNull('style')->where('type', 'Staff')->where('session_year_id', $session_year_id)->pluck('name', 'id'); return view('certificate.staff-list', compact('certificateTemplates')); } catch (Throwable $e) { ResponseService::logErrorResponse($e, "Certificate Template Controller -> Staff Certificate Store Method"); ResponseService::errorResponse(); } } public function staff_generate_certificate(Request $request) { ResponseService::noFeatureThenRedirect('ID Card - Certificate Generation'); ResponseService::noPermissionThenRedirect('certificate-list'); $request->validate([ 'certificate_template_id' => 'required', 'user_id' => 'required' ], [ 'certificate_template_id.required' => 'The certificate template field is required', 'user_id.required' => 'Please select at least one record.' ]); try { $certificateTemplate = $this->certificateTemplate->findById($request->certificate_template_id); $height = $certificateTemplate->height * 3.7795275591; $width = $certificateTemplate->width * 3.7795275591; $layout = [ 'height' => $height . 'px', 'width' => $width . 'px' ]; $user_id = explode(",", $request->user_id); $users = $this->user->builder()->with('staff', 'roles', 'extra_student_details.form_field')->whereIn('id', $user_id)->get(); $user_data = array(); foreach ($users as $key => $user) { $user_data[] = [ 'image' => $user->image, 'description' => $this->replaceSatffPlaceholders($certificateTemplate->description, $user) ]; } $users = $user_data; $style = json_decode($certificateTemplate->style, true); $settings = $this->cache->getSchoolSettings(); return view('certificate.certificate-pdf', compact('certificateTemplate', 'layout', 'users', 'style', 'settings')); } catch (Throwable $e) { ResponseService::logErrorResponse($e, "Certificate Template Controller -> Certificate Generate Store Method"); ResponseService::errorResponse(); } } private function replaceSatffPlaceholders($templateContent, $user) { $settings = $this->cache->getSchoolSettings(); $sessionYear = $this->cache->getSessionYear(); $today_date = Carbon::now(); $joining_date = Carbon::createFromFormat($settings['date_format'] .' '. $settings['time_format'], $user->staff->joining_date)->format('Y-m-d'); $joining_date = Carbon::parse($joining_date); $experience = $joining_date->diffInMonths($today_date); $experience = $experience / 12; // Define the placeholders and their replacements $placeholders = [ '{full_name}' => $user->full_name, '{first_name}' => $user->first_name, '{last_name}' => $user->last_name, '{mobile}' => $user->mobile, '{dob}' => $user->dob, '{current_address}' => $user->current_address, '{permanent_address}' => $user->permanent_address, '{gender}' => $user->gender, '{email}' => $user->email, '{joining_date}' => date($settings['date_format'], strtotime($user->staff->joining_date)), '{role}' => implode(',', $user->roles->pluck('name')->toArray()), '{qualification}' => $user->staff->qualification, '{session_year}' => $sessionYear->name, '{experience}' => number_format($experience, 1), ...$this->extraFormFields($user) // Add more placeholders as needed ]; // Replace the placeholders in the template content foreach ($placeholders as $placeholder => $replacement) { $templateContent = str_replace($placeholder, $replacement, $templateContent); } return $templateContent; } }