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 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 196
ProjectThesisService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
1560.00
0.00% covered (danger)
0.00%
0 / 196
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 getStudentsForProjectThesis
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 27
 getAllStudentDetailsByProjectThesis
0.00% covered (danger)
0.00%
0 / 1
506.00
0.00% covered (danger)
0.00%
0 / 97
 getStudentAppliedDetails
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 69
<?php
namespace com\linways\ec\core\service;
use com\linways\base\util\MakeSingletonTrait;
use com\linways\base\util\SecurityUtils;
use com\linways\ec\core\constant\StatusConstants;
use com\linways\ec\core\exception\ExamControllerException;
use com\linways\ec\core\dto\FeeType;
use com\linways\ec\core\logging\Events;
use com\linways\ec\core\logging\entities\Staff;
use com\linways\core\ams\professional\logging\AMSLogger;
use com\linways\ec\core\service\CommonExamService;
use com\linways\base\util\TwigRenderer;
use com\linways\core\ams\professional\util\PdfUtil;
use com\linways\core\ams\professional\service\StaffService;
use com\linways\core\ams\professional\request\api\GetAllFacultiesRequest;
use com\linways\ec\core\request\SearchRuleRequest;
use com\linways\ec\core\service\RuleService;
class ProjectThesisService extends BaseService
{
    use MakeSingletonTrait;
    private function __construct()
    {
        $this->logger = AMSLogger::getLogger('exam-controller-log');
    }
    
    /**
     * search All Student Details TA
     * @param $request
     * @return studentDetails
     */
    public function getStudentsForProjectThesis($request){
        try{
            $responseData = new \stdClass;
            
            $studentDetails = $this->getAllStudentDetailsByProjectThesis($request);
            $studentDetails = (array)$studentDetails;
            if($request->isReportUploadedStudentsOnly){
                $students = [];
                foreach($studentDetails as $student){
                    $requestForCertificate = new \stdClass();
                    $requestForCertificate->groupId = $student->groupId;
                    $requestForCertificate->studentId = $student->studentId;
                    $requestForCertificate->type = 'PROJECT_THESIS';
                    $student->uploadedCertificates = CertificateUploadService::getInstance()->getCertificateUpload($requestForCertificate);
                    if(!empty($student->uploadedCertificates)){
                        $students[] = $student;
                    }
                }
                $responseData->students = $students;
            }
            else{
                $responseData->students = $studentDetails;
            }
            return $responseData;
        }
        catch(\Exception $e) {
            throw new ExamControllerException ($e->getCode(),$e->getMessage());
        }
    }
    /**
     * get All Student Details By ExamRegistration
     * @param $request
     * @return studentDetails
     */
    public function getAllStudentDetailsByProjectThesis($request){
        $request = $this->realEscapeObject($request);
        try{
            $searchRuleRequest = new SearchRuleRequest;
            $searchRuleRequest->name = "PROJECT_THESIS";
            $ruleObj = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
            if(!empty ($ruleObj->applicableCourseTypeIds)){
                $request->courseTypeId = $ruleObj->applicableCourseTypeIds;
            }
            $whereQuery = "";
            $limitQuery = "";
            $joinQueary = "";
            $sortBy = " ORDER BY spa.properties->>'$.registerNumber' ASC ";
            if(($request->isFetchAppliedStudentsOnly)){
                $joinQueary .= " INNER JOIN ec_student_additional_details esad ON
                esad.student_id = sa.studentID AND  esad.program_id = p.id AND esad.type = 'PROJECT_THESIS' ";
            }
            else{
                $joinQueary .= " LEFT JOIN ec_student_additional_details esad ON
                esad.student_id = sa.studentID AND  esad.program_id = p.id AND esad.type = 'PROJECT_THESIS' ";
            }
            if(!empty($request->studentId)){
                $whereQuery .= " AND sa.studentID = '$request->studentId'";
            }
            if(!empty($request->guideId)){
                $whereQuery .= " AND esad.properties->>'$.guideId' = '$request->guideId'";
            }
            if(!empty($request->verificationStatus)){
                $whereQuery .= " AND esad.properties->>'$.verificationStatus' = '$request->verificationStatus'";
            }
            if(!empty($request->registerNo)){
                $whereQuery .= " AND spa.properties->>'$.registerNumber' = '$request->registerNo'";
            }
            if(!empty($request->groupId)){
                $groupIdString = is_array($request->groupId) ? "'" . implode("','",$request->groupId) . "'" : "'".$request->groupId."'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            if(!empty($request->courseTypeId)){
                $courseTypeIdString = is_array($request->courseTypeId) ? "'" . implode("','",$request->courseTypeId) . "'" : "'".$request->courseTypeId."'";
                $whereQuery .= " AND p.course_type_id IN ( $courseTypeIdString )";
            }
          
            $query = "SELECT DISTINCT
                sa.studentID as studentId,
                sa.studentName as name,
                sa.studentEmail as email,
                sa.studentPhone as phone,
                spa.properties->>'$.registerNumber' AS registerNo,
                p.id AS programId,
                g.id AS groupId,
                g.name AS groupName,
                d.deptName as deptCode,
                d.departmentDesc as deptName,
                esad.properties as projectThesisProperties
            FROM
                `groups` g 
            INNER JOIN group_members gm ON
                gm.groups_id = g.id
            INNER JOIN program p ON 
                p.id = g.properties->>'$.programId'
            INNER JOIN student_program_account spa ON 
               spa.id = gm.members->>'$.studentId' AND
               spa.current_program_id = p.id AND 
               spa.current_batch_id = g.id AND
               spa.properties->>'$.academicStatus' IN ('ACTIVE','COMPLETED')
            INNER JOIN studentaccount sa ON
                sa.studentID = spa.student_id
            INNER JOIN department d ON
                d.deptID = g.properties ->> '$.departmentId'
            $joinQueary 
            WHERE
                g.`type` = 'BATCH' ";
            $studentDetails = $this->executeQueryForList($query.$whereQuery.$sortBy.$limitQuery);
        }
        catch(\Exception $e) {
            throw new ExamControllerException ($e->getCode(),$e->getMessage());
        }
        array_walk($studentDetails,function($student){
            $student->isSelected = false;
            $student->guide = "";
            $student->verificationStartDate = "";
            $student->verificationEndDate = "";
            $student->projectThesisProperties =   $student->projectThesisProperties ? json_decode($student->projectThesisProperties) : new \stdClass;
            if($student->projectThesisProperties){
                $student->verificationStartDate = $student->projectThesisProperties->verificationStartDate ? date("Y-m-d", strtotime($student->projectThesisProperties->verificationStartDate)) : '';
                $student->verificationEndDate = $student->projectThesisProperties->verificationEndDate ? date("Y-m-d", strtotime($student->projectThesisProperties->verificationEndDate)) : '';
                $student->verificationEndDate = $student->projectThesisProperties->verificationEndDate ? date("Y-m-d", strtotime($student->projectThesisProperties->verificationEndDate)) : '';
                $student->guide = $student->projectThesisProperties->guideId ? $student->projectThesisProperties->guideId  : '';
                $student->vivaFaculty = $student->projectThesisProperties->vivaFacultyId ? $student->projectThesisProperties->vivaFacultyId  : [];
                $student->verificationStatus = $student->projectThesisProperties->verificationStatus ? $student->projectThesisProperties->verificationStatus  : '';
                if( $student->guide){
                    $getAllFacultiesRequest = new GetAllFacultiesRequest;
                    $getAllFacultiesRequest->id = $student->guide;
                    $currentStaffDetails = reset(StaffService::getInstance()->getAllFacultiesForApi($getAllFacultiesRequest));
                }
                $student->guideName = $currentStaffDetails ? $currentStaffDetails->name  : '';
            }
            
        });
        return $studentDetails;
    }
    /**
     * search All Student applied Details PT
     * @param $request
     * @return studentDetails
     */
    public function getStudentAppliedDetails($request){
        try{
            $responseData = new \stdClass;
            $studentDetails = $this->getAllStudentDetailsByProjectThesis($request);
            $appliedDetails = (array)$studentDetails;
            foreach($appliedDetails as $student){
                $student->errorMsg = "";
                $student->allowUpload = true;
                $student->alreadyUploaded = false;
                if(empty($student->projectThesisProperties)){
                    $student->errorMsg = "Uploads not yet started!";
                    $student->allowUpload = false;
                }
                else{
                    if(strtotime($student->projectThesisProperties->verificationStartDate) > strtotime(date("Y-m-d"))){
                        $verificationStartDate = date("d-m-Y",strtotime($student->projectThesisProperties->verificationStartDate));
                        $student->errorMsg = "Upload will be open from ".$verificationStartDate;
                        $student->allowUpload = false;
                    }
                    else{
                        $requestForCertificate = new \stdClass();
                        $requestForCertificate->groupId = $student->groupId;
                        $requestForCertificate->studentId = $student->studentId;
                        $requestForCertificate->type = 'PROJECT_THESIS';
                        $student->uploadedCertificates = CertificateUploadService::getInstance()->getCertificateUpload($requestForCertificate);
                        if(!empty($student->uploadedCertificates)){
                            $student->alreadyUploaded = true;
                        }
                        if($student->projectThesisProperties->verificationStatus){
                            switch ($student->projectThesisProperties->verificationStatus) {
                                case 'APPROVED': 
                                    $student->allowUpload = false;
                                    $student->status = "Verified";
                                    $student->statusClass = "text-success";
                                    break;
                                case 'REJECTED': 
                                    $student->allowUpload = true;
                                    $student->status = "Rejected, Upload Again";
                                    $student->statusClass = "text-danger";
                                    break;
                                case 'UPLOADED': 
                                    $student->allowUpload = true;
                                    $student->status = "Pending";
                                    $student->statusClass = "text-info";
                                    break;
                                default:
                                    $student->allowUpload = true;
                                    $student->status = "Not Submitted";
                                    $student->statusClass = "text-info";
                                    break;
                            }
                        }
                        else{
                            $student->allowUpload = true;
                            $student->status = "Not Submitted";
                            $student->statusClass = "text-info"; 
                        }
                    }
                    if(strtotime($student->projectThesisProperties->verificationEndDate) < strtotime(date("Y-m-d"))){
                        $student->errorMsg = "Cannot upload Date exceeded!";
                        $student->allowUpload = false;
                    }
                }
            }
            return $appliedDetails;
        }
        catch(\Exception $e) {
            throw new ExamControllerException ($e->getCode(),$e->getMessage());
        }
    }
}