Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 40 |
CRAP | |
0.00% |
0 / 1032 |
| OnlineInteractiveClassService | |
0.00% |
0 / 1 |
|
0.00% |
0 / 40 |
56882.00 | |
0.00% |
0 / 1032 |
| __construct | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 3 |
|||
| __clone | n/a |
0 / 0 |
1 | n/a |
0 / 0 |
|||||
| getInstance | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 5 |
|||
| createOrUpdateUsers | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 17 |
|||
| getMeetingDetails | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 15 |
|||
| isOnlineHourAssignedToTimetable | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 15 |
|||
| getClusterMeetings | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 18 |
|||
| getClusterDetails | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 12 |
|||
| addUser | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 22 |
|||
| updateIsActive | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 8 |
|||
| deleteUsers | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 8 |
|||
| saveMeeting | |
0.00% |
0 / 1 |
72.00 | |
0.00% |
0 / 19 |
|||
| createMeeting | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 31 |
|||
| updateMeeting | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 17 |
|||
| searchUsers | |
0.00% |
0 / 1 |
182.00 | |
0.00% |
0 / 43 |
|||
| searchMeetings | |
0.00% |
0 / 1 |
506.00 | |
0.00% |
0 / 74 |
|||
| addStudents | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 41 |
|||
| notifyStudents | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 25 |
|||
| deleteMeeting | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 18 |
|||
| checkAttendanceAlreadyMarked | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 17 |
|||
| getMeetingAttendance | |
0.00% |
0 / 1 |
132.00 | |
0.00% |
0 / 75 |
|||
| deleteStudentsByMeetingId | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 11 |
|||
| joinMeetingByMeetingId | |
0.00% |
0 / 1 |
72.00 | |
0.00% |
0 / 24 |
|||
| hostMeetingByMeetingId | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 18 |
|||
| markAttendedMeeting | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 11 |
|||
| getMeetingAttendedStudents | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 11 |
|||
| getStudentsAssignedToMeeting | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 14 |
|||
| getOnlineMeetingReport | |
0.00% |
0 / 1 |
182.00 | |
0.00% |
0 / 100 |
|||
| createUserApi | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 23 |
|||
| createMeetingApi | |
0.00% |
0 / 1 |
56.00 | |
0.00% |
0 / 49 |
|||
| updateMeetingApi | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 37 |
|||
| deleteMeetingApi | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 13 |
|||
| getActiveAppById | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 21 |
|||
| getApps | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 12 |
|||
| getAppsForStaff | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 23 |
|||
| getMeetingAppName | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 16 |
|||
| getJoinUrlApi | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 19 |
|||
| getHostUrlApi | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 22 |
|||
| getAllStaffMeetingCount | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 17 |
|||
| getAllMeetingBasicDetails | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 24 |
|||
| searchMeetingsOpt | |
0.00% |
0 / 1 |
756.00 | |
0.00% |
0 / 84 |
|||
| <?php | |
| namespace com\linways\core\ams\professional\service; | |
| use com\linways\base\constant\UserType; | |
| use com\linways\base\util\SecurityUtils; | |
| use com\linways\core\ams\professional\oic\Zoom; | |
| use com\linways\core\ams\professional\oic\MsTeams; | |
| use com\linways\core\ams\professional\oic\Kaltura; | |
| use com\linways\core\ams\professional\dto\oic\User; | |
| use com\linways\core\ams\professional\constant\OicApp; | |
| use com\linways\core\ams\professional\dto\oic\Meeting; | |
| use com\linways\core\ams\professional\service\CommonService; | |
| use com\linways\core\ams\professional\service\StudentService; | |
| use com\linways\core\ams\professional\service\SubjectService; | |
| use com\linways\core\ams\professional\constant\SettingsConstants; | |
| use com\linways\core\ams\professional\dto\notification\Notification; | |
| use com\linways\core\ams\professional\request\oic\SearchUsersRequest; | |
| use com\linways\core\ams\professional\exception\ProfessionalException; | |
| use com\linways\core\ams\professional\request\oic\SearchMeetingsRequest; | |
| use com\linways\core\ams\professional\dto\notification\NotificationRecipient; | |
| use com\linways\core\ams\professional\request\oic\CreateOrUpdateUsersRequest; | |
| use com\linways\core\ams\professional\service\notification\NotificationService; | |
| use com\linways\core\ams\professional\mapper\OnlineInteractiveClassServiceMapper; | |
| use com\linways\core\ams\professional\constant\notification\NotificationContextConstant; | |
| use com\linways\core\ams\professional\constant\notification\NotificationFeatureConstant; | |
| class OnlineInteractiveClassService extends BaseService | |
| { | |
| // /Condition 1 - Presence of a static member variable | |
| private static $_instance = null; | |
| // /Condition 2 - Locked down the constructor | |
| private function __construct() | |
| { | |
| $this->mapper = OnlineInteractiveClassServiceMapper::getInstance()->getMapper(); | |
| } | |
| // Prevent any oustide instantiation of this class | |
| // /Condition 3 - Prevent any object or instance of that class to be cloned | |
| private function __clone() {} | |
| // Prevent any copy of this object | |
| // /Condition 4 - Have a single globally accessible static method | |
| public static function getInstance() | |
| { | |
| if (!is_object(self::$_instance)) // or if( is_null(self::$_instance) ) or if( self::$_instance == null ) | |
| self::$_instance = new self(); | |
| return self::$_instance; | |
| } | |
| /** | |
| * Create or Update User accounts | |
| * @param $request | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| public function createOrUpdateUsers(CreateOrUpdateUsersRequest $request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| try { | |
| foreach ($request->newUsers as $newUser) { | |
| if (empty($newUser->id)) { | |
| $newUser->id = $this->addUser($newUser); | |
| } else { | |
| $this->updateIsActive($newUser->id, $newUser->isActive); | |
| } | |
| } | |
| if (!empty($request->deletedUsers)) { | |
| $this->deleteUsers($request->deletedUsers); | |
| } | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch meetings details | |
| * @param $meetingId | |
| * @throws ProfessionalException | |
| * @return Array $meetingDetails | |
| */ | |
| public function getMeetingDetails($meetingId) | |
| { | |
| try { | |
| if( !$meetingId || empty($meetingId) ){ | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Meeting id is required"); | |
| } | |
| $query = "SELECT vom.id, vom.name, vom.description, vom.meeting_date, | |
| vom.meetings_details->>'$.join_url' AS join_url, vom.meetings_details | |
| FROM v4_oic_meetings vom | |
| WHERE id = '$meetingId' "; | |
| $meetingDetails = $this->executeQueryForList($query); | |
| return $meetingDetails; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch meetings details | |
| * @param $timetableId | |
| * @throws ProfessionalException | |
| * @return Object $result | |
| */ | |
| public function isOnlineHourAssignedToTimetable($timetableId) | |
| { | |
| try { | |
| if (!$timetableId || empty($timetableId)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Timetable id is mandatory"); | |
| } | |
| // Fetch meeting id, start url and join url | |
| $query = "SELECT id, JSON_UNQUOTE(JSON_EXTRACT(vom.meetings_details, '$.start_url')) AS start_url, | |
| JSON_UNQUOTE(JSON_EXTRACT(vom.meetings_details, '$.join_url')) AS join_url | |
| FROM v4_oic_meetings vom | |
| WHERE v4_timetable_id = '$timetableId'"; | |
| $result = $this->executeQueryForObject($query); | |
| return $result ? $result : false; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch meetings details | |
| * @param $clusterId | |
| * @throws ProfessionalException | |
| * @return Array $meetings | |
| */ | |
| public function getClusterMeetings($clusterId) | |
| { | |
| try { | |
| if( !$clusterId || empty($clusterId) ){ | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Cluster id not found"); | |
| } | |
| $staffId = $GLOBALS['userId']; | |
| $query = "SELECT vom.id, vom.name, vom.description, vom.meeting_date | |
| FROM v4_oic_meetings vom | |
| INNER JOIN cluster c ON c.id = vom.cluster_id | |
| INNER JOIN cluster_members cm ON cm.cluster_id = c.id | |
| INNER JOIN staffaccounts s ON s.staffID = cm.staff_id | |
| WHERE vom.cluster_id = '$clusterId' AND s.staffID = $staffId ORDER BY vom.meeting_date desc"; | |
| $meetings = $this->executeQueryForList($query); | |
| return $meetings ? $meetings : false; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch cluster details | |
| * @param $clusterId | |
| * @throws ProfessionalException | |
| * @return Object $result | |
| */ | |
| public function getClusterDetails($clusterId) | |
| { | |
| try { | |
| if( !$clusterId || empty($clusterId) ){ | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Cluster id not found"); | |
| } | |
| $query = "SELECT c.name FROM cluster c WHERE c.id = '$clusterId' "; | |
| $result = $this->executeQueryForObject($query); | |
| return $result ? $result : false; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Create a new user | |
| * @param User $user | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function addUser(User $user) | |
| { | |
| $user->createdBy = $GLOBALS['userId']; | |
| try { | |
| $user->id = SecurityUtils::getRandomString(); | |
| $user->userDetails = $this->createUserApi($user); | |
| if (!empty($user->userDetails)) { // ZOOM Meetings | |
| if (!$user->userDetails->status) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Cannot create user! Please try again"); | |
| } | |
| $userDetails = "'" . json_encode($user->userDetails->data) . "'"; | |
| } else { | |
| // OTHER Meetings | |
| $userDetails = 'NULL'; | |
| } | |
| $query = "INSERT INTO oic_users (id,staff_id,user_details,is_active,created_by,created_date,updated_by,updated_date,oic_app_id) | |
| VALUES ('$user->id','$user->staffId',$userDetails,'1','$user->createdBy',UTC_TIMESTAMP(), | |
| '$user->createdBy',UTC_TIMESTAMP(),'$user->appId')"; | |
| $this->executeQuery($query); | |
| return $user->id; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Update users active status | |
| * @param $id, $isActive | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function updateIsActive($id, $isActive) | |
| { | |
| $query = "UPDATE oic_users SET is_active='$isActive' WHERE id='$id'"; | |
| try { | |
| $this->executeQuery($query); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Delete users | |
| * @param $userIds | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function deleteUsers($userIds) | |
| { | |
| $query = "UPDATE oic_users SET is_active = 0,updated_by='" . $_SESSION['adminID'] . "',updated_date = UTC_TIMESTAMP() WHERE id IN ('" . implode("','", $userIds) . "')"; | |
| try { | |
| $this->executeQuery($query); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Create or update an meeting based on meeting id | |
| * @param Meeting $meeting | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| public function saveMeeting(Meeting $meeting) | |
| { | |
| $meeting->createdBy = $GLOBALS['userId']; | |
| $meeting->updatedBy = $GLOBALS['userId']; | |
| if (empty($meeting->name) || empty($meeting->description) || empty($meeting->meetingDate) || empty($meeting->appId)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Please fill required fields"); | |
| } | |
| if (!(bool) strtotime($meeting->meetingDate)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_DATE, "Invalid date given! Please enter a valid date"); | |
| } | |
| try { | |
| if (empty($meeting->id)) { | |
| $this->createMeeting($meeting); | |
| } else { | |
| $this->updateMeeting($meeting); | |
| } | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Create a new meeting | |
| * @param Meeting $meeting | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function createMeeting(Meeting $meeting) | |
| { | |
| try { | |
| $meeting->meetingDetails = $this->createMeetingApi($meeting); // returns json start and join url | |
| $meeting->meetingDetails = json_decode(json_encode($meeting->meetingDetails)); | |
| if (!$meeting->meetingDetails->status) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, $meeting->meetingDetails->message ? $meeting->meetingDetails->message : "Cannot create meeting! Please try again"); | |
| } | |
| $meeting->meetingDetails = $meeting->meetingDetails->data; // data -> start and join url | |
| $meeting->id = SecurityUtils::getRandomString(); | |
| $query = | |
| "INSERT INTO v4_oic_meetings (id, v4_timetable_id, cluster_id, name, description, meetings_details, meeting_date, oic_users_id, created_by, created_date, updated_by, updated_date) | |
| VALUES ( | |
| '$meeting->id', | |
| '$meeting->timetableId', | |
| '$meeting->clusterId', | |
| '$meeting->name', | |
| '$meeting->description', | |
| '" . str_replace("'", "\'", json_encode($meeting->meetingDetails)) . "', | |
| '" . date("Y-m-d H:i:s", strtotime($meeting->meetingDate)) . "', | |
| '$meeting->userId', | |
| '$meeting->createdBy', | |
| UTC_TIMESTAMP(), | |
| '$meeting->updatedBy', | |
| UTC_TIMESTAMP() | |
| )"; | |
| $this->executeQuery($query); | |
| $this->addStudents($meeting); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Update meeting | |
| * @param Meeting $meeting | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function updateMeeting(Meeting $meeting) | |
| { | |
| try { | |
| $response = $this->updateMeetingApi($meeting); | |
| $response = json_decode(json_encode($response)); | |
| if (!$response->status) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, $response->message ? $response->message : "Cannot update meeting! Please try again"); | |
| } | |
| $meetingDetails = $response->data ? "'" . str_replace("'", "\'", json_encode($response->data)) . "'" : 'meetings_details'; | |
| $query = "UPDATE v4_oic_meetings SET name='$meeting->name',description='$meeting->description',oic_users_id='$meeting->userId', | |
| meeting_date='" . date("Y-m-d H:i:s", strtotime($meeting->meetingDate)) . "',updated_by='$meeting->updatedBy', | |
| updated_date=UTC_TIMESTAMP(),meetings_details=$meetingDetails | |
| WHERE id='$meeting->id'"; | |
| $this->executeQuery($query); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Search user | |
| * @param SearchUsersRequest $request | |
| * @throws ProfessionalException | |
| * @return Array $userDetails | |
| */ | |
| public function searchUsers(SearchUsersRequest $request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| $query = "SELECT oics.id, oics.user_details, oics.is_active, sta.staffName, sta.staffID, sta.staffEmail, | |
| sta.staffAccount, oics.oic_app_id, oa.name | |
| FROM staffaccounts sta | |
| LEFT JOIN oic_users oics ON sta.staffID=oics.staff_id | |
| LEFT JOIN oic_app oa ON oics.oic_app_id=oa.id | |
| WHERE 1=1 AND sta.isResigned=0 "; | |
| if (!empty($request->id)) { | |
| $query .= " AND oics.id='" . $request->id . "'"; | |
| } | |
| if (!empty($request->staffId)) { | |
| $query .= " AND oics.staff_id='$request->staffId'"; | |
| } | |
| if (!empty($request->departmentId)) { | |
| $query .= " AND sta.deptID='$request->departmentId'"; | |
| } | |
| if (!empty($request->staffName)) { | |
| $query .= " AND sta.staffName LIKE '%$request->staffName%'"; | |
| } | |
| if (!empty($request->staffAccount)) { | |
| $query .= " AND sta.staffAccount='$request->staffAccount'"; | |
| } | |
| if ($request->isActive === "1" || $request->isActive === "0") { | |
| $query .= " AND oics.is_active = '$request->isActive'"; | |
| } | |
| if ($request->appId) { | |
| $query .= " AND oics.oic_app_id='$request->appId'"; | |
| } | |
| try { | |
| $userDetails = $this->executeQueryForList($query, $this->mapper[OnlineInteractiveClassServiceMapper::GET_USER_DETAILS]); | |
| foreach ($userDetails as $u) { | |
| foreach ($u->apiDetails as $app) { | |
| if (is_array($app->userDetails)) { | |
| $app->userDetails = json_decode(json_encode($app->userDetails)); | |
| } | |
| } | |
| } | |
| return $userDetails; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Search user | |
| * @param SearchUsersRequest $request | |
| * @throws ProfessionalException | |
| * @return Array $response | |
| */ | |
| public function searchMeetings(SearchMeetingsRequest $request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| try { | |
| if ($request->studentId) { | |
| $durations = json_decode(CommonService::getInstance()->getSettings(SettingsConstants::ONLINE_CLASS, SettingsConstants::ONLINE_CLASS_LIST_STUDENT_DURATIONS)); | |
| } else { | |
| $durations = json_decode(CommonService::getInstance()->getSettings(SettingsConstants::ONLINE_CLASS, SettingsConstants::ONLINE_CLASS_LIST_DURATIONS)); | |
| } | |
| } catch (\Throwable $th) { | |
| $durations->upComingMeetingShowDurationInMinutes = 5; | |
| $durations->onGoingMeetingShowDurationInMinutes = 40; | |
| } | |
| $query = "SELECT om.id, om.name, om.description, om.meetings_details, om.meeting_date, om.oic_users_id, ou.staff_id, sta.staffName, | |
| IF(now() BETWEEN om.meeting_date+INTERVAL -" . $durations->upComingMeetingShowDurationInMinutes . | |
| " MINUTE AND om.meeting_date +INTERVAL +" . $durations->onGoingMeetingShowDurationInMinutes . | |
| " MINUTE,1,0) AS liveNow,IF(now() < om.meeting_date+INTERVAL -" . $durations->upComingMeetingShowDurationInMinutes . | |
| " MINUTE,1,0) AS upComing,IF(now() > om.meeting_date+INTERVAL +" . $durations->onGoingMeetingShowDurationInMinutes . | |
| " MINUTE,1,0) AS expiredMeeting,ou.oic_app_id | |
| FROM v4_oic_meetings om | |
| INNER JOIN oic_users ou ON om.oic_users_id = ou.id | |
| INNER JOIN staffaccounts sta ON sta.staffID=ou.staff_id | |
| WHERE 1=1 "; | |
| $orderBy = " ORDER BY om.meeting_date ASC"; | |
| if (!empty($request->id)) { | |
| $query .= " AND om.id='$request->id'"; | |
| } | |
| if (!empty($request->userId)) { | |
| $query .= " AND om.user_id='$request->userId'"; | |
| } | |
| if (!empty($request->staffId)) { | |
| $query .= " AND ou.staff_id='$request->staffId'"; | |
| } | |
| if (!empty($request->batchId)) { | |
| $query .= " AND om.id IN (SELECT DISTINCT oic_meetings_id FROM v4_oic_students ost INNER JOIN studentaccount sta ON sta.studentID=ost.student_id WHERE sta.batchID='$request->batchId')"; | |
| } | |
| if (!empty($request->studentId)) { | |
| $query .= " AND om.id IN (SELECT DISTINCT oic_meetings_id FROM v4_oic_students WHERE student_id='$request->studentId')"; | |
| } | |
| if (!empty($request->fromDate) && !empty($request->toDate)) { | |
| $query .= " AND DATE_FORMAT(CONVERT_TZ(om.meeting_date, | |
| '+00:00', | |
| @@global .time_zone), | |
| '%Y-%m-%d') BETWEEN '" . date('Y-m-d', strtotime($request->fromDate)) . "' AND '" . date('Y-m-d', strtotime($request->toDate)) . "'"; | |
| } else if (!empty($request->fromDate)) { | |
| $query .= " AND DATE_FORMAT(CONVERT_TZ(sfrd.remitted_date, | |
| '+00:00', | |
| @@global .time_zone), | |
| '%Y-%m-%d') = '" . date('Y-m-d', strtotime($request->fromDate)) . "'"; | |
| } | |
| if (!empty($request->pssubId)) { | |
| $query .= " AND om.id IN (SELECT DISTINCT oic_meetings_id FROM v4_oic_students ost INNER JOIN pseudosubjects_students psbs ON psbs.studentID=ost.student_id WHERE psbs.pseudosubjectID='$request->pssubId')"; | |
| } | |
| if ($request->onGoingMeetingsOnly) { | |
| $query .= " AND now() BETWEEN om.meeting_date+INTERVAL -" . $durations->upComingMeetingShowDurationInMinutes . " MINUTE AND om.meeting_date +INTERVAL +" . $durations->onGoingMeetingShowDurationInMinutes . " MINUTE"; | |
| } | |
| try { | |
| $response = $this->executeQueryForList($query . $orderBy, $this->mapper[OnlineInteractiveClassServiceMapper::GET_MEETING_DETAILS]); | |
| foreach ($response as $meeting) { | |
| if (is_array($meeting->meetingDetails)) { | |
| $meeting->meetingDetails = json_decode(json_encode($meeting->meetingDetails)); | |
| } | |
| if ($meeting->meetingDate) { | |
| $meetingDate = strtotime($meeting->meetingDate); | |
| $meeting->upComing = strtotime(date("Y-m-d H:i:s")) < strtotime("-" . $durations->upComingMeetingShowDurationInMinutes . " minutes", $meetingDate) ? "1" : "0"; | |
| $meeting->liveNow = strtotime("-" . $durations->upComingMeetingShowDurationInMinutes . " minutes", $meetingDate) < strtotime(date("Y-m-d H:i:s")) && strtotime(date("Y-m-d H:i:s")) < strtotime("+" . $durations->onGoingMeetingShowDurationInMinutes . " minutes", $meetingDate) ? "1" : "0"; | |
| $meeting->joinTimeLimit = $meeting->liveNow ? $durations->onGoingMeetingShowDurationInMinutes : 0; | |
| $meeting->expiredMeeting = strtotime("+" . $durations->onGoingMeetingShowDurationInMinutes . " minutes", $meetingDate) < strtotime(date("Y-m-d H:i:s")) ? "1" : "0"; | |
| } | |
| } | |
| return $response; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Add students for a meeting | |
| * @param $meeting | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function addStudents($meeting) | |
| { | |
| $createdBy = $GLOBALS['userId']; | |
| $updatedBy = $GLOBALS['userId']; | |
| $queryValues = []; | |
| try { | |
| $query = "INSERT INTO v4_oic_students (oic_meetings_id,student_id,attended,created_by,created_date,updated_by,updated_date) VALUES "; | |
| $queryForClusterStudentList = $meeting->timetableId | |
| ? | |
| "SELECT DISTINCT(s.studentID ) | |
| FROM v4_oic_meetings vom | |
| INNER JOIN v4_timetable vt ON vt.id = vom.v4_timetable_id | |
| INNER JOIN cluster c ON c.id = vt.cluster_id AND c.trashed IS NULL | |
| INNER JOIN cluster_groups_relations cgr ON cgr.cluster_id = c.id | |
| INNER JOIN `groups` g ON g.id = cgr.groups_id | |
| INNER JOIN group_members gm ON gm.groups_id = g.id AND gm.academic_status = 'ACTIVE' | |
| INNER JOIN student_program_account spa ON spa.id = gm.student_id | |
| INNER JOIN studentaccount s ON s.studentID = spa.student_id | |
| WHERE vom.v4_timetable_id = '$meeting->timetableId' | |
| AND vom.id = '$meeting->id' | |
| AND vom.cluster_id = '$meeting->clusterId' " | |
| : | |
| "SELECT DISTINCT(s.studentID ) | |
| FROM v4_oic_meetings vom | |
| INNER JOIN cluster c ON c.id = vom.cluster_id AND c.trashed IS NULL | |
| INNER JOIN cluster_groups_relations cgr ON cgr.cluster_id = c.id | |
| INNER JOIN `groups` g ON g.id = cgr.groups_id | |
| INNER JOIN group_members gm ON gm.groups_id = g.id AND gm.academic_status = 'ACTIVE' | |
| INNER JOIN student_program_account spa ON spa.id = gm.student_id | |
| INNER JOIN studentaccount s ON s.studentID = spa.student_id | |
| WHERE vom.id = '$meeting->id' AND vom.cluster_id = '$meeting->clusterId' "; | |
| $clusterStudentList = $this->executeQueryForList($queryForClusterStudentList); | |
| foreach ($clusterStudentList as $student) { | |
| $queryValues[] = "('$meeting->id','$student->studentID','0','$createdBy',UTC_TIMESTAMP(),'$updatedBy',UTC_TIMESTAMP())"; | |
| } | |
| if (!empty($queryValues)) { | |
| $this->executeQuery($query . (implode(",", $queryValues))); | |
| } | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Notify students regarding the meeting | |
| * @param $meeting | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function notifyStudents($meeting) | |
| { | |
| $meetingDate = date('d-m-Y H:i:a', strtotime($meeting->meetingDate)); | |
| if (!empty($meeting->pssubId)) { | |
| $subjectName = SubjectService::getInstance()->getPseudoSubjectDetailsById($meeting->pssubId)->name; | |
| $studentList = StudentService::getInstance()->getStudentsAssignedToApseudoSub($meeting->pssubId); | |
| } else { | |
| $subjectName = SubjectService::getInstance()->getBasicSubjectDetailsBySubjectId($meeting->subjectId)->subjectName; | |
| $studentList = StudentService::getInstance()->getStudentsByBatchIdSemIdSubjectIdStaffId($meeting->batchId, $meeting->subjectId, $meeting->semesterId, $_SESSION['staffID']); | |
| } | |
| if (!empty($studentList)) { | |
| $notification = new Notification(); | |
| $notification->context = NotificationContextConstant::OIC_MEETING; | |
| $notification->feature = NotificationFeatureConstant::NOTIFY_MEETING_CREATED; | |
| $notification->recipientType = UserType::STUDENT; | |
| $notification->createdBy = $_SESSION['staffID']; | |
| foreach ($studentList as $student) { | |
| $recipient = new NotificationRecipient(); | |
| $recipient->recipientId = $student->studentID; | |
| $recipient->recipientType = UserType::STUDENT; | |
| $recipient->templateParameters = ["date" => $meetingDate, "subjectName" => $subjectName]; | |
| $notification->recipient[] = $recipient; | |
| } | |
| } | |
| NotificationService::getInstance()->sendNotification($notification); | |
| } | |
| /** | |
| * Delete meeting | |
| * @param $meetingId | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| public function deleteMeeting($meetingId) | |
| { | |
| $meetingId = $this->realEscapeString($meetingId); | |
| try { | |
| $meetingRequest = new SearchMeetingsRequest(); | |
| $meetingRequest->id = $meetingId; | |
| $meetingRequest->staffId = $GLOBALS['userId']; | |
| $meeting = $this->searchMeetings($meetingRequest)[0]; | |
| if (empty($meeting)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Permission denied"); | |
| } | |
| $this->checkAttendanceAlreadyMarked($meetingId); | |
| // $response = $this->deleteMeetingApi($meeting->meetingDetails->id); | |
| $this->deleteStudentsByMeetingId($meetingId); | |
| $query = "DELETE FROM v4_oic_meetings WHERE id='$meetingId'"; | |
| $this->executeQuery($query); | |
| // $query_timetable = "UPDATE batch_timetable SET oicMeetingId=null WHERE oicMeetingId='$meetingId'"; | |
| // $this->executeQuery($query_timetable); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Check if at least one attendance has been marked against a meeting | |
| * @param $meetingId | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function checkAttendanceAlreadyMarked($meetingId) | |
| { | |
| if( !$meetingId || empty($meetingId) ){ | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Meeting id is required"); | |
| } | |
| // CHECK ATTENDANCE ONLY FOR MEETINGS CREATED AGAINST TIMETABLE | |
| $query = "SELECT vos.student_id, COUNT(*) as count | |
| FROM v4_oic_meetings vom | |
| INNER JOIN v4_oic_students vos ON vos.oic_meetings_id = vom.id | |
| WHERE vos.attended = '1' AND vos.oic_meetings_id = '$meetingId' AND vom.v4_timetable_id != '0' "; | |
| try { | |
| $response = $this->executeQueryForList($query); | |
| if (!($response) || (int)($response[0]->count) > 0) { | |
| throw new ProfessionalException(ProfessionalException::ATTENDANCE_ALREADY_MARKED, "Unable to delete the meeting, attendance has already been marked"); | |
| } | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Get drafted/marked attendance entry for a meeting | |
| * @param $meetingId | |
| * @throws ProfessionalException | |
| * @return Array | |
| */ | |
| public function getMeetingAttendance($meetingId) | |
| { | |
| if( !$meetingId || empty($meetingId) ){ | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Meeting id is required"); | |
| } | |
| try { | |
| // CHECK IF MEETING IS CREATED AGIANST A TIMETABLE, IF NOT THROW EXCEPTION | |
| $queryForClusterMeeting = | |
| "SELECT * | |
| FROM v4_oic_meetings vom | |
| WHERE vom.id = '$meetingId'"; | |
| $clusterMeeting = $this->executeQueryForList($queryForClusterMeeting); | |
| if($clusterMeeting[0]->v4_timetable_id == 0){ | |
| throw new ProfessionalException(ProfessionalException::ATTENDANCE_NOT_RECORDED, "Attendance record does not exist as this meeting is not created against a timetable"); | |
| } | |
| // CHECK ATTENDANCE ENTRY IN DRAFTED | |
| // GET STUDENT DETAILS IF ATTENDANCE HAS BEEN DRAFTED | |
| $queryForAttendanceDrafted = | |
| "SELECT s.studentID , s.studentName , vad.is_absent, 'DRAFTED' as status | |
| FROM v4_oic_meetings vom | |
| INNER JOIN v4_attendance_draft vad ON | |
| vad.time_table_id = vom.v4_timetable_id | |
| INNER JOIN v4_attendance_drafted_user vadu | |
| ON vadu.staff_id = vad.staff_id AND vadu.time_table_id = vad.time_table_id | |
| INNER JOIN staffaccounts staff ON | |
| staff.staffID = vadu.staff_id | |
| INNER JOIN student_program_account spa ON | |
| spa.id = vad.student_program_id | |
| INNER JOIN studentaccount s ON | |
| s.studentID = spa.student_id | |
| WHERE vom.id = '$meetingId' "; | |
| $attendanceDraftedStudents = $this->executeQueryForList($queryForAttendanceDrafted); | |
| if (!empty($attendanceDraftedStudents) && count($attendanceDraftedStudents) > 0) { | |
| return $attendanceDraftedStudents; | |
| } | |
| // CHECK ATTENDANCE ENTRY IN MARKED | |
| // GET STUDENT DETAILS IF ATTENDANCE HAS BEEN CONFIRMED | |
| $queryForAttendanceMarked = | |
| "SELECT s.studentID , s.studentName , va.is_absent, 'CONFIRMED' as status | |
| FROM v4_oic_meetings vom | |
| INNER JOIN v4_attendance va ON | |
| va.time_table_id = vom.v4_timetable_id | |
| INNER JOIN v4_attendance_marked_user vamu | |
| ON vamu.staff_id = va.staff_id AND vamu.time_table_id = va.time_table_id | |
| INNER JOIN staffaccounts staff ON | |
| staff.staffID = vamu.staff_id | |
| INNER JOIN student_program_account spa ON | |
| spa.id = va.student_program_id | |
| INNER JOIN studentaccount s ON | |
| s.studentID = spa.student_id | |
| WHERE vom.id = '$meetingId' "; | |
| $attendanceMarkedStudents = $this->executeQueryForList($queryForAttendanceMarked); | |
| if (!empty($attendanceMarkedStudents) && count($attendanceMarkedStudents) > 0) { | |
| return $attendanceMarkedStudents; | |
| } | |
| // IF ATTENDANCE NEITHER DRAFTED NOR CONFIRMED, FETCH ATTENDED COLUMN FROM v4_oic_students | |
| $queryForMeetingAttended = | |
| "SELECT | |
| s.studentID, | |
| s.studentName, | |
| CASE | |
| WHEN vos.attended = 0 THEN 1 | |
| WHEN vos.attended = 1 THEN 0 | |
| END AS is_absent, | |
| 'Not Recorded. Below data is based on students who joined the meeting.' as status | |
| FROM | |
| v4_oic_students vos | |
| INNER JOIN studentaccount s ON | |
| s.studentID = vos.student_id | |
| INNER JOIN student_program_account spa ON | |
| spa.student_id = s.studentID | |
| where | |
| vos.oic_meetings_id = '$meetingId' "; | |
| $meetingAttended = $this->executeQueryForList($queryForMeetingAttended); | |
| if (!empty($meetingAttended) && count($meetingAttended) > 0) { | |
| return $meetingAttended; | |
| } | |
| throw new ProfessionalException(ProfessionalException::ATTENDANCE_NOT_RECORDED, "Attendance for this hour has not been recorded."); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Delete students associated with a meeting | |
| * @param $meetingId | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function deleteStudentsByMeetingId($meetingId) | |
| { | |
| if( !$meetingId || empty($meetingId) ){ | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Meeting id is required"); | |
| } | |
| $query = "DELETE FROM v4_oic_students WHERE oic_meetings_id='$meetingId'"; | |
| try { | |
| $this->executeQuery($query); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Join by meeting id | |
| * @param $meetingId | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| public function joinMeetingByMeetingId($meetingId) | |
| { | |
| $studentId = $GLOBALS['userId']; | |
| if (empty($meetingId)) { | |
| if (empty($studentId)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request! Please send a valid request"); | |
| } | |
| } | |
| try { | |
| $searchMeetingsRequest = new SearchMeetingsRequest(); | |
| $searchMeetingsRequest->id = $meetingId; | |
| $searchMeetingsRequest->studentId = $studentId; | |
| // $searchMeetingsRequest->onGoingMeetingsOnly = "1"; | |
| $meeting = $this->searchMeetingsOpt($searchMeetingsRequest); | |
| $meeting = $meeting[0]; | |
| if (empty($meeting) || $meeting->upComing === "1") { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Permission Denied"); | |
| } | |
| if ($meeting->liveNow === "1" && !empty($studentId)) { | |
| $this->markAttendedMeeting($studentId, $meetingId); | |
| } | |
| return $this->getJoinUrlApi($meeting); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Host meeting | |
| * @param $meetingId | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| public function hostMeetingByMeetingId($meetingId) | |
| { | |
| if (empty($meetingId) || empty($_SESSION['staffID'])) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request! Please send a valid request"); | |
| } | |
| try { | |
| $searchMeetingsRequest = new SearchMeetingsRequest(); | |
| $searchMeetingsRequest->id = $meetingId; | |
| $searchMeetingsRequest->staffId = $_SESSION['staffID']; | |
| // $searchMeetingsRequest->onGoingMeetingsOnly = "1"; | |
| $meeting = $this->searchMeetings($searchMeetingsRequest); | |
| $meeting = $meeting[0]; | |
| if (empty($meeting) || $meeting->upComing === "1") { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Permission Denied"); | |
| } | |
| return $this->getHostUrlApi($meeting); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Mark meeting attendance | |
| * @param $studentId, $meetingId | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| public function markAttendedMeeting($studentId, $meetingId) | |
| { | |
| if (empty($studentId) || empty($meetingId)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request! Please send a valid request"); | |
| } | |
| $query = "UPDATE v4_oic_students SET attended = 1 WHERE student_id='$studentId' AND oic_meetings_id='$meetingId'"; | |
| try { | |
| $this->executeQuery($query); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch meeting attended students | |
| * @param $studentId, $meetingId | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| public function getMeetingAttendedStudents($meetingId) | |
| { | |
| if( !$meetingId || empty($meetingId) ){ | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Meeting id is required"); | |
| } | |
| $query = "SELECT * FROM v4_oic_students WHERE oic_meetings_id='$meetingId' AND attended=1"; | |
| try { | |
| return $this->executeQueryForList($query); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch students in a meeting | |
| * @param $meetingId | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| public function getStudentsAssignedToMeeting($meetingId) | |
| { | |
| if (empty($meetingId)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Meeting id is required"); | |
| } | |
| $query = "SELECT sa.studentID,sa.rollNo,sa.studentName,os.attended | |
| FROM v4_oic_students os | |
| INNER JOIN studentaccount sa ON sa.studentID= os.student_id | |
| WHERE os.oic_meetings_id='$meetingId' ORDER BY sa.studentName"; | |
| try { | |
| return $this->executeQueryForList($query); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch meeting report | |
| * @param $request | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| public function getOnlineMeetingReport($request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| try { | |
| $durations = json_decode(CommonService::getInstance()->getSettings(SettingsConstants::ONLINE_CLASS, SettingsConstants::ONLINE_CLASS_LIST_DURATIONS)); | |
| } catch (\Throwable $th) { | |
| $durations->upComingMeetingShowDurationInMinutes = 5; | |
| $durations->onGoingMeetingShowDurationInMinutes = 40; | |
| } | |
| $whereCond = ''; | |
| $limit = ''; | |
| $dates = []; | |
| if ($request->schoolIds) { | |
| $whereCond .= " AND d.school_id IN ('" . implode("','", $request->schoolIds) . "')"; | |
| } | |
| if ($request->programIds) { | |
| $whereCond .= " AND p.id IN ('" . implode("','", $request->programIds) . "')"; | |
| } | |
| if ($request->batchId) { | |
| $whereCond .= " AND gBatch.id = '$request->batchId'"; | |
| } else if ($request->batchIds) { | |
| $whereCond .= " AND gBatch.id IN ('" . implode("','", $request->batchIds) . "')"; | |
| } | |
| if ($request->termId) { | |
| $whereCond .= " AND at.id = '$request->termId'"; | |
| } else if ($request->termIds) { | |
| $whereCond .= " AND at.id IN ('" . implode("','", $request->termIds) . "')"; | |
| } | |
| if ($request->dateRange) { | |
| $dates = explode(' to ', $request->dateRange); | |
| if (empty($dates[1])) { | |
| $dates[1] = $dates[0]; | |
| } | |
| $whereCond .= " AND DATE_FORMAT(CONVERT_TZ(vom.meeting_date, '+00:00', @@global.time_zone), | |
| '%Y-%m-%d') BETWEEN '" . date('Y-m-d', strtotime($dates[0])) . "' | |
| AND '" . date('Y-m-d', strtotime($dates[1])) . "'"; | |
| } | |
| // if(!empty($request->orderBy)){ | |
| // $orderBy = $request->orderBy; | |
| // } | |
| // $query = "SELECT distinct om.id,om.name,om.description,om.meetings_details,om.meeting_date,om.oic_users_id,ou.staff_id,sta.staffName,sub.subjectID,sub.subjectName,b.batchName,b.batchID,sbs.semID,sbs.sbsID,sbs.isPseudosubject,sum(attended) as attended, IF(now() BETWEEN om.meeting_date+INTERVAL -".$durations->upComingMeetingShowDurationInMinutes." MINUTE AND om.meeting_date +INTERVAL +".$durations->onGoingMeetingShowDurationInMinutes." MINUTE,1,0) AS liveNow,IF(now() < om.meeting_date+INTERVAL -".$durations->upComingMeetingShowDurationInMinutes." MINUTE,1,0) AS upComing,IF(now() > om.meeting_date+INTERVAL +".$durations->onGoingMeetingShowDurationInMinutes." MINUTE,1,0) AS expiredMeeting,ou.oic_app_id FROM v4_oic_meetings om INNER JOIN oic_users ou ON om.oic_users_id = ou.id INNER JOIN staffaccounts sta ON sta.staffID=ou.staff_id INNER JOIN v4_oic_students ost on ost.oic_meetings_id = om.id INNER JOIN studentaccount sa ON sa.studentID=ost.student_id INNER JOIN batches b on b.batchID = sa.batchID inner join sbs_relation sbs on sbs.batchID= sa.batchID and sbs.staffID= sta.staffID and sbs.semID=b.semID inner join subjects sub on sbs.subjectID = sub.subjectID WHERE 1=1 "; | |
| $query = "SELECT | |
| DISTINCT vom.id, | |
| vom.name, | |
| vom.description, | |
| vom.meetings_details, | |
| GROUP_CONCAT(DISTINCT gBatch.name ORDER BY gBatch.name SEPARATOR ', ') as batchName, | |
| vom.meeting_date, | |
| vom.oic_users_id, | |
| ou.staff_id, | |
| sta.staffName, | |
| sum(attended) as attended, | |
| IF(now() BETWEEN vom.meeting_date + INTERVAL -" . $durations->upComingMeetingShowDurationInMinutes . " MINUTE AND vom.meeting_date + INTERVAL + " . $durations->onGoingMeetingShowDurationInMinutes . " MINUTE, | |
| 1, | |
| 0) AS liveNow , | |
| IF(now() < vom.meeting_date + INTERVAL -" . $durations->upComingMeetingShowDurationInMinutes . " MINUTE, | |
| 1, | |
| 0) AS upComing , | |
| IF(now() > vom.meeting_date + INTERVAL + " . $durations->onGoingMeetingShowDurationInMinutes . " MINUTE, | |
| 1, | |
| 0) AS expiredMeeting, | |
| ou.oic_app_id | |
| FROM | |
| v4_oic_meetings vom | |
| INNER JOIN oic_users ou ON | |
| vom.oic_users_id = ou.id | |
| INNER JOIN staffaccounts sta ON | |
| sta.staffID = ou.staff_id | |
| INNER JOIN v4_oic_students ost ON | |
| ost.oic_meetings_id = vom.id | |
| INNER JOIN studentaccount sa ON | |
| sa.studentID = ost.student_id | |
| INNER JOIN cluster c ON | |
| c.id = vom.cluster_id | |
| INNER JOIN cluster_groups_relations cgr ON | |
| cgr.cluster_id = c.id | |
| INNER JOIN `groups` gSub ON -- FETCH STUDENT SUBJECTS | |
| gSub.id = cgr.groups_id | |
| INNER JOIN group_members gm ON -- FETCH STUDENTS IN SUBJECTS | |
| gm.groups_id = gSub.id AND gm.academic_status = 'ACTIVE' | |
| INNER JOIN academic_term at ON -- FETCH STUDENT SEMESTER | |
| at.id = gSub.academic_term_id | |
| INNER JOIN groups_relations gr ON | |
| gr.child_groups_id = gSub.id | |
| INNER JOIN `groups` gBatch ON -- FETCH STUDENT BATCH | |
| gBatch.id = gr.parent_groups_id | |
| INNER JOIN program p ON -- FETCH BATCH PROGRAM | |
| p.id = gBatch.program_id | |
| INNER JOIN program_department_relation pdr ON -- FETCH BATCH SCHOOL | |
| pdr.program_id = gBatch.program_id | |
| INNER JOIN department d ON | |
| d.deptID = pdr.department_id | |
| WHERE 1=1 $whereCond GROUP BY vom.id ORDER BY vom.meeting_date DESC"; | |
| // $orderBy = " ORDER BY om.meeting_date $orderBy"; | |
| // if(!empty($request->staffId)) | |
| // { | |
| // $query .= " AND ou.staff_id='$request->staffId'"; | |
| // } | |
| // if($request->onGoingMeetingsOnly) | |
| // { | |
| // $query .= " AND now() BETWEEN om.meeting_date+INTERVAL -".$durations->upComingMeetingShowDurationInMinutes." MINUTE AND om.meeting_date +INTERVAL +".$durations->onGoingMeetingShowDurationInMinutes." MINUTE"; | |
| // } | |
| try { | |
| $response = $this->executeQueryForList($query, $this->mapper[OnlineInteractiveClassServiceMapper::GET_MEETING_DETAILS]); | |
| foreach ($response as $meeting) { | |
| if (is_array($meeting->meetingDetails)) { | |
| $meeting->meetingDetails = json_decode(json_encode($meeting->meetingDetails)); | |
| } | |
| // if($meeting->meetingDate){ | |
| // $meetingDate = strtotime($meeting->meetingDate); | |
| // $meeting->upComing = strtotime(date("Y-m-d H:i:s")) < strtotime("-".$durations->upComingMeetingShowDurationInMinutes." minutes",$meetingDate)?"1":"0"; | |
| // $meeting->liveNow = strtotime("-".$durations->upComingMeetingShowDurationInMinutes." minutes",$meetingDate) < strtotime(date("Y-m-d H:i:s")) && strtotime(date("Y-m-d H:i:s")) < strtotime("+".$durations->onGoingMeetingShowDurationInMinutes." minutes",$meetingDate)?"1":"0"; | |
| // $meeting->expiredMeeting = strtotime("+".$durations->onGoingMeetingShowDurationInMinutes." minutes",$meetingDate) < strtotime(date("Y-m-d H:i:s"))?"1":"0"; | |
| // } | |
| } | |
| return $response; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /**************************************api services ************************************/ | |
| /** | |
| * Create user via API | |
| * @param User $user | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function createUserApi(User $user) | |
| { | |
| try { | |
| $app = $this->getActiveAppById($user->appId); | |
| switch ($app->name) { | |
| case OicApp::ZOOM: | |
| $createZoomUser = new Zoom($app->API_KEY, $app->API_SECRET_KEY, $app->ACCOUNT_ID); | |
| return $createZoomUser->createUser($user); | |
| break; | |
| case OicApp::OTHER: | |
| return null; | |
| break; | |
| case OicApp::MS_TEAMS: | |
| $createMsTeamsUser = new MsTeams($app->CLIENT_ID, $app->CLIENT_SECRET_KEY, $app->TENANT_ID, $app->DOMAIN); | |
| return $createMsTeamsUser->createUser($user); | |
| break; | |
| case OicApp::KALTURA: | |
| return null; | |
| break; | |
| } | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Create meeting via API | |
| * @param Meeting $meeting | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function createMeetingApi(Meeting $meeting) | |
| { | |
| try { | |
| $app = $this->getActiveAppById($meeting->appId); | |
| switch ($app->name) { | |
| case OicApp::ZOOM: | |
| $getUserRequest = new SearchUsersRequest(); | |
| $getUserRequest->id = $meeting->userId; | |
| $getUserRequest->appId = $meeting->appId; | |
| $user = $this->searchUsers($getUserRequest)[0]; | |
| $meeting->apiUserId = $user->apiDetails[0]->userDetails->id; | |
| $createZoomMeeting = new Zoom($app->API_KEY, $app->API_SECRET_KEY, $app->ACCOUNT_ID); | |
| $response = $createZoomMeeting->createMeeting($meeting); | |
| $meetingDetails = new \Stdclass(); | |
| $meetingDetails->data = $response; | |
| $meetingDetails->status = $response['status']; | |
| return $meetingDetails; | |
| break; | |
| case OicApp::OTHER: | |
| if (empty($meeting->joinUrl)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "URL is mandatory! Please provide a valid URL"); | |
| } | |
| $meetingDetails = (object) [ | |
| "data" => (object) ["start_url" => "https://" . str_replace(["http://", "https://"], "", $meeting->joinUrl), "join_url" => "https://" . str_replace(["http://", "https://"], "", $meeting->joinUrl)], | |
| "status" => true | |
| ]; | |
| return $meetingDetails; | |
| break; | |
| case OicApp::MS_TEAMS: | |
| $getUserRequest = new SearchUsersRequest(); | |
| $getUserRequest->id = $meeting->userId; | |
| $getUserRequest->appId = $meeting->appId; | |
| $user = $this->searchUsers($getUserRequest)[0]; | |
| $meeting->apiUserId = $user->apiDetails[0]->userDetails->id; | |
| $createMeeting = new MsTeams($app->CLIENT_ID, $app->CLIENT_SECRET_KEY, $app->TENANT_ID); | |
| return $createMeeting->createMeeting($meeting); | |
| break; | |
| case OicApp::KALTURA: | |
| $getUserRequest = new SearchUsersRequest(); | |
| $getUserRequest->id = $meeting->userId; | |
| $getUserRequest->appId = $meeting->appId; | |
| $user = $this->searchUsers($getUserRequest)[0]; | |
| // $meeting->apiUserId = $user->apiDetails[0]->userDetails->id; | |
| $createMeeting = new Kaltura(); | |
| return $createMeeting->createMeeting($meeting); | |
| break; | |
| } | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Update meeting via API | |
| * @param Meeting $meeting | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function updateMeetingApi(Meeting $meeting) | |
| { | |
| try { | |
| $app = $this->getActiveAppById($meeting->appId); // Zoom API credentials | |
| switch ($app->name) { | |
| case OicApp::ZOOM: | |
| $getUserRequest = new SearchUsersRequest(); | |
| $getUserRequest->id = $meeting->userId; | |
| $getUserRequest->appId = $meeting->appId; | |
| $user = $this->searchUsers($getUserRequest)[0]; // staff name, etc -> api details -> userDetails | |
| // $meeting->apiUserId = $user->userDetails->id; | |
| // $meeting->apiUserId = $user->apiDetails[0]->userDetails->id; | |
| $meeting->apiUserId = $user->userDetails->id; | |
| $updateZoomMeeting = new Zoom($app->API_KEY, $app->API_SECRET_KEY, $app->ACCOUNT_ID); | |
| $response = $updateZoomMeeting->updateMeeting($meeting); | |
| $response->data = ""; | |
| return $response; | |
| break; | |
| case OicApp::OTHER: | |
| if (empty($meeting->joinUrl)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "URL is mandatory! Please provide a valid URL"); | |
| } | |
| $meetingDetails = (object) [ | |
| "data" => (object) ["start_url" => "https://" . str_replace(["http://", "https://"], "", $meeting->joinUrl), "join_url" => "https://" . str_replace(["http://", "https://"], "", $meeting->joinUrl)], | |
| "status" => true | |
| ]; | |
| return $meetingDetails; | |
| break; | |
| case OicApp::MS_TEAMS: | |
| return | |
| (object) [ | |
| "status" => true, | |
| "data" => "" | |
| ]; | |
| break; | |
| } | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Delete meeting via API | |
| * @param $meetingId | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| private function deleteMeetingApi($meetingId) | |
| { | |
| try { | |
| $app = $this->getActiveApp(); | |
| switch ($app->name) { | |
| case OicApp::ZOOM: | |
| $deleteZoomMeeting = new Zoom($app->API_KEY, $app->API_SECRET_KEY, $app->ACCOUNT_ID); | |
| return $deleteZoomMeeting->deleteMeeting($meetingId); | |
| break; | |
| } | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch active meeting app by app id | |
| * @param $id | |
| * @throws ProfessionalException | |
| * @return Object $app | |
| */ | |
| private function getActiveAppById($id) // Get api credentials of zoom | |
| { | |
| $id = $this->realEscapeString($id); | |
| if (empty($id)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid Request! Please try again"); | |
| } | |
| $query = "SELECT oa.id,oa.name,oa.is_active,oaa.id as attr_id,oaa.name as attr_name,oaa.value as attr_value | |
| FROM oic_app oa | |
| LEFT JOIN oic_app_attr oaa ON oa.id=oaa.oic_app_id | |
| WHERE is_active=1 "; | |
| $query .= " AND oa.id='$id'"; | |
| try { | |
| $app = $this->executeQueryForObject($query, false, $this->mapper[OnlineInteractiveClassServiceMapper::GET_APP_DETAILS]); | |
| foreach ($app->attr as $appAttr) { | |
| $app->{$appAttr->name} = $appAttr->value; | |
| } | |
| unset($app->attr); | |
| return $app; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch active meeting app by app id | |
| * @param $isActive | |
| * @throws ProfessionalException | |
| * @return Array $app | |
| */ | |
| public function getApps($isActive = true) | |
| { | |
| $isActive = $isActive ? "1" : "0"; | |
| $query = "SELECT id,name,is_active | |
| FROM oic_app | |
| WHERE is_active = '$isActive'"; | |
| try { | |
| $app = $this->executeQueryForList($query, $this->mapper[OnlineInteractiveClassServiceMapper::GET_APP_DETAILS]); | |
| return $app; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch active meeting apps associated with a staff | |
| * @param $staffId | |
| * @throws ProfessionalException | |
| * @return Array $app | |
| */ | |
| public function getAppsForStaff($staffId) | |
| { | |
| $query = " SELECT | |
| oics.oic_app_id as id, | |
| oa.name as name | |
| FROM | |
| staffaccounts sta | |
| LEFT JOIN oic_users oics ON | |
| sta.staffID = oics.staff_id | |
| LEFT JOIN oic_app oa ON | |
| oics.oic_app_id = oa.id | |
| WHERE | |
| 1 = 1 | |
| AND sta.isResigned = 0 | |
| AND oics.is_active = 1 | |
| AND oa.is_active = 1 | |
| AND sta.staffID = '$staffId' "; | |
| try { | |
| $app = $this->executeQueryForList($query); | |
| return $app; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch meeting app name | |
| * @param $meetingId | |
| * @throws ProfessionalException | |
| * @return Array $app | |
| */ | |
| public function getMeetingAppName($meetingId) | |
| { | |
| if( !$meetingId || empty($meetingId) ){ | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Meeting id is required"); | |
| } | |
| $query = "SELECT oa.id AS appId, oa.name AS appName | |
| FROM v4_oic_meetings vom | |
| INNER JOIN oic_users oc ON oc.id = vom.oic_users_id | |
| INNER JOIN oic_app oa ON oa.id = oc.oic_app_id AND oa.is_active = 1 | |
| WHERE vom.id = '$meetingId' "; | |
| try { | |
| $app = $this->executeQueryForList($query); | |
| return $app[0]; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch join url via API | |
| * @param Meeting $meeting | |
| * @throws | |
| * @return | |
| */ | |
| public function getJoinUrlApi(Meeting $meeting) | |
| { | |
| $app = $this->getActiveAppById($meeting->appId); | |
| switch ($app->name) { | |
| case OicApp::ZOOM: | |
| return $meeting->meetingDetails->join_url; | |
| break; | |
| case OicApp::OTHER: | |
| return $meeting->meetingDetails->join_url; | |
| break; | |
| case OicApp::MS_TEAMS: | |
| return $meeting->meetingDetails->joinWebUrl; | |
| break; | |
| case OicApp::KALTURA: | |
| $user = StudentService::getInstance()->getStudentDetailsById($_SESSION['studentID']); | |
| $kaltura = new Kaltura(); | |
| return $kaltura->getJoinUrl($meeting->meetingDetails->eventId, $user); | |
| break; | |
| } | |
| } | |
| /** | |
| * Fetch host url via API | |
| * @param Meeting $meeting | |
| * @throws | |
| * @return | |
| */ | |
| public function getHostUrlApi(Meeting $meeting) | |
| { | |
| $app = $this->getActiveAppById($meeting->appId); | |
| switch ($app->name) { | |
| case OicApp::ZOOM: | |
| return $meeting->meetingDetails->start_url; | |
| break; | |
| case OicApp::OTHER: | |
| return $meeting->meetingDetails->start_url; | |
| break; | |
| case OicApp::MS_TEAMS: | |
| return $meeting->meetingDetails->joinUrl; | |
| break; | |
| case OicApp::KALTURA: | |
| $getUserRequest = new SearchUsersRequest(); | |
| $getUserRequest->id = $meeting->userId; | |
| $getUserRequest->appId = $meeting->appId; | |
| $user = $this->searchUsers($getUserRequest)[0]; | |
| // $meeting->apiUserId = $user->apiDetails[0]->userDetails->id; | |
| $kaltura = new Kaltura(); | |
| return $kaltura->getHostUrl($meeting->meetingDetails->eventId, $user, $meeting->userId); | |
| break; | |
| } | |
| } | |
| /** | |
| * Fetch staff meeting count | |
| * @param $request | |
| * @throws | |
| * @return | |
| */ | |
| public function getAllStaffMeetingCount($request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| try { | |
| $sql = "SELECT sta.staffID,sta.staffAccount,om.oic_users_id,sta.staffName,sta.staffCode,count(distinct om.id) as meetingCount | |
| FROM v4_oic_meetings om | |
| INNER JOIN oic_users ou ON om.oic_users_id = ou.id | |
| INNER JOIN sbs_relation sbs ON sbs.staffID = ou.staff_id | |
| INNER JOIN batches bat ON bat.batchID = sbs.batchID AND bat.semID = sbs.semID | |
| INNER JOIN studentaccount st ON st.batchID = sbs.batchID | |
| INNER JOIN v4_oic_students oics ON st.studentID = oics.student_id AND oics.oic_meetings_id = om.id | |
| INNER JOIN staffaccounts sta ON sta.staffID = sbs.staffID | |
| GROUP BY ou.staff_id ORDER BY ou.staff_id;"; | |
| return $this->executeQueryForList($sql); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Fetch basic meeting details | |
| * @param $request | |
| * @throws ProfessionalException | |
| * @return | |
| */ | |
| public function getAllMeetingBasicDetails($request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| $where = []; | |
| $request->staffId ? $where[] = "ou.staff_id = $request->staffId" : null; | |
| $request->sbsIds ? $where[] = "sbs.sbsID in (" . implode(',', $request->sbsIds) . ")" : null; | |
| try { | |
| $sql = "SELECT om.id,om.name,om.description,om.meeting_date as meetingDate, | |
| meetings_details,ou.staff_id,is_active,st.studentID,st.studentAccount,st.studentName, | |
| group_concat(DISTINCT st.batchID) batches,CONCAT('[',group_concat(DISTINCT (JSON_OBJECT(oics.student_id,oics.attended))),']') AS attended, | |
| count(DISTINCT oics.student_id) AS studentCount,group_concat(DISTINCT sbs.sbsID) AS sbsIds,bat.batchID, | |
| group_concat(distinct bat.batchName) | |
| FROM v4_oic_meetings om | |
| INNER JOIN oic_users ou ON om.oic_users_id = ou.id | |
| INNER JOIN sbs_relation sbs ON sbs.staffID = ou.staff_id | |
| INNER JOIN batches bat ON bat.batchID = sbs.batchID and bat.semID = sbs.semID | |
| INNER JOIN studentaccount st ON st.batchID = sbs.batchID | |
| INNER JOIN v4_oic_students oics ON st.studentID = oics.student_id AND oics.oic_meetings_id = om.id | |
| INNER JOIN staffaccounts sta ON sta.staffID = sbs.staffID | |
| " . ((!empty($where)) ? " WHERE " . implode(' AND ', $where) : "") . " GROUP BY om.id ORDER BY om.meeting_date DESC;"; | |
| return $this->executeQueryForList($sql); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Search meeetings (optimised) | |
| * @param SearchMeetingsRequest $request | |
| * @throws ProfessionalException | |
| * @return Array $response | |
| */ | |
| public function searchMeetingsOpt(SearchMeetingsRequest $request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| try { | |
| if ($request->studentId) { | |
| $durations = json_decode(CommonService::getInstance()->getSettings(SettingsConstants::ONLINE_CLASS, SettingsConstants::ONLINE_CLASS_LIST_STUDENT_DURATIONS)); | |
| } else { | |
| $durations = json_decode(CommonService::getInstance()->getSettings(SettingsConstants::ONLINE_CLASS, SettingsConstants::ONLINE_CLASS_LIST_DURATIONS)); | |
| } | |
| } catch (\Throwable $th) { | |
| $durations->upComingMeetingShowDurationInMinutes = 5; | |
| $durations->onGoingMeetingShowDurationInMinutes = 40; | |
| } | |
| $selectColmn = "SELECT om.id,om.v4_timetable_id,om.cluster_id,om.name,om.description,om.meetings_details,om.meeting_date,om.oic_users_id, IF(now() BETWEEN om.meeting_date+INTERVAL -" . $durations->upComingMeetingShowDurationInMinutes . " MINUTE AND om.meeting_date +INTERVAL +" . $durations->onGoingMeetingShowDurationInMinutes . " MINUTE,1,0) AS liveNow ,IF(now() < om.meeting_date+INTERVAL -" . $durations->upComingMeetingShowDurationInMinutes . " MINUTE,1,0) AS upComing ,IF(now() > om.meeting_date+INTERVAL +" . $durations->onGoingMeetingShowDurationInMinutes . " MINUTE,1,0) AS expiredMeeting "; | |
| $from = " FROM v4_oic_meetings om "; | |
| $where = " WHERE 1=1 "; | |
| $orderBy = " ORDER BY om.meeting_date ASC"; | |
| if (!empty($request->id)) // Meeting id | |
| { | |
| $where .= " AND om.id='$request->id'"; | |
| } | |
| // if(!empty($request->userId)) | |
| // { | |
| // $where .= " AND om.user_id='$request->userId'"; | |
| // } | |
| if (!empty($request->clusterId)) { | |
| $where .= " AND om.cluster_id='$request->clusterId'"; | |
| } | |
| if (!empty($request->userId) && $request->userType == UserType::STAFF) { | |
| $selectColmn .= " ,ou.oic_app_id,ou.staff_id,sta.staffName "; | |
| $from .= " INNER JOIN oic_users ou ON om.oic_users_id = ou.id INNER JOIN staffaccounts sta ON sta.staffID=ou.staff_id "; | |
| $where .= " AND ou.staff_id='$request->userId' "; | |
| } | |
| if (!empty($request->batchId) || ((!empty($request->userId)) && ($request->userType == UserType::STUDENT)) || !empty($request->pssubId)) { | |
| $selectColmn .= ""; | |
| $from .= " INNER JOIN v4_oic_students ost ON ost.oic_meetings_id = om.id "; | |
| if ($request->batchId) { | |
| $from .= str_contains($from, "studentaccount") ? "" : " INNER JOIN studentaccount sta ON sta.studentID=ost.student_id "; | |
| $where .= " AND sta.batchID='$request->batchId' "; | |
| } | |
| if ($request->userId && $request->userType == UserType::STUDENT) { | |
| $from .= str_contains($from, "studentaccount") ? "" : " INNER JOIN studentaccount sta ON sta.studentID = ost.student_id "; | |
| $where .= " AND ost.student_id ='$request->userId' "; | |
| $selectColmn .= " ,staf.staffName "; | |
| $from .= " INNER JOIN oic_users ou ON om.oic_users_id = ou.id INNER JOIN staffaccounts staf ON staf.staffID=ou.staff_id "; | |
| } | |
| if ($request->pssubId) { | |
| $from .= " INNER JOIN pseudosubjects_students psbs ON psbs.studentID=ost.student_id "; | |
| $where .= " AND psbs.pseudosubjectID='$request->pssubId' "; | |
| } | |
| //$query .= " AND om.id IN (SELECT DISTINCT oic_meetings_id FROM v4_oic_students ost INNER JOIN studentaccount sta ON sta.studentID=ost.student_id WHERE sta.batchID='$request->batchId')"; | |
| } | |
| if (!empty($request->fromDate) && !empty($request->toDate)) { | |
| $where .= " AND DATE_FORMAT(CONVERT_TZ(om.meeting_date, | |
| '+00:00', | |
| @@global .time_zone), | |
| '%Y-%m-%d') BETWEEN '" . date('Y-m-d', strtotime($request->fromDate)) . "' AND '" . date('Y-m-d', strtotime($request->toDate)) . "'"; | |
| } else if (!empty($request->fromDate)) { | |
| $where .= " AND DATE_FORMAT(CONVERT_TZ(sfrd.remitted_date, | |
| '+00:00', | |
| @@global .time_zone), | |
| '%Y-%m-%d') = '" . date('Y-m-d', strtotime($request->fromDate)) . "'"; | |
| } | |
| // if(!empty($request->pssubId)) | |
| // { | |
| // $query .= " AND om.id IN (SELECT DISTINCT oic_meetings_id FROM v4_oic_students ost INNER JOIN pseudosubjects_students psbs ON psbs.studentID=ost.student_id WHERE psbs.pseudosubjectID='$request->pssubId')"; | |
| // } | |
| if ($request->onGoingMeetingsOnly) { | |
| $where .= " AND now() BETWEEN om.meeting_date+INTERVAL -" . $durations->upComingMeetingShowDurationInMinutes . " MINUTE AND om.meeting_date +INTERVAL +" . $durations->onGoingMeetingShowDurationInMinutes . " MINUTE"; | |
| } | |
| // $having = " HAVING "; | |
| // $having .= " expiredMeeting = 1 "; | |
| switch ($request->meetingType) { | |
| case 1: | |
| $having .= " liveNow = 1 "; | |
| break; | |
| case 2: | |
| $having .= " upComing = 1 "; | |
| break; | |
| case 3: | |
| $having .= " expiredMeeting = 1 "; | |
| break; | |
| } | |
| try { | |
| $query = $selectColmn . $from . $where . $having . $orderBy; | |
| $response = $this->executeQueryForList($query, $this->mapper[OnlineInteractiveClassServiceMapper::GET_MEETING_DETAILS]); | |
| foreach ($response as $meeting) { | |
| if (is_array($meeting->meetingDetails)) { | |
| $meeting->meetingDetails = json_decode(json_encode($meeting->meetingDetails)); | |
| } | |
| // if($meeting->meetingDate){ | |
| // $meetingDate = strtotime($meeting->meetingDate); | |
| // $meeting->upComing = strtotime(date("Y-m-d H:i:s")) < strtotime("-".$durations->upComingMeetingShowDurationInMinutes." minutes",$meetingDate)?"1":"0"; | |
| // $meeting->liveNow = strtotime("-".$durations->upComingMeetingShowDurationInMinutes." minutes",$meetingDate) < strtotime(date("Y-m-d H:i:s")) && strtotime(date("Y-m-d H:i:s")) < strtotime("+".$durations->onGoingMeetingShowDurationInMinutes." minutes",$meetingDate)?"1":"0"; | |
| // $meeting->joinTimeLimit = $meeting->liveNow?$durations->onGoingMeetingShowDurationInMinutes:0; | |
| // $meeting->expiredMeeting = strtotime("+".$durations->onGoingMeetingShowDurationInMinutes." minutes",$meetingDate) < strtotime(date("Y-m-d H:i:s"))?"1":"0"; | |
| // } | |
| } | |
| return $response; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| } |