Your IP : 216.73.217.79


Current Path : /var/www/cesa.co.za/cesanet/
Upload File :
Current File : /var/www/cesa.co.za/cesanet/inc_shared.php

<?php

// error_reporting(E_ALL);
// ini_set('display_errors', 1);

// Include the CESA error handler
include_once($_SERVER['DOCUMENT_ROOT'] . '/php/includes/error_handling/bootstrap.php');

include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/maill.php");
include_once($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php');

if (!function_exists('cesaLoadEnvFile')) {
    /**
     * Load key/value pairs from the project .env file into process env.
     * Existing environment variables are not overwritten.
     */
    function cesaLoadEnvFile($envFilePath)
    {
        if (!is_string($envFilePath) || !file_exists($envFilePath) || !is_readable($envFilePath)) {
            return;
        }

        $lines = file($envFilePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        if (!is_array($lines)) {
            return;
        }

        foreach ($lines as $line) {
            $line = trim($line);

            if ($line === '' || strpos($line, '#') === 0) {
                continue;
            }

            $splitPos = strpos($line, '=');
            if ($splitPos === false) {
                continue;
            }

            $name = trim(substr($line, 0, $splitPos));
            $value = trim(substr($line, $splitPos + 1));

            if ($name === '') {
                continue;
            }

            // Strip wrapping quotes if present.
            if (
                strlen($value) >= 2 &&
                (($value[0] === '"' && substr($value, -1) === '"') || ($value[0] === "'" && substr($value, -1) === "'"))
            ) {
                $value = substr($value, 1, -1);
            }

            // Keep explicit process/webserver vars as source of truth.
            $existing = getenv($name);
            if ($existing !== false && $existing !== '') {
                continue;
            }

            putenv($name . '=' . $value);
            $_ENV[$name] = $value;
            $_SERVER[$name] = $value;
        }
    }
}

cesaLoadEnvFile($_SERVER['DOCUMENT_ROOT'] . '/.env');

include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/BaseTableClass.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADec_Contacts.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADecQuestionnaires.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADec_OfficeContacts.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADec_PIUnderwriters.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADec_tblMemberFirms.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADec_tblMemberFirmOffices.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADec_tblMemberFirmSkills.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADec_Transformation.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADQAnswers.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADQAudit.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ADQAuditAnswers.php");
include_once($_SERVER['DOCUMENT_ROOT'] . '/php/includes/AnonRespondees.php');
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/AwardsEntries.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/BatchJob.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEAssignment.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEAssignmentMarking.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEBooks.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCECourseSchedules.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEDocCategories.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEDocuments.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEExam.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEConvenorAuth.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEExamQuestion.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEFacilitatorUser.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEMessageLog.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEMessages.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEModules.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEResourceGroups.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEResources.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCESetup.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEStAssigExtension.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEStAssigExtensionRequest.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEStudentAssignment.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEStudentCourses.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEStudents.php");
include_once($_SERVER['DOCUMENT_ROOT'] . '/php/includes/CCEModuleMarksService.php');
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCETemplates.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CCEWeeklySessions.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/Certificates.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/Contact.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CPDServiceProvider.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CPDSPReview.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/CPDTrainingMaterial.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/ErrorLog.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/EventSchedules.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/FileUploads.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/HTMLHelper.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/KeyValue.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/MarketingAttendees.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/MemberContact.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/MemberFirm.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/MemberFirmSkill.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/MemberFirmOffices.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/OfficeContact.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/Picklists.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/Questionnaires.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/SchoolAttendees.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/SchoolCourses.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/SchoolEvents.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/SchoolPresenters.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/TrainingProvider.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/TrainingProviderDoc.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/Transformation.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/UnempPractitioners.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/Utils.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/WeeklySessionsParser.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/cstUnreadMessages.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/cstWeeksCourses.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/mail/MailMessages.php");
include_once($_SERVER['DOCUMENT_ROOT'] . "/php/includes/sqlFunctions.php");

if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/contracts/fpdf184/fpdf.php')) {
    include_once($_SERVER['DOCUMENT_ROOT'] . '/contracts/fpdf184/fpdf.php');
}

if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/contracts/FPDI-2.3.6/src/autoload.php')) {
    include_once($_SERVER['DOCUMENT_ROOT'] . '/contracts/FPDI-2.3.6/src/autoload.php');
}

$env = 'prod';

if (
    strpos($_SERVER['HTTP_HOST'], 'devstage') !== false
    || strpos($_SERVER['DOCUMENT_ROOT'], 'clients/client') !== false
    || strpos($_SERVER['HTTP_HOST'], 'cesa.local') !== false
    || strpos($_SERVER['HTTP_HOST'], 'localhost') !== false
    || strpos($_SERVER['DOCUMENT_ROOT'], 'BitBucket') !== false
) {
    $env = 'dev';
}

function GeneratePDF($sToFile, $content, $orientation = "portrait", $margin = 10)
{

    if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/echasl23/downloads/")) {
        mkdir($_SERVER['DOCUMENT_ROOT'] . "/echasl23/downloads/");
    }

    $newfile = $_SERVER['DOCUMENT_ROOT'] . "/echasl23/downloads/" . str_replace(".html", "_html.pdf", $sToFile);
    //    echo $newfile;
    //    exit;
    if (file_exists($newfile))
        unlink($newfile);

    $sHTMLfile = $_SERVER['DOCUMENT_ROOT'] . "/echasl23/downloads/" . $sToFile;
    if (file_exists($sHTMLfile))
        unlink($sHTMLfile);
    file_put_contents($sHTMLfile, $content);

    $process = $_SERVER['DOCUMENT_ROOT'] . '/wkhtmltopdf/wkhtmltox/bin/wkhtmltopdf';

    if (
        strpos($_SERVER['HTTP_HOST'], 'dev') !== false
        || strpos($_SERVER['HTTP_HOST'], 'cesa.local') !== false
        || strpos($_SERVER['HTTP_HOST'], 'localhost') !== false
    ) {
        $process = 'wkhtmltopdf';
    }

    $process .= ' -B ' . $margin . ' -L ' . $margin . ' -R ' . $margin . ' -T ' . $margin . ' --print-media-type ';
    if ($orientation == "landscape")
        $process .= " -O landscape ";
    $process .= '--load-error-handling abort "' . $sHTMLfile . '" "' . $newfile . '"';

    exec($process, $error);

    var_dump($error);

    if (file_exists($newfile)) {
        $f = fopen($newfile, "rb+");
        fseek($f, 44);
        fwrite($f, "                                    ");
        fseek($f, 95);
        fwrite($f, "                ");
        fclose($f);
    }

    return str_replace(".html", "_html.pdf", $sToFile);
}

function CreateThumb($iDocID, $iDocFile, $sTable = "", $docData = array())
{

    global $conni;

    if (strlen($sTable) <= 0) {
        $sTable = 'CCEDocuments';
    }

    if (isset($docData['DocumentCategory'])) {

        $docthumb = '/cesanet/images/';
        $moduleName = '';

        switch ($docData['CCEModuleID']) {
            case 1:
                $moduleName .= 'cee';
                break;
            case 2:
                $moduleName .= 'project-deliver';
                break;
            case 3:
                $moduleName .= 'finance';
                break;
            default:
                $moduleName .= 'law';
                break;
        }

        switch ($docData['DocumentCategory']) {
            case 1:
                $docthumb .= 'pre-block-reading.jpg';
                break;
            case 2:
                $docthumb .= 'timetable.png';
                break;
            case 3:
                $docthumb .= 'reference-' . $moduleName . '.png';
                break;
            case 5:
                $docthumb .= 'reading-resources.jpg';
                break;
            case 7:
                $docthumb .= 'presentation-' . $moduleName . '.png';
                break;
            case 8:
                $docthumb .= 'general.png';
                break;
            case 9:
                $docthumb .= 'docs-hard-copy.png';
                break;
            default:
                $docthumb .= 'general.png';
                break;
        }
    } else {
        $im = new imagick('../cceadmin/documents/' . $iDocFile . '[0]');
        $im->setImageFormat("jpg");
        $im->thumbnailImage(0, 60);
        $im->borderImage(new ImagickPixel("black"), 1, 1);
        $docthumb = 'docthumbs/' . "doc" . $iDocID . ".jpg";
        $im->writeImage($_SERVER['DOCUMENT_ROOT'] . '/cesanet/' . $docthumb);
    }

    $sql = "UPDATE " . $sTable . " SET DocumentThumb='" . $docthumb . "' WHERE CCEDocumentID=" . $iDocID;
    mysqli_query($conni, $sql);
    return $docthumb;
}

function GetResubDate($iAssigID, $studentID = 0)
{

    global $sqlf;

    $studentAssignmentObj = new CCEStudentAssignment($sqlf);
    return $studentAssignmentObj->getResubmitDate($iAssigID, $studentID);

    /*
    global $conni;
    // When was the feedback sent?
    $sql = "SELECT MIN(CCEMessages.SentDateTime) AS FeedbackSent, SA1.ResubmitDateOverride 
        FROM CCEStudentAssignments SA1
        JOIN CCEAssignmentFeedback ON (SA1.CCEStudentAssigID=CCEAssignmentFeedback.CCEStudentAssigID)
        JOIN CCEMessages USING (CCEMessageID) 
        WHERE SA1.CCEAssignmentID=" . $iAssigID . " AND SA1.Passed>0";

    if ($studentID > 0) {
        $sql .= ' AND SA1.CCEStudentID = ' . $studentID;
    }

    // echo '==========================<br />'
    //     . 'Please ignore debug information: ' . $sql . '<br />'
    //     . '==========================<br />';

    $recR = mysqli_query($conni, $sql);
    if ($rowR = mysqli_fetch_assoc($recR)) {
        if (!empty($rowR["ResubmitDateOverride"]) && strlen($rowR["ResubmitDateOverride"]) > 0 && $studentID > 0) {
            //Only take resubmit date into account for individual students
            //            echo $rowR["FeedbackSent"];
            //            exit;
            return date("Y-m-d", strtotime($rowR["ResubmitDateOverride"]));
        } elseif (!empty($rowR["FeedbackSent"]) && strlen($rowR['FeedbackSent']) > 0) {
            //            echo $rowR["FeedbackSent"];
            //            exit;
            return date("Y-m-d", strtotime("+15 days", strtotime($rowR["FeedbackSent"])));
        }
    }
    return "";
    */
}

function GetOverdue($iStudentID, $sModules)
{

    global $conni;

    if (empty($sModules))
        $sModules = "1,2,3,4,5";

    $sql = "SELECT DueDate, CCEAssignments.CCEAssignmentID, RefNum, AssignmentName, MAX(CCEExtensionDate) AS ExtDate, GROUP_CONCAT(CCEStudentAssignments.CCEStudentAssigID) AS CCEStudentAssigID,
		GROUP_CONCAT(DISTINCT RulingCode) AS Rulings
	FROM CCEAssignments LEFT JOIN CCEStudentAssignments
	ON (CCEAssignments.CCEAssignmentID=CCEStudentAssignments.`CCEAssignmentID`
	AND CCEStudentAssignments.`CCEStudentID`=" . $iStudentID . ")
	LEFT JOIN CCEStAssigExtensionRequests ON (CCEAssignments.CCEAssignmentID=CCEStAssigExtensionRequests.`CCEAssignmentID`
	AND CCEStAssigExtensionRequests.`CCEStudentID`=" . $iStudentID . "
	AND CCEStAssigExtensionRequests.Status='A')
	WHERE CCEAssignments.`Archived`=0
	AND CCEAssignments.CCEModuleID IN (" . $sModules . ")
	AND CCEAssignments.`DueDate`<CURDATE()
	AND YEAR(CCEAssignments.DueDate)=YEAR(NOW())
	GROUP BY DueDate, CCEAssignments.CCEAssignmentID, RefNum, AssignmentName
	ORDER BY DueDate";

    //    echo '<!-- ' . $sql . ' -->';

    $recOverdue = mysqli_query($conni, $sql);
    $arrOverdue = array();
    while ($recOverdue && $rowOverdue = mysqli_fetch_assoc($recOverdue)) {

        if (empty($rowOverdue["CCEStudentAssigID"])) {

            if (empty($rowOverdue["ExtDate"]) || (strtotime($rowOverdue["ExtDate"]) < mktime(0))) {
                $arrOverdue[$rowOverdue["CCEAssignmentID"]] = date("d M", strtotime($rowOverdue["DueDate"])) . ": <a href='/cesanet/assignmentinfo.php?id=" . $rowOverdue["CCEAssignmentID"] . "'>" . $rowOverdue["RefNum"] . ": " . $rowOverdue["AssignmentName"] . "</a>";
            }
        } elseif ((strpos($rowOverdue["CCEStudentAssigID"], ",") === false) && ($rowOverdue["Rulings"] == "R")) {

            $dtResub = GetResubDate($rowOverdue["CCEAssignmentID"]);

            if (!empty($dtResub) && (strtotime($dtResub) < mktime(0))) {
                $arrOverdue[$rowOverdue["CCEAssignmentID"]] = date("d M", strtotime($dtResub)) . ": <a href='/cesanet/assignmentinfo.php?id=" . $rowOverdue["CCEAssignmentID"] . "'>" . $rowOverdue["RefNum"] . ": " . $rowOverdue["AssignmentName"] . " (Resubmission)</a>";
            }
        }
    }

    if (!is_array($arrOverdue)) {
        $arrOverdue = array();
    }

    return $arrOverdue;
}

function GetAverageAssigScore($iStudentID = 0, $bInterim = false, $moduleNum = 0, $year = 0)
{
    global $conni;

    $sModulesEnrolled = "1,2,3,4,5";
    $sql = "SELECT ModulesEnrolled FROM CCEStudents WHERE CCEStudentID=" . $iStudentID;
    $recAS = mysqli_query($conni, $sql);
    if ($rowAS = mysqli_fetch_assoc($recAS)) {
        $sModulesEnrolled = $rowAS["ModulesEnrolled"];
    }
    mysqli_free_result($recAS);
    if ($bInterim) {
        $sql = "SELECT AVG(CCEAssignmentMarking.Score) AS ScoreAvg
		FROM CCEStudents INNER JOIN CCEStudentCourses USING (CCEStudentID)";

        if ($year <= 0) {
            $sql .= " INNER JOIN CCESetup ON (CCEStudentCourses.CCECourseScheduleID=CCESetup.CurrentScheduleID) ";
        }

        $sql .= " INNER JOIN CCEStudentAssignments on (CCEStudents.CCEStudentID=CCEStudentAssignments.CCEStudentID)
		INNER JOIN CCEAssignmentMarking on (CCEAssignmentMarking.CCEStudentAssigID=CCEStudentAssignments.CCEStudentAssigID)
		INNER JOIN CCEAssignments ON (CCEAssignments.CCEAssignmentID=CCEStudentAssignments.CCEAssignmentID)
		WHERE ";

        if ($iStudentID > 0) {
            $sql .= "CCEStudentAssignments.CCEStudentID=" . $iStudentID . " AND ";
        }

        if ($year <= 0) {
            $year = date('Y');
        }

        $sql .= "CCEAssignmentMarking.Ruling NOT IN ('R', '')
		AND YEAR(CCEStudentAssignments.DateSubmitted)=" . $year . "
		AND CCEAssignments.CCEModuleID IN (" . $sModulesEnrolled . ")";
    } else {
        $sql = "SELECT AVG(CCEStudentAssignments.AssignmentScore) AS ScoreAvg
		FROM CCEStudents INNER JOIN CCEStudentCourses USING (CCEStudentID) ";

        if ($year <= 0) {
            $sql .= " INNER JOIN CCESetup ON (CCEStudentCourses.CCECourseScheduleID=CCESetup.CurrentScheduleID) ";
        }

        $sql .= " INNER JOIN CCEStudentAssignments on (CCEStudents.CCEStudentID=CCEStudentAssignments.CCEStudentID)
		INNER JOIN CCEAssignments ON (CCEAssignments.CCEAssignmentID=CCEStudentAssignments.CCEAssignmentID)
		WHERE ";

        if ($iStudentID > 0) {
            $sql .= " CCEStudentAssignments.CCEStudentID=" . $iStudentID . " AND ";
        }

        if ($year <= 0) {
            $year = date('Y');
        }

        //        $sql .= "CCEStudents.Archived=0 AND ";
        $sql .= " YEAR(CCEStudentAssignments.DateSubmitted) = " . $year . " AND ";
        $sql .= " CCEStudentAssignments.RulingCode NOT IN ('R', '') AND CCEAssignments.CCEModuleID IN (" . $sModulesEnrolled . ")";
    }

    //    echo $sql;

    if ($moduleNum > 0) {
        $sql .= ' AND CCEAssignments.CCEModuleID = ' . $moduleNum;
    }

    // Omit scores for modules in ModulesExcluded (class aggregates and per-student averages).
    if (class_exists('CCEStudents')) {
        $sql .= CCEStudents::sqlClassAverageExclusionClause('CCEStudents', 'CCEAssignments.CCEModuleID');
    }

    $recAvg = mysqli_query($conni, $sql);
    if ($rowAvg = mysqli_fetch_assoc($recAvg)) {
        $iAvg = number_format($rowAvg["ScoreAvg"], 1);
    } else
        $iAvg = 0;
    mysqli_free_result($recAvg);
    return $iAvg;
}

function GetClassAssigAverage($iAssigID = 0, $moduleId = 0, $studentId = 0)
{

    global $conni;

    $sql = "SELECT AVG(CCEStudentAssignments.AssignmentScore) AS ScoreAvg
	FROM CCEStudents INNER JOIN CCEStudentCourses USING (CCEStudentID)
	INNER JOIN CCESetup ON (CCEStudentCourses.CCECourseScheduleID=CCESetup.CurrentScheduleID)
	INNER JOIN CCEStudentAssignments on (CCEStudents.CCEStudentID=CCEStudentAssignments.CCEStudentID)
        INNER JOIN CCEAssignments ON CCEStudentAssignments.CCEAssignmentID = CCEAssignments.CCEAssignmentID
	WHERE CCEStudents.Archived=0 AND YEAR(CCEStudentAssignments.DateSubmitted)=" . date("Y") . "
	AND CCEStudentAssignments.RulingCode NOT IN ('R', '')";

    if (!empty($iAssigID)) {
        $sql .= " AND CCEStudentAssignments.CCEAssignmentID=" . intval($iAssigID);
    }

    if ($moduleId > 0) {
        $sql .= " AND CCEAssignments.CCEModuleID=" . intval($moduleId);
    }

    if ($studentId > 0) {
        $sql .= " AND CCEStudentAssignments.CCEStudentID=" . intval($studentId);
    }

    if (class_exists('CCEStudents')) {
        $sql .= CCEStudents::sqlClassAverageExclusionClause('CCEStudents', 'CCEAssignments.CCEModuleID');
    }

    //    echo '< ! -- ' . $sql . ' -- >';

    $rec = mysqli_query($conni, $sql);
    if ($row = mysqli_fetch_assoc($rec)) {
        $iClassAvg = number_format($row["ScoreAvg"], 1);
    } else
        $iClassAvg = 0;
    mysqli_free_result($rec);
    return $iClassAvg;
}

function SendStudentEmail($iStudentID, $iAssigID, $sStatus, $fullMessage = '', $subject = '')
{
    global $conni;

    $extensionDate = '';

    $sql = "SELECT FacilitatorID, FullName FROM CCEFacilitatorUsers WHERE Username='" . $_SESSION[EW_SESSION_USER_PROFILE_USER_NAME] . "'";
    //    echo $sql;
    //    exit;
    $SentByFacilitatorID = 0;
    $recFrom = mysqli_query($conni, $sql);
    if ($rowFrom = mysqli_fetch_assoc($recFrom)) {

        $sFrom = $rowFrom["FullName"];
        $SentByFacilitatorID = $rowFrom["FacilitatorID"] + 0;
    }
    mysqli_free_result($recFrom);

    $sql = "SELECT CCEAssignments.CCEModuleID, CCEAssignments.RefNum, CCEAssignments.AssignmentName, "
        . "CCEStAssigExtensionRequests.CCEExtensionDate, CCEStAssigExtensionRequests.StatusReason "
        . "FROM CCEAssignments "
        . "LEFT OUTER JOIN CCEStAssigExtensionRequests ON "
        . "(CCEAssignments.CCEAssignmentID=CCEStAssigExtensionRequests.`CCEAssignmentID` "
        . "AND CCEStAssigExtensionRequests.`CCEStudentID`=" . $iStudentID . ") "
        . "WHERE CCEAssignments.CCEAssignmentID=" . $iAssigID . " "
        . "ORDER BY CCEStAssigExtensionRequests.CCEStAssigExtensionID DESC";
    //	echo $sql;
    $recAssig = mysqli_query($conni, $sql);
    $statusReason = '';
    if ($rowAssig = mysqli_fetch_assoc($recAssig)) {
        $sRefNum = $rowAssig["RefNum"] . ' - ' . $rowAssig["AssignmentName"];
        $sModuleID = $rowAssig["CCEModuleID"];
        $extensionDate = $rowAssig["CCEExtensionDate"];

        if (strlen($rowAssig['StatusReason']) > 0) {
            $statusReason = "\r\n\r\n" . 'Convenors comments: ' . $rowAssig['StatusReason'] . "\r\n\r\n";
        }
    }
    mysqli_free_result($recAssig);

    $sSentTo = "";
    $sql = "SELECT FirstName, Surname, EmailAddress, KnownAs FROM CCEStudents WHERE CCEStudentID=" . intval($iStudentID);
    $recTo = mysqli_query($conni, $sql);
    if ($rowTo = mysqli_fetch_assoc($recTo)) {
        $sSentTo = $rowTo["KnownAs"] . " " . $rowTo["Surname"];
        $sEmail = $rowTo["EmailAddress"];
    }

    if (
        strpos($_SERVER['HTTP_HOST'], 'dev') !== false
        || strpos($_SERVER['HTTP_HOST'], 'cesa.local') !== false
        || strpos($_SERVER['HTTP_HOST'], 'localhost') !== false
    ) {
        $sEmail = 'cesa-sce-student@igotafrica.com';
    }

    mysqli_free_result($recTo);

    $sSubject = "BCE Assignment Extension Decision: " . $sRefNum;
    if ($sStatus == "A") {
        $sMessage = "Your request for an extension for assignment " . $sRefNum . " has been approved until " . $extensionDate . ". "
            . "Please ensure you meet the extension deadline, otherwise late penalties will apply.";
    } elseif ($sStatus == "P") {
        $sMessage = "Your request for an extension for assignment " . $sRefNum . " has been approved with a penalty of -1 "
            . "until " . $extensionDate . ". Please ensure you meet the extension deadline, otherwise late penalties will apply.";
    } elseif ($sStatus == "D") {
        $sMessage = "Your request for an extension was declined for assignment " . $sRefNum . ".";
    }

    $sMessage = "Dear " . $sSentTo . ",

" . $sMessage . $statusReason . ""
        . "\r\n\r\n"
        . "Should you wish to query this decision, please contact the module convenor via the CESAnet.";
    $isHTML = false;

    if ($sStatus == "Overdue" && strlen($fullMessage) > 0) {
        $sMessage = $fullMessage;
        $sSubject = $subject;
        $isHTML = true;
    }

    maill($sEmail, $sSubject, $sMessage, null, array('bcc' => array('bce@igotafrica.com', 'isHTML' => $isHTML)));

    $sMessage = sanitizeCceMessageHtml($sMessage);

    $sql = "INSERT INTO CCEMessages (CCEModuleID, SentByName, SentTo, SentDateTime, MessageSubject, MessageText, SentByFacilitatorID, SystemMessage)
	VALUES (" . $sModuleID . ", '" . $sFrom . "', '" . $sSentTo . "', '" . date("Y-m-d H:i:s") . "', '" . addslashes(stripslashes($sSubject)) . "', '" . addslashes(stripslashes($sMessage)) . "',
	" . $SentByFacilitatorID . ", 1)";
    //    echo $sql;
    //    exit;
    mysqli_query($conni, $sql);
    $sql = "INSERT INTO CCEMessagesSentTo (CCEMessageID, SentType, SentID) VALUES (" . mysqli_insert_id($conni) . ", 'Student', '" . $iStudentID . "')";
    mysqli_query($conni, $sql);
}

$numModules = 5;

if (!defined('CESA_TEST_STUDENT_IDS')) {
    define('CESA_TEST_STUDENT_IDS', serialize([54, 3920]));
}

if (!function_exists('getTestStudentIDs')) {
    function getTestStudentIDs()
    {
        return unserialize(CESA_TEST_STUDENT_IDS);
    }
}

if (!function_exists('isTestStudent')) {
    /**
     * @param int $studentId CCEStudentID to check
     * @return bool true when $studentId belongs to a known test/demo account
     */
    function isTestStudent($studentId)
    {
        return in_array((int) $studentId, getTestStudentIDs());
    }
}

if (!function_exists('hasActiveScheduledExam')) {
    /**
     * Check whether there is at least one CCEExam whose scheduled window
     * (StartDate..CloseDate) covers the current moment.
     *
     * @param int $questionnaireId  optional – limit check to a specific exam
     * @return bool
     */
    function hasActiveScheduledExam($questionnaireId = 0)
    {
        global $conni;

        $sql = "SELECT 1 FROM CCEExams
                WHERE StartDate IS NOT NULL
                AND CloseDate IS NOT NULL
                AND StartDate <= NOW()
                AND CloseDate >= NOW()";

        if ($questionnaireId > 0) {
            $sql .= " AND Questionnaire_ID = " . (int) $questionnaireId;
        }

        $sql .= " LIMIT 1";

        $rec = mysqli_query($conni, $sql);
        $found = $rec && mysqli_fetch_assoc($rec);
        if ($rec) {
            mysqli_free_result($rec);
        }
        return (bool) $found;
    }
}

// Function to clean HTML and line breaks from text
function cleanTextForCSV($text) {
    if (empty($text)) {
        return '';
    }
    // Strip HTML tags
    $text = strip_tags($text);
    // Replace line breaks and carriage returns with spaces
    $text = str_replace(array("\r\n", "\r", "\n"), ' ', $text);
    // Replace multiple spaces with single space
    $text = preg_replace('/\s+/', ' ', $text);
    // Trim whitespace
    return trim($text);
}