Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 14
CRAP
0.00% covered (danger)
0.00%
0 / 309
AttendanceLockService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 14
2256.00
0.00% covered (danger)
0.00%
0 / 309
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 __clone
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 getInstance
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 7
 createAttendanceLock
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 17
 getAttendanceLocks
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 49
 getAttendanceLockById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 52
 activateLockByID
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
 disableLockByID
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
 deleteLockByID
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
 disableActiveLocks
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 updateAttendanceLockByRequest
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 29
 checkAttendanceLockByTimetableRequest
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 40
 getAttendanceDayLockByBatchId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getLockDetailsForNonTimetable
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 50
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\core\ams\professional\exception\ProfessionalException;
use Exception;
/**
 *
 * @Date 07/01/21
 * @author  Joel M John
 */
class AttendanceLockService extends BaseService
{
    /**
     * Presence of a static member variable
     *
     * @var null
     */
    private static $_instance = null;
    /**
     * Mapper variable
     * @var array
     */
    private $mapper = [];
    /**
     * Initialise mapper, logger, hooks here
     *
     * 
     */
    private function __construct()
    {
        
    }
    /**
     * Prevent any object or instance of that class to be cloned
     */
    private function __clone()
    {
    }
    /**
     * Have a single globally accessible static method
     *
     * @return AttendanceLockService|null
     */
    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;
    }
    /**
     * method to create an Attendance Lock
     * @param  Object $request
     * @return Boolean
     * @throws ProfessionalException
     */
    public function createAttendanceLock($request)
    {
        // $request->courseTypeId // $request->semID       * requests at a glance
        // $request->batchID // $request->hour  //$request->deptID 
        // $request->sbsID // $request->subjectID
        // $request->fromDate // $request->toDate 
        // $request->startTime // $request->endTime // $request->userID 
        if(!$request->courseTypeId || !$request->fromDate || !$request->toDate){
            throw new Exception("Fields cannot be empty!");
        }
        try {
            
            $sql = "INSERT INTO `lock_attendance` (`course_type_id`, `deptID`,`semID`,`batchID`, `hour`, `sbsID`, 
            `subjectID`, `from_date`, `to_date`, `start_time`, `end_time`, `created_by`)
            VALUES ('$request->courseTypeId','$request->deptID', '$request->semID', '$request->batchID', '$request->hour', '$request->sbsID', 
            '$request->subjectID', '$request->fromDate', '$request->toDate ', '$request->startTime', '$request->endTime', '$request->userID')";
            if($this->executeQueryForObject($sql,true)) {
                return true;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * method to get all Attendance Locks
     * @return Result
     * @throws ProfessionalException
     */
    public function getAttendanceLocks()
    {
        try {
            
            $sql = "SELECT 
            la.id,
            la.deptID,
            la.semID,
            la.batchID,
            la.sbsID,
            la.subjectID,
            ct.typeName as CourseTypeName,
            dept.deptName,
            sem.semName,
            btch.batchName,
            la.hour,
            sa.staffName,
            sub.subjectName,
            la.from_date,
            la.to_date,
            la.start_time,
            la.end_time,
            la.lock_status,
            aa.adminName,
            la.created_at
        FROM
            course_type ct
                INNER JOIN
            lock_attendance la ON ct.courseTypeID = la.course_type_id
                LEFT JOIN
            adminaccount aa ON aa.adminID = la.created_by
                LEFT JOIN
            semesters sem ON la.semID = sem.semID
                LEFT JOIN
            department dept ON la.deptID = dept.deptID
                LEFT JOIN 
            batches btch ON btch.batchID = la.batchID
                LEFT JOIN
            subjects sub ON sub.subjectID = la.subjectID
                LEFT JOIN
            sbs_relation sbs ON sbs.sbsID = la.sbsID
                LEFT JOIN
            staffaccounts sa ON sbs.staffID = sa.staffID
        ORDER BY la.created_at DESC";
            
            $result = $this->executeQueryForList($sql);
            return $result;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * method to get Attendance Lock by ID
     * @param  lockID  
     * @return Result
     * @throws ProfessionalException
     */
    public function getAttendanceLockById($lockID)
    {
        try {
            
            $sql = "SELECT 
            la.id,
            la.course_type_id as courseTypeID,
            la.deptID,
            la.semID,
            la.batchID,
            la.sbsID,
            la.subjectID,
            ct.typeName as CourseTypeName,
            dept.deptName,
            sem.semName,
            btch.batchName,
            la.hour,
            sa.staffName,
            sub.subjectName,
            la.from_date,
            la.to_date,
            la.start_time,
            la.end_time,
            la.lock_status,
            aa.adminName,
            la.created_at
        FROM
            course_type ct
                INNER JOIN
            lock_attendance la ON ct.courseTypeID = la.course_type_id
                LEFT JOIN
            adminaccount aa ON aa.adminID = la.created_by
                LEFT JOIN
            semesters sem ON la.semID = sem.semID
                LEFT JOIN
            department dept ON la.deptID = dept.deptID
                LEFT JOIN 
            batches btch ON btch.batchID = la.batchID
                LEFT JOIN
            subjects sub ON sub.subjectID = la.subjectID
                LEFT JOIN
            sbs_relation sbs ON sbs.sbsID = la.sbsID
                LEFT JOIN
            staffaccounts sa ON sbs.staffID = sa.staffID
        WHERE 
            la.id = '$lockID'
        ORDER BY la.created_at DESC";
            
            $result = $this->executeQueryForList($sql);
            return $result;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * method to activate lock by Id
     * @param  id
     * @return Boolean
     * @throws ProfessionalException
     */
    public function activateLockByID($id)
    {
        try {
            
            $sql = "UPDATE `lock_attendance` SET `lock_status`='1' 
                    WHERE `id`='$id'";
            if($this->executeQuery($sql)) {
                return true;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * method to disable lock by Id
     * @param  id
     * @return Boolean
     * @throws ProfessionalException
     */
    public function disableLockByID($id)
    {
        try {
            
            $sql = "UPDATE `lock_attendance` SET `lock_status`='0' 
                    WHERE `id`='$id'";
            if($this->executeQuery($sql,true)) {
                return true;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * method to delete lock by Id
     * @param  id
     * @return Boolean
     * @throws ProfessionalException
     */
    public function deleteLockByID($id)
    {
        try {
            
            $sql = "DELETE FROM `lock_attendance` 
                    WHERE `id`='$id'";
            if($this->executeQuery($sql,true)) {
                return true;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * method to disable all active locks
     * @return Boolean
     * @throws ProfessionalException
     */
    public function disableActiveLocks()
    {
        try {
            
            $sql = "UPDATE lock_attendance 
                SET 
                    lock_status = 0
                WHERE
                    lock_status = 1";
            if($this->executeQuery($sql,true)) {
                return true;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * method to update Atteandance Lock by request
     * @param  request
     * @return Boolean
     * @throws ProfessionalException
     */
    public function updateAttendanceLockByRequest($request)
    {
        // $request->courseTypeId // $request->semID       * requests at a glance
        // $request->batchID // $request->hour  //$request->deptID 
        // $request->sbsID // $request->subjectID
        // $request->fromDate // $request->toDate 
        // $request->startTime // $request->endTime // $request->userID // $request->lockID
        if(!$request->courseTypeId || !$request->fromDate || !$request->toDate){
            throw new Exception("Fields cannot be empty!");
        }
        
        try {
            
            $sql = "UPDATE lock_attendance 
                SET 
                    `course_type_id` = '$request->courseTypeId',
                    `deptID` = '$request->deptID',
                    `semID` = '$request->semID',
                    `batchID` = '$request->batchID',
                    `hour` = '$request->hour',
                    `sbsID` = '$request->sbsID',
                    `subjectID` = '$request->subjectID',
                    `from_date` = '$request->fromDate',
                    `to_date` = '$request->toDate',
                    `start_time` = '$request->startTime',
                    `end_time` = '$request->endTime',
                    `created_by` = '$request->userID'
                WHERE
                    `id` = '$request->lockID'";
            if($this->executeQuery($sql,true)) {
                return true;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * method to check attendanceLockByTimetable
     * @param  timetable request
     * @return Boolean
     * @throws ProfessionalException
     */
    public function checkAttendanceLockByTimetableRequest($timetable)
    {
        if(!$timetable->courseTypeID || !$timetable->timetableDate){
            throw new Exception("Fields cannot be empty!");
        }
        $cond = '';
        if($timetable->batchID){
            $cond .= " AND batchID IN ('0',$timetable->batchID";
        }
        if($timetable->semID){
            $cond .= "AND semID IN ('0',$timetable->semID";
        }
        if($timetable->subjectID){
            $cond .= "AND subjectID IN ('0',$timetable->subjectID)  ";
        }
        if($timetable->sbsID){
            $cond .= "AND sbsID IN ('0',$timetable->sbsID";
        }
        
        if($timetable->hourID){
            $cond .= "AND hour IN ('0',$timetable->hourID";
        }
        if($timetable->deptID){
            $cond .= "AND deptID IN ('0',$timetable->deptID";
        }
        try {
            
            $sql = "SELECT 
                        lock_status
                    FROM
                        lock_attendance
                    WHERE
                        course_type_id = $timetable->courseTypeID AND lock_status = 1 
                            AND '$timetable->timetableDate' BETWEEN from_date AND to_date ".$cond;
            $result = $this->executeQueryForObject($sql);
             if($result->lock_status == 1) {
                return true;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * get attendance lock for lazy restriction
     *
     * attendance lock for restricting staff putting of older dates
     *
     * @param Int $batchID 
     * @return Object
     * @throws ProfessionalException
     * @author Ajay C
     **/
    public function getAttendanceDayLockByBatchId($batchID)
    {
        $batchID = $this->realEscapeString($batchID);
        $sql = "SELECT batchID ,markingPeriodType,attendancelimit,lockingType  from attendance_limit al WHERE batchID IN  ($batchID)";
        try {
            $result = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
    /**
     * get locakmanager details
     *
     * get lock details for non timetable method
     *
     * @param Integer $batchID,$date,$hour
     * @return Object
     * @throws ProfessionalException
     **/
    public function getLockDetailsForNonTimetable($batchID,$date,$hour = null)
    {
        $condition = " AND hour IN ('0','$hour')";
        $sql = "SELECT 
                        la.id,
                        la.deptID,
                        la.semID,
                        la.batchID,
                        la.sbsID,
                        la.subjectID,
                        ct.typeName as CourseTypeName,
                        dept.deptName,
                        sem.semName,
                        btch.batchName,
                        la.hour,
                        sa.staffName,
                        sub.subjectName,
                        la.from_date,
                        la.to_date,
                        la.start_time,
                        la.end_time,
                        la.lock_status,
                        aa.adminName,
                        la.created_at
                    FROM
                        course_type ct
                            INNER JOIN
                        lock_attendance la ON ct.courseTypeID = la.course_type_id
                            LEFT JOIN
                        adminaccount aa ON aa.adminID = la.created_by
                            LEFT JOIN
                        semesters sem ON la.semID = sem.semID
                            LEFT JOIN
                        department dept ON la.deptID = dept.deptID
                            LEFT JOIN 
                        batches btch ON btch.batchID = la.batchID
                            LEFT JOIN
                        subjects sub ON sub.subjectID = la.subjectID
                            LEFT JOIN
                        sbs_relation sbs ON sbs.sbsID = la.sbsID
                            LEFT JOIN
                        staffaccounts sa ON sbs.staffID = sa.staffID
                        WHERE la.batchID in ('0','$batchID') and la.course_type_id  in (SELECT courseTypeID from batches WHERE batchID = '$batchID') or la.course_type_id  in (0)
                                and '$date' BETWEEN la.from_date and la.to_date $condition and la.lock_status = 1
                    ORDER BY la.created_at DESC";
                    
        try {
                return $this->executeQueryForObject($sql);
        }  catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
}