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 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 285
FolioNumberService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 11
2070.00
0.00% covered (danger)
0.00%
0 / 285
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 generateFolioNumber
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 42
 saveFolioNumber
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 30
 validateSaveFolioNumber
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 3
 insertFolioNumber
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 17
 getBatchDetailsByBatchPriority
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 32
 getLatestFolioNumber
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 getStudentsDetailsByBatch
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 40
 checkIfFolioNumberGenerated
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 getFolioNumberReport
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 41
 getFolioGeneratedStudentsDetailsByBatch
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 38
<?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\FolioNumber;
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\base\util\TwigRenderer;
use com\linways\core\ams\professional\util\PdfUtil;
class FolioNumberService extends BaseService
{
    use MakeSingletonTrait;
    private function __construct(){
        $this->logger = AMSLogger::getLogger('exam-controller-log');
    }
    /**
     * Generate Folio Number 
     * @param $request
     * @return $id
     */
    public function generateFolioNumber( $request){
        $request = $this->realEscapeObject($request);
        $staffId = $GLOBALS['userId'];
        try {
            if(empty($request->groupId)){
                throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Can't generate folio number. No batch found");
            }
            $sortedGroupList = $this->getBatchDetailsByBatchPriority($request);
            if(count($sortedGroupList) != count($request->groupId)){
                throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Can't generate folio number. No prefix added");
            }
            // check folio number prefix
            foreach($sortedGroupList  as $group){
                $maxFolioNumber = "";
                $folioNumberCount = 1;
                
                $requestForMaxFolioNumber = new \stdClass;
                $requestForMaxFolioNumber->year = $group->endYear;
                $maxFolioNumber = $this->getLatestFolioNumber($requestForMaxFolioNumber);
                if($maxFolioNumber){
                    $folioNumberCount = (int)substr($maxFolioNumber, 2)+1;
                }
                $requestForStudents = new \stdClass;
                $requestForStudents->groupId = $group->id;
                $requestForStudents->orderBy = "GENDER_WISE";
                $studentsList = $this->getStudentsDetailsByBatch($requestForStudents);
                foreach($studentsList as $student){
                    $folioNumber = new FolioNumber;
                    $folioNumber->groupId = $group->id;
                    $folioNumber->studentId = $student->id;
                    $folioNumber->folioNumber = $group->prefix.sprintf("%04d", $folioNumberCount);
                    $folioNumberProperties = new \stdClass;
                    $folioNumberProperties->year = $group->endYear;
                    if($group->priority){
                        $folioNumberProperties->batchPriority = $group->priority;
                    }
                    $folioNumber->properties = $folioNumberProperties;
                    $folioNumber->id = $this->saveFolioNumber($folioNumber);
                    $folioNumberCount ++;
                }
                
            }
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Save Folio Number
     * @param FolioNumber $folioNumber
     * @return $id
     */
    public function saveFolioNumber(FolioNumber $folioNumber){
        $folioNumber = $this->realEscapeObject($folioNumber);
        $folioNumber->createdBy = $GLOBALS['userId'] ?? $folioNumber->createdBy;
        $folioNumber->updatedBy = $GLOBALS['userId'] ?? $folioNumber->updatedBy;
        $staffId = $GLOBALS['userId'];
        try {
            $this->validateSaveFolioNumber($folioNumber);
            $folioNumber->id = $this->insertFolioNumber($folioNumber);
            
            AMSLogger::log_info($this->logger,Events::EC_SAVE_FOLIO_NUMBER, [
                "staff" => new Staff(["id" => $staffId]),
                "request" => $folioNumber,
                "status" => StatusConstants::SUCCESS
            ]);
        } catch (\Exception $e) {
            AMSLogger::log_error($this->logger,Events::EC_SAVE_FOLIO_NUMBER, [
                "staff" => new Staff(["id" => $staffId]),
                "request" => $folioNumber,
                "errorCode" => $e->getCode(),
                "errorMessage" => $e->getMessage(),
                "status" => StatusConstants::FAILED
            ]);
            if ($e->getCode() !== ExamControllerException::INVALID_PARAMETERS && $e->getCode() !== ExamControllerException::EMPTY_PARAMETERS && $e->getCode() !== "DUPLICATE_ENTRY") {
                throw new ExamControllerException($e->getCode(), "Failed to save folio number! Please try again");
            } else if ($e->getCode() === ExamControllerException::DUPLICATE_ENTRY) {
                throw new ExamControllerException(ExamControllerException::DUPLICATE_ENTRY, "Cannot add folio number.");
            } else {
                throw new ExamControllerException($e->getCode(), $e->getMessage());
            }
        }
        return $folioNumber->id;
    }
    /**
     * Validate Folio Number Request Before Saving
     * @param FolioNumber $folioNumber
     * @return NULL
     */
    private function validateSaveFolioNumber(FolioNumber $folioNumber){
        if (empty($folioNumber->groupId) || empty($folioNumber->studentId))
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS, " empty parameter. can't save folio number! ");
    }
    /**
     * Insert Folio Number 
     * @param FolioNumber $folioNumber
     * @return  $id
     */
    private function insertFolioNumber(FolioNumber $folioNumber){
        $properties = !empty($folioNumber->properties) ? "'" . json_encode($folioNumber->properties) . "'" : "NULL";
        $query = "INSERT INTO ec_folio_number
                    (student_id,groups_id,folio_number,properties,created_by,updated_by)
                    VALUES
                    ('$folioNumber->studentId','$folioNumber->groupId','$folioNumber->folioNumber',$properties,'$folioNumber->createdBy','$folioNumber->updatedBy')
                    ON DUPLICATE KEY
                    UPDATE
                    updated_by = VALUES(created_by),
                    folio_number = VALUES(folio_number),
                    properties = VALUES(properties)";
        try {
            $folioNumber->id = $this->executeQuery($query,true)->id;
            return $folioNumber->id;
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get Batch details by batch priority
     * @param $searchRequest
     * @return $batches
     */
    public function getBatchDetailsByBatchPriority($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try {
            $whereQuery = null;
            $orderBy = " ORDER BY egp.priority ASC ";
            $whereQuery = "";
            if (!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','", $searchRequest->groupId) . "'" : "'" . $searchRequest->groupId . "'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            $query = "SELECT
                            DISTINCT 
                            g.id,
                            g.identifying_context as identifyingContext,
                            g.name,
                            g.type,
                            g.properties->>'$.endYear' as endYear,
                            egp.priority,
                            fnp.prefix 
                        FROM
                            `groups` g 
                        INNER JOIN folioNumber_prefix fnp ON
                            fnp.year = g.properties->>'$.endYear'
                        LEFT JOIN ec_group_priority egp ON
                            egp.groups_id = g.id
                       
                        WHERE
                            1 = 1 ";
            $batches =  $this->executeQueryForList($query . $whereQuery .$orderBy );
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
        return $batches;
    }
    /**
     * get  latest Folio Number
     * @param $searchRequest
     * @return $maxFolioNumber
     */
    public function getLatestFolioNumber($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try {
            $whereQuery = null;
            $whereQuery = "";
            if (!empty($searchRequest->year)) {
                $yearString = is_array($searchRequest->year) ? "'" . implode("','", $searchRequest->year) . "'" : "'" . $searchRequest->year . "'";
                $whereQuery .= " AND efn.properties->>'$.year' IN ( $yearString )";
            }
            $query = "SELECT
                            MAX(efn.folio_number) as maxFolioNumber
                            
                        FROM
                            `ec_folio_number` efn
                        WHERE
                            1 = 1 ";
            $maxFolioNumber =  $this->executeQueryForObject($query . $whereQuery )->maxFolioNumber;
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
        return $maxFolioNumber;
    }
    /**
     * get Students Details By Batch
     * @param $searchRequest
     * @return $students
     */
    public function getStudentsDetailsByBatch($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try {
            $whereQuery = null;
            if($searchRequest->orderBy == 'GENDER_WISE'){
                $orderBy = " ORDER BY s.studentGender ASC, s.studentName ";
            }
            else{
                $orderBy = " ORDER BY spa.properties->>'$.registerNumber' ASC ";
            }
            $whereQuery = "";
            if (!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','", $searchRequest->groupId) . "'" : "'" . $searchRequest->groupId . "'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            $query = "SELECT DISTINCT
                        spa.student_id AS id,
                        spa.student_id AS studentId,
                        g.id AS groupId,
                        g.name AS groupName,
                        g.properties ->>'$.programId'  AS programId,
                        spa.properties->>'$.rollNumber' AS studentRollNo,
                        spa.properties->>'$.registerNumber' AS studentRegisterNo,
                        s.studentName AS studentName
                    FROM 
                        studentaccount s 
                    INNER JOIN student_program_account spa
                        ON spa.student_id = s.studentID
                    INNER JOIN student_program_batch_log spbl 
                        ON spbl.program_student_id = spa.id AND spbl.properties->>'$.academicStatus' IN ('ACTIVE','COMPLETED')
                    INNER JOIN `program` p 
                        ON p.id = spbl.program_id
                    INNER JOIN `groups` g 
                        ON g.id = spbl.batch_group_id
                    WHERE 1=1 ";
            $students =  $this->executeQueryForList($query . $whereQuery .$orderBy );
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
        return $students;
    }
     /**
     * checkIfFolioNumberGenerated
     * @param $searchRequest
     * @return $folioNumber
     */
    public function checkIfFolioNumberGenerated($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try {
            $limit = " LIMIT 1";
            $whereQuery = "";
            if (!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','", $searchRequest->groupId) . "'" : "'" . $searchRequest->groupId . "'";
                $whereQuery .= " AND efn.groups_id IN ( $groupIdString )";
            }
            $query = "SELECT
                            efn.id
                        FROM
                            `ec_folio_number` efn
                        WHERE
                            1 = 1 ";
            $folioNumber =  $this->executeQueryForList($query . $whereQuery .$limit);
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
        return $folioNumber;
    }
     /**
     * get Regular Exam Subject Wise Result Analysis
     * @param $searchRequest 
     * @return $response 
     */
    public function getFolioNumberReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $students = $this->getFolioGeneratedStudentsDetailsByBatch($searchRequest);
            if(empty($students)){
            throw new ExamControllerException(ExamControllerException::NO_REPORTS_DETAILS_FOUND,"No Folio Number Generated");
            }
            else{
                $templateName = "template_1";
                $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/folioNumber/$templateName.twig"), [ 'students'=>$students ]);
                $prtContent = NULL;
                    $prtContent .= '<html><head>';
                    $prtContent .= "<style>
                        h6 {font-size: 26px;} .text-center { text-align: center;} .align-middle {vertical-align: middle;}; tr.noBorder td {border: 0;  border-collapse:collapse;}
                        table, th, td {border: 1px solid black;border-collapse: collapse;}
                        </style>";
                    $prtContent .= '</head><title>Folio Number Report</title><body>';
                    $prtContent .= $responseHtml;
                    $prtContent .= '</body></html>';
                    $totalWidth = 210;
                    $totalHeight = 297;
                    $options = array(
                        'page-width'     => $totalHeight."mm",
                        'page-height'    => $totalWidth."mm",
                        'dpi'            => 96,
                        'margin-top' => "9mm",
                        'margin-left' => "1mm",
                        'margin-right' => "1mm",
                        'margin-bottom' => "9mm",
                        // 'binary' => "/usr/local/bin/wkhtmltopdf", // For Mac
                        'user-style-sheet' => realpath(DOCUMENT_ROOT . "/libcommon/bootstrap/css/bootstrap.min.css")
                    );
                $programResult = new \stdClass;
                $programResult->dispalyHtmlData = $responseHtml;
                $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return  $programResult;
    }
     /**
     * getFolioGeneratedStudentsDetailsByBatch
     * @param $searchRequest
     * @return $students
     */
    public function getFolioGeneratedStudentsDetailsByBatch($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try {
            $whereQuery = null;
            $whereQuery = "";
            if (!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','", $searchRequest->groupId) . "'" : "'" . $searchRequest->groupId . "'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            $query = "SELECT DISTINCT
                        spa.student_id AS id,
                        spa.student_id AS studentId,
                        g.id AS groupId,
                        g.name AS groupName,
                        efn.folio_number AS folioNumber,
                        g.properties ->>'$.programId'  AS programId,
                        spa.properties->>'$.rollNumber' AS studentRollNo,
                        spa.properties->>'$.registerNumber' AS studentRegisterNo,
                        s.studentName AS studentName,
                        s.admissionNo AS admissionNo
                    FROM 
                        ec_folio_number efn
                    INNER JOIN studentaccount s ON
                        s.studentID = efn.student_id
                    INNER JOIN student_program_account spa
                        ON spa.student_id = s.studentID
                    INNER JOIN student_program_batch_log spbl 
                        ON spbl.program_student_id = spa.id AND spbl.properties->>'$.academicStatus' IN ('ACTIVE','COMPLETED')
                    INNER JOIN `program` p 
                        ON p.id = spbl.program_id
                    INNER JOIN `groups` g 
                        ON g.id = spbl.batch_group_id AND g.id = efn.groups_id
                    WHERE 1=1 ";
            $students =  $this->executeQueryForList($query . $whereQuery  );
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
        return $students;
    }
    
   
    
}