Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 13 |
CRAP | |
0.00% |
0 / 633 |
| ScheduledNotifications | |
0.00% |
0 / 1 |
|
0.00% |
0 / 13 |
9900.00 | |
0.00% |
0 / 633 |
| __construct | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 3 |
|||
| __clone | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 1 |
|||
| getInstance | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 5 |
|||
| timeTableReminderSms | |
0.00% |
0 / 1 |
240.00 | |
0.00% |
0 / 85 |
|||
| getDayName | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 12 |
|||
| unmarkedAttendanceReminder | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 40 |
|||
| unmarkedHourDetails | |
0.00% |
0 / 1 |
342.00 | |
0.00% |
0 / 132 |
|||
| notifyParentOnStudentAttendanceOnSpecifiedTime | |
0.00% |
0 / 1 |
306.00 | |
0.00% |
0 / 100 |
|||
| getStudentAttendanceSMSSendOnSpecifiedTimeMsgParamValues | |
0.00% |
0 / 1 |
110.00 | |
0.00% |
0 / 48 |
|||
| filterOutInvalidParentPhoneNumber | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 16 |
|||
| getStudentAttendanceDetailsForNotification | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 14 |
|||
| sendEmailNotificationToFaculteesAbsenteesStudentList | |
0.00% |
0 / 1 |
342.00 | |
0.00% |
0 / 170 |
|||
| v4IntimationRequest | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 7 |
|||
| <?php | |
| namespace com\linways\core\ams\professional\service\notification; | |
| use stdClass; | |
| use mikehaertl\wkhtmlto\Pdf; | |
| use com\linways\base\dto\Email; | |
| use com\linways\base\dto\EmailTo; | |
| use com\linways\base\dto\sms\SMS; | |
| use com\linways\base\dto\EmailFrom; | |
| use com\linways\base\util\StringUtil; | |
| use com\linways\base\dto\EmailAttachment; | |
| use com\linways\base\service\EmailService; | |
| use com\linways\core\ams\professional\util\CommonUtil; | |
| use com\linways\core\ams\professional\dto\AMSConstants; | |
| use com\linways\core\ams\professional\util\MessageUtil; | |
| use com\linways\core\ams\professional\constant\UserType; | |
| use com\linways\academics\core\service\IntimationService; | |
| use com\linways\core\ams\professional\service\SMSService; | |
| use com\linways\core\ams\professional\constant\SMSContext; | |
| use com\linways\core\ams\professional\service\BaseService; | |
| use com\linways\core\ams\professional\constant\EmailModule; | |
| use com\linways\core\ams\professional\service\BatchService; | |
| use com\linways\core\ams\professional\service\StaffService; | |
| use com\linways\core\ams\professional\service\TimetableService; | |
| use com\linways\core\ams\professional\service\AttendanceService; | |
| use com\linways\core\ams\professional\service\DepartmentService; | |
| use com\linways\core\ams\professional\dto\notification\Notification; | |
| use com\linways\core\ams\professional\exception\ProfessionalException; | |
| use com\linways\core\ams\professional\request\api\GetAllBatchesRequest; | |
| use com\linways\core\ams\professional\dto\notification\NotificationRecipient; | |
| use com\linways\core\ams\professional\request\notification\GetGlobalSettingsRequest; | |
| use com\linways\core\ams\professional\mapper\notification\SchedulerNotificationMapper; | |
| use com\linways\core\ams\professional\constant\notification\NotificationContextConstant; | |
| use com\linways\core\ams\professional\constant\notification\NotificationFeatureConstant; | |
| use com\linways\core\ams\professional\request\notification\GetStudentAttendanceDetailsForNotification; | |
| use com\linways\core\ams\professional\constant\SettingsConstants; | |
| use com\linways\core\ams\professional\service\CommonService; | |
| /** | |
| * | |
| * @author gadheyan | |
| * | |
| */ | |
| class ScheduledNotifications extends BaseService{ | |
| private static $_instance = null; | |
| private $mapper = []; | |
| // /Condition 2 - Locked down the constructor | |
| private function __construct() | |
| { | |
| $this->mapper = SchedulerNotificationMapper::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; | |
| } | |
| public function timeTableReminderSms() | |
| { | |
| // Send Notifications For Unassigned Timetable | |
| $combinedMessage = ""; | |
| $noTimeTable = ""; | |
| $smsContent = ""; | |
| $departments = DepartmentService::getInstance()->getDepartments(); | |
| $principalDetail = StaffService::getInstance()->getPrincipalDetails(); | |
| $erpAdminDetail = StaffService::getInstance()->getErpAdminDetails(); | |
| $notification = new Notification(); | |
| $notification->context = NotificationContextConstant::TIMETABLE; | |
| $notification->feature = NotificationFeatureConstant::UNASSIGNED_TIMETABLE_REMINDER_SMS; | |
| $notification->recipientType = UserType::STAFF; | |
| $notification->smsDeferred = 0; | |
| $notification->createdBy = 0; | |
| $notification->creatorType = UserType::STAFF; | |
| foreach ($departments as $department) { | |
| $hodDetail = StaffService::getInstance()->getHodDetailsByDeptID($department->id); | |
| $batches = BatchService::getInstance()->getBatchesByDepartmentIdWithoutPassoutBatches($department->id); | |
| if (! empty($batches)) { | |
| foreach ($batches as $batch) { | |
| $timeTableDetails = TimetableService::getInstance()->getBatchTimeTableByBatchAndSem($batch->batchID, $batch->semID); | |
| if (empty($timeTableDetails)) { | |
| $noTimeTable = "TimeTable is not Defined for " . $batch->batchName . ","; | |
| } else { | |
| foreach ($timeTableDetails as $timetable) { | |
| if ($timetable->sbsID == 0 || $timetable->sbsID == NULL) { | |
| $unAssignedTimeTable[] = $timetable; | |
| } | |
| } | |
| if (! empty($unAssignedTimeTable)) { | |
| $smsContent = " The following hour(s) are not defined - "; | |
| foreach ($unAssignedTimeTable as $timetableUnAssigned) { | |
| $smsContent .= " Batch -" . $batch->batchName . " S-" . $batch->semID . "" . " Hour- " . $timetableUnAssigned->hourID . " " . $this->getDayName($timetableUnAssigned->dayID) . "(" . date('d-m-Y', strtotime($timetableUnAssigned->timetableDate)) . "),"; | |
| } | |
| } | |
| unset($unAssignedTimeTable); | |
| } | |
| } | |
| } | |
| $messageToSent = $noTimeTable . $smsContent; | |
| if (empty($messageToSent)) { | |
| // error_log(); | |
| continue; | |
| } | |
| $combinedMessage .= ' ' . $messageToSent; | |
| if ($hodDetail) { | |
| $recipient = null; | |
| $recipient = new NotificationRecipient(); | |
| $recipient->recipientId = $hodDetail->staffID; | |
| $recipient->recipientType = UserType::STAFF; | |
| $recipient->templateParameters = [ | |
| "message" => $messageToSent | |
| ]; | |
| $notification->recipient[] = $recipient; | |
| } | |
| if (! empty($principalDetail)) { | |
| $recipient = null; | |
| $recipient = new NotificationRecipient(); | |
| $recipient->recipientId = $principalDetail->staffID; | |
| $recipient->recipientType = UserType::STAFF; | |
| $recipient->templateParameters = [ | |
| "message" => $messageToSent | |
| ]; | |
| $notification->recipient[] = $recipient; | |
| } | |
| if (! empty($erpAdminDetail)) { | |
| $recipient = null; | |
| $recipient = new NotificationRecipient(); | |
| $recipient->recipientId = $erpAdminDetail->staffID; | |
| $recipient->recipientType = UserType::STAFF; | |
| $recipient->templateParameters = [ | |
| "message" => $messageToSent | |
| ]; | |
| $notification->recipient[] = $recipient; | |
| } | |
| } | |
| $smsContent = ""; | |
| $noTimeTable = ""; | |
| $messageToSent = ""; | |
| unset($unAssignedTimeTable); | |
| try { | |
| NotificationService::getInstance()->sendNotification($notification); | |
| } catch (\Exception $e) { | |
| // log exception | |
| $errorMsg = "Error Code : '" . $e->getCode() . "' . Error Message : " . $e->getMessage(); | |
| error_log($errorMsg); | |
| } | |
| } | |
| function getDayName($dayID) | |
| { | |
| $dayArray = Array( | |
| "1" => "Monday", | |
| "2" => "TuesDay", | |
| "3" => "Wednesday", | |
| "4" => "Thursday", | |
| "5" => "Friday", | |
| "6" => "Saturday", | |
| "7" => "Sunday" | |
| ); | |
| return $dayArray[$dayID]; | |
| } | |
| public function unmarkedAttendanceReminder() | |
| { | |
| // Send Notifications About Unmarked Attendance | |
| $globalSettingsRequest = new GetGlobalSettingsRequest(); | |
| $globalSettingsRequest->context = NotificationContextConstant::ATTENDANCE; | |
| $globalSettingsRequest->feature = NotificationFeatureConstant::UNMARKED_ATTENDANCE_REMINDER; | |
| $settings = NotificationSettingsService::getInstance()->getSingleGlobalSettings($globalSettingsRequest); | |
| if (! $settings->smsEnabled) { | |
| return null; | |
| } | |
| $notification = new Notification(); | |
| $notification->context = NotificationContextConstant::ATTENDANCE; | |
| $notification->feature = NotificationFeatureConstant::UNMARKED_ATTENDANCE_REMINDER; | |
| $notification->recipientType = UserType::STAFF; | |
| $notification->smsDeferred = 0; | |
| $notification->createdBy = 0; | |
| $notification->creatorType = UserType::STAFF; | |
| $departments = DepartmentService::getInstance()->getDepartments(); | |
| foreach ($departments as $department) { | |
| $staffs = StaffService::getInstance()->getAssignedStaffByDepartment($department->id); | |
| foreach ($staffs as $staff) { | |
| $staffId = $staff->staffID; | |
| $staffPhone = $staff->staffPhone; | |
| if (preg_match("/^[6-9][0-9]{9}$/", $staffPhone)) { | |
| $recipient = null; | |
| $recipient = new NotificationRecipient(); | |
| $recipient->recipientId = $staff->staffID; | |
| $recipient->recipientType = UserType::STAFF; | |
| $recipient->templateParameters = [ | |
| "smsContent" => $settings->customSettingsValue->smsTemplate | |
| ]; | |
| $notification->recipient[] = $recipient; | |
| } | |
| } | |
| } | |
| try { | |
| NotificationService::getInstance()->sendNotification($notification); | |
| } catch (\Exception $e) { | |
| // log exception | |
| $errorMsg = "Error Code : '" . $e->getCode() . "' . Error Message : " . $e->getMessage(); | |
| error_log($errorMsg); | |
| } | |
| } | |
| // Send Details Of Unmarked Hours | |
| public function unmarkedHourDetails() | |
| { | |
| $globalSettingsRequest = new GetGlobalSettingsRequest(); | |
| $globalSettingsRequest->context = NotificationContextConstant::ATTENDANCE; | |
| $globalSettingsRequest->feature = NotificationFeatureConstant::UNMARKED_HOUR_DETAILS; | |
| $settings = NotificationSettingsService::getInstance()->getSingleGlobalSettings($globalSettingsRequest); | |
| if (! $settings->emailEnabled && ! $settings->smsEnabled) { | |
| return null; | |
| } | |
| $startDate = new \DateTime("first day of last month"); | |
| $endDate = new \DateTime("last day of last month"); | |
| $startDate = $startDate->format("Y-m-d"); | |
| $endDate = $endDate->format("Y-m-d"); | |
| $departments = DepartmentService::getInstance()->getDepartments(); | |
| $html = "<table border='1' width='100%' cellpadding='2' cellspacing='0'><tr><th width='50%'>Name</th><th width='25%'>Department</th><th width='25%'>Unmarked Hours</th></tr>"; | |
| $htmlPrincipal = ""; | |
| $htmlHOD = ""; | |
| $principalStaffCount = 0; | |
| $departmentStaffCount = 0; | |
| $PRINCIPAL_SMS_CONTENT = $settings->customSettingsValue->principal->smsTemplate; | |
| $PRINCIPAL_EMAIL_CONTENT = $settings->customSettingsValue->principal->emailContent; | |
| $PRINCIPAL_EMAIL_SUBJECT = $settings->customSettingsValue->principal->emailSubject; | |
| $HOD_SMS_CONTENT = $settings->customSettingsValue->hod->smsTemplate; | |
| $HOD_EMAIL_CONTENT = $settings->customSettingsValue->hod->emailContent; | |
| $HOD_EMAIL_SUBJECT = $settings->customSettingsValue->hod->emailSubject; | |
| $STAFF_SMS_CONTENT = $settings->customSettingsValue->staff->smsTemplate; | |
| $UNMARKED_HOUR_LIMIT = $settings->customSettingsValue->minNoOfUnmarkedHours; | |
| $UNMARKED_HOUR_SEND_DATE = $settings->customSettingsValue->date; | |
| $principalDetails = StaffService::getInstance()->getPrincipalDetails(); | |
| $notification = new Notification(); | |
| $notification->context = NotificationContextConstant::ATTENDANCE; | |
| $notification->feature = NotificationFeatureConstant::UNMARKED_HOUR_DETAILS; | |
| $notification->recipientType = UserType::STAFF; | |
| $notification->smsDeferred = 0; | |
| $notification->emailDeferred = 0; | |
| $notification->createdBy = 0; | |
| $notification->creatorType = UserType::STAFF; | |
| if (date("d") == $UNMARKED_HOUR_SEND_DATE && $UNMARKED_HOUR_LIMIT > 0) { | |
| foreach ($departments as $department) { | |
| $htmlHOD = ""; | |
| $departmentStaffCount = 0; | |
| $staffs = StaffService::getInstance()->getStaffByDepartment($department->id); | |
| $hodDetails = StaffService::getInstance()->getHodDetailsByDeptID($department->id); | |
| foreach ($staffs as $staff) { | |
| $unmarkedHoursResponse = AttendanceService::getInstance()->getUnmarkedHourAndDateDetails($staff->staffID, $startDate, $endDate); | |
| $hours = count($unmarkedHoursResponse->unmarkedHourandDate); | |
| if ($hours > $UNMARKED_HOUR_LIMIT) { | |
| $departmentStaffCount ++; | |
| $htmlHOD .= "<tr><td>" . $staff->staffName . "</td><td align='center'>" . $department->name . "</td><td align='center'>" . $hours . "</td></tr>"; | |
| $principalStaffCount ++; | |
| $smsForStaff = ""; | |
| $smsForStaff = str_replace("[[count-hrs]]", $hours, $STAFF_SMS_CONTENT); | |
| if (trim($smsForStaff) == "") { | |
| continue; | |
| } | |
| $recipient = null; | |
| $recipient = new NotificationRecipient(); | |
| $recipient->recipientId = $staff->staffID; | |
| $recipient->recipientType = UserType::STAFF; | |
| $recipient->templateParameters = [ | |
| 'smsContent' => $smsForStaff | |
| ]; | |
| $notification->recipient[] = $recipient; | |
| } | |
| } | |
| $htmlPrincipal .= $htmlHOD; | |
| $htmlHOD = $html . $htmlHOD . "</table>"; | |
| $smsForHod = ""; | |
| $smsForHod = str_replace([ | |
| "[[count-staff]]" | |
| ], [ | |
| $departmentStaffCount | |
| ], $HOD_SMS_CONTENT); | |
| $emailSubjectForHod = $HOD_EMAIL_SUBJECT; | |
| $emailContentForHod = str_replace([ | |
| "[[count-staff]]", | |
| "[[staff-details]]" | |
| ], [ | |
| $departmentStaffCount, | |
| $htmlHOD | |
| ], $HOD_EMAIL_CONTENT); | |
| if ($departmentStaffCount > 0) { | |
| $recipient = null; | |
| $recipient = new NotificationRecipient(); | |
| $recipient->recipientId = $hodDetails->staffID; | |
| $recipient->recipientType = UserType::STAFF; | |
| if (trim($smsForHod) == "" && trim($emailContentForHod) == "" && trim($emailSubjectForHod) == "") { | |
| continue; | |
| } | |
| $recipient->templateParameters = [ | |
| 'smsContent' => $smsForHod, | |
| 'emailContent' => $emailContentForHod, | |
| 'emailSubject' => $emailSubjectForHod | |
| ]; | |
| $notification->recipient[] = $recipient; | |
| } | |
| } | |
| $smsForPrincipal = ""; | |
| $smsForPrincipal = str_replace([ | |
| "[[count-staff]]" | |
| ], [ | |
| $principalStaffCount | |
| ], $PRINCIPAL_SMS_CONTENT); | |
| $emailSubjectForPrincipal = $PRINCIPAL_EMAIL_SUBJECT; | |
| $emailContentForPrincipal = str_replace([ | |
| "[[count-staff]]", | |
| "[[staff-details]]" | |
| ], [ | |
| $principalStaffCount, | |
| $html . $htmlPrincipal . "</table>" | |
| ], $PRINCIPAL_EMAIL_CONTENT); | |
| if ($principalStaffCount > 0) { | |
| $recipient = null; | |
| $recipient = new NotificationRecipient(); | |
| $recipient->recipientId = $principalDetails->staffID; | |
| $recipient->recipientType = UserType::STAFF; | |
| $recipient->templateParameters = [ | |
| 'smsContent' => $smsForPrincipal, | |
| 'emailContent' => $emailContentForPrincipal, | |
| 'emailSubject' => $emailSubjectForPrincipal | |
| ]; | |
| if (trim($smsForPrincipal) != "" || trim($emailContentForPrincipal) != "" || trim($emailSubjectForPrincipal) != "") { | |
| $notification->recipient[] = $recipient; | |
| } | |
| } | |
| } | |
| try { | |
| NotificationService::getInstance()->sendNotification($notification); | |
| } catch (\Exception $e) { | |
| // log exception | |
| $errorMsg = "Error Code : '" . $e->getCode() . "' . Error Message : " . $e->getMessage(); | |
| error_log($errorMsg); | |
| } | |
| } | |
| /** | |
| * Method for handling Notify parent on student attendance at specified time | |
| * | |
| * @return NULL | |
| */ | |
| public function notifyParentOnStudentAttendanceOnSpecifiedTime() | |
| { | |
| $sqlCount = null; | |
| $sql = null; | |
| $sqlStudentIds = null; | |
| $totalStudents = 0; | |
| $customSettingsValue = null; | |
| $currentDate = null; | |
| $chunkSize = 50; | |
| $includeOnlyAbsentHourSqlCriteria = ""; | |
| $studentIdsObjList = []; | |
| $studentIds = []; | |
| $smsMsgTemplate = null; | |
| $smsMsgTags = []; | |
| $attendanceDate = null; | |
| $studentsList = []; | |
| $startIndex = 0; | |
| // Send Notifications student attendance at specified time | |
| $globalSettingsRequest = new GetGlobalSettingsRequest(); | |
| $globalSettingsRequest->context = NotificationContextConstant::ATTENDANCE; | |
| $globalSettingsRequest->feature = NotificationFeatureConstant::NOTIFY_PARENTS_ON_STUDENT_ATTENDANCE_SPECIFIED_TIME; | |
| $settings = NotificationSettingsService::getInstance()->getSingleGlobalSettings($globalSettingsRequest); | |
| $notificationType = NotificationUtilityService::getInstance()->getNotificationType(NotificationContextConstant::ATTENDANCE, NotificationFeatureConstant::NOTIFY_PARENTS_ON_STUDENT_ATTENDANCE_SPECIFIED_TIME); | |
| $attendanceNotify = json_decode( CommonService::getInstance()->getSettings(SettingsConstants::SMS_ATTENDANCE_NOTIFICATION,SettingsConstants::SMS_ATTENDANCE_NOTIFICATION)); | |
| $sendToParent = $attendanceNotify->parent; | |
| $sendToStudent = $attendanceNotify->student; | |
| // Currenlty SMS only handled. | |
| // TODO Email | |
| if (empty($settings) || ! $settings->smsEnabled || empty($notificationType->customTemplate)) { | |
| error_log('Settings not found'); | |
| return null; | |
| } | |
| $customSettingsValue = $settings->customSettingsValue; | |
| if (empty($notificationType->customTemplate)) { | |
| // log exception | |
| $errorMsg = "SMS Message content is empty or null in notifyParentOnStudentAttendanceOnSpecifiedTime "; | |
| error_log($errorMsg); | |
| return; | |
| } | |
| // TODO Excluding batches. | |
| $currentDate = date('Y-m-d'); | |
| $attendanceDate = $customSettingsValue->previousDayAttendance ? CommonUtil::getPreviousDate($currentDate) : $currentDate; | |
| // $attendanceDate = "2019-07-30"; | |
| try { | |
| $sqlCount = "SELECT DISTINCT count(distinct stu.studentID) as totalStudents FROM attendance att INNER JOIN studentaccount stu ON att.studentID = stu.studentID AND att.attendanceDate = '$attendanceDate' WHERE 1=1 "; | |
| if ($customSettingsValue->includeOnlyAbsentHours) { | |
| $includeOnlyAbsentHourSqlCriteria = " AND att.isAbsent = 1"; | |
| } | |
| $sqlCount .= $includeOnlyAbsentHourSqlCriteria; | |
| $totalStudents = $this->executeQueryForObject($sqlCount)->totalStudents; | |
| if ($totalStudents > 0) { | |
| $noOfLoops = ceil($totalStudents / $chunkSize); | |
| for ($i = 0; $i < $noOfLoops; $i ++) { | |
| $studentsList = []; | |
| $sqlStudentIds = "SELECT DISTINCT stu.studentID as studentId FROM attendance att INNER JOIN studentaccount stu ON att.studentID = stu.studentID AND att.attendanceDate ='$attendanceDate' WHERE 1=1 $includeOnlyAbsentHourSqlCriteria LIMIT $startIndex,$chunkSize"; | |
| $studentIdsObjList = $this->executeQueryForList($sqlStudentIds); | |
| $studentIdsObjListMap = []; | |
| $studentIdsObjListMap = array_map(function($stuObj) { return $stuObj->studentId; }, | |
| $studentIdsObjList); | |
| $studentIds = implode(',', $studentIdsObjListMap); | |
| $sql = "SELECT DISTINCT stu.studentId,stu.studentName,stu.parentPhone,stu.studentPhone,att.id as attendanceId,att.attendanceDate,att.hour,att.isAbsent,bt.stratTime as hourStartTime,bt.endTime as hourEndTime FROM attendance att INNER JOIN studentaccount stu ON att.studentID = stu.studentID AND att.attendanceDate = '$attendanceDate' left join batch_timetable bt on bt.batchId = stu.batchID | |
| and bt.timetableDate = att.attendanceDate and bt.hourID=att.hour where stu.studentId in ($studentIds) order by stu.studentID,att.hour; "; | |
| $studentsList = $this->executeQueryForList($sql, $this->mapper[SchedulerNotificationMapper::GET_STUDENT_SMS_ATTENDANCE_DETAILS]); | |
| // Removing invalid parent phone students | |
| $studentsList = $this->filterOutInvalidParentPhoneNumber($studentsList); | |
| // Starting send sms to student parent | |
| foreach ($studentsList as $student) { | |
| // if (empty($alreadySMSSendStudents[$student->studentId])) { | |
| $smsNotificationTemplateDetails = NotificationService::getInstance()->checkTemplateForSmsNotification(NotificationFeatureConstant::NOTIFY_PARENTS_ON_STUDENT_ATTENDANCE_SPECIFIED_TIME,NotificationContextConstant::ATTENDANCE); | |
| $templateProperties = json_decode($smsNotificationTemplateDetails->properties); | |
| $templateProperties->templateId = $templateProperties->templateId != NULL? $templateProperties->templateId: NULL; | |
| $smsMsgTemplate = $templateProperties->content?$templateProperties->content:$notificationType->customTemplate; | |
| $smsMsgTags = $this->getStudentAttendanceSMSSendOnSpecifiedTimeMsgParamValues($student, $attendanceDate); | |
| $smsMsg = StringUtil::replace_tags($smsMsgTemplate, $smsMsgTags); | |
| if($templateProperties->footerContent != NULL){ | |
| $smsMsg .= " ".$templateProperties->footerContent; | |
| } | |
| $sms = new SMS(); | |
| $sms->context = SMSContext::SCHEDULER_NOTIFY_PARENT_STUDENT_ATTENDANCE_ON_SPECIFIED_TIME; | |
| $sms->message = $smsMsg; | |
| if($sendToParent) | |
| { | |
| $sms->mobileNos[] = $student->parentPhone; | |
| } | |
| if($sendToStudent) | |
| { | |
| $sms->mobileNos[] = $student->studentPhone; | |
| } | |
| $sms->module = "ACADEMICS"; | |
| $sms->route = SMS::ROUTE_TRANSACTIONAL; | |
| $sms->createdBy = 0; | |
| $sms->createdByUserType = \com\linways\base\constant\UserType::SYSTEM; | |
| try { | |
| SMSService::getInstance()->sendSMS($sms,$templateProperties->templateId); | |
| error_log($smsMsg); | |
| } catch (\Exception $e) { | |
| // log exception | |
| $errorMsg = "SMS Send failed for studentId:$student->studentId. Error Code : '" . $e->getCode() . "' . Error Message : " . $e->getMessage(); | |
| error_log($errorMsg); | |
| } | |
| // } | |
| } | |
| $startIndex += $chunkSize; | |
| } | |
| } else { | |
| // log exception | |
| $errorMsg = "There are no students found for notifyParentOnStudentAttendanceOnSpecifiedTime on $attendanceDate "; | |
| error_log($errorMsg); | |
| } | |
| } catch (\Exception $e) { | |
| // log exception | |
| $errorMsg = "Error Code : '" . $e->getCode() . "' . Error Message : " . $e->getMessage(); | |
| error_log($errorMsg); | |
| } | |
| } | |
| /** | |
| * GetStudentAttendacnedetails to parent on specified time sms tag replacement values | |
| * @param \stdClass $student | |
| * @param string $attendanceDate | |
| * @return array of tags and value | |
| */ | |
| private function getStudentAttendanceSMSSendOnSpecifiedTimeMsgParamValues($student, $attendanceDate) | |
| { | |
| $smsMsgTags = []; | |
| $absentHourDeatils = null; | |
| $absentHourTimeDetails = null; | |
| $presentHourDetails = null; | |
| $presentHourTimeDetails = null; | |
| if (! empty($student)) { | |
| if (! empty($student->attendance)) { | |
| foreach ($student->attendance as $attendance) { | |
| // Setting absentHourDeatils | |
| if ($attendance->isAbsent == 1) { | |
| if (empty($absentHourDeatils)) { | |
| $absentHourDeatils = $attendance->hour; | |
| } else { | |
| $absentHourDeatils .= "," . $attendance->hour; | |
| } | |
| // Setting absentHourTimeDetails | |
| if (empty($absentHourTimeDetails)) { | |
| $absentHourTimeDetails = $attendance->hourStartTime . " to " . $attendance->hourEndTime; | |
| } else { | |
| $absentHourTimeDetails .= "," . $attendance->hourStartTime . " to " . $attendance->hourEndTime; | |
| } | |
| } | |
| // Setting presentHourDetails | |
| if ($attendance->isAbsent == 0) { | |
| if (empty($presentHourDetails)) { | |
| $presentHourDetails = $attendance->hour; | |
| } else { | |
| $presentHourDetails .= "," . $attendance->hour; | |
| } | |
| // Setting presentHourTimeDetails | |
| if (empty($presentHourTimeDetails)) { | |
| $presentHourTimeDetails = $attendance->hourStartTime . " to " . $attendance->hourEndTime; | |
| } else { | |
| $presentHourTimeDetails .= "," . $attendance->hourStartTime . " to " . $attendance->hourEndTime; | |
| } | |
| } | |
| } | |
| } | |
| $dateAndHours = date("d-m-Y", strtotime($attendanceDate))." for hours".$absentHourDeatils; | |
| $smsMsgTags = array( | |
| "StudentName" => $student->studentName, | |
| "AttendanceDate" => date("d-m-Y", strtotime($attendanceDate)), | |
| "AbsentHourDeatils" => $absentHourDeatils, | |
| "AbsentHourTimeDetails" => $absentHourTimeDetails, | |
| "PresentHourDetails" => $presentHourDetails, | |
| "PresentHourTimeDetails" => $presentHourTimeDetails, | |
| "absentDetailsWithHours"=>$dateAndHours | |
| ); | |
| } | |
| return $smsMsgTags; | |
| } | |
| /** | |
| * Filter out invalid phone number students | |
| * | |
| * @param array $studentAndParentPhoneNumberList | |
| * @return array | |
| */ | |
| private function filterOutInvalidParentPhoneNumber($studentList) | |
| { | |
| if (! $studentList) | |
| return []; | |
| $response = []; | |
| foreach ($studentList as $student) { | |
| if (preg_match("/^91[0-9]{10}$/", $student->parentPhone)) { | |
| $response[] = $student; | |
| } else { | |
| if (preg_match("/^[0-9]{10}$/", $student->parentPhone)) { | |
| $student->parentPhone = "91" . $student->parentPhone; | |
| $response[] = $student; | |
| } | |
| } | |
| } | |
| return $response; | |
| } | |
| /** | |
| * | |
| * @param GetStudentAttendanceDetailsForNotification $getStudentAttendanceDetailsForNotification | |
| * @return array | |
| */ | |
| public function getStudentAttendanceDetailsForNotification(GetStudentAttendanceDetailsForNotification $getStudentAttendanceDetailsForNotification) | |
| { | |
| $studentList = []; | |
| $sql = null; | |
| $getStudentAttendanceDetailsForNotification = $this->realEscapeObject($getStudentAttendanceDetailsForNotification); | |
| $currentDate = date('Y-m-d'); | |
| $attendanceDate = $getStudentAttendanceDetailsForNotification->previousDayAttendance ? CommonUtil::getPreviousDate($currentDate) : $currentDate; | |
| // | |
| try { | |
| $sql = "SELECT DISTINCT stu.parentPhone as parentPhoneNo, stu.studentID as studentId FROM studentaccount stu INNER JOIN attendance att ON att.studentID = stu.studentID where att.attendanceDate = '$attendanceDate' "; | |
| $studentList = $this->executeQueryForList($sql); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| return $studentList; | |
| } | |
| public function sendEmailNotificationToFaculteesAbsenteesStudentList(){ | |
| $notificationDetails = NotificationUtilityService::getInstance()->getNotificationGlobalSettings("ATTENDANCE","EMAIL_NOTIFICATION_TO_FACULTYS_OF_ABSENTEES_STUDENT_REPORT"); | |
| if($notificationDetails->feature_enabled != '1'){ | |
| return; | |
| } | |
| $request = new GetAllBatchesRequest(); | |
| $request->excludeCourseCompleted = 1; | |
| $batchList = BatchService::getInstance()->getAllBatchesByRequest($request); | |
| GLOBAL $COLLEGE_NAME, $COLLEGE_NAME_NEW, $COLLEGE_CODE; | |
| $imgPath = realpath(DOCUMENT_ROOT . "/libcommon/images/college/".$COLLEGE_CODE."/logo.png"); | |
| $htmlContent = " | |
| <html> | |
| <head> | |
| <style> | |
| #report { | |
| border-collapse: collapse; | |
| width: 100%; | |
| font-size: 15px; | |
| } | |
| #report td, #report th { | |
| border: 1px solid #ddd; | |
| padding: 8px; | |
| } | |
| #report tr:nth-child(even){background-color: #f2f2f2;} | |
| #report tr:hover {background-color: #ddd;} | |
| #report th { | |
| padding-top: 12px; | |
| padding-bottom: 12px; | |
| text-align: left; | |
| background-color: grey; | |
| color: white; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class='container'> | |
| <div class='text-center'> | |
| <h3>".($COLLEGE_NAME_NEW?$COLLEGE_NAME_NEW:$COLLEGE_NAME)."</h3> | |
| </div> | |
| Dear Sir/Madam,<br> | |
| The attendance report for <u><b>".date("d-m-Y")."</b></u> as updated by your staff through Linways interface is detailed below:<br><br> | |
| "; | |
| foreach($batchList as $batch){ | |
| $req = new stdClass(); | |
| $req->batchId = $batch->id;//116 | |
| $req->semId = $batch->semID;//3 | |
| $reportDetails = AttendanceService::getInstance()->generateSubjectWiseAbsenteesAttendanceDetails($req); | |
| if(!$reportDetails){ | |
| continue; | |
| } | |
| $htmlContent .=" | |
| <table id='report'> | |
| <thead > | |
| <tr> | |
| <th colspan='8'><u><b>Batch</b> - ".$batch->name." <b>Sem - </b>".$batch->semName."</u></th> | |
| </tr> | |
| <tr> | |
| <th>#</th> | |
| <th>Subject Name - Staff</th> | |
| <th>Period</th> | |
| <th>Total</th> | |
| <th>Present</th> | |
| <th>Absent</th> | |
| <th>%</th> | |
| <th>Absentees (RollNo -Student Name)</th> | |
| </tr> | |
| </thead> | |
| <tbody>"; | |
| $index = 0; | |
| $absenteesList = []; | |
| $allSubjectAbsentees = []; | |
| $allSubjectAbsent = true; | |
| $subjectId = 0; | |
| foreach($reportDetails as $report){ | |
| $index ++; | |
| if($allSubjectAbsent){ | |
| $absenteesList = $report->absentees?explode(',',$report->absentees):[]; | |
| if(empty($allSubjectAbsentees) && !empty($absenteesList)){ | |
| $allSubjectAbsentees = $absenteesList; | |
| } | |
| if($absenteesList){ | |
| $length = count($allSubjectAbsentees); | |
| foreach($absenteesList as $student){ | |
| $allSubjectAbsentees[$length] = $student; | |
| $length++; | |
| } | |
| $allSubjectAbsentees = array_unique($allSubjectAbsentees); | |
| } | |
| } | |
| if($subjectId !=0 && $subjectId != $report->subjectID){ | |
| $allSubjectAbsent = false; | |
| } | |
| $subjectId = $report->subjectID; | |
| $htmlContent .= " | |
| <tr> | |
| <td>$index</td> | |
| <td>$report->subjectDesc <br>$report->staffName </td> | |
| <td>$report->hour</td> | |
| <td>$report->total_hours</td> | |
| <td>$report->attended_hourIds</td> | |
| <td>$report->isAbsent</td> | |
| <td>$report->hour_percentage</td> | |
| <td>$report->absentees</td> | |
| </tr> | |
| "; | |
| } | |
| if(!$allSubjectAbsent){ | |
| $allSubjectAbsentees = []; | |
| } | |
| $allSubjectAbsentees = empty($allSubjectAbsentees)?'':$$allSubjectAbsentees = implode(',',$allSubjectAbsentees); | |
| $htmlContent .=" | |
| <tr> | |
| <td colspan='7'>All Subject Absentees</td> | |
| <td colspan='1'>$allSubjectAbsentees</td> | |
| </tr> | |
| </tbody> | |
| </table><br> | |
| "; | |
| } | |
| $htmlContent .= " | |
| </div> | |
| </body> | |
| </html> | |
| "; | |
| $pdf = new Pdf(array( | |
| 'no-outline', // Make Chrome not complain | |
| 'margin-top' => 10, | |
| 'margin-right' => 10, | |
| 'margin-bottom' => 10, | |
| 'margin-left' => 10, | |
| 'user-style-sheet' => realpath(DOCUMENT_ROOT . "/libcommon/bootstrap/css/bootstrap.min.css") | |
| )); | |
| // Add a HTML file, a HTML string or a page from a URL | |
| //$pdf->addPage('/home/joe/page.html'); | |
| $pdf->addPage($htmlContent); | |
| // Save the PDF | |
| $tempDir = sys_get_temp_dir(); | |
| $file = $pdf->saveAs($tempDir.'/AbsenteesReport.pdf'); | |
| // if(!$file){ | |
| // $eror = $pdf->_error; | |
| // } | |
| $fileExist = file_exists($tempDir.'/AbsenteesReport.pdf'); | |
| if(!$fileExist){ | |
| return; | |
| } | |
| $notificationDetails->custom_settings_value = json_decode($notificationDetails->custom_settings_value,true); | |
| $emailIds = explode(",",$notificationDetails->custom_settings_value['emailIds']); | |
| global $college_MailFromID; | |
| $emailBody = "Dear Sir/Madam,<br> | |
| The Attendance pdf report for <b> ".date("d-m-Y")."</b> as updated by your staff through Linways Interface is attached below:<br><br> | |
| Kind Regards,<br> | |
| Linways Technologies Pvt Ltd"; | |
| $emailSubject = 'Absentees Attendance Notification | Linways'; | |
| foreach($emailIds as $emailId){ | |
| $emailObj = new Email(); | |
| $emailFrom = new EmailFrom(); | |
| $emailFrom->email = "Linways Mail"; | |
| $emailFrom->name = $college_MailFromID; | |
| $emailTo = new EmailTo(); | |
| $emailTo->email = $emailId; | |
| $emailTo->name = ''; | |
| $emailObj->subject = $emailSubject; | |
| $emailObj->body = $emailBody; | |
| $emailObj->from = $emailFrom; | |
| $emailObj->to = $emailTo; | |
| $emailObj->mailerType = Email::SMTP; | |
| $attachments = []; | |
| $fileAttach = new stdClass(); | |
| $fileAttach->path = "/tmp/AbsenteesReport.pdf"; | |
| $fileAttach->fileName = "AbsenteesReport.pdf"; | |
| $fileAttach->encoding = "base64"; | |
| $fileAttach->type = "application/octet-stream"; | |
| $attachments['file'] = $fileAttach; | |
| $emailObj->attachments = $attachments; | |
| EmailService::getInstance()->sendEmail($emailObj); | |
| } | |
| } | |
| public function v4IntimationRequest($request){ | |
| try{ | |
| V4IntimationService::getInstance()->setSchedulerForIntimation($request); | |
| }catch (\Exception $e) { | |
| // log exception | |
| $errorMsg = "Error Code : '" . $e->getCode() . "' . Error Message : " . $e->getMessage(); | |
| error_log($errorMsg); | |
| } | |
| } | |
| } |