Your IP : 216.73.217.79


Current Path : /var/www/v3.cesa.co.za/src/EventBundle/Controller/
Upload File :
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'
        ]);
    }
}