| Current Path : /var/www/v3.cesa.co.za/src/EventBundle/Controller/ |
| Current File : /var/www/v3.cesa.co.za/src/EventBundle/Controller/SchoolEventController.php |
<?php
namespace App\EventBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use App\CoreBundle\Services\ServiceGetterManager;
use App\EventBundle\Entity\SchoolEvent;
use App\EventBundle\Entity\SchoolCourse;
use App\EventBundle\Entity\SchoolAttendee;
use App\UserBundle\Entity\UserList;
use Doctrine\ORM\EntityManagerInterface;
class SchoolEventController extends AbstractController
{
/**
* @Route("/api/school-courses", name="api_school_courses", methods={"GET"})
*/
public function getSchoolCourses(
Request $request,
TokenStorageInterface $tokenStorage,
EntityManagerInterface $entityManager
): Response {
// Check if user is authenticated
// $token = $tokenStorage->getToken();
// if (!$token || !$token->getUser() instanceof UserList) {
// throw new AccessDeniedException('Authentication required');
// }
// Get pagination parameters
$page = (int) $request->query->get('page', -1);
$limit = (int) $request->query->get('limit', 0);
$trainingProviderId = (int) $request->query->get('training_provider_id', 0);
$providerId = (int) $request->query->get('provider_id', 0);
if ($page > 0) {
$offset = ($page - 1) * $limit;
} else {
$offset = -1;
}
// Define the headers for CSV-style output
$headers = [
'id',
'training_provider_id',
'provider_id',
'course_name',
'level',
'cpd',
'accred_num',
'course_description',
'file_attachment',
'hours',
'nqf_level',
'category',
'sacpcmp_num',
'accred_num_2',
'course_type',
'desc_overview',
'desc_why_attend',
'desc_outcomes',
'desc_objectives',
'desc_program',
'desc_who_attend',
'currently_offered',
'advert_info',
'temp_desc_overview',
'temp_desc_why_attend',
'temp_desc_outcomes',
'temp_desc_program',
'temp_desc_who_attend',
'accept_temp',
'testimonials'
];
try {
// Get all SchoolCourse entities with optimized query and pagination
$schoolCourses = $entityManager->getRepository(
SchoolCourse::class
)->findAllForAPI(
$limit,
$offset,
['training_provider_id' => $trainingProviderId, 'provider_id' => $providerId]
);
// Prepare the data rows
$data = [];
foreach ($schoolCourses as $courseArr) {
// echo $courseArr['id'];
// exit;
$course = $entityManager->getRepository(SchoolCourse::class)->find($courseArr['id']);
if (!$course) {
// echo "Skipping course " . $courseArr['id'] . " because it doesn't exist\n";
continue;
}
$row = [];
foreach ($headers as $header) {
if ($header === 'training_provider_id') {
$row[] = $course->getTrainingProvider()->getId();
continue;
}
if ($header === 'provider_id') {
$row[] = $course->getSchoolProvider()->getId();
continue;
}
$getter = 'get' . str_replace('_', '', ucwords($header, '_'));
if (method_exists($course, $getter)) {
$value = $course->$getter();
// Handle different data types
if ($value instanceof \DateTimeInterface) {
$row[] = $value->format('Y-m-d H:i:s');
} elseif (is_bool($value)) {
$row[] = $value ? '1' : '0';
} elseif (is_null($value)) {
$row[] = '';
} else {
$row[] = (string) $value;
}
} else {
$row[] = '';
}
}
$data[] = $row;
}
// Create CSV-style JSON response
$response = [
'headers' => $headers,
'data' => $data,
'pagination' => [
'page' => $page,
'limit' => $limit,
'offset' => $offset,
'count' => count($data)
]
];
return $this->json($response, Response::HTTP_OK, [
'Content-Type' => 'application/json',
'Cache-Control' => 'no-cache, no-store, must-revalidate',
'Pragma' => 'no-cache',
'Expires' => '0'
]);
} catch (\Exception $e) {
return $this->json([
'error' => 'Database error occurred',
'message' => $e->getMessage()
], Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @Route("/api/school-events", name="api_school_events", methods={"GET"})
*/
public function getSchoolEvents(
Request $request,
TokenStorageInterface $tokenStorage,
EntityManagerInterface $entityManager
): Response {
// Check if user is authenticated
// $token = $tokenStorage->getToken();
// if (!$token || !$token->getUser() instanceof UserList) {
// throw new AccessDeniedException('Authentication required');
// }
// Get pagination parameters
$page = (int) $request->query->get('page', -1);
$limit = (int) $request->query->get('limit', 0);
$trainerId = (int) $request->query->get('training_provider_id', 0);
if ($page > 0) {
$offset = ($page - 1) * $limit;
} else {
$offset = -1;
}
// Define the headers for CSV-style output
$headers = [
'id',
'training_provider_id',
'event_name',
'level',
'city',
'venue',
'start_date',
'end_date',
'start_time',
'end_time',
'available_spaces',
'cost_per_person',
'event_description',
'hours',
'cpd',
'code',
'accred_num',
'province',
'reg_deadline',
'member_discount',
'early_bird_discount',
'early_bird_date',
'cancelled',
'bank_acc_name',
'external_link',
'file_attachment',
'candidate_academy',
'booking_confirmed',
'attendance_register',
'sacpcmp_num'
];
try {
// Get all SchoolEvent entities with optimized query and pagination
$schoolEvents = $entityManager->getRepository(SchoolEvent::class)->findAllForAPI(
$limit,
$offset,
['trainer_id' => $trainerId]
);
// Prepare the data rows
$data = [];
foreach ($schoolEvents as $eventArr) {
// echo $eventArr['id'];
// exit;
$event = $entityManager->getRepository(SchoolEvent::class)->find($eventArr['id']);
if (!$event) {
// echo "Skipping event " . $eventArr['id'] . " because it doesn't exist\n";
continue;
}
$row = [];
foreach ($headers as $header) {
if ($header === 'training_provider_id') {
$row[] = $event->getTrainingProvider()->getId();
continue;
}
$getter = 'get' . str_replace('_', '', ucwords($header, '_'));
if (method_exists($event, $getter)) {
$value = $event->$getter();
// Handle different data types
if ($value instanceof \DateTimeInterface) {
$row[] = $value->format('Y-m-d H:i:s');
} elseif (is_bool($value)) {
$row[] = $value ? '1' : '0';
} elseif (is_null($value)) {
$row[] = '';
} else {
$row[] = (string) $value;
}
} else {
$row[] = '';
}
}
$data[] = $row;
}
// Create CSV-style JSON response
$response = [
'headers' => $headers,
'data' => $data,
'pagination' => [
'page' => $page,
'limit' => $limit,
'offset' => $offset,
'count' => count($data)
]
];
return $this->json($response, Response::HTTP_OK, [
'Content-Type' => 'application/json',
'Cache-Control' => 'no-cache, no-store, must-revalidate',
'Pragma' => 'no-cache',
'Expires' => '0'
]);
} catch (\Exception $e) {
return $this->json([
'error' => 'Database error occurred',
'message' => $e->getMessage()
], Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @Route("/api/school-attendees", name="api_school_attendees", methods={"GET"})
*/
public function getSchoolAttendees(
Request $request,
TokenStorageInterface $tokenStorage,
EntityManagerInterface $entityManager
): Response {
// Check if user is authenticated
// $token = $tokenStorage->getToken();
// if (!$token || !$token->getUser() instanceof UserList) {
// throw new AccessDeniedException('Authentication required');
// }
// Get query parameters
$eventId = $request->query->get('eventId');
$lastAttendeeId = $request->query->get('lastAttendeeId', 0);
// Validate required parameters
if (!$eventId) {
return $this->json([
'error' => 'eventId parameter is required'
], Response::HTTP_BAD_REQUEST);
}
// Validate eventId is numeric
if (!is_numeric($eventId)) {
return $this->json([
'error' => 'eventId must be a valid number'
], Response::HTTP_BAD_REQUEST);
}
// Validate lastAttendeeId is numeric
if (!is_numeric($lastAttendeeId)) {
return $this->json([
'error' => 'lastAttendeeId must be a valid number'
], Response::HTTP_BAD_REQUEST);
}
// Get school attendees using the repository method
$schoolAttendees = $entityManager->getRepository(SchoolAttendee::class)
->findByEventIdAndAttendeeIdGreaterThan((int) $eventId, (int) $lastAttendeeId);
// Define the headers for CSV-style output
$headers = [
'id',
'contact_title',
'contact_first_name',
'contact_last_name',
'company_name',
'address_line_1',
'address_line_2',
'address_line_3',
'city',
'postal_code',
'phone_number',
'mobile_number',
'fax_number',
'email_address',
'dietary_req',
'attended',
'order_num',
'org_vat_num',
'id_number',
'saace_mem_number',
'ecsa_number',
'designation',
'cancelled',
'date_cancelled',
'booking_name',
'booking_tel',
'booking_email',
'booking_fax',
'date_booked',
'known_as',
'comments',
'certificate_sent',
'company_type',
'saice_member',
'saice_mem_number',
'cesa_staff',
'booking_form',
'responsible_payment',
'marketing_source',
'package_chosen',
'event_id'
];
// Prepare the data rows
$data = [];
foreach ($schoolAttendees as $attendee) {
$row = [];
foreach ($headers as $header) {
if ($header === 'event_id') {
// Special handling for event ID
$schoolEvent = $attendee->getSchoolEvent();
$row[] = $schoolEvent ? $schoolEvent->getId() : '';
} else {
$getter = 'get' . str_replace('_', '', ucwords($header, '_'));
if (method_exists($attendee, $getter)) {
$value = $attendee->$getter();
// Handle different data types
if ($value instanceof \DateTimeInterface) {
$row[] = $value->format('Y-m-d H:i:s');
} elseif (is_bool($value)) {
$row[] = $value ? '1' : '0';
} elseif (is_null($value)) {
$row[] = '';
} else {
$row[] = (string) $value;
}
} else {
$row[] = '';
}
}
}
$data[] = $row;
}
// Create CSV-style JSON response
$response = [
'headers' => $headers,
'data' => $data
];
return $this->json($response, Response::HTTP_OK, [
'Content-Type' => 'application/json',
'Cache-Control' => 'no-cache, no-store, must-revalidate',
'Pragma' => 'no-cache',
'Expires' => '0'
]);
}
}