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 / 53
CRAP
0.00% covered (danger)
0.00%
0 / 798
CommonService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 53
35156.00
0.00% covered (danger)
0.00%
0 / 798
 __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 / 5
 getAcademicYear
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getLastDayOfMonth
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 4
 getMonthInWords
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 4
 getSettings
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getMultipleSettings
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 16
 updateSettingsValue
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSettingsByType
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 checkPhoneNo
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
 addOrdinalNumberSuffix
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 17
 updateSettings
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 checkEmail
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 7
 getCollegeHeader
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getCollegeHeaderAsTableRows
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 20
 getCertificateHeader
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 30
 getFormat
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 numberDropDown
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 23
 getExamReportHeader
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 22
 isName
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 3
 getActiveProductConfig
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getProductPackageType
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 appendZero
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 6
 getIndianCurrency
0.00% covered (danger)
0.00%
0 / 1
182.00
0.00% covered (danger)
0.00%
0 / 31
 selectNumber
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 19
 generateNumberDropdown
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 23
 createSettings
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getOBESettings
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 updateOBESettings
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 updateJSONValueSettings
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 generateQRcodeByStudentId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 32
 getCustomTemplate
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 21
 getAcademicYearByDate
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
 updateSettingsValueWithJson
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getAllHtmldata
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 13
 getEmailConfByModule
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 numToOrdinalWord
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 constructResponseHtmlForBarcode
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 37
 getCollegeHeaders
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 34
 getCollegeCommonHeader
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 5
 checkV3AdminIsEnabledToUser
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
 checkV3HrAdminIsEnabledToUser
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 19
 validateAdminWithStaff
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 15
 getDigitalValuationStaffPermission
0.00% covered (danger)
0.00%
0 / 1
272.00
0.00% covered (danger)
0.00%
0 / 44
 getCustomFieldObjectList
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 18
 getDataType
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 12
 getStudentDetailsByFalseNumber
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 24
 verifyMailId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getStudentExamDetailsByRequest
0.00% covered (danger)
0.00%
0 / 1
156.00
0.00% covered (danger)
0.00%
0 / 41
 htmlEntityDecodeArrayOfObjects
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 16
 url_exists
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 3
 getClusterDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\base\util\TwigRenderer;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\mapper\CommonServiceMapper;
use com\linways\core\ams\professional\util\CommonUtil;
use com\linways\core\ams\professional\request\CommonHeaderRequest;
use com\linways\core\ams\professional\dto\SettingsConstents;
use com\linways\core\ams\professional\constant\ExamType;
use com\linways\core\ams\professional\service\ExamRevaluationService;
use com\linways\core\ams\professional\service\ExamService;
use TCPDFBarcode;
class CommonService 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 = CommonServiceMapper::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 academic year of college
     *
     * @return string
     */
    public function getAcademicYear()
    {
        $academicYear = "";
        if (date('m') > 06) {
            $date = date('Y', strtotime("this year June 1st"));
        } else {
            $date = date('Y', strtotime("previous year June 1st"));
        }
        $academicYear = $date . "-" . substr(($date + 1), 2);
        return $academicYear;
    }
    public function getLastDayOfMonth($month, $year)
    {
        $date = date('Y-m-t', strtotime($year . '-' . $month . '-01'));
        return $date;
    }
    public function getMonthInWords($month)
    {
        $monthWords = date('F', mktime(0, 0, 0, $month, 1, date('Y')));
        return $monthWords;
    }
    /**
     * Get value for a setting by name & type
     *
     * @param
     *            name
     * @param
     *            type
     * @return string
     */
    public function getSettings($type, $name)
    {
        $type = $this->realEscapeString($type);
        $name = $this->realEscapeString($name);
        $value = NULL;
        $sql = "SELECT value FROM settings where type='$type' AND name='$name'";
        try {
            $value = $this->executeQueryForObject($sql)->value;
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
        return $value;
    }
    /**
     * Get multiple settings by name array
     *
     * @param
     *            Array[settingsName]
     *
     * @return Array
     */
    public function getMultipleSettings($requestArray = [], $searchBy = 'BY_NAME')
    {
        switch($searchBy) {
            case 'BY_NAME':
                $sql = "SELECT name, value FROM settings WHERE name IN ('" . implode("','", $requestArray) . "')";
                break;
            case 'BY_TYPE':
                $sql = "SELECT name, value FROM settings WHERE type IN ('" . implode("','", $requestArray) . "')";
                break;
        }
        try {
            $settings = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
        return $settings;
    }
    /**
     * update the value of settings constants
     *
     * @param string $type
     * @param string $name
     * @param string $value
     */
    public function updateSettingsValue($type, $name, $value)
    {
        $type = $this->realEscapeString($type);
        $name = $this->realEscapeString($name);
        $value = $this->realEscapeString($value);
        $sql = "UPDATE settings SET value='$value' WHERE type='$type' AND name='$name'";
        try {
            return $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get value for a setting by type
     *
     * @param
     *            name
     * @return array
     */
    public function getSettingsByType($type)
    {
        $type = $this->realEscapeString($type);
        $value = [];
        $sql = "SELECT name, value FROM settings where type='$type'";
        try {
            $value = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
        return $value;
    }
    /**
     * check if phone number is valid and returns with code embedded.
     *
     * @param string $phonNo
     *
     */
    public function checkPhoneNo($phonNo)
    {
        if (preg_match("/^91[0-9]{10}$/", $phonNo)) {
            return $phonNo;
        } else {
            if (preg_match("/^[0-9]{10}$/", $phonNo)) {
                $phonNo = "91" . $phonNo;
                return $phonNo;
            } else {
                $phonNo = "";
            }
        }
    }
    /**
     * Add ordinal number suffix eg:1->st,2->nd
     *
     * @param int $num
     * @return string
     */
    public function addOrdinalNumberSuffix($num)
    {
        if (!in_array(($num % 100), array(
            11,
            12,
            13
        ))) {
            switch ($num % 10) {
                // Handle 1st, 2nd, 3rd
                case 1 :
                    return $num . 'st';
                case 2 :
                    return $num . 'nd';
                case 3 :
                    return $num . 'rd';
            }
        }
        return $num . 'th';
    }
    /**
     * Update value for a setting by name & type
     *
     * @param
     *            name
     * @param
     *            type
     * @return string
     */
    public function updateSettings($type, $name, $value)
    {
        $type = $this->realEscapeString($type);
        $name = $this->realEscapeString($name);
        $value = $this->realEscapeString($value);
        global $connect;
        $sql = "UPDATE settings SET value='$value' where type='$type' AND name='$name'";
        try {
            return $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    /**
     * check if email is valid
     *
     * @param string $email
     * @return boolean
     */
    public function checkEmail($email)
    {
        if (preg_match('/^\S+@[\w\d.-]{2,}\.[\w]{2,6}$/iU', $email)) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * college header for print and export
     */
    public function getCollegeHeader($wrapperClass = "well")
    {
        global $COLLEGE_NAME;
        global $COLLEGE_ADDRESS1;
        global $COLLEGE_ADDRESS2;
        global $COLLEGE_CONTACT1;
        global $COLLEGE_CONTACT2;
        global $COLLEGE_NAME_NEW;
        return "<div class='$wrapperClass' align='center'>
<font size='4'><b>".($COLLEGE_NAME_NEW?$COLLEGE_NAME_NEW:$COLLEGE_NAME)."</b></font><br/>
<b>$COLLEGE_ADDRESS1.$COLLEGE_ADDRESS2</b><br/>
<b>$COLLEGE_CONTACT1</b><br/>
<i>$COLLEGE_CONTACT2</i><br/>
</div>";
    }
    /**
     * Undocumented function
     *
     * @param string $colspan
     * @return void
     */
    public function getCollegeHeaderAsTableRows($colspan = "", $rowClass = '', $colClass = '')
    {
        global $COLLEGE_NAME;
        global $COLLEGE_ADDRESS1;
        global $COLLEGE_ADDRESS2;
        global $COLLEGE_CONTACT1;
        global $COLLEGE_CONTACT2;
        global $COLLEGE_NAME_NEW;
        return "<tr  align='center' class='$rowClass'>
                    <td class='$colClass' colspan='$colspan' data-a-h='center' data-a-v='vertical' data-b-a-s='thin' data-f-bold='true' >".($COLLEGE_NAME_NEW?$COLLEGE_NAME_NEW:$COLLEGE_NAME)."</td>
                </tr>
                <tr  align='center' class='$rowClass'>
                    <td class='$colClass' colspan='$colspan' data-a-h='center' data-a-v='vertical' data-b-a-s='thin' data-f-bold='true'>$COLLEGE_ADDRESS1.<br/>$COLLEGE_ADDRESS2</td>
                </tr>
                <tr  align='center' class='$rowClass'>
                    <td class='$colClass' colspan='$colspan' data-a-h='center' data-a-v='vertical' data-b-a-s='thin' data-f-bold='true'>$COLLEGE_CONTACT1</td>
                </tr>
                <tr  align='center' class='$rowClass'>
                    <td class='$colClass' colspan='$colspan' data-a-h='center' data-a-v='vertical' data-b-a-s='thin' data-f-bold='true'>$COLLEGE_CONTACT2</td>
                </tr>";
    }
    /**
     * get college certificate header
     *
     * @return string
     */
    public function getCertificateHeader($pageSize = 'A4')
    {
        global $COLLEGE_NAME;
        global $COLLEGE_ADDRESS1;
        global $COLLEGE_ADDRESS2;
        global $COLLEGE_CONTACT1;
        global $COLLEGE_CONTACT2;
        global $COLLEGE_AFFILIATIONS;
        global $COLLEGE_NAME_NEW;
        global $autonomous;
        switch ($pageSize) {
            case 'A5':
                return "
<div  style='font-family: Times New Roman;font-size:18px;letter-spacing: -1px;line-height: 23px;
    text-align: center;'>
<b>".($COLLEGE_NAME_NEW?$COLLEGE_NAME_NEW:$COLLEGE_NAME)."</b>
</div>" .
                    (!empty($autonomous) ? "<div style='font-family: Times New Roman;text-align: center;font-size: 12px;padding-top: 11px;'>$autonomous</div>" : "")
                    . "<div style='font-family: Times New Roman;text-align: center;font-size: 12px;padding-top: 11px;'>$COLLEGE_AFFILIATIONS $COLLEGE_ADDRESS1 $COLLEGE_ADDRESS2</div>";
                break;
            default:
                return "
<div  style='font-family: Times New Roman;font-size: 28px;letter-spacing: -1px;line-height: 23px;
    text-align: center;'>
<b>".($COLLEGE_NAME_NEW?$COLLEGE_NAME_NEW:$COLLEGE_NAME)."</b>
</div>" .
                    (!empty($autonomous) ? "<div style='font-family: Times New Roman;text-align: center;font-size: 16px;padding-top: 11px;'>$autonomous</div>" : "")
                    . "<div style='font-family: Times New Roman;text-align: center;font-size: 16px;padding-top: 11px;'>$COLLEGE_AFFILIATIONS $COLLEGE_ADDRESS1 $COLLEGE_ADDRESS2</div>";
                break;
        }
    }
    /**
     * To get the format of file
     *
     * @param String $filename
     * @return string
     */
    function getFormat($filename)
    {
        return strtolower(substr(strrchr($filename, '.'), 1));
    }
    /**
     * It will generate html dropdown for number
     *
     * @param int $from
     * @param int $limit
     * @param string $id
     * @param string $name
     * @param string $class
     * @param int $select
     * @return string
     * @author Sanoop
     */
    public function numberDropDown($from, $limit, $id = "", $name = "", $class = "", $select = 0)
    {
        $limit = $from + $limit;
        if ($select) {
            $selected [$select] = 'selected';
        }
        $response = "<select ";
        if ($class) {
            $response .= "class='$class";
        }
        if ($id) {
            $response .= "id='$id";
        }
        if ($name) {
            $response .= "name='$name";
        }
        $response .= ">";
        $response .= "<option value='0'>--select--</option>";
        for ($i = $from; $i <= $limit; $i++) {
            $response .= "<option value='$i" . $selected [$i] . ">$i</option>";
        }
        $response .= "</select>";
        return $response;
    }
    public function getExamReportHeader()
    {
        $examReportHeader = NULL;
        $sql = "SELECT t1.header,t1.header_type,t1.alternate_header FROM header t1, exam_reporthead t2 WHERE t1.id = t2.header";
        try {
            $examReportHeader = $this->executeQueryForObject($sql);
            $header_type = $examReportHeader->header_type;
            $header = $examReportHeader->header;
            $export_head = $examReportHeader->header;
            if ($header_type == 'image') {
                $export_head = $row ['alternate_header'];
                if (file_exists('../' . $header)) {
                    return "<div><img src='" . $header . "'/></div>";
                } else {
                    return $export_head;
                }
            } else {
                return $header;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    /**
     * check common name
     *
     * @param string $name
     * @return boolean
     */
    public function isName($name)
    {
        return preg_match('/^([\w\d\s\&\-\_\+\.\:\|\/]+)$/iU', $name) ? TRUE : FALSE;
    }
    /**
     * Method for getting active product configuration
     *
     * @return Object|null
     * @throws ProfessionalException
     */
    public function getActiveProductConfig()
    {
        $productConfig = null;
        $sql = "SELECT * FROM product_package_config WHERE active = 1;";
        try {
            $productConfig = $this->executeQueryForObject($sql, false, $this->mapper[CommonServiceMapper::GETACTIVEPRODUCTCONFIG]);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
        return $productConfig;
    }
    /**
     *  Method for getting active product package type
     * @return string
     * @throws ProfessionalException
     */
    public function getProductPackageType()
    {
        $packageType = null;
        $sql = "SELECT packageType FROM product_package_config WHERE active = 1;";
        try {
            $response = $this->executeQueryForObject($sql);
            if (!empty($response)) {
                $packageType = $response->packageType;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
        return $packageType;
    }
    /**
     * padding zero
     * @param int $num
     * @param int $paddingLength
     * @return string
     */
    function appendZero($num, $paddingLength)
    {
        if (is_numeric($num)) {
            $num = str_pad($num, $paddingLength, "0", STR_PAD_LEFT);
        }
        return $num;
    }
    /**
     * get numbers to indian currency
     * @param float $number
     * @return string
     */
    public function getIndianCurrency($number)
    {
        $decimal = round($number - ($no = floor($number)), 2) * 100;
        $hundred = null;
        $digits_length = strlen($no);
        $i = 0;
        $str = array();
        $words = array(0 => '', 1 => 'one', 2 => 'two',
            3 => 'three', 4 => 'four', 5 => 'five', 6 => 'six',
            7 => 'seven', 8 => 'eight', 9 => 'nine',
            10 => 'ten', 11 => 'eleven', 12 => 'twelve',
            13 => 'thirteen', 14 => 'fourteen', 15 => 'fifteen',
            16 => 'sixteen', 17 => 'seventeen', 18 => 'eighteen',
            19 => 'nineteen', 20 => 'twenty', 30 => 'thirty',
            40 => 'forty', 50 => 'fifty', 60 => 'sixty',
            70 => 'seventy', 80 => 'eighty', 90 => 'ninety');
        $digits = array('', 'hundred', 'thousand', 'lakh', 'crore');
        while ($i < $digits_length) {
            $divider = ($i == 2) ? 10 : 100;
            $number = floor($no % $divider);
            $no = floor($no / $divider);
            $i += $divider == 10 ? 1 : 2;
            if ($number) {
                $plural = (($counter = count($str)) && $number > 9) ? '' : null;
                $hundred = ($counter == 1 && $str[0]) ? ' and ' : null;
                $str [] = ($number < 21) ? $words[$number] . ' ' . $digits[$counter] . $plural . ' ' . $hundred : $words[floor($number / 10) * 10] . ' ' . $words[$number % 10] . ' ' . $digits[$counter] . $plural . ' ' . $hundred;
            } else $str[] = null;
        }
        $Rupees = ucfirst(implode('', array_reverse($str)));
//        $paise = ($decimal) ? "." . ($words[$decimal / 10] . " " . $words[$decimal % 10]) . ' Paise' : '';
        $paise = ($decimal) ? "and " . ($words[$decimal / 10] . " " . (($decimal % 10) == 0 ? 'zero' : $words[$decimal % 10])) . ' Paise' : '';
        return ($Rupees ? $Rupees . 'Rupees ' : '') . $paise;
    }
    public function selectNumber($startNumber, $endNumber, $inputName, $titleName, $comparedVal = '', $order = 'asc')
    {
        $response = '';
        if ($order == "desc") {
            $response .= "<select id='$inputName' class='form-control input-sm' name='" . $inputName . "'><option value=''>" . $titleName . "</option>";
            for ($i = $endNumber; $i >= $startNumber; $i--) {
                if ($i == $comparedVal) $response .= "<option value='$i' selected>$i</option>";
                else  $response .= "<option value='$i'>$i</option>";
            }
            $response .= "</select>";
        } else {
            $response .= "<select id='$inputName' class='form-control input-sm' name='" . $inputName . "'><option value=''>" . $titleName . "</option>";
            for ($i = $startNumber; $i <= $endNumber; $i++) {
                if ($i == $comparedVal) $response .= "<option value='$i' selected>$i</option>";
                else  $response .= "<option value='$i'>$i</option>";
            }
            $response .= "</select>";
        }
        return $response;
    }
    /**
     * generate nummber dropdown
     * request contain startNumber, endNumber, inputName, titleName, comparedVal, order, required
     * @param object $request
     * @return string
     */
    public function generateNumberDropdown($request)
    {
        $response = '';
        $required = '';
        if ($request->required == true) {
            $required = 'required';
        }
        if ($request->order == "desc") {
            $response .= "<select id='$request->inputName' class='form-control input-sm' name='" . $request->inputName . "$required><option value=''>" . $request->titleName . "</option>";
            for ($i = $request->endNumber; $i >= $request->startNumber; $i--) {
                if ($i == $request->comparedVal) $response .= "<option value='$i' selected>$i</option>";
                else  $response .= "<option value='$i'>$i</option>";
            }
            $response .= "</select>";
        } else {
            $response .= "<select id='$request->inputName' class='form-control input-sm' name='" . $request->inputName . "$required><option value=''>" . $request->titleName . "</option>";
            for ($i = $request->startNumber; $i <= $request->endNumber; $i++) {
                if ($i == $request->comparedVal) $response .= "<option value='$i' selected>$i</option>";
                else  $response .= "<option value='$i'>$i</option>";
            }
            $response .= "</select>";
        }
        return $response;
    }
    /**
     * Create settings
     * @param string $type
     * @param string $name
     * @param string $value
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function createSettings($type, $name, $value)
    {
        $type = $this->realEscapeString($type);
        $name = $this->realEscapeString($name);
        $value = $this->realEscapeString($value);
        $sql = "INSERT INTO settings (name, value, type, created_by, created_date, updated_by, updated_date) VALUES ('$name', '$value', '$type', '1', UTC_TIMESTAMP(), '1', UTC_TIMESTAMP())";
        try {
            return $this->executeQueryForObject($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get value for a obe setting by name & type
     *
     * @param
     *            name
     * @param
     *            type
     * @return string
     */
    public function getOBESettings($type, $name, $deptId = 'null')
    {
        $type = $this->realEscapeString($type);
        $name = $this->realEscapeString($name);
        $deptId = $this->realEscapeString($deptId);
        $value = NULL;
        $sql = "SELECT value FROM obe_settings where type='$type' AND name='$name' AND deptId=$deptId";
        try {
            $value = $this->executeQueryForObject($sql)->value;
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
        return $value;
    }
    /**
     * Update value for a setting by name & type
     *
     * @param
     *            name
     * @param
     *            type
     * @return string
     */
    public function updateOBESettings($type, $name, $value, $deptId = 'null')
    {
        $type = $this->realEscapeString($type);
        $name = $this->realEscapeString($name);
        $value = $this->realEscapeString($value);
        $deptId = $this->realEscapeString($deptId);
        global $connect;
        $sql = "UPDATE settings SET value='$value' where type='$type' AND name='$name' AND deptId=$deptId";
        try {
            return $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    public function updateJSONValueSettings($type, $name, $value)
    {
        $type = $this->realEscapeString($type);
        $name = $this->realEscapeString($name);
        $value = $this->realEscapeObject(json_encode($value));
        $value = htmlspecialchars_decode($value);
        $query = "UPDATE settings SET value='$value' WHERE name='$name' and type='$type'";
        try {
            $this->executeQuery($query);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Generate QR code
     * @param studentId $studentId
     * @return string QRcodeImageURL
     * @throws ProfessionalException
     */
    public function generateQRcodeByStudentId($studentId)
    {
        $studentId = $this->realEscapeString($studentId);
        // $QUICK is the secret key defined in the conf.php
        global $QUICK;
        try {
            $studentDetailsSQL = "SELECT cc.code, sa.studentName, sa.studentBirthday
                FROM coursetype_code cc
                    INNER JOIN
                batches b ON cc.courseTypeID = b.courseTypeID AND cc.batchID = b.batchID
                    INNER JOIN
                studentaccount sa ON sa.batchID = b.batchID
                WHERE studentID = \"" . $studentId . "\"";
            $studentDetails = $this->executeQueryForObject($studentDetailsSQL);
            $batchCode = $studentDetails->code;
            $DOB = explode("-", $studentDetails->studentBirthday);
            $DOBMonth = $DOB[1];
            $DOBDay = $DOB[2];
            $date = strtotime($studentDetails->studentBirthday);
            $year = date("Y", $date);
            $smallYear = substr($year, 2);
            $studentDOB = trim($smallYear . $DOBMonth . $DOBDay);
            $studentNameInQR = $studentDetails->studentName;
            $studentNameInQR = str_replace(" ", "", trim($studentNameInQR));
            $studentNameInQR = str_replace(".", "", $studentNameInQR);
            $combineString = $studentNameInQR . $studentDOB . $batchCode;
            $ciphertext = hash_hmac('sha256', $combineString, $QUICK);
            $ciphertext_base64 = base64_encode($ciphertext);
            $allString = $combineString . "|" . $ciphertext_base64;
            return "https://chart.googleapis.com/chart?chs=100x100&cht=qr&chl=$allString&choe=UTF-8";
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get Template name from multiple templates
     * @param settings type
     * @param settings name
     * @param  $id
     * @return string templateName
     * @throws ProfessionalException
     * @author Anoop
     *
     */
    public function getCustomTemplate($type, $name, $id = NULL)
    {
        $id = $this->realEscapeString($id);
        $type = $this->realEscapeString($type);
        $name = $this->realEscapeString($name);
        $customTemplate = NULL;
        try {
            $customTemplateJSON = CommonService::getInstance()->getSettings($type, $name);
            $customTemplateJSON = json_decode($customTemplateJSON);
            if (!empty($customTemplateJSON->custom)) {
                foreach ($customTemplateJSON->custom as $template) {
                    if (in_array($id, $template->id)) {
                        $customTemplate = $template->templateId;
                    }
                }
            }
            $customTemplate = ($customTemplate && $id != NULL) ? $customTemplate : $customTemplateJSON->default;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $customTemplate;
    }
    public function getAcademicYearByDate($date = null)
    {
        $academicYear = "";
        $date = $date ? date("Y-m-d", strtotime($date)) : date("Y-m-d");
        $month = date("m", strtotime($date));
        if ($month > 06) {
            $date = date('Y', strtotime($date));
        } else {
            $date = date('Y', strtotime($date)) - 1;
        }
        $academicYear = $date . "-" . substr(($date + 1), 2);
        return $academicYear;
    }
    /**
     * update settings which contains json values as value
     *
     * @param [type] $type
     * @param [type] $name
     * @param [type] $key
     * @param [type] $property
     * @param [type] $value
     * @return void
     */
    public function updateSettingsValueWithJson($type, $name, $key, $property, $value)
    {
        $type = $this->realEscapeString($type);
        $name = $this->realEscapeString($name);
        $key = $this->realEscapeString($key);
        $property = $this->realEscapeString($property);
        $value = $this->realEscapeString($value);
        global $connect;
        $sql = "UPDATE settings SET value=JSON_SET(value, '\$.$key.$property', '$value') WHERE name='$name' AND TYPE='$type'";
        try {
            return $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Written for staff side quiz
     */
    function getAllHtmldata($string, $dontReplaceTags, $first, $last = null)
    {
        $question = $first ? htmlspecialchars_decode($string) : $string;
        $string = CommonUtil::get_string_between2_strings($question, '```', '```');
        $replaceString = $dontReplaceTags ? '|||' . htmlspecialchars($string) . '|||' : htmlspecialchars($string);
        $question = str_replace('```' . $string . '```', $replaceString, $question);
        if (CommonUtil::get_string_between2_strings($question, '```', '```')) {
            $question = CommonService::getAllHtmldata($question, $dontReplaceTags, 0);
        }
        if ($last) {
            $question = str_replace('|||', '```', $question);
        }
        return $question;
    }
    /**
     * get email credential by  module
     * @param string $module
     * @throws ProfessionalException
     * @return object|NULL|\com\linways\base\util\$objectList[]
     */
    public function getEmailConfByModule($module)
    {
        $sql ="SELECT * FROM module_email_configuration WHERE module='$module'";
        try {
            return $this->executeQueryForObject($sql);
        } catch ( \Exception $e ) {
            throw new ProfessionalException ( $e->getCode (), $e->getMessage () );
        }
    }
    /**
     * Convert number to ordinal word
     * @param Integer $num
     * @return String $string
     */
    function numToOrdinalWord($num)
    {
        $first_word = array('eth','First','Second','Third','Fouth','Fifth','Sixth','Seventh','Eighth','Ninth','Tenth','Elevents','Twelfth','Thirteenth','Fourteenth','Fifteenth','Sixteenth','Seventeenth','Eighteenth','Nineteenth','Twentieth');
        $second_word =array('','','Twenty','Thirty','Forty','Fifty');
        if($num <= 20)
            return $first_word[$num];
        $first_num = substr($num,-1,1);
        $second_num = substr($num,-2,1);
        return $string = str_replace('y-eth','ieth',$second_word[$second_num].'-'.$first_word[$first_num]);
    }
    function constructResponseHtmlForBarcode($studentDetails, $type)
    {
        $responseHtml = '';
        $responseHtml .= "
        <div id='printDiv_$type'>
            <style>
                .barcodeDiv {
                    width:5.25cm;
                    line-height:2cm;
                    vertical-align:middle !important;
                    text-align: center;
                    margin:1.5mm 0;
                }
                .barcodeDiv > div { margin : auto; }
                table tr,
                table tr td {
                    page-break-inside: avoid;
                }
            </style>
            <table border='0' cellpadding='0' cellspacing='0'>";
            foreach ( $studentDetails as $student ) {
                $barcodeobj = new TCPDFBarcode($student->regNo, 'C128');
                $responseHtml .= "
                <tr style='text-align:center;'>
                    <td>
                        <div class='barcodeDiv' style='font-size:18px;'><b>".$student->regNo."</b></div>
                    </td>
                    <td>
                        <div class='barcodeDiv'>".$barcodeobj->getBarcodeHTML(1, 30, 'black')."</div>
                    </td>
                </tr>";
            }
            $responseHtml .= "
            </table>
        </div>
        <button class='btn btn-sm btn-primary' style='margin-left:5cm' @click=\"printBarcode('printDiv_$type')\">Print</button>";
        return $responseHtml;
    }
    /**
     * Undocumented function
     *
     * @param string $colspan
     * @return Object
     */
    public function getCollegeHeaders()
    {
        global $COLLEGE_NAME;
        global $COLLEGE_ADDRESS1;
        global $COLLEGE_ADDRESS2;
        global $COLLEGE_CONTACT1;
        global $COLLEGE_CONTACT2;
        global $COLLEGE_CODE;
        global $COLLEGE_AFFLIATE;
        global $COLLEGE_WEBSITE;
        global $COLLEGE_NAME_NEW;
        global $COLLEGE_CODE;
        $college = new \stdClass();
        $college->code = $COLLEGE_CODE;
        $college->name = $COLLEGE_NAME_NEW?$COLLEGE_NAME_NEW:$COLLEGE_NAME;
        $college->address1 = $COLLEGE_ADDRESS1;
        $college->address2 = $COLLEGE_ADDRESS2;
        $college->contact1 = $COLLEGE_CONTACT1;
        $college->contact2 = $COLLEGE_CONTACT2;
        $college->affliate = $COLLEGE_AFFLIATE;
        $college->website = $COLLEGE_WEBSITE;
        // $college->reportHeader = "../../libcommon/images/college/".($COLLEGE_NAME_NEW?$COLLEGE_NAME_NEW:$COLLEGE_NAME)."/report-header.png";
        $college->reportHeader = "../../libcommon/images/college/".($COLLEGE_CODE)."/report-header.png";
        $collegeUrl = $GLOBALS['_SERVER']['REQUEST_SCHEME']."://".$GLOBALS['_SERVER']['HTTP_HOST'];
        $addOn = (getenv("DEBUG") === "true") ? "http://localhost/" : $collegeUrl."/";
        $bannerUrl = $addOn."libcommon/images/college/".$college->code."/college_header_banner.png";
    
        if (CommonService::getInstance()->url_exists($bannerUrl)) {
            // If the header banner exists at the URL
            $college->collegeBannerHeader = $bannerUrl;
            $college->isCollegeBannerHeaderExist = true;
        }
        try{
            $college->templateSettings = json_decode( CommonService::getInstance()->getSettings("V4_COMMON_TEMPLATE_SETTINGS","V4_COMMON_TEMPLATE_CONFIGURATION"));
            return $college;
        }catch (\Exception $e) {
        }
    }
     /**
     * Common header function
     * @param CommonHeaderRequest $headerRequest
     * @return void
     */
    public function getCollegeCommonHeader(CommonHeaderRequest $headerRequest,$collegeProperty = null){
        $college = $this->getCollegeHeaders();
        $templateName = $college->templateSettings->templateName??"conventionalTemplate";
        $header = TwigRenderer::renderTemplateFileToHtml(__DIR__."/../../../../core/templates/headerTwigs/$templateName.twig", [ 'headerRequest' => $headerRequest,'collegeProperty'=>$collegeProperty,'college'=>$college]);
        // need to display filters
        return $header;
    }
    public function checkV3AdminIsEnabledToUser($staffId){
        $staffId = $this->realEscapeString($staffId);
        if(empty($staffId))
            throw new ProfessionalException(ProfessionalException::INVALID_LOGIN,"Invalid user! Please try again");
        $sql = "SELECT a.adminID AS id, a.adminAccount AS account, a.adminPassword AS password, s.staffID as staffId, s.staffAccount, s.staffPassword from adminaccount a
        INNER JOIN staffaccounts s ON s.staffID = a.staff_id
        WHERE a.is_blocked = 0 AND s.isResigned = 0 AND s.staffID = $staffId ;";
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    public function checkV3HrAdminIsEnabledToUser($staffId){
        $staffId = $this->realEscapeString($staffId);
        if(empty($staffId))
            throw new ProfessionalException(ProfessionalException::INVALID_LOGIN,"Invalid user! Please try again");
        $sql = "SELECT a.adminID AS id,
                        a.adminAccount AS account,
                        a.adminPassword AS password,
                        s.staffID as staffId,
                        s.staffAccount,
                        s.staffPassword
                        from hr_admin a
                        INNER JOIN staffaccounts s ON s.staffID = a.staff_id
                        WHERE s.isResigned = 0 
                        AND s.staffID = $staffId ;";
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    public function validateAdminWithStaff($staffId,$adminId){
        $staffId = $this->realEscapeString($staffId);
        $adminId = $this->realEscapeString($adminId);
        $where = "";
        if(empty($staffId))
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETERS,"Invalid user! Please try again");
        if($adminId){
            $where = " AND a.adminID <> $adminId ";
        }
        $sql = "select a.adminID as id from adminaccount a where a.staff_id = $staffId $where;";
        try {
            return $this->executeQueryForObject($sql)->id;
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get staff permissions for assigned digital valuation count
     * @param string $request
     * @throws ProfessionalException
     * @return object|NULL|\com\linways\base\util\$objectList[]
     */
    public function getDigitalValuationStaffPermission($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = "";
        $permissionSql = "";
        $permission = false;
        $condition = "";
        if(!$request->staffId || !$request->studentId || !$request->examId || !$request->valCount){
            return $permission;
        }
        try {
            if($request->revalId){
                $digitalValuationProperties = $this->getSettings(SettingsConstents::EXAM_CONTROLLER, SettingsConstents::DIGITAL_VALUATION_PROPERTIES);
                $digitalValuationProperties = $digitalValuationProperties ? current(json_decode($digitalValuationProperties)->revaluation) : "";
                //FOR SCRUTINY
                if($digitalValuationProperties->considerRevaluationType){
                    $request->markEntryType = $request->scrId ? "SCRUTINY":"REVALUATION";
                    $revaluationTypeId = (int)ExamRevaluationService::getInstance()->getRevaluationTypeIdByOeRequest($request)->revaluationTypeId;
                    $condition = $revaluationTypeId  ? " AND revaluationTypeId IN ($revaluationTypeId)" : "";
                }
                //FOR REVALUATION
                $permissionSql = "SELECT id FROM examRevaluationStaffAssignedStudents
                                    WHERE revaluationId = '$request->revalId' AND examId = '$request->examId' AND studentId = '$request->studentId'  AND staffId = '$request->staffId' AND valuationCount = '$request->valCount$condition ";
            }
            else if($request->rvwId){
                //consider reviewer as valuation count 2
                $request->valuationCount = 2;
                $examList = StaffService::getInstance()->getExamsAssignedForValuationByStaff($request);
                if(!empty($examList)){
                    $permission = true;
                }
                return $permission;
            }
            else{
                //FOR REGULAR AND SUPPLY
                $sql = "SELECT examID as examId,subjectID as subjectId ,IF(examregID,examregID,supply_examreg_id) as examRegId,IF(examregID,'REGULAR','SUPPLY') as examType  FROM exam WHERE examID IN ($request->examId)";
                $examDetails = $this->executeQueryForObject($sql);
                if ($examDetails) {
                    $permissionSql = "SELECT id FROM examValuationStaffAssignedStudents
                                        WHERE examRegId = '$examDetails->examRegId' AND examType = '$examDetails->examType' AND subjectId = '$examDetails->subjectId' AND studentId = '$request->studentId'  AND staffId = '$request->staffId' AND valuationCount = '$request->valCount'";
                }
            }
            $result =  $permissionSql ? $this->executeQueryForObject($permissionSql)->id :"";
            $permission = $result ? true : false;
            return $permission;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get student custom field enabled values
     * @param string $request
     * @throws ProfessionalException
     * @return object|NULL|\com\linways\base\util\$objectList[]
     */
    public function getCustomFieldObjectList($customFields)
    {
        $fieldList = [];
        $response = new \stdClass();
        $studentData = new \stdClass();
        $orderNo = 1;
        foreach ($customFields as $customField) {
            $field = json_decode('{"columnName":"","displayName":"","fieldType":"","format":"","orderNo":0,"validation":"text","editable":true,"required":false,"relatedFieldList":[],"relatedFieldSeperator":"","foreignkeyTableDetails":{},"tableType":"CUSTOM"}');
            $field->columnName = $customField->code;
            $field->displayName = $customField->label;
            $field->fieldType = $this->getDataType($customField->dataType);
            $field->orderNo = $orderNo++;
            $studentData->{$customField->code} = $customField->value;
            $fieldList[] = $field;
        }
        $response->fieldList = $fieldList;
        $response->studentData = $studentData;
        return $response;
    }
    private function getDataType($dataType)
    {
        switch ($dataType) {
            case "longtext":
                return "textarea";
                break;
            case "varchar":
                return "text";
                break;
            case "integer":
                return "text";
        }
    }
    /**
     * Get studentDetails By false no ,examId
     * @param int $request
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getStudentDetailsByFalseNumber($request)
    {
        $request = $this->realEscapeObject($request);
        $sqlR = "";
        $sql = "";
        $regularExamId = "";
        if (!$request->examId || !$request->falseNumber) {
            return false;
        }
        try {
            //new digital valuation properties
            $digitalValuationProperties = $this->getSettings(SettingsConstents::EXAM_CONTROLLER, SettingsConstents::DIGITAL_VALUATION_PROPERTIES);
            $digitalValuationProperties = $digitalValuationProperties ? json_decode($digitalValuationProperties) : new \stdClass;
            if ($request->examType == ExamType::SUPPLY && $digitalValuationProperties->getRegularFalseNumberForSupply) {
                //get regular false number for supply
                $sqlR = "SELECT er.examregID as examRegId,er.examID as regularExamId  from exam es
                        INNER JOIN  exam er ON er.semID = es.semID AND er.batchID=es.batchID AND er.subjectID = es.subjectID AND er.examregID IS NOT NULL
                        WHERE  es.examID IN($request->examId)";
                $regularExamId =  $this->executeQueryForObject($sqlR)->regularExamId;
            }
            $examId = $regularExamId ? $regularExamId : $request->examId;
            $sql = "SELECT studentID as userId FROM examcontroller_false_number WHERE false_number = '$request->falseNumber' AND examID = '$examId'";
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function verifyMailId($mailId){
        $mailId = $this->realEscapeString($mailId);
        $sql = " select studentAccount, studentPassword, studentEmail from studentaccount s where studentEmail = '$mailId'";
        try{
            $studentCredentials =  $this->executeQueryForList($sql);
        }catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $studentCredentials;
     }
    /**
     * Get student exam details by examId,studentId
     * @param int $request
     * @return Boolean
     * @throws ProfessionalException
     */
    public function getStudentExamDetailsByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $status = false;
        $sql = "";
        if (!$request->examId || !$request->studentId) {
            return $status;
        }
        try {
            $examDetails = ExamService::getInstance()->getExamDetailsByExamId($request->examId);
            if($examDetails->examregID){
                $sql = "SELECT ers.studentID as studentId,e.examID as examId,e.examDate,e.examStartTime ,e.examEndTime  FROM exam e 
                        INNER JOIN exam_reg_studentsubject erss ON erss.subjectID = e.subjectID AND erss.examregID = e.examregID 
                        INNER JOIN exam_reg_studentchallan ers ON ers.examregID = e.examregID AND ers.studentID = erss.studentID
                        WHERE e.examID IN ($request->examId) AND erss.studentID IN ($request->studentId) AND ers.paid =1";
            }else if($examDetails->supplyRegId){
                $sql = "SELECT ers.studentID as studentId,e.examID as examId,e.examDate,e.examStartTime ,e.examEndTime  FROM exam e 
                        INNER JOIN exam er ON er.subjectID = e.subjectID AND er.batchID = e.batchID AND er.semID = e.semID AND er.examregID IS NOT NULL
                        INNER JOIN exam_supplementary_student_subjects erss ON erss.exam_supplementary_id = e.supply_examreg_id AND erss.examID = er.examID 
                        INNER JOIN exam_supplementary_student_details ers ON ers.exam_supplementary_id = e.supply_examreg_id AND ers.studentID = erss.studentID
                        WHERE e.examID IN ($request->examId) AND erss.studentID IN ($request->studentId) AND ers.paid =1";
            }else{
                return $status;
            }
            $studentExam =  $this->executeQueryForObject($sql);
            if($studentExam->examDate && $studentExam->examStartTime && $studentExam->examEndTime){
                $today = strtotime(date("Y-m-d"));
                $currentTime = strtotime(date("h:i A"));
                $examDate = strtotime($studentExam->examDate);
                if ($today == $examDate) {
                    $startTime = strtotime($studentExam->examStartTime);
                    $endTime = strtotime($studentExam->examEndTime);
                    if (($currentTime >= $startTime) && ($currentTime < $endTime)) {
                        $status = true;
                    }
                }
            }
            return $status;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get student exam details by examId,studentId
     * @param Array
     * @return Array
     * @throws ProfessionalException
     */
    public function htmlEntityDecodeArrayOfObjects($result)
    {
       try {
        $final = [];
        foreach ($result as $value) {
            $obj = [];
            foreach ($value as $key => $val) {
                $obj[$key] = html_entity_decode($val);
            }
            $obj = (Object) $obj;
            $final[] = $obj;
        }
            return $final;
        
       } catch (\Exception $e) {
        throw new ProfessionalException($e->getCode(), $e->getMessage());
    }
    }
    /**
     * Check file exist using url 
     *
     * 
     **/
    public function url_exists($url) {
        $headers = @get_headers($url);
        return $headers && strpos($headers[0], '200') !== false;
    }
    
    /**
     * GET CLUSTER DETAILS
     * @param int $clusterId
     * @return object
     * @throws ProfessionalException
     * @author Midhun Shaji
     */
    
    public function getClusterDetails($clusterId){
        $clusterId = $this->realEscapeString($clusterId);
        $sql = "SELECT id, `name` , properties->>'$.clusterCategory' as clusterCategory  FROM cluster WHERE id = '$clusterId'";
        try{
            return $this->executeQueryForObject($sql);
        }catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
}