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 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 212
AttendanceReportService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 6
156.00
0.00% covered (danger)
0.00%
0 / 212
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 __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
 getDayWiseAttendanceReport
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 95
 StudentLeaveBetweenTwoDates
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 15
 getConsolidatedHourWiseAttendanceReport
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 90
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\core\ams\professional\request\AttendanceDaywiseReportRequest;
use com\linways\core\ams\professional\exception\ProfessionalException;
use  com\linways\core\ams\professional\service\BatchService;
use  com\linways\core\ams\professional\service\SemesterService;
use com\linways\core\ams\professional\mapper\AttendanceReportServiceMapper;
class AttendanceReportService extends BaseService
{
    // /Condition 1 - Presence of a static member variable
    private static $_instance = null;
    private $mapper = [];
    // /Condition 2 - Locked down the constructor
    private function __construct()
    {
        $this->mapper = AttendanceReportServiceMapper::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;
    }    
    /**
     * Get day-wise attendance report of batch
     * @param AttendanceDaywiseReportRequest | $request
     * @throws ProfessionalException
     * @return studentDetails
     */
    public function getDayWiseAttendanceReport(AttendanceDaywiseReportRequest $request){
        $request = $this->realEscapeObject($request);
        $isCurrentSem = SemesterService::getInstance ()->isCurrentSemester ( $request->batchID, $request->semID );
        if($isCurrentSem){
            $sql = "SELECT 
                        sa.studentID,
                        sa.studentName,
                        UPPER(sa.studentGender) as gender ,
                        sa.rollNo,
                        sa.regNo,
                        studentJoindate as studentJoinDate,
                        studentAccount,
                        a.isAbsent,
                        st.staffName,
                        a.isBlocked,
                        a.hour
                    FROM
                        studentaccount sa
                            INNER JOIN
                        batches ba ON ba.batchID = sa.batchID
                            INNER JOIN
                        semesters sem ON sem.semID = ba.semID
                            INNER JOIN
                        semesters joinedSem ON sa.joiningSemId = joinedSem.semID
                            LEFT JOIN
                        attendance a ON sa.studentID = a.studentID AND a.attendanceDate = '$request->attendanceDate'
                            LEFT JOIN
                        staffaccounts st ON a.staffID = st.staffID
                    WHERE
                        sa.batchID = $request->batchID
                            AND joinedSem.orderNo <= sem.orderNo
                        
                    ORDER BY sa.".$request->sortByColumn.", a.hour";
        }else{
            $semDetails = SemesterService::getInstance()->getSemDetailsBySemId($request->semID);
            $sql = "SELECT 
                        sa.studentID,
                        sa.studentName,
                        UPPER(sa.studentGender) as gender ,
                        sa.rollNo,
                        sa.studentJoindate,
                        sa.studentAccount,
                        sa.regNo,
                        a.isAbsent,
                        st.staffName,
                        a.isBlocked,
                        a.hour
                    FROM
                        studentaccount sa
                            INNER JOIN
                        batches ba ON sa.batchID = ba.batchID
                            INNER JOIN
                        semesters joinedSem ON sa.joiningSemId = joinedSem.semID
                            LEFT JOIN
                        attendance a ON sa.studentID = a.studentID AND a.attendanceDate = '$request->attendanceDate'
                            LEFT JOIN
                        staffaccounts st ON a.staffID = st.staffID
                    WHERE
                        ba.batchID = $request->batchID
                            AND joinedSem.orderNo <= $semDetails->orderNo
                            
                    UNION SELECT 
                        sa.studentID,
                        sa.studentName,
                        UPPER(sa.studentGender) as gender ,
                        sa.rollNo,
                        sa.studentJoindate,
                        sa.studentAccount,
                        sa.regNo,
                        a.isAbsent,
                        st.staffName,
                        a.isBlocked,
                        a.hour
                    FROM
                        failed_students fs
                            LEFT JOIN
                        studentaccount sa ON fs.studentID = sa.studentID
                            INNER JOIN
                        semesters fsem ON fsem.semID = fs.failedInSemester
                            INNER JOIN
                        semesters joinedSem ON sa.joiningSemId = joinedSem.semID
                            LEFT JOIN
                        attendance a ON sa.studentID = a.studentID AND a.attendanceDate = '$request->attendanceDate'
                            LEFT JOIN
                        staffaccounts st ON a.staffID = st.staffID
                    WHERE
                        previousBatch = $request->batchID AND fsem.orderNo > $semDetails->orderNo
                            AND joinedSem.orderNo <= $semDetails->orderNo
                    ORDER BY $request->sortByColumn,hour";
        }
        try{
            
            $studentDetails = $this->executeQueryForList($sql,$this->mapper[AttendanceReportServiceMapper::GET_BATCH_ATTENDANCE_DETAILS]);
            return $studentDetails;
        }
        catch(\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * Get student leave report between 2 dates
     * @param $semId,$studentId,$fromDate,$toDate
     * @throws ProfessionalException
     * @return leaveDetails
     */
    public function StudentLeaveBetweenTwoDates($semId,$studentId,$fromDate,$toDate){
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        $fromDate = $this->realEscapeString($fromDate);
        $toDate = $this->realEscapeString($toDate);
        $sql = "SELECT DISTINCT studentID,(select count(semID) from attendance where semID= $semId and studentID=$studentId and attendanceDate BETWEEN '$fromDate' AND '$toDate')as totalHours,(SELECT COUNT(isAbsent) FROM attendance WHERE semID =  $semId AND studentID = $studentId AND isAbsent = 1 AND attendanceDate BETWEEN '$fromDate' AND '$toDate') AS absent,(SELECT COUNT(isAbsent) FROM attendance
        WHERE semID =  $semId AND studentID = $studentId AND isAbsent = 0 AND attendanceDate BETWEEN '$fromDate' AND '$toDate') AS present,(SELECT COUNT(isAbsent) FROM attendance WHERE semID =  $semId AND studentID = $studentId
        AND isAbsent = 2 AND attendanceDate BETWEEN '$fromDate' AND '$toDate') AS dutyleave,(SELECT COUNT(asla.id) FROM student_leave_application asla INNER JOIN student_leave_type aslt ON asla.leave_type_id = aslt.id AND aslt.isActive = 1 WHERE asla.student_id = $studentId AND aslt.code = 'DL' AND asla.start_date >= '$fromDate' AND CASE WHEN (asla.end_date = '0000-00-00' || asla.end_date IS NULL) THEN (asla.end_date = '0000-00-00' || asla.end_date IS NULL) ELSE asla.end_date <= '$toDate' END) AS appliedDutyleave FROM attendance WHERE studentID = $studentId AND attendanceDate BETWEEN '$fromDate' AND '$toDate'";
              
        try{
            
            $leaveDetails = $this->executeQueryForObject($sql);
            return $leaveDetails;
        }
        catch(\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * Get consolidated attendance report  hour-wise
     * @param AttendanceDaywiseReportRequest | $request
     * @throws ProfessionalException
     * @return studentDetails
     */
    public function getConsolidatedHourWiseAttendanceReport(AttendanceDaywiseReportRequest $request){
        $request = $this->realEscapeObject($request);
        $isCurrentSem = SemesterService::getInstance ()->isCurrentSemester ( $request->batchID, $request->semID );
        if($isCurrentSem){
            $sql = "SELECT 
                        sa.studentID,
                        sa.studentName,
                        UPPER(sa.studentGender) as gender ,
                        sa.rollNo,
                        sa.regNo,
                        studentJoindate,
                        studentAccount,
                        a.isAbsent,
                        a.isBlocked,
                        a.hour,
                        a.attendanceDate
                    FROM
                        batches ba
                            INNER JOIN
                        studentaccount sa ON ba.batchID = sa.batchID
                            INNER JOIN
                        semesters sem ON sem.semID = ba.semID
                            INNER JOIN
                        semesters joinedSem ON sa.joiningSemId = joinedSem.semID
                            LEFT JOIN
                        attendance a ON sa.studentID = a.studentID AND a.attendanceDate BETWEEN '$request->fromDate' AND '$request->toDate
                    WHERE
                        ba.batchID = $request->batchID
                            AND joinedSem.orderNo <= sem.orderNo
                    ORDER BY sa.".$request->sortByColumn." ,a.attendanceDate, a.hour ";
        }else{
            $semDetails = SemesterService::getInstance()->getSemDetailsBySemId($request->semID);
            $sql = "SELECT 
                        sa.studentID,
                        sa.studentName,
                        UPPER(sa.studentGender) as gender ,
                        sa.rollNo,
                        sa.regNo,
                        sa.studentJoindate,
                        sa.studentAccount,
                        sa.regNo,
                        a.isAbsent,
                        a.isBlocked,
                        a.hour
                    FROM
                        studentaccount sa
                            INNER JOIN
                        batches ba ON sa.batchID = ba.batchID
                            INNER JOIN
                        semesters joinedSem ON sa.joiningSemId = joinedSem.semID
                            LEFT JOIN
                        attendance a ON sa.studentID = a.studentID AND a.attendanceDate = '$request->attendanceDate'
                    WHERE
                        ba.batchID = $request->batchID
                            AND joinedSem.orderNo <= $semDetails->orderNo
                            
                    UNION SELECT 
                        sa.studentID,
                        sa.studentName,
                        UPPER(sa.studentGender) as gender ,
                        sa.rollNo,
                        sa.regNo,
                        sa.studentJoindate,
                        sa.studentAccount,
                        sa.regNo,
                        a.isAbsent,
                        st.staffName,
                        a.isBlocked,
                        a.hour
                    FROM
                        failed_students fs
                            LEFT JOIN
                        studentaccount sa ON fs.studentID = sa.studentID
                            INNER JOIN
                        semesters fsem ON fsem.semID = fs.failedInSemester
                            INNER JOIN
                        semesters joinedSem ON sa.joiningSemId = joinedSem.semID
                            LEFT JOIN
                        attendance a ON sa.studentID = a.studentID AND a.attendanceDate = '$request->attendanceDate'
                    WHERE
                        previousBatch = $request->batchID AND fsem.orderNo > $semDetails->orderNo
                            AND joinedSem.orderNo <= $semDetails->orderNo
                    ORDER BY $request->sortByColumn,hour";
        }
        try{
            
            $studentDetails = $this->executeQueryForList($sql,$this->mapper[AttendanceReportServiceMapper::GET_BATCH_ATTENDANCE_DETAILS]);
            return $studentDetails;
        }
        catch(\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    
}