Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 52 |
CRAP | |
0.00% |
0 / 1993 |
NbaCoPoService | |
0.00% |
0 / 1 |
|
0.00% |
0 / 52 |
202050.00 | |
0.00% |
0 / 1993 |
__construct | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 3 |
|||
__clone | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 2 |
|||
getInstance | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 5 |
|||
getAssessmentTypeIdFromCode | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 14 |
|||
getPseudoSubjectList | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 13 |
|||
getAssessmentTypeCodeFromId | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 14 |
|||
saveCoValuesForSubjectAssessments | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 8 |
|||
deleteCoValuesOfSubjectAssessment | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 14 |
|||
insertCoValuesForSubjectAssessments | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 15 |
|||
savePoValuesForSubjectAssessments | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 8 |
|||
deletePoValuesOfSubjectAssessment | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 14 |
|||
insertPoValuesForSubjectAssessments | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 15 |
|||
getRulesForUniversityOrEndSemesterExamCoMapping | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 30 |
|||
calculatePoValuesFromCo | |
0.00% |
0 / 1 |
420.00 | |
0.00% |
0 / 77 |
|||
deleteAllPOsOfAParticularAssessment | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 14 |
|||
getAllCalculatedCosFromSubjectAssessmentTable | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 33 |
|||
calculateCoValuesForUniversityExam | |
0.00% |
0 / 1 |
342.00 | |
0.00% |
0 / 80 |
|||
calculateCoValuesForEndSemesterExam | |
0.00% |
0 / 1 |
462.00 | |
0.00% |
0 / 98 |
|||
calculateCoValuesForActivity | |
0.00% |
0 / 1 |
56.00 | |
0.00% |
0 / 43 |
|||
calculateAssessmentCOsAndPOs | |
0.00% |
0 / 1 |
930.00 | |
0.00% |
0 / 89 |
|||
getDescriptors | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 9 |
|||
getDescriptorById | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 10 |
|||
getProgramOutcomeListByBatchId | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 6 |
|||
getProgramOutcomeListByDeptId | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 11 |
|||
calculateCoAttainmentValuesAndStoreItToTreeForStudentMarkEntryMethod | |
0.00% |
0 / 1 |
306.00 | |
0.00% |
0 / 65 |
|||
calculateCoAttainmentValuesAndStoreItToTreeForStudentMarkEntryMethodForUniversity | |
0.00% |
0 / 1 |
240.00 | |
0.00% |
0 / 63 |
|||
getMaximumCorrelationForCoursePoMatrix | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 14 |
|||
getCoPoRelationMatrix | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 38 |
|||
getSubjectWiseCoListWithCoPoRelation | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 29 |
|||
createNewCoPoRelation | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 15 |
|||
deleteAllCoPoRelationByCoId | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 9 |
|||
deleteAllCoPoRelationByCoIdList | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 10 |
|||
getPosAndJustificationDetails | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 19 |
|||
saveCoPoJustification | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 17 |
|||
getPosAndJustificationDetailsForPseudoSubject | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 32 |
|||
saveCoPoJustificationPseudoSubject | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 20 |
|||
calculateCoOfOnlineExam | |
0.00% |
0 / 1 |
506.00 | |
0.00% |
0 / 124 |
|||
calculateCoOfPollsSurvey | |
0.00% |
0 / 1 |
462.00 | |
0.00% |
0 / 121 |
|||
getAllOnlineExams | |
0.00% |
0 / 1 |
56.00 | |
0.00% |
0 / 40 |
|||
getAllPollsSurvey | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 37 |
|||
getValidCos | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 11 |
|||
getPosByCoAndPo | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 10 |
|||
courseWiseAttainmentCalculation | |
0.00% |
0 / 1 |
4160.00 | |
0.00% |
0 / 191 |
|||
courseWisePOAttainmentCalculation | |
0.00% |
0 / 1 |
2256.00 | |
0.00% |
0 / 145 |
|||
constructSubjectAssessmentNodeAttainmentRequest | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 8 |
|||
saveCoValuesForSubjectAssessmentCourseWiseCalculetion | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 6 |
|||
deleteCoValuesOfSubjectAssessmentCourseWiseCalculation | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 14 |
|||
insertCoValuesForSubjectAssessmentCourseWiseCalculetion | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 15 |
|||
insertPoValuesForSubjectAssessmentCourseWiseCalculetion | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 15 |
|||
getAllCalculatedCourseWiseCosFromNodeCoValueTable | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 30 |
|||
courseWiseAttainmentCalculationForUniversity | |
0.00% |
0 / 1 |
2256.00 | |
0.00% |
0 / 145 |
|||
calculateCoOfOnlineExamForSelectAllAnswerdAndMandatoryUnAswered | |
0.00% |
0 / 1 |
506.00 | |
0.00% |
0 / 125 |
<?php | |
namespace com\linways\core\ams\professional\service\nba; | |
use com\linways\base\hooks\LinwaysHooks; | |
use com\linways\core\ams\professional\util\CommonUtil; | |
use com\linways\core\ams\professional\service\BaseService; | |
use com\linways\core\ams\professional\service\BatchService; | |
use com\linways\core\ams\professional\service\nba\PoGroupService; | |
use com\linways\core\ams\professional\constant\nba\AssessmentType; | |
use com\linways\core\ams\professional\util\nba\NbaCoPoServiceUtil; | |
use com\linways\core\ams\professional\service\UniversityExamService; | |
use com\linways\core\ams\professional\exception\ProfessionalException; | |
use com\linways\core\ams\professional\mapper\nba\NbaCoPoServiceMapper; | |
use com\linways\core\ams\professional\request\nba\SearchPoGroupRequest; | |
use com\linways\core\ams\professional\service\nba\ExtraActivitiesService; | |
use com\linways\core\ams\professional\dto\nba\NBASubjectAssessmentCoValue; | |
use com\linways\core\ams\professional\dto\nba\NBASubjectAssessmentPoValue; | |
use com\linways\core\ams\professional\request\nba\GetExtraActivityRequest; | |
use com\linways\core\ams\professional\constant\nba\AttainmentCalculationType; | |
use com\linways\core\ams\professional\request\GetGradePointOfStudentExamRequest; | |
use com\linways\core\ams\professional\service\StudentService; | |
use com\linways\core\ams\professional\service\SubjectService; | |
use com\linways\core\ams\professional\request\nba\GetAllSubjectAssessmentNodeRequest; | |
use com\linways\core\ams\professional\constant\SettingsConstants; | |
use com\linways\core\ams\professional\service\CommonService; | |
use com\linways\core\ams\professional\constant\nba\NbaMethod; | |
class NbaCoPoService 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 = NbaCoPoServiceMapper::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; | |
} | |
public function getAssessmentTypeIdFromCode($name) | |
{ | |
$name = $this->realEscapeString($name); | |
$assessmentType = null; | |
$sql = "SELECT id from assessment_type WHERE code = '$name'"; | |
try { | |
$assessmentType = $this->executeQueryForObject($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
if (!empty($assessmentType)) { | |
return $assessmentType->id; | |
} | |
return null; | |
} | |
public function getPseudoSubjectList($hlndDeptId) | |
{ | |
$hlndDeptId = $this->realEscapeString($hlndDeptId); | |
$sql = "SELECT pseudosubjectID,subjectName,hdl_deptID from pseudosubjects where pseudosubjects.hdl_deptID = $hlndDeptId"; | |
try { | |
$pseudoSubjectList = $this->executeQueryForList($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
if (!empty($pseudoSubjectList)) { | |
return $pseudoSubjectList; | |
} | |
return null; | |
} | |
public function getAssessmentTypeCodeFromId($id) | |
{ | |
$id = $this->realEscapeString($id); | |
$assessmentType = null; | |
$sql = "SELECT code from assessment_type WHERE id = '$id'"; | |
try { | |
$assessmentType = $this->executeQueryForObject($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
if (!empty($assessmentType)) { | |
return $assessmentType->code; | |
} | |
return null; | |
} | |
/** | |
* To Do: | |
* 1)Add update functionality | |
* 2)There are many cases to be handled inorder to rewrite service as update... | |
* what happens when co mapping is deleted from an assessment | |
* what happens when an assessment is deleted altogether after a report | |
* is calculated | |
* | |
* @param [type] $assessmentCoList | |
* @return void | |
*/ | |
public function saveCoValuesForSubjectAssessments($assessmentCoList) | |
{ | |
if (empty($assessmentCoList)) { | |
throw new ProfessionalException(ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN, 'Atleast 1 Co must be given'); | |
} | |
$assessmentCo = $assessmentCoList[0]; | |
$this->deleteCoValuesOfSubjectAssessment($assessmentCo->assessmentId, $assessmentCo->assessmentTypeId, $assessmentCo->batchId, $assessmentCo->semId, $assessmentCo->subjectId); | |
$this->insertCoValuesForSubjectAssessments($assessmentCoList); | |
} | |
private function deleteCoValuesOfSubjectAssessment($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId) | |
{ | |
$sql = ""; | |
$assessmentId = $this->realEscapeString($assessmentId); | |
$assessmentTypeId = $this->realEscapeString($assessmentTypeId); | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$subjectId = $this->realEscapeString($subjectId); | |
$sql = "DELETE FROM nba_subject_assessment_co_value WHERE assessment_id = '$assessmentId' AND assessment_type_id = '$assessmentTypeId' AND batch_id = '$batchId' AND sem_id = '$semId' AND subject_id = '$subjectId'"; | |
try { | |
$this->executeQuery($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
/** | |
* !!!Always Provide Assessments Of Same Type!!! | |
* | |
* @param NBASubjectAssessmentCoValue[] $assessmentCoList | |
* @return void | |
*/ | |
private function insertCoValuesForSubjectAssessments($assessmentCoList) | |
{ | |
$sql = ""; | |
$assessmentCoList = $this->realEscapeArray($assessmentCoList); | |
$sql = "INSERT INTO `nba_subject_assessment_co_value` (`assessment_id`, `assessment_type_id`, `co_id`, `value`, `student_id`, `staff_id`, `batch_id`, `sem_id`, `subject_id`, `createdBy`, `createdDate`, `updatedBy`, `updatedDate`) VALUES "; | |
$values = []; | |
foreach ($assessmentCoList as $assessmentCo) { | |
$values[] = "('$assessmentCo->assessmentId', '$assessmentCo->assessmentTypeId', '$assessmentCo->coId', '$assessmentCo->value', '$assessmentCo->studentId', '$assessmentCo->staffId', '$assessmentCo->batchId', '$assessmentCo->semId', '$assessmentCo->subjectId', '$assessmentCo->createdBy', UTC_TIMESTAMP(), '$assessmentCo->updatedBy', UTC_TIMESTAMP())"; | |
} | |
$sql .= implode(',', $values); | |
try { | |
$this->executeQuery($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
/** | |
* To Do: | |
* 1)Add update functionality | |
* 2)There are many cases to be handled inorder to rewrite service as update... | |
* what happens when co mapping is deleted from an assessment | |
* what happens when an assessment is deleted altogether after a report | |
* is calculated | |
* | |
* @param [type] $assessmentPoList | |
* @return void | |
*/ | |
public function savePoValuesForSubjectAssessments($assessmentPoList) | |
{ | |
if (empty($assessmentPoList)) { | |
throw new ProfessionalException(ProfessionalException::EMPTY_PO_ASSESSMENT_LIST_GIVEN, 'Atleast 1 Po must be given'); | |
} | |
$assessmentPo = $assessmentPoList[0]; | |
$this->deletePoValuesOfSubjectAssessment($assessmentPo->assessmentId, $assessmentPo->assessmentTypeId, $assessmentPo->batchId, $assessmentPo->semId, $assessmentPo->subjectId); | |
$this->insertPoValuesForSubjectAssessments($assessmentPoList); | |
} | |
private function deletePoValuesOfSubjectAssessment($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId) | |
{ | |
$sql = ""; | |
$assessmentId = $this->realEscapeString($assessmentId); | |
$assessmentTypeId = $this->realEscapeString($assessmentTypeId); | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$subjectId = $this->realEscapeString($subjectId); | |
$sql = "DELETE FROM nba_subject_assessment_po_value WHERE assessment_id = '$assessmentId' AND assessment_type_id = '$assessmentTypeId' AND batch_id = '$batchId' AND sem_id = '$semId' AND subject_id = '$subjectId'"; | |
try { | |
$this->executeQuery($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
/** | |
* !!!Always Provide Assessments Of Same Type!!! | |
* | |
* @param NBASubjectAssessmentPoValue[] $assessmentPoList | |
* @return void | |
*/ | |
private function insertPoValuesForSubjectAssessments($assessmentPoList) | |
{ | |
$sql = ""; | |
$assessmentPoList = $this->realEscapeArray($assessmentPoList); | |
$sql = "INSERT INTO `nba_subject_assessment_po_value` (`assessment_id`, `assessment_type_id`, `po_id`, `value`, `student_id`, `staff_id`, `batch_id`, `sem_id`, `subject_id`, `createdBy`, `createdDate`, `updatedBy`, `updatedDate`) VALUES "; | |
$values = []; | |
foreach ($assessmentPoList as $assessmentPo) { | |
$values[] = "('$assessmentPo->assessmentId', '$assessmentPo->assessmentTypeId', '$assessmentPo->poId', '$assessmentPo->value', '$assessmentPo->studentId', '$assessmentPo->staffId', '$assessmentPo->batchId', '$assessmentPo->semId', '$assessmentPo->subjectId', '$assessmentPo->createdBy', UTC_TIMESTAMP(), '$assessmentPo->updatedBy', UTC_TIMESTAMP())"; | |
} | |
$sql .= implode(',', $values); | |
try { | |
$this->executeQuery($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
public function getRulesForUniversityOrEndSemesterExamCoMapping($batchId, $semId, $subjectId) | |
{ | |
$sql = ""; | |
$subjectId = $this->realEscapeString($subjectId); | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$responseList = []; | |
$sql = "SELECT | |
id, | |
co_id AS coId, | |
po_id AS poId, | |
value, | |
from_percent AS fromPercent, | |
to_percent AS toPercent, | |
distribution_type AS distributionType, | |
subject_id AS subjectId, | |
sem_id AS semId, | |
batch_id AS batchId, | |
staff_id AS staffId | |
FROM | |
nba_university_exam_co_mapping_rules | |
WHERE | |
subject_id = '$subjectId' AND batch_id = '$batchId' | |
AND sem_id = '$semId'"; | |
try { | |
$responseList = $this->executeQueryForList($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $responseList; | |
} | |
/** | |
* method to calculate po values of all students for a particular assessment | |
* when an assessment is given. | |
* | |
* @param [int] $assessmentId | |
* @param [int] $assessmentTypeId | |
* @param [int] $batchId | |
* @param [int] $semId | |
* @param [int] $subjectId | |
* @param [int] $createdBy | |
* @return void | |
*/ | |
public function calculatePoValuesFromCo($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId) | |
{ | |
$createdBy = null; | |
try { | |
$createdBy = $_SESSION['staffID']; | |
} catch (\Exception $e) { | |
error_log('SESSION[staffID] is not defined... in calculatePoValuesFromCo'); | |
} | |
$subjectId = $this->realEscapeString($subjectId); | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$assessmentId = $this->realEscapeString($assessmentId); | |
$assessmentTypeId = $this->realEscapeString($assessmentTypeId); | |
$nodeId = $this->realEscapeString($nodeId); | |
if (empty($subjectId) || empty($batchId) || empty($semId) || empty($assessmentId) || empty($assessmentTypeId)) { | |
throw new ProfessionalException(ProfessionalException::INSUFFICIENT_PARAMETERS, "Sorry! Couldn't calculate PO values..."); | |
} | |
$this->deleteAllPOsOfAParticularAssessment($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId); | |
$studentList = $this->getAllCalculatedCosFromSubjectAssessmentTable($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId);//result is mapped as student | |
if (empty($studentList)) { | |
return null; | |
} | |
$sql = ""; | |
$sql = "INSERT INTO `nba_subject_assessment_po_value` (`assessment_id`, `assessment_type_id`, `po_id`, `value`, `student_id`, `staff_id`, `batch_id`, `sem_id`, `subject_id`, `createdBy`, `createdDate`, `updatedBy`, `updatedDate`) VALUES "; | |
foreach ($studentList as $student) { | |
foreach ($student->poList as $po) { | |
if (empty($po->coList)) { | |
continue; | |
} | |
$poValueInPercent = 0; | |
$sumOfDescriptors = 0; | |
$sumOfDescriptors = NbaCoPoServiceUtil::findSumOfCoDescriptors($po->coList); | |
foreach ($po->coList as $co) { | |
$poValueInPercent += ($co->coContribution) * ($co->descriptorValue / $sumOfDescriptors); | |
} | |
$values[] = "('$assessmentId', '$assessmentTypeId', '$po->id', '$poValueInPercent', '$student->id', '$po->staffId', '$batchId', '$semId', '$subjectId', '$createdBy', UTC_TIMESTAMP(), '$createdBy', UTC_TIMESTAMP())"; | |
} | |
} | |
$sql .= implode(",", $values); | |
try { | |
$this->executeQuery($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
$courseWisePoList = $this->getAllCalculatedCourseWiseCosFromNodeCoValueTable($nodeId, $batchId, $semId, $subjectId);//result is mapped as student | |
if (empty($courseWisePoList)) { | |
return null; | |
} | |
$sql = ""; | |
$sql = "INSERT INTO `nba_course_wise_node_po_value` (`node_id`, `po_id`, `value`, `staff_id`, `batch_id`, `sem_id`, `subject_id`, `createdBy`, `createdDate`, `updatedBy`, `updatedDate`) VALUES "; | |
foreach ($courseWisePoList as $po) { | |
if (empty($po->coList)) { | |
continue; | |
} | |
$poValueInPercent = 0; | |
$coPoCourseWiseCalculationDisplayStyle = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_PO_CALCULATION_DISPlAY_STYLE_IN_TREE_NODE); | |
if($coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_AND_CALCULATION_TWO){ | |
$maxDescriptorValue = CoPoAttainmentService::getInstance()->getMaxDescriptorDetails(); | |
foreach ($po->coList as $co) { | |
$poValueInPercent += ($co->coContribution) * ($co->descriptorValue / $maxDescriptorValue->descriptorValue); | |
} | |
$poValueInPercent = $poValueInPercent/count($po->coList); | |
}else{ | |
$sumOfDescriptors = 0; | |
$sumOfDescriptors = NbaCoPoServiceUtil::findSumOfCoDescriptors($po->coList); | |
foreach ($po->coList as $co) { | |
$poValueInPercent += ($co->coContribution) * ($co->descriptorValue / $sumOfDescriptors); | |
} | |
} | |
$valuesCourseWise[] = "('$nodeId', '$po->id', '$poValueInPercent', '$po->staffId', '$batchId', '$semId', '$subjectId', '$createdBy', UTC_TIMESTAMP(), '$createdBy', UTC_TIMESTAMP())"; | |
} | |
$sql .= implode(",", $valuesCourseWise); | |
try { | |
$this->executeQuery($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
private function deleteAllPOsOfAParticularAssessment($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId) | |
{ | |
$subjectId = $this->realEscapeString($subjectId); | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$assessmentId = $this->realEscapeString($assessmentId); | |
$assessmentTypeId = $this->realEscapeString($assessmentTypeId); | |
$sql = ""; | |
$sql = "DELETE FROM nba_subject_assessment_po_value WHERE assessment_id = '$assessmentId' AND assessment_type_id = $assessmentTypeId AND batch_id = $batchId AND sem_id = $semId AND subject_id = $subjectId"; | |
try { | |
$this->executeQuery($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
/** | |
* | |
* | |
* @param [type] $assessmentId | |
* @param [type] $assessmentTypeId | |
* @param [type] $batchId | |
* @param [type] $semId | |
* @param [type] $subjectId | |
* @return void | |
*/ | |
public function getAllCalculatedCosFromSubjectAssessmentTable($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId) | |
{ | |
$subjectId = $this->realEscapeString($subjectId); | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$assessmentId = $this->realEscapeString($assessmentId); | |
$assessmentTypeId = $this->realEscapeString($assessmentTypeId); | |
$sql = "SELECT | |
cpr.nba_program_outcome_id AS poId, | |
cpr.nba_course_outcome_id AS coId, | |
sacv.student_id AS studentId, | |
sacv.staff_id as staffId, | |
sacv.value AS coContribution, | |
d.weightage | |
FROM | |
nba_subject_assessment_co_value sacv | |
INNER JOIN | |
nba_co_po_relation cpr ON cpr.nba_course_outcome_id = sacv.co_id | |
INNER JOIN | |
nba_descriptor d ON d.id = cpr.nba_descriptor_id | |
WHERE | |
sacv.assessment_id = '$assessmentId' | |
AND sacv.assessment_type_id = '$assessmentTypeId' | |
AND sacv.batch_id = '$batchId' | |
AND sacv.sem_id = '$semId' | |
AND sacv.subject_id = '$subjectId'"; | |
$responseList = []; | |
try { | |
$responseList = $this->executeQueryForList($sql, $this->mapper[NbaCoPoServiceMapper::GET_CO_VALUES_FOR_AN_ASSESSMENT]); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $responseList; | |
} | |
public function calculateCoValuesForUniversityExam($examId, $batchId, $semId, $subjectId, $nodeId) | |
{ | |
$createdBy = null; | |
try { | |
$createdBy = $_SESSION['staffID']; | |
} catch (\Exception $e) { | |
error_log('SESSION[staffID] is not defined... in calculateCoValuesForUniversityExam'); | |
} | |
if (empty($examId)) { | |
throw new ProfessionalException(ProfessionalException::INSUFFICIENT_PARAMETERS, "Exam details not provided. Couldn't calculate co for university exam."); | |
} | |
//Currently It Only uses data from university_studentgrade table, in future we may want to take actual marks from universityMarks Table. | |
$examId = $this->realEscapeString($examId); | |
$subjectId = $this->realEscapeString($subjectId); | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$nodeId = $this->realEscapeString($nodeId); | |
$assessmentTypeId = $this->getAssessmentTypeIdFromCode(AssessmentType::UNIVERSITY_EXAM); | |
$examRulesOfUniversity = $this->getRulesForUniversityOrEndSemesterExamCoMapping($batchId, $semId, $subjectId); | |
if (empty($examRulesOfUniversity)) { | |
error_log("Couldn't calculate CO for given exam since there are no rules defined for this subjectId :$subject, semId:$semId, batchId:$batchId"); | |
return null; | |
} | |
if (!$examRulesOfUniversity[0]->coId && !$examRulesOfUniversity[0]->poId) { | |
throw new ProfessionalException(ProfessionalException::DATA_EMPTY, "University Exam Rule Is Not Properly Defined."); | |
} | |
$mapToCo = $examRulesOfUniversity[0]->coId ? true : false; | |
$getGradePointRequest = new GetGradePointOfStudentExamRequest (); | |
$getGradePointRequest->examId = $examId; | |
$getGradePointRequest->batchId = $batchId; | |
$getGradePointRequest->semId = $semId; | |
$getGradePointRequest->subjectId = $subjectId; | |
$studentUniversityMarks = UniversityExamService::getInstance()->getGradePointsOfStudentsForAnExam($getGradePointRequest); | |
if (empty($studentUniversityMarks)) { | |
error_log("No Student Mark Records For UniversityExam With examId :$examId,subjectId :$subject, semId:$semId, batchId:$batchId"); | |
return null; | |
} | |
$assessmentList = []; | |
//As of now we use average of the percentFrom and percentTo to | |
//calculate co of a student | |
foreach ($studentUniversityMarks as $studentMark) { | |
foreach ($examRulesOfUniversity as $rule) { | |
if (($studentMark->averagePercent >= $rule->fromPercent && $studentMark->averagePercent < $rule->toPercent) || ($studentMark->averagePercent == 100 && $rule->toPercent == 100)) { | |
if ($mapToCo) { | |
$nbaSubjectAssessmentValue = new NBASubjectAssessmentCoValue(); | |
} else { | |
$nbaSubjectAssessmentValue = new NBASubjectAssessmentPoValue(); | |
} | |
$nbaSubjectAssessmentValue->assessmentId = $examId; | |
$nbaSubjectAssessmentValue->assessmentTypeId = $assessmentTypeId; | |
if ($mapToCo) { | |
$nbaSubjectAssessmentValue->coId = $rule->coId; | |
} else { | |
$nbaSubjectAssessmentValue->poId = $rule->poId; | |
} | |
$nbaSubjectAssessmentValue->value = $studentMark->averagePercent; | |
$nbaSubjectAssessmentValue->studentId = $studentMark->studentId; | |
$nbaSubjectAssessmentValue->staffId = $createdBy;//Here staff is | |
$nbaSubjectAssessmentValue->batchId = $studentMark->batchId; | |
$nbaSubjectAssessmentValue->semId = $studentMark->semId; | |
$nbaSubjectAssessmentValue->subjectId = $studentMark->subjectId; | |
$nbaSubjectAssessmentValue->createdBy = $createdBy; | |
$nbaSubjectAssessmentValue->updatedBy = $createdBy; | |
$assessmentList[] = $nbaSubjectAssessmentValue; | |
} | |
} | |
} | |
if(empty($assessmentList)){ | |
error_log("Couldn't calculate CO for given exam since there were no valid results for exam with examId:$examId, subjectId :$subject, semId:$semId, batchId:$batchId"); | |
return null; | |
} | |
if ($mapToCo) { | |
$assessmentCourseWiseCOList=$this->courseWiseAttainmentCalculationForUniversity($assessmentList, $nodeId); | |
$this->saveCoValuesForSubjectAssessmentCourseWiseCalculetion($assessmentCourseWiseCOList); | |
$this->saveCoValuesForSubjectAssessments($assessmentList); | |
$this->calculatePoValuesFromCo($examId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId); | |
} else { | |
$assessmentCo = $assessmentList[0]; | |
$this->deleteCoValuesOfSubjectAssessment($assessmentCo->assessmentId, $assessmentCo->assessmentTypeId, $assessmentCo->batchId, $assessmentCo->semId, $assessmentCo->subjectId); | |
$this->savePoValuesForSubjectAssessments($assessmentList); | |
$assessmentCourseWisePOList=$this->courseWisePOAttainmentCalculation($assessmentList, $nodeId); | |
$this->insertPoValuesForSubjectAssessmentCourseWiseCalculetion($assessmentCourseWisePOList); | |
} | |
} | |
public function calculateCoValuesForEndSemesterExam($examId, $batchId, $semId, $subjectId, $nodeId) | |
{ | |
$createdBy = null; | |
try { | |
$createdBy = $_SESSION['staffID']; | |
} catch (\Exception $e) { | |
error_log('SESSION[staffID] is not defined... in calculateCoValuesForEndSemesterExam'); | |
} | |
if (empty($examId)) { | |
throw new ProfessionalException(ProfessionalException::INSUFFICIENT_PARAMETERS, "Exam details not provided. Couldn't calculate co for end semester exam."); | |
} | |
$examId = $this->realEscapeString($examId); | |
$subjectId = $this->realEscapeString($subjectId); | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$nodeId = $this->realEscapeString($nodeId); | |
$assessmentTypeId = $this->getAssessmentTypeIdFromCode(AssessmentType::END_SEMESTER_EXAM); | |
$examRulesOfEndSemester = $this->getRulesForUniversityOrEndSemesterExamCoMapping($batchId, $semId, $subjectId); | |
if (empty($examRulesOfEndSemester)) { | |
error_log("Couldn't calculate CO for given exam since there are no rules defined for this subjectId :$subject, semId:$semId, batchId:$batchId"); | |
return null; | |
} | |
if (!$examRulesOfEndSemester[0]->coId && !$examRulesOfEndSemester[0]->poId) { | |
throw new ProfessionalException(ProfessionalException::DATA_EMPTY, "End Semester Exam Rule Is Not Properly Defined."); | |
} | |
$mapToCo = $examRulesOfEndSemester[0]->coId ? true : false; | |
$studentEndSemesterExamMarks = UniversityExamService::getInstance()->getStudentEndSemesterExamMarks($examId, $batchId, $semId, $subjectId); | |
if (empty($studentEndSemesterExamMarks)) { | |
error_log("No Student Mark Records For end semester exam With examId :$examId,subjectId :$subjectId, semId:$semId, batchId:$batchId"); | |
return null; | |
} | |
$endSemesterExamMark = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_END_SEMESTER_MARK_SELECTION); | |
if($endSemesterExamMark==NbaMethod::OBE_END_SEMESTER_MARK_NOT_NORMALIZED){ | |
try { | |
$sql="SELECT | |
e.examTotalMarks, ims.maxInternalMarks | |
FROM | |
exam e | |
INNER JOIN | |
internal_marks_settings ims ON ims.batchID = e.batchID | |
AND ims.semID = e.semID | |
AND ims.subjectID = e.subjectID | |
WHERE | |
examID = $examId"; | |
$totalMark = $this->executeQueryForObject($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
$combinedMaximumMarks= $totalMark->examTotalMarks+$totalMark->maxInternalMarks; | |
} | |
$assessmentList = []; | |
//As of now we use average of the percentFrom and percentTo to | |
//calculate co of a student | |
foreach ($studentEndSemesterExamMarks as $studentMark) { | |
if($endSemesterExamMark!=NbaMethod::OBE_END_SEMESTER_MARK_NOT_NORMALIZED){ | |
$combinedMaximumMarks = (double) $studentMark->maxMark; | |
} | |
$studentMark->totalMark= (((double) $studentMark->totalMark)/$combinedMaximumMarks)*100; | |
foreach ($examRulesOfEndSemester as $rule) { | |
if (($studentMark->totalMark >= $rule->fromPercent && $studentMark->totalMark < $rule->toPercent) || ($studentMark->totalMark == 100 && $rule->toPercent == 100)) { | |
if ($mapToCo) { | |
$nbaSubjectAssessmentValue = new NBASubjectAssessmentCoValue(); | |
} else { | |
$nbaSubjectAssessmentValue = new NBASubjectAssessmentPoValue(); | |
} | |
$nbaSubjectAssessmentValue->assessmentId = $examId; | |
$nbaSubjectAssessmentValue->assessmentTypeId = $assessmentTypeId; | |
if ($mapToCo) { | |
$nbaSubjectAssessmentValue->coId = $rule->coId; | |
} else { | |
$nbaSubjectAssessmentValue->poId = $rule->poId; | |
} | |
$nbaSubjectAssessmentValue->value = $studentMark->totalMark; | |
$nbaSubjectAssessmentValue->studentId = $studentMark->studentId; | |
$nbaSubjectAssessmentValue->staffId = $createdBy;//Here staff is | |
$nbaSubjectAssessmentValue->batchId = $studentMark->batchId; | |
$nbaSubjectAssessmentValue->semId = $studentMark->semId; | |
$nbaSubjectAssessmentValue->subjectId = $studentMark->subjectId; | |
$nbaSubjectAssessmentValue->createdBy = $createdBy; | |
$nbaSubjectAssessmentValue->updatedBy = $createdBy; | |
$assessmentList[] = $nbaSubjectAssessmentValue; | |
} | |
} | |
} | |
if(empty($assessmentList)){ | |
error_log("Couldn't calculate CO for given exam since there were no valid results for exam with examId:$examId, subjectId :$subject, semId:$semId, batchId:$batchId"); | |
return null; | |
} | |
if ($mapToCo) { | |
$assessmentCourseWiseCOList=$this->courseWiseAttainmentCalculation($assessmentList, $nodeId); | |
$this->saveCoValuesForSubjectAssessmentCourseWiseCalculetion($assessmentCourseWiseCOList); | |
$this->saveCoValuesForSubjectAssessments($assessmentList); | |
$this->calculatePoValuesFromCo($examId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId); | |
} else { | |
$assessmentCo = $assessmentList[0]; | |
$this->deleteCoValuesOfSubjectAssessment($assessmentCo->assessmentId, $assessmentCo->assessmentTypeId, $assessmentCo->batchId, $assessmentCo->semId, $assessmentCo->subjectId); | |
$this->savePoValuesForSubjectAssessments($assessmentList); | |
$assessmentCourseWisePOList=$this->courseWisePOAttainmentCalculation($assessmentList, $nodeId); | |
$this->insertPoValuesForSubjectAssessmentCourseWiseCalculetion($assessmentCourseWisePOList); | |
} | |
} | |
// wip | |
public function calculateCoValuesForActivity($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId) { | |
$request = new GetExtraActivityRequest(); | |
$request->subjectId = $this->realEscapeString($subjectId); | |
$request->batchId = $this->realEscapeString($batchId); | |
$request->semId = $this->realEscapeString($semId); | |
$request->nodeId = $this->realEscapeString($nodeId); | |
$assessmentId = $this->realEscapeString($assessmentId); | |
$assessmentTypeId = $this->realEscapeString($assessmentTypeId); | |
$staffId = $_SESSION['staffID']; | |
$activity = ExtraActivitiesService::getInstance()->getActivityById ( $assessmentId ); | |
$courseOutcomes = ExtraActivitiesService::getInstance()->getCoPercentageOfActivity ( $request, $assessmentId ); | |
if(empty($courseOutcomes)) { | |
throw new ProfessionalException(ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN, "Couldn't calculate CO for activity - ".$activity->activity_name.", since there were no valid COs are mapped."); | |
} | |
$students = ExtraActivitiesService::getInstance()->getActivityStudentDetailsById ( $assessmentId , $batchId, $semId, $subjectId, $staffId); | |
foreach ( $courseOutcomes as $co ) { | |
foreach ( $students as $student ) { | |
if ( $activity->use_in_co ) { | |
$nbaSubjectAssessmentValue = new NBASubjectAssessmentCoValue(); | |
} else { | |
$nbaSubjectAssessmentValue = new NBASubjectAssessmentPoValue(); | |
} | |
$value = $student->isAttended == 1 ? 100 : 0; | |
$nbaSubjectAssessmentValue->coId = $co->co_id; | |
$nbaSubjectAssessmentValue->value = $value; | |
$nbaSubjectAssessmentValue->semId = $request->semId; | |
$nbaSubjectAssessmentValue->staffId = $staffId; | |
$nbaSubjectAssessmentValue->batchId = $request->batchId; | |
$nbaSubjectAssessmentValue->studentId = $student->studentID; | |
$nbaSubjectAssessmentValue->subjectId = $request->subjectId; | |
$nbaSubjectAssessmentValue->createdBy = $staffId; | |
$nbaSubjectAssessmentValue->updatedBy = $staffId; | |
$nbaSubjectAssessmentValue->assessmentId = $assessmentId; | |
$nbaSubjectAssessmentValue->assessmentTypeId = $assessmentTypeId; | |
$assessmentList[] = $nbaSubjectAssessmentValue; | |
} | |
} | |
if ( $activity->use_in_co ) { | |
$assessmentCourseWiseCOList=$this->courseWiseAttainmentCalculation($assessmentList, $nodeId); | |
$this->saveCoValuesForSubjectAssessmentCourseWiseCalculetion($assessmentCourseWiseCOList); | |
$this->saveCoValuesForSubjectAssessments($assessmentList); | |
$this->calculatePoValuesFromCo($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId); | |
} | |
} | |
/** | |
* method to be called during tree traversal | |
* | |
* @param [type] $assessmentId | |
* @param [type] $assessmentTypeId | |
* @param [type] $batchId | |
* @param [type] $semId | |
* @param [type] $subjectId | |
* @param [type] $nodeId | |
* @return void | |
*/ | |
public function calculateAssessmentCOsAndPOs($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId) | |
{ | |
if (empty($assessmentId) || empty($assessmentTypeId) || empty($batchId) || empty($semId) || empty($subjectId) || empty($nodeId)) { | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS, 'Assessment details is empty'); | |
} | |
$hooks = LinwaysHooks::getInstance(); | |
$assessmentType = $this->getAssessmentTypeCodeFromId($assessmentTypeId); | |
$hookParams = []; | |
$hookParams = ["assessmentId" => $assessmentId, "batchId" => $batchId, "semId" => $semId, "subjectId" => $subjectId, "nodeId" => $nodeId]; | |
switch ($assessmentType) { | |
case AssessmentType::ASSIGNMENT: | |
try { | |
$hooks->do_action('calculate_co_of_assignment', $hookParams); | |
} catch (\Exception $e) { | |
if ($e->getCode() != ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
$this->calculatePoValuesFromCo($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId); | |
break; | |
case AssessmentType::EXAM: | |
try { | |
$hooks->do_action('calculate_co_of_exam', $hookParams); | |
} catch (\Exception $e) { | |
if ($e->getCode() != ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
$this->calculatePoValuesFromCo($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId); | |
break; | |
case AssessmentType::QUIZ: | |
try { | |
$hooks->do_action('calculate_co_of_quiz', $hookParams); | |
} catch (\Exception $e) { | |
if ($e->getCode() != ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
$this->calculatePoValuesFromCo($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId); | |
break; | |
case AssessmentType::UNIVERSITY_EXAM: | |
try { | |
$this->calculateCoValuesForUniversityExam($assessmentId, $batchId, $semId, $subjectId, $nodeId); | |
} catch (\Exception $e) { | |
if ($e->getCode() != ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
//Here We Dont calculate Po Values From Co Since For University Exam it can be directly mapped to PO.. Po calculation is done inside calculateCoValuesForUniversityExam service | |
break; | |
case AssessmentType::END_SEMESTER_EXAM: | |
try { | |
$this->calculateCoValuesForEndSemesterExam($assessmentId, $batchId, $semId, $subjectId, $nodeId); | |
} catch (\Exception $e) { | |
if ($e->getCode() != ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
//Here We Dont calculate Po Values From Co Since For End Semester Exam it can be directly mapped to PO.. Po calculation is done inside calculateCoValuesForEndSemesterExam service | |
break; | |
case AssessmentType::ONLINE_EXAM: | |
try { | |
$coValueCalculationMethod = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_SELECT_QUESTIONS_IN_THE_ONLINE_EXAM_FOR_OBE_CALCULATION); | |
if($coValueCalculationMethod == NbaMethod::SELECT_ALL_ANSWERED_AND_MANDATORY_UNANSWERED_QUESTIONS ){ | |
$this->calculateCoOfOnlineExamForSelectAllAnswerdAndMandatoryUnAswered($assessmentId, $batchId, $semId, $subjectId, $nodeId); | |
}else{ | |
$this->calculateCoOfOnlineExam($assessmentId, $batchId, $semId, $subjectId, $nodeId); | |
} | |
} catch (\Exception $e) { | |
if ($e->getCode() != ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
//Here We Dont calculate Po Values From Co Since For End Semester Exam it can be directly mapped to PO.. Po calculation is done inside calculateCoValuesForEndSemesterExam service | |
$this->calculatePoValuesFromCo($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId); | |
break; | |
case AssessmentType::POLLS_SURVEY: | |
try { | |
$this->calculateCoOfPollsSurvey($assessmentId, $batchId, $semId, $subjectId, $nodeId); | |
} catch (\Exception $e) { | |
if ($e->getCode() != ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
//Here We Dont calculate Po Values From Co Since For End Semester Exam it can be directly mapped to PO.. Po calculation is done inside calculateCoValuesForEndSemesterExam service | |
$this->calculatePoValuesFromCo($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId); | |
break; | |
case AssessmentType::ACTIVITY: | |
$this->calculateCoValuesForActivity($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId, $nodeId); | |
break; | |
default: | |
throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER, "Please provide a valid assessment type."); | |
} | |
} | |
/** | |
* Get all descriptors | |
* @throws ProfessionalExcepton | |
* @return Array $descriptors | |
* @author Vishnu M | |
*/ | |
public function getDescriptors () { | |
$descriptors = null; | |
try { | |
$sql = "SELECT id, descriptorName, descriptorDesc, weightage FROM nba_descriptor ORDER BY weightage DESC"; | |
$descriptors = $this->executeQueryForList($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $descriptors; | |
} | |
/** | |
* Get descriptor by id | |
* @throws ProfessionalExcepton | |
* @return Array $descriptors | |
* @author Vishnu M | |
*/ | |
public function getDescriptorById ($id) { | |
$descriptor = null; | |
$id = $this->realEscapeString($id); | |
try { | |
$sql = "SELECT id, descriptorName, descriptorDesc, weightage FROM nba_descriptor WHERE id=$id"; | |
$descriptor = $this->executeQueryForObject($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $descriptor; | |
} | |
/** | |
* Undocumented function | |
* | |
* @param [type] $batchId | |
* @return void | |
*/ | |
public function getProgramOutcomeListByBatchId($batchId, $includePo = true, $includePso = true){ | |
$poList = []; | |
$batchId = $this->realEscapeString($batchId); | |
$groupDetails = PoGroupService::getInstance()->getGroupDetailsByBatchId($batchId); | |
$poList = PoGroupService::getInstance()->getPoListByGroupId($groupDetails->id, $includePo, $includePso); | |
// //if there are no pos in group fall back to default | |
// if(empty($poList)){ | |
// $batchDetails = BatchService::getInstance()->getBatchDetailsById($batchId); | |
// $poList = $this->getProgramOutcomeListByDeptId($batchDetails->deptId); | |
// } | |
return $poList; | |
} | |
/** | |
* Undocumented function | |
* | |
* @param integer $deptId | |
* @return void | |
*/ | |
public function getProgramOutcomeListByDeptId($deptId){ | |
$sql = ""; | |
$deptId = $this->realEscapeString($deptId); | |
$poList = []; | |
$sql = "SELECT t1.id, t1.poCode, t1.poName, t1.poDesc, t1.order_no FROM nba_program_outcome WHERE department_id = $deptId"; | |
try { | |
$poList = $this->executeQueryForList($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $poList; | |
} | |
public function calculateCoAttainmentValuesAndStoreItToTreeForStudentMarkEntryMethod($request){ | |
$request = $this->realEscapeObject($request); | |
try { | |
$coList = NbaStudentMarkEntryMethodService::getInstance()->getCoWiseStudentListForAttainmentCalculation($request); | |
} catch (\Exception $e) { | |
} | |
if(empty($coList)){ | |
return null; | |
} | |
try { | |
$totalNumberOfStudents = BatchService::getInstance()->getBatchStudentCount($request->batchId); | |
} catch (\Exception $e) { | |
} | |
if(empty($totalNumberOfStudents) || $totalNumberOfStudents == 0){ | |
return null; | |
} | |
$coAttainmentRuleDetails = CoPoAttainmentService::getInstance()->getRulesForCoAndPoAttainment($request->batchId, $request->semId, $request->subjectId); | |
if (empty($coAttainmentRuleDetails)) { | |
throw new ProfessionalException(ProfessionalException::ATTAINMENT_RULES_NOT_DEFINED, 'Please Define Co And Po Attainment rules...'); | |
} | |
$coAttainmentRule = $coAttainmentRuleDetails->rule; | |
$coAttainmentRule->goals = CoPoAttainmentService::getInstance()->populateDescriptorValuesFromIds($coAttainmentRule->goals); | |
if($coAttainmentRule->type != AttainmentCalculationType::NSTUDENT_NPERCENT){ | |
throw new ProfessionalException(ProfessionalException::ATTAINMENT_RULES_NOT_DEFINED, 'Please Define Co And Po Attainment rules...'); | |
} | |
foreach($coList as $co){ | |
$attainmentForAllAssessment = 0; | |
foreach($co->assessmentTypeList->assessmentList as $assessment){ | |
$attainmentForQuestions = 0; | |
foreach($assessment->questionList as $question){ | |
$question->studentMarkList = CommonUtil::getPercentageValueForAnAttributeInObjectList($question->studentMarkList , $question->maxMark, "marks"); | |
foreach($coAttainmentRule->goals as $goal){ | |
$numberOfStudentsWithSpecifiedAttainment = CommonUtil::getNumberOfElementsInAnObjectListByComparingAnAttributeWithGivenValue($question->studentMarkList, "marksInPercentage", ">=", $goal->attain_percent); | |
$percentageOfStudentsWithSpecifiedAttainment = 0; | |
if($totalNumberOfStudents){ | |
$percentageOfStudentsWithSpecifiedAttainment = ($numberOfStudentsWithSpecifiedAttainment/$totalNumberOfStudents)*100; | |
} | |
if($percentageOfStudentsWithSpecifiedAttainment >= $goal->student_percent){ | |
if($goal->descriptor->weightage){ | |
$attainmentForQuestions += $goal->descriptor->weightage; | |
} | |
break; | |
} | |
} | |
} | |
if(!empty($assessment->questionList)){ | |
$attainmentForQuestions = $attainmentForQuestions/sizeof($assessment->questionList); | |
} | |
$attainmentForAllAssessment += $attainmentForQuestions; | |
} | |
if(!empty($co->assessmentTypeList->assessmentList)){ | |
$attainmentForAllAssessment = $attainmentForAllAssessment/sizeof($co->assessmentTypeList->assessmentList); | |
} | |
$coAttainment = new NBASubjectAssessmentCoValue(); | |
$coAttainment->coId = $co->id; | |
$coAttainment->value = $attainmentForAllAssessment; | |
$coAttainment->nodeId = $request->nodeId; | |
$coAttainment->batchId = $request->batchId; | |
$coAttainment->semId = $request->semId; | |
$coAttainment->staffId = $request->staffId; | |
$coAttainment->subjectId = $request->subjectId; | |
$coAttainment->createdBy = $request->createdBy; | |
$coAttainment->updatedBy = $request->updatedBy; | |
NBAPOAttainmentTreeService::getInstance()->addSubjectLeafNodeCoValueDirectly($coAttainment); | |
} | |
} | |
public function calculateCoAttainmentValuesAndStoreItToTreeForStudentMarkEntryMethodForUniversity($request){ | |
$request = $this->realEscapeObject($request); | |
$coList = []; | |
$allCourseOutcomeList = []; | |
$totalNumberOfStudents = 0; | |
try { | |
$coList = NbaStudentMarkEntryMethodService::getInstance()->getCoWiseStudentListForAttainmentCalculation($request); | |
} catch (\Exception $e) { | |
$coList = []; | |
} | |
if(empty($coList)){ | |
return null; | |
} | |
try{ | |
$allCourseOutcomeList = NbaCoService::getInstance()->getAllCosBySubjectIdBatchIdAndSemId($request->subjectId, $request->batchId, $request->semId); | |
}catch(\Exception $e){ | |
$allCourseOutcomeList = []; | |
} | |
if(empty($allCourseOutcomeList)){ | |
return null; | |
} | |
try { | |
$totalNumberOfStudents = BatchService::getInstance()->getBatchStudentCount($request->batchId); | |
} catch (\Exception $e) { | |
} | |
if(empty($totalNumberOfStudents) || $totalNumberOfStudents == 0){ | |
return null; | |
} | |
$coAttainmentRuleDetails = UniversityExamCoPoRuleService::getInstance()->getRulesForUniversityAttainment($request->batchId, $request->semId, $request->subjectId); | |
if (empty($coAttainmentRuleDetails)) { | |
throw new ProfessionalException(ProfessionalException::ATTAINMENT_RULES_NOT_DEFINED, 'Please Define Co And Po Attainment rules...'); | |
} | |
$coAttainmentRule = $coAttainmentRuleDetails->rule; | |
$coAttainmentRule->slabs = CoPoAttainmentService::getInstance()->populateDescriptorValuesFromIds($coAttainmentRule->slabs); | |
if($coAttainmentRule->type != AttainmentCalculationType::SLABBED_UNIVERSITY_AVERAGE){ | |
throw new ProfessionalException(ProfessionalException::ATTAINMENT_RULES_NOT_DEFINED, 'Please Define Co And Po Attainment rules...'); | |
} | |
$questionList = $coList[0]->assessmentTypeList->assessmentList[0]->questionList[0]; | |
$numberOfStudentsWithMoreThanUniversityAverage = CommonUtil::getNumberOfElementsInAnObjectListByComparingAnAttributeWithGivenValue($questionList->studentMarkList, "marks", ">=", $questionList->universityAverage); | |
$percentageOfStudentsWithMoreThanUniversityAverage = 0; | |
if($totalNumberOfStudents){ | |
$percentageOfStudentsWithMoreThanUniversityAverage = ($numberOfStudentsWithMoreThanUniversityAverage/$totalNumberOfStudents)*100; | |
} | |
$coAttainmentValue = 0; | |
foreach($coAttainmentRule->slabs as $slab){ | |
if($percentageOfStudentsWithMoreThanUniversityAverage >= $slab->percent){ | |
$coAttainmentValue = $slab->descriptor->weightage?$slab->descriptor->weightage:0; | |
break; | |
} | |
} | |
foreach($allCourseOutcomeList as $co){ | |
$coAttainment = new NBASubjectAssessmentCoValue(); | |
$coAttainment->coId = $co->id; | |
$coAttainment->value = $coAttainmentValue; | |
$coAttainment->nodeId = $request->nodeId; | |
$coAttainment->batchId = $request->batchId; | |
$coAttainment->semId = $request->semId; | |
$coAttainment->staffId = $request->staffId; | |
$coAttainment->subjectId = $request->subjectId; | |
$coAttainment->createdBy = $request->createdBy; | |
$coAttainment->updatedBy = $request->updatedBy; | |
NBAPOAttainmentTreeService::getInstance()->addSubjectLeafNodeCoValueDirectly($coAttainment); | |
} | |
} | |
public function getMaximumCorrelationForCoursePoMatrix($poId,$batchId,$semId,$subjectId){ | |
$sql = ""; | |
$weightage = null; | |
$poId = $this->realEscapeObject($poId); | |
$batchId = $this->realEscapeObject($batchId); | |
$semId = $this->realEscapeObject($semId); | |
$subjectId = $this->realEscapeObject($subjectId); | |
$sql = "SELECT MAX(nd.weightage) as weightage FROM nba_program_outcome po INNER JOIN nba_co_po_relation cpr ON cpr.nba_program_outcome_id = po.id INNER JOIN nba_course_outcome co ON co.id = cpr.nba_course_outcome_id INNER JOIN nba_descriptor nd ON nd.id = cpr.nba_descriptor_id WHERE po.id = '$poId' and co.batchID ='$batchId' and co.semID = '$semId' and co.subjectID = '$subjectId' "; | |
try { | |
$weightage = $this->executeQueryForObject($sql)->weightage; | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $weightage; | |
} | |
/** | |
* Returns CO PO relation | |
* | |
* @param RequestForAttainment $request | |
* @return void | |
*/ | |
public function getCoPoRelationMatrix($request){ | |
$request = $this->realEscapeObject($request); | |
$poList = []; | |
$sql = ""; | |
$sql = "SELECT | |
co.id AS coId, | |
co.code AS coCode, | |
po.id AS poId, | |
po.poCode, | |
po.poName, | |
po.department_id AS poDepartmentId, | |
ndesc.id AS descriptorId, | |
ndesc.descriptorName, | |
ndesc.weightage AS descriptorWeightage | |
FROM | |
nba_course_outcome co | |
INNER JOIN | |
nba_co_po_relation cpr ON co.id = cpr.nba_course_outcome_id | |
INNER JOIN | |
nba_program_outcome po ON po.id = cpr.nba_program_outcome_id | |
INNER JOIN | |
nba_descriptor ndesc ON cpr.nba_descriptor_id = ndesc.id | |
WHERE | |
co.batchID = '$request->batchId' AND co.subjectID = '$request->subjectId' | |
AND co.semID = '$request->semId' "; | |
if($request->isPSO == 0){ | |
$sql .= " AND po.isPso = 0 "; | |
} | |
if( $request->isPSO == 1){ | |
$sql .= " AND po.isPso = 1 "; | |
} | |
$sql .= "ORDER BY po.order_no"; | |
try{ | |
$poList = $this->executeQueryForList($sql, $this->mapper[NbaCoPoServiceMapper::GET_CO_PO_RELATION_MATRIX]); | |
}catch(\Exception $e){ | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $poList; | |
} | |
/** | |
* get subject wise co list | |
* | |
* @param GetSubjectWiseCoListWithCoPoRelationRequest $request | |
* @return void | |
*/ | |
public function getSubjectWiseCoListWithCoPoRelation($request){ | |
$request = $this->realEscapeObject($request); | |
$sql = "SELECT | |
co.id as co_id, | |
co.code as co_code, | |
co.objective as co_objective, | |
co.description as co_description, | |
co.order_no as co_order_number, | |
co.subjectID as co_subjectId, | |
co.staffID as co_staffId, | |
co.batchID as co_batchId, | |
co.semID as co_semId, | |
cpr.id AS cpr_id, | |
cpr.nba_course_outcome_id AS cpr_coId, | |
cpr.nba_program_outcome_id AS cpr_poId, | |
cpr.nba_descriptor_id AS cpr_descriptor_id | |
FROM | |
nba_course_outcome co | |
INNER JOIN | |
nba_co_po_relation cpr ON cpr.nba_course_outcome_id = co.id | |
WHERE | |
co.subjectID = '$request->subjectId' AND co.batchID = '$request->batchId' | |
AND co.semID = '$request->semId' ORDER BY co.order_no"; | |
try{ | |
$coList = $this->executeQueryForList($sql, $this->mapper[NbaCoPoServiceMapper::GET_SUBJECT_WISE_CO_LIST_WITH_CO_PO_RELATION]); | |
}catch(\Exception $e){ | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $coList; | |
} | |
/** | |
* Method to create new co po relation | |
* | |
* @param NbaCoPoRelation $coPoRelationList | |
* @return void | |
*/ | |
public function createNewCoPoRelation($coPoRelationList){ | |
$coPoRelationList = $this->realEscapeArray($coPoRelationList); | |
$sql = ""; | |
$values = []; | |
$sql = "INSERT INTO `nba_co_po_relation` (`nba_course_outcome_id`, `nba_program_outcome_id`, `nba_descriptor_id`) VALUES "; | |
foreach($coPoRelationList as $coPoRelation){ | |
$values[] = "('$coPoRelation->coId', '$coPoRelation->poId', '$coPoRelation->descriptorId')"; | |
} | |
$sql .= implode(',', $values); | |
try{ | |
$this->executeQuery($sql); | |
}catch(\Exception $e){ | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return true; | |
} | |
/** | |
* Undocumented function | |
* | |
* @param [type] $coId | |
* @return void | |
*/ | |
public function deleteAllCoPoRelationByCoId($coId){ | |
$coId = $this->realEscapeString($coId); | |
$sql = "DELETE FROM nba_co_po_relation WHERE nba_course_outcome_id = '$coId'"; | |
try{ | |
$this->executeQuery($sql); | |
}catch(\Exception $e){ | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return true; | |
} | |
/** | |
* function used for delete co-po relation of a list of COs | |
* | |
* @param [type] $coIdList | |
* @return void | |
*/ | |
public function deleteAllCoPoRelationByCoIdList($coIdList){ | |
$coIdList = $this->realEscapeArray($coIdList); | |
$ids = implode("','", $coIdList); | |
$sql = "DELETE FROM nba_co_po_relation WHERE nba_course_outcome_id IN ('".$ids."')"; | |
try{ | |
$this->executeQuery($sql); | |
}catch(\Exception $e){ | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return true; | |
} | |
/** | |
* function used for returns all pos and co-po justification Details of selected CO | |
* | |
* @param [type] $coId | |
* @return void | |
*/ | |
public function getPosAndJustificationDetails($coId){ | |
$coId = $this->realEscapeString($coId); | |
$sql = "SELECT | |
t1.id as poId, t1.poCode, t1.poName, t2.descriptorName, t1.order_no, t3.nba_co_po_justification as coPoJustification | |
FROM | |
nba_program_outcome t1, | |
nba_descriptor t2, | |
nba_co_po_relation t3 | |
WHERE | |
t1.id = t3.nba_program_outcome_id | |
AND t2.id = t3.nba_descriptor_id | |
AND t3.nba_course_outcome_id = '$coId' | |
ORDER BY t1.order_no ASC"; | |
try{ | |
$poList = $this->executeQueryForList($sql); | |
}catch(\Exception $e){ | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $poList; | |
} | |
public function saveCoPoJustification($poList,$coId){ | |
$poList = $this->realEscapeArray($poList); | |
$coId = $this->realEscapeString($coId); | |
foreach($poList as $po){ | |
$coPovalues[] = "('".$coId."','".$po['poId']."','".$po['justification']."')"; | |
} | |
$coPoValuesInsert = implode(',', $coPovalues); | |
$sql = "INSERT INTO nba_co_po_relation (nba_course_outcome_id,nba_program_outcome_id,nba_co_po_justification) | |
VALUES | |
$coPoValuesInsert | |
ON DUPLICATE KEY UPDATE | |
nba_co_po_justification = VALUES(nba_co_po_justification)"; | |
try{ | |
$this->executeQuery($sql); | |
}catch(\Exception $e){ | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
public function getPosAndJustificationDetailsForPseudoSubject($coIds){ | |
$coIds = $this->realEscapeArray($coIds); | |
$poList = []; | |
if(empty($coIds)){ | |
return $poList; | |
} | |
$coIdsForSearch = implode(',', $coIds); | |
$sql="SELECT | |
npo.id as poId, npo.poCode, npo.poName, nd.descriptorName, npo.order_no as orderNo, ncpr.nba_co_po_justification as coPoJustification,nco.batchID as batchId,nco.semID as semId,npg.name as groupName,batches.batchName,npg.id as groupId,ncpr.nba_course_outcome_id as courseOutcomeId,ncpr.id as coPoRelationId,nd.id as descriptorId | |
FROM | |
nba_program_outcome npo | |
INNER JOIN | |
nba_co_po_relation ncpr ON npo.id = ncpr.nba_program_outcome_id | |
INNER JOIN | |
nba_descriptor nd ON nd.id = ncpr.nba_descriptor_id | |
INNER JOIN | |
nba_course_outcome nco ON nco.id = ncpr.nba_course_outcome_id | |
INNER JOIN | |
nba_po_group_to_batches_mapping npgbm ON npgbm.batch_id = nco.batchID | |
INNER JOIN | |
nba_po_group npg ON npg.id = npgbm.nba_po_group_id | |
INNER JOIN | |
batches ON batches.batchID = nco.batchID | |
WHERE | |
ncpr.nba_course_outcome_id IN ($coIdsForSearch) | |
ORDER BY npo.order_no ASC"; | |
try{ | |
$poList = $this->executeQueryForList($sql,$this->mapper[NbaCoPoServiceMapper::GET_CO_PO_JUSSTFICATION_DETAILS]); | |
}catch(\Exception $e){ | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $poList; | |
} | |
public function saveCoPoJustificationPseudoSubject($selectedCoMoreDetails){ | |
$selectedCoMoreDetails = $this->realEscapeArray($selectedCoMoreDetails); | |
foreach($selectedCoMoreDetails as $group){ | |
foreach($group->batchList as $batch){ | |
foreach($batch->poList as $po){ | |
$coPovalues[] = "('".$po->coPoRelation->coId."','".$po->id."','".$po->coPoRelation->coPoJustification."')"; | |
} | |
} | |
} | |
$coPoValuesInsert = implode(',', $coPovalues); | |
$sql = "INSERT INTO nba_co_po_relation (nba_course_outcome_id,nba_program_outcome_id,nba_co_po_justification) | |
VALUES | |
$coPoValuesInsert | |
ON DUPLICATE KEY UPDATE | |
nba_co_po_justification = VALUES(nba_co_po_justification)"; | |
try{ | |
$this->executeQuery($sql); | |
}catch(\Exception $e){ | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
public function calculateCoOfOnlineExam($onlineExamId, $batchId, $semId, $subjectId, $nodeId) | |
{ | |
$onlineExamId = $onlineExamId; | |
$sql = ""; | |
$assessmentCOList = []; | |
$assessmentTypeId = NbaCoPoService::getInstance()->getAssessmentTypeIdFromCode(AssessmentType::ONLINE_EXAM); | |
$onlineExamId = trim(sql_real_escape_string($onlineExamId)); | |
$coPoCourseWiseCalculationDisplayStyle = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_PO_CALCULATION_DISPlAY_STYLE_IN_TREE_NODE); | |
$coValueCalculationMethod = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_VALUE_CALCULATION_FROM_ASSESSMENTS_METHOD); | |
// $sql = "select batchName from batches where batchID=\"" . $batchID . "\""; | |
// $result = sql_query($sql, $connect); | |
// $row = sql_fetch_array($result); | |
// $batchName = preg_replace('/\s+/', '', $row[0]); | |
// $fileName = $batchName . "_" . date("d-m-Y", strtotime($date)); | |
// $fileName = preg_replace('/\s+/', '', $fileName); | |
$result = StudentService::getInstance()->getAllStudentsByBatchIdSemIdSubjectId($batchId, $semId, $subjectId); | |
$count = 1; | |
$COcount = 0; | |
$sql_count = "SELECT id, code, objective, order_no FROM nba_course_outcome WHERE batchID=\"" . $batchId . "\" and subjectID = \"" . $subjectId . "\" ORDER BY order_no ASC"; | |
$result_count = sql_query($sql_count, $connect); | |
$COcount = sql_num_rows($result_count); | |
$colspan = $COcount + 3; | |
while ($row_count = sql_fetch_array($result_count)) { | |
$nba_course_outcomes[$row_count['id']] = $row_count['code']; | |
} | |
$count = count($nba_course_outcomes); | |
if (!$count) { | |
return null; | |
} | |
$sbsIdDetails = SubjectService::getInstance()->getSbsDetailsByStaffId($batchId, $semId, $_SESSION['staffID'], $subjectId); | |
$pseudoSubject = SubjectService::getInstance()->getPseudoSubjectBySbsId($sbsIdDetails->sbsID); | |
if ( $pseudoSubject && $pseudoSubject->pseudosubjectID ) { | |
$contexts[] = '"pseudoSubjectId":"'.$pseudoSubject->pseudosubjectID.'"'; | |
}else{ | |
if ( $batchId ) { | |
$contexts[] = '"batchId":"'.$batchId.'"'; | |
} | |
if ( $semId ) { | |
$contexts[] = '"semId":"'.$semId.'"'; | |
} | |
if ( $subjectId ) { | |
$contexts[] = '"subjectId":"'.$subjectId.'"'; | |
} | |
} | |
$conditions .= " AND JSON_CONTAINS(oee.identifying_context, '{" . implode (",", $contexts ) . "}')"; | |
foreach ($result as $student) { | |
$denominatorValueArray=[]; | |
$nominatorValueArray=[]; | |
$studentId = $student->id; | |
$sql_oe = "SELECT | |
oee.id | |
FROM | |
oe_exams oee | |
LEFT JOIN | |
oe_exam_user_mark oeum ON (oee.id = oeum.oe_exams_id AND oeum.user_id = '$studentId' AND oeum.user_type= 'STUDENT') | |
WHERE oee.is_deleted = 0 AND oee.id= '$onlineExamId' AND ( oee.type = 'QUIZ' OR oee.type = 'EXAM_CONTROLLER' OR oee.type = 'OBE_MARK_ENTRY' ) | |
$conditions | |
GROUP BY oee.id"; | |
$oeExams = $this->executeQueryForList($sql_oe); | |
foreach ($oeExams as $exam) { | |
$oeExamId = $exam->id; | |
$studentMarkList = NbaCoService::getInstance()->getCoDetailsOfOnlineExam($oeExamId, $studentId,$batchId,$semId,$subjectId); | |
$validStudentQuestionIds=NbaCoService::getInstance()->getSectionWiseValidQuestionIdsForCoCalculationOfAStudentForOnlineExam($oeExamId,$studentId); | |
if (!empty($studentMarkList)) { | |
$totalCoPercentList = NbaCoService::getInstance()->calculateTotalCOPercentsOnlineExam($validStudentQuestionIds->nbaCourseOutcomeQuestionsIdList, $batchId, $semId, $subjectId); | |
foreach ($studentMarkList as $row_mark) { | |
$row_mark = (array)$row_mark; | |
if (!in_array($row_mark['oe_exam_questions_id'], $validStudentQuestionIds->nbaCourseOutcomeQuestionsIdList)) { | |
continue; | |
} | |
$mark_obtained = $row_mark['markObtained']; | |
$staffId = $row_mark["created_by"]; | |
$maxMark = $row_mark['mark']; | |
foreach($row_mark['cos'] as $coDetails){ | |
$nba_course_outcome_id = $coDetails->coId; | |
$course_outcome_value = $coDetails->value; | |
$course_outcome_value = $course_outcome_value / 100; | |
//this is only for course wise type 2 calculation | |
if ($coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_AND_CALCULATION_TWO){ | |
$studentQuestionCoDetails = new NBASubjectAssessmentCoValue(); | |
$value = (($mark_obtained / $maxMark) * ($course_outcome_value))*100; | |
$studentQuestionCoDetails->markCOPercentage = $value; | |
$studentQuestionCoDetails->studentId = $studentId; | |
$studentQuestionCoDetails->questionId = $row_mark['oe_exam_questions_id']; | |
$studentQuestionCoDetails->coId = $nba_course_outcome_id; | |
$assessmentStudentQuestionMarkCOList[] = $studentQuestionCoDetails; | |
} | |
if ($coValueCalculationMethod==NbaMethod::OBE_CO_VALUE_CALCULATION_FROM_ASSESSMENTS_METHOD_TWO){ | |
$denominatorValue =($maxMark*($coDetails->value/100)); | |
$denominatorValueArray[$nba_course_outcome_id] += $denominatorValue; | |
$nominatorValue =($mark_obtained*($coDetails->value/100)); | |
$nominatorValueArray[$nba_course_outcome_id] += $nominatorValue; | |
}else{ | |
$per_percent = $totalCoPercentList[$nba_course_outcome_id] / 100; | |
$percentage = ($mark_obtained / $maxMark) * ($course_outcome_value); | |
$exactValue = ($percentage / $per_percent) * 100; | |
$CoArr[$studentId][$nba_course_outcome_id] += $exactValue; | |
} | |
} | |
} | |
if ($coValueCalculationMethod==NbaMethod::OBE_CO_VALUE_CALCULATION_FROM_ASSESSMENTS_METHOD_TWO){ | |
foreach ($nominatorValueArray as $coId => $nominatorValue) { | |
$CoArr[$studentId][$coId]= ($nominatorValue/$denominatorValueArray[$coId])*100; | |
} | |
} | |
} | |
} | |
} | |
foreach ($CoArr as $studentId => $nbaCourseOutcomes) { | |
foreach ($nbaCourseOutcomes as $coId => $coValue) { | |
$nbaSubjectAssessmentCoValue = new NBASubjectAssessmentCoValue(); | |
$nbaSubjectAssessmentCoValue->assessmentId = $onlineExamId; | |
$nbaSubjectAssessmentCoValue->assessmentTypeId = $assessmentTypeId; | |
$nbaSubjectAssessmentCoValue->coId = $coId; | |
$nbaSubjectAssessmentCoValue->value = $coValue; | |
$nbaSubjectAssessmentCoValue->studentId = $studentId; | |
$nbaSubjectAssessmentCoValue->staffId = $staffId ? $staffId : $_SESSION['staffID'];//Here staff is the one who enters mark to students | |
$nbaSubjectAssessmentCoValue->batchId = $batchId; | |
$nbaSubjectAssessmentCoValue->semId = $semId; | |
$nbaSubjectAssessmentCoValue->subjectId = $subjectId; | |
$nbaSubjectAssessmentCoValue->createdBy = $_SESSION['staffID']; | |
$nbaSubjectAssessmentCoValue->updatedBy = $_SESSION['staffID']; | |
$assessmentCOList[] = $nbaSubjectAssessmentCoValue; | |
} | |
} | |
if (empty($assessmentCOList)) { | |
throw new ProfessionalException(ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN, 'Atleast 1 Co must be given'); | |
} | |
$assessmentCourseWiseCOList=$this->courseWiseAttainmentCalculation($assessmentCOList, $nodeId, $assessmentStudentQuestionMarkCOList); | |
$this->saveCoValuesForSubjectAssessmentCourseWiseCalculetion($assessmentCourseWiseCOList); | |
$this->saveCoValuesForSubjectAssessments($assessmentCOList); | |
} | |
public function calculateCoOfPollsSurvey($onlineExamId, $batchId, $semId, $subjectId, $nodeId) | |
{ | |
$onlineExamId = $onlineExamId; | |
$sql = ""; | |
$assessmentCOList = []; | |
$assessmentTypeId = NbaCoPoService::getInstance()->getAssessmentTypeIdFromCode(AssessmentType::POLLS_SURVEY); | |
$onlineExamId = trim(sql_real_escape_string($onlineExamId)); | |
$coPoCourseWiseCalculationDisplayStyle = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_PO_CALCULATION_DISPlAY_STYLE_IN_TREE_NODE); | |
$coValueCalculationMethod = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_VALUE_CALCULATION_FROM_ASSESSMENTS_METHOD); | |
// $sql = "select batchName from batches where batchID=\"" . $batchID . "\""; | |
// $result = sql_query($sql, $connect); | |
// $row = sql_fetch_array($result); | |
// $batchName = preg_replace('/\s+/', '', $row[0]); | |
// $fileName = $batchName . "_" . date("d-m-Y", strtotime($date)); | |
// $fileName = preg_replace('/\s+/', '', $fileName); | |
$result = StudentService::getInstance()->getAllStudentsByBatchIdSemIdSubjectId($batchId, $semId, $subjectId); | |
$count = 1; | |
$COcount = 0; | |
$sql_count = "SELECT id, code, objective, order_no FROM nba_course_outcome WHERE batchID=\"" . $batchId . "\" and subjectID = \"" . $subjectId . "\" ORDER BY order_no ASC"; | |
$result_count = sql_query($sql_count, $connect); | |
$COcount = sql_num_rows($result_count); | |
$colspan = $COcount + 3; | |
while ($row_count = sql_fetch_array($result_count)) { | |
$nba_course_outcomes[$row_count['id']] = $row_count['code']; | |
} | |
$count = count($nba_course_outcomes); | |
if (!$count) { | |
return null; | |
} | |
$sbsIdDetails = SubjectService::getInstance()->getSbsDetailsByStaffId($batchId, $semId, $_SESSION['staffID'], $subjectId); | |
$pseudoSubject = SubjectService::getInstance()->getPseudoSubjectBySbsId($sbsIdDetails->sbsID); | |
if ( $pseudoSubject && $pseudoSubject->pseudosubjectID ) { | |
$batchesAndSubject = '{"pseudoSubjectId":"'.$pseudoSubject->pseudosubjectID.'"}'; | |
}else{ | |
if ( $batchId && $subjectId) { | |
$batchesAndSubject= '{"batchId":"'.$batchId.'","subjectId":"'.$subjectId.'"}'; | |
} | |
} | |
$batchesAndSubjects = []; | |
$batchesAndSubjects[] = $batchesAndSubject; | |
$identifyingContexts[] = '"batchAndSubjects":['.implode($batchesAndSubjects).']'; | |
$conditions .= " AND JSON_CONTAINS(oee.identifying_context, '{" . implode (",", $identifyingContexts) . "}')"; | |
foreach ($result as $student) { | |
$denominatorValueArray=[]; | |
$nominatorValueArray=[]; | |
$studentId = $student->id; | |
$sql_oe = "SELECT | |
oee.id | |
FROM | |
oe_exams oee | |
LEFT JOIN | |
oe_exam_user_mark oeum ON (oee.id = oeum.oe_exams_id AND oeum.user_id = '$studentId' AND oeum.user_type= 'STUDENT') | |
WHERE oee.is_deleted = 0 AND oee.id= '$onlineExamId' AND oee.type = 'POLLS_SURVEY' | |
$conditions | |
GROUP BY oee.id"; | |
$oeExams = $this->executeQueryForList($sql_oe); | |
foreach ($oeExams as $exam) { | |
$oeExamId = $exam->id; | |
$studentMarkList = NbaCoService::getInstance()->getCoDetailsOfOnlineExam($oeExamId, $studentId,$batchId,$semId,$subjectId); | |
$validStudentQuestionIds=NbaCoService::getInstance()->getSectionWiseValidQuestionIdsForCoCalculationOfAStudentForOnlineExam($oeExamId,$studentId); | |
if (!empty($studentMarkList)) { | |
$totalCoPercentList = NbaCoService::getInstance()->calculateTotalCOPercentsOnlineExam($validStudentQuestionIds->nbaCourseOutcomeQuestionsIdList, $batchId, $semId, $subjectId); | |
foreach ($studentMarkList as $row_mark) { | |
$row_mark = (array)$row_mark; | |
if (!in_array($row_mark['oe_exam_questions_id'], $validStudentQuestionIds->nbaCourseOutcomeQuestionsIdList)) { | |
continue; | |
} | |
$mark_obtained = $row_mark['markObtained']; | |
$staffId = $row_mark["created_by"]; | |
$maxMark = $row_mark['mark']; | |
foreach($row_mark['cos'] as $coDetails){ | |
$nba_course_outcome_id = $coDetails->coId; | |
$course_outcome_value = $coDetails->value; | |
$course_outcome_value = $course_outcome_value / 100; | |
//this is only for course wise type 2 calculation | |
if ($coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_AND_CALCULATION_TWO){ | |
$studentQuestionCoDetails = new NBASubjectAssessmentCoValue(); | |
$value = (($mark_obtained / $maxMark) * ($course_outcome_value))*100; | |
$studentQuestionCoDetails->markCOPercentage = $value; | |
$studentQuestionCoDetails->studentId = $studentId; | |
$studentQuestionCoDetails->questionId = $row_mark['oe_exam_questions_id']; | |
$studentQuestionCoDetails->coId = $nba_course_outcome_id; | |
$assessmentStudentQuestionMarkCOList[] = $studentQuestionCoDetails; | |
} | |
if ($coValueCalculationMethod==NbaMethod::OBE_CO_VALUE_CALCULATION_FROM_ASSESSMENTS_METHOD_TWO){ | |
$denominatorValue =($maxMark*($coDetails->value/100)); | |
$denominatorValueArray[$nba_course_outcome_id] += $denominatorValue; | |
$nominatorValue =($mark_obtained*($coDetails->value/100)); | |
$nominatorValueArray[$nba_course_outcome_id] += $nominatorValue; | |
}else{ | |
$per_percent = $totalCoPercentList[$nba_course_outcome_id] / 100; | |
$percentage = ($mark_obtained / $maxMark) * ($course_outcome_value); | |
$exactValue = ($percentage / $per_percent) * 100; | |
$CoArr[$studentId][$nba_course_outcome_id] += $exactValue; | |
} | |
} | |
} | |
if ($coValueCalculationMethod==NbaMethod::OBE_CO_VALUE_CALCULATION_FROM_ASSESSMENTS_METHOD_TWO){ | |
foreach ($nominatorValueArray as $coId => $nominatorValue) { | |
$CoArr[$studentId][$coId]= ($nominatorValue/$denominatorValueArray[$coId])*100; | |
} | |
} | |
} | |
} | |
} | |
foreach ($CoArr as $studentId => $nbaCourseOutcomes) { | |
foreach ($nbaCourseOutcomes as $coId => $coValue) { | |
$nbaSubjectAssessmentCoValue = new NBASubjectAssessmentCoValue(); | |
$nbaSubjectAssessmentCoValue->assessmentId = $onlineExamId; | |
$nbaSubjectAssessmentCoValue->assessmentTypeId = $assessmentTypeId; | |
$nbaSubjectAssessmentCoValue->coId = $coId; | |
$nbaSubjectAssessmentCoValue->value = $coValue; | |
$nbaSubjectAssessmentCoValue->studentId = $studentId; | |
$nbaSubjectAssessmentCoValue->staffId = $staffId ? $staffId : $_SESSION['staffID'];//Here staff is the one who enters mark to students | |
$nbaSubjectAssessmentCoValue->batchId = $batchId; | |
$nbaSubjectAssessmentCoValue->semId = $semId; | |
$nbaSubjectAssessmentCoValue->subjectId = $subjectId; | |
$nbaSubjectAssessmentCoValue->createdBy = $_SESSION['staffID']; | |
$nbaSubjectAssessmentCoValue->updatedBy = $_SESSION['staffID']; | |
$assessmentCOList[] = $nbaSubjectAssessmentCoValue; | |
} | |
} | |
if (empty($assessmentCOList)) { | |
throw new ProfessionalException(ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN, 'Atleast 1 Co must be given'); | |
} | |
$assessmentCourseWiseCOList=$this->courseWiseAttainmentCalculation($assessmentCOList, $nodeId, $assessmentStudentQuestionMarkCOList); | |
$this->saveCoValuesForSubjectAssessmentCourseWiseCalculetion($assessmentCourseWiseCOList); | |
$this->saveCoValuesForSubjectAssessments($assessmentCOList); | |
} | |
public function getAllOnlineExams($batchId, $subjectId, $semId){ | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$subjectId = $this->realEscapeString($subjectId); | |
$sbsIdDetails = SubjectService::getInstance()->getSbsDetailsByStaffId($batchId, $semId, $_SESSION['staffID'], $subjectId); | |
$pseudoSubject = SubjectService::getInstance()->getPseudoSubjectBySbsId($sbsIdDetails->sbsID); | |
if ( $pseudoSubject && $pseudoSubject->pseudosubjectID ) { | |
$contexts[] = '"pseudoSubjectId":"'.$pseudoSubject->pseudosubjectID.'"'; | |
}else{ | |
if ( $batchId ) { | |
$contexts[] = '"batchId":"'.$batchId.'"'; | |
} | |
if ( $semId ) { | |
$contexts[] = '"semId":"'.$semId.'"'; | |
} | |
if ( $subjectId ) { | |
$contexts[] = '"subjectId":"'.$subjectId.'"'; | |
} | |
} | |
// if ( $staffId ) { | |
// $contexts[] = '"staffId":"'.$staffId.'"'; | |
// } | |
// if ( $subbatchId ) { | |
// if ( $userId ) { | |
// /** | |
// * If subbatchId is given then (In user side) | |
// * Fetch all exam with that subbatchId and also subbatchId = 0 (ALL) | |
// */ | |
// $conditions .= " AND JSON_EXTRACT(oee.identifying_context, \"$.subbatchId\") IN (0, $subbatchId) "; | |
// } | |
// else { | |
// $contexts[] = '"subbatchId":"'.$subbatchId.'"'; | |
// } | |
// } else { | |
// $contexts[] = '"subbatchId":"0"'; | |
// } | |
// if ( $userId ) { | |
// /** | |
// * If userId then | |
// * List all unlocked exams | |
// */ | |
// // $conditions .= " AND JSON_CONTAINS(oee.properties, '{\"isLocked\": false}')"; | |
// // if ( $staffId ) { | |
// // $contexts[] = '"staffId":"'.$staffId.'"'; | |
// // } | |
// } | |
$conditions .= " AND JSON_CONTAINS(oee.identifying_context, '{" . implode (",", $contexts ) . "}')"; | |
try { | |
$sql = "SELECT | |
oee.id, | |
oee.name, | |
oee.description, | |
oee.type, | |
oee.identifying_context, | |
oee.properties, | |
oee.user_type, | |
oee.is_deleted | |
FROM | |
oe_exams oee | |
WHERE oee.is_deleted = 0 AND ( oee.type = 'QUIZ' OR oee.type = 'EXAM_CONTROLLER' OR oee.type = 'OBE_MARK_ENTRY' ) | |
$conditions | |
GROUP BY oee.id"; | |
$exams = $this->executeQueryForList($sql); | |
return $exams; | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
public function getAllPollsSurvey($batchId, $subjectId, $semId){ | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$subjectId = $this->realEscapeString($subjectId); | |
$sbsIdDetails = SubjectService::getInstance()->getSbsDetailsByStaffId($batchId, $semId, $_SESSION['staffID'], $subjectId); | |
$pseudoSubject = SubjectService::getInstance()->getPseudoSubjectBySbsId($sbsIdDetails->sbsID); | |
if ( $pseudoSubject && $pseudoSubject->pseudosubjectID ) { | |
$batchesAndSubject = '{"pseudoSubjectId":"'.$pseudoSubject->pseudosubjectID.'"}'; | |
}else{ | |
if ( $batchId && $subjectId) { | |
$batchesAndSubject= '{"batchId":"'.$batchId.'","subjectId":"'.$subjectId.'"}'; | |
} | |
} | |
$batchesAndSubjects = []; | |
$batchesAndSubjects[] = $batchesAndSubject; | |
$identifyingContexts[] = '"batchAndSubjects":['.implode($batchesAndSubjects).']'; | |
$conditions .= " AND JSON_CONTAINS(oee.identifying_context, '{" . implode (",", $identifyingContexts) . "}')"; | |
try { | |
$sql = "SELECT | |
oee.id, | |
oee.name, | |
oee.description, | |
oee.type, | |
oee.identifying_context, | |
oee.properties, | |
oee.user_type, | |
oee.is_deleted | |
FROM | |
oe_exams oee | |
WHERE oee.is_deleted = 0 AND oee.type = 'POLLS_SURVEY' | |
$conditions | |
GROUP BY oee.id"; | |
$exams = $this->executeQueryForList($sql); | |
return $exams; | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
public function getValidCos($batchId,$subjectId){ | |
$sql_valid_COs = "SELECT nco.id,nco.code ,b.batchName,subjectName from | |
nba_course_outcome nco | |
LEFT JOIN batches b ON b.batchID =nco.batchID | |
INNER JOIN subjects s ON s.subjectID = nco.subjectID | |
WHERE nco.batchID =".$batchId." and nco.subjectID=".$subjectId." order by nco.order_no;"; | |
try { | |
return $this->executeQueryForList($sql_valid_COs); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
public function getPosByCoAndPo($coId,$poId){ | |
$sql = "SELECT weightage | |
FROM nba_co_po_relation copo | |
INNER JOIN nba_descriptor nd ON copo.nba_descriptor_id = nd.id | |
WHERE copo.nba_course_outcome_id = '".$coId."' AND copo.nba_program_outcome_id = $poId"; | |
try { | |
return $this->executeQueryForObject($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
public function courseWiseAttainmentCalculation($assessmentStudentCOList, $nodeId, $assessmentStudentQuestionMarkCOList=null){ | |
$coPoCourseWiseCalculationDisplayStyle = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_PO_CALCULATION_DISPlAY_STYLE_IN_TREE_NODE); | |
$subjectCOs = NbaCoService::getInstance()->getAllCosBySubjectIdBatchIdAndSemId($_REQUEST['subjectId'], $_REQUEST['batchId'], $_REQUEST['semId']); | |
$ruleForCalculation = true; | |
if ($coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_IN_TREE_NODE || $coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_AND_CALCULATION_TWO) { | |
$coAttainmentRuleDetails = CoPoAttainmentService::getInstance()->getRulesForCoAndPoAttainment($_REQUEST['batchId'], $_REQUEST['semId'], $_REQUEST['subjectId'], $nodeId, $ruleForCalculation); | |
}else{ | |
$coAttainmentRuleDetails = CoPoAttainmentService::getInstance()->getRulesForCoAndPoAttainment($_REQUEST['batchId'], $_REQUEST['semId'], $_REQUEST['subjectId']); | |
} | |
$totalCOValues=[]; | |
$coAttainment=[]; | |
foreach ($assessmentStudentCOList as $studentCoDetails) { | |
$studentDetails[$studentCoDetails->studentId] = $studentCoDetails->studentName; | |
$studentDetailsCO[$studentCoDetails->studentId][$studentCoDetails->coId] = $studentCoDetails->value; | |
$totalCOValues[$studentCoDetails->coId]+=sprintf("%01.2f",$studentCoDetails->value); | |
} | |
$totalStudentStrength = count($studentDetails); | |
if (empty($coAttainmentRuleDetails)) { | |
throw new ProfessionalException(ProfessionalException::ATTAINMENT_RULES_NOT_DEFINED, 'Please Define Co And Po Attainment rules...'); | |
}else{ | |
$coAttainmentRule = $coAttainmentRuleDetails->rule; | |
$coAttainmentType = $coAttainmentRule->type; | |
$coAttainmentGoals = $coAttainmentRule->goals; | |
} | |
$maxDescriptorValue = CoPoAttainmentService::getInstance()->getMaxDescriptorDetails(); | |
if (empty($maxDescriptorValue)) { | |
throw new ProfessionalException(ProfessionalException::DESCRIPTOR_VALUES_NOT_DEFINED, 'Please Make Sure Descriptor Values Are Defined'); | |
} | |
$maxDescriptorValue = $maxDescriptorValue->descriptorValue; | |
switch ($coAttainmentRule->type) { | |
case AttainmentCalculationType::SIMPLE_AVERAGE: | |
foreach($totalCOValues as $coId => $coTotal){ | |
$coValue = 0; | |
if(count($totalStudentStrength)){ | |
$coValue = $coTotal / $totalStudentStrength; | |
$coValue = ($coValue / 100) * $maxDescriptorValue; | |
$coAttainment[$coId] = $coValue; | |
} | |
} | |
break; | |
case AttainmentCalculationType::SLABBED_AVERAGE: | |
foreach($totalCOValues as $coId => $coTotal){ | |
$coValue = 0; | |
$didNotMatchToAnySlab = true; | |
if(count($totalStudentStrength)){ | |
$coValue = $coTotal / $totalStudentStrength; | |
foreach ($coAttainmentRule->slabs as $slab) { | |
if (($coValue >= $slab->min->percent && $coValue < $slab->max->percent) || ($slab->min->percent == $slab->max->percent && $coValue == $slab->max->percent) || ($coValue == $slab->max->percent && $coValue == 100)) { | |
$didNotMatchToAnySlab = false; | |
if(($slab->max->percent - $slab->min->percent) == 0) | |
$coValue = $slab->min->descriptor; | |
else | |
$coValue = $slab->min->descriptor + (($coValue - $slab->min->percent) / ($slab->max->percent - $slab->min->percent)); //coValue = min_range + (coValueInPercent - lower_range_slab)/ (higher_range_slab - lower_range_slab) This formula converts out co to descriptor range | |
break; | |
} | |
} | |
} | |
if($didNotMatchToAnySlab){ | |
$coValue = 0; | |
$coAttainment[$coId] = $coValue; | |
}else{ | |
// $coValue = round($coValue,0); | |
$coAttainment[$coId] = $coValue; | |
} | |
} | |
break; | |
case AttainmentCalculationType::NSTUDENT_NPERCENT: | |
$coAttainmentRule->goals = CoPoAttainmentService::getInstance()->populateDescriptorValuesFromIds($coAttainmentRule->goals); | |
$questionAttendedStudents =[]; | |
if ($coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_AND_CALCULATION_TWO){ | |
foreach ($assessmentStudentQuestionMarkCOList as $studentQuestionCoDetails) { | |
if(empty($questionAttendedStudents[$studentQuestionCoDetails->questionId])){ | |
$questionAttendedStudents[$studentQuestionCoDetails->questionId]=1; | |
}else{ | |
$questionAttendedStudents[$studentQuestionCoDetails->questionId] = $questionAttendedStudents[$studentQuestionCoDetails->questionId]+1; | |
} | |
$atleastOneStudentNotHaveAttainPercentage[$studentQuestionCoDetails->questionId][$studentQuestionCoDetails->coId] =0; | |
if($studentQuestionCoDetails->markCOPercentage >= $coAttainmentRule->goals[0]->attain_percent){ | |
if(empty($questionAttendedStudentsHaveSpecifiedCoValue[$studentQuestionCoDetails->questionId][$studentQuestionCoDetails->coId])){ | |
$questionAttendedStudentsHaveSpecifiedCoValue[$studentQuestionCoDetails->questionId][$studentQuestionCoDetails->coId]=1; | |
}else{ | |
$questionAttendedStudentsHaveSpecifiedCoValue[$studentQuestionCoDetails->questionId][$studentQuestionCoDetails->coId] = $questionAttendedStudentsHaveSpecifiedCoValue[$studentQuestionCoDetails->questionId][$studentQuestionCoDetails->coId]+1; | |
} | |
}else{ | |
$atleastOneStudentNotHaveAttainPercentage[$studentQuestionCoDetails->questionId][$studentQuestionCoDetails->coId] = 1; | |
} | |
} | |
foreach($questionAttendedStudents as $questionId => $attendedStudents){ | |
foreach ( $subjectCOs as $co ) { | |
$percentageOfStudentScoredSpecifiedValue[$questionId][$co->id] = ($questionAttendedStudentsHaveSpecifiedCoValue[$questionId][$co->id]/$questionAttendedStudents[$questionId])*100; | |
foreach($coAttainmentRule->goals as $gIndex => $goal){ | |
if($percentageOfStudentScoredSpecifiedValue[$questionId][$co->id]>=$goal->student_percent){ | |
$attainmentOfStudentScoredSpecifiedValue[$questionId][$co->id]= $goal->descriptor->weightage; | |
break; | |
}else if($percentageOfStudentScoredSpecifiedValue[$questionId][$co->id]>0 || $atleastOneStudentNotHaveAttainPercentage[$questionId][$co->id]){ | |
$attainmentOfStudentScoredSpecifiedValue[$questionId][$co->id]= 0; | |
} | |
} | |
} | |
} | |
foreach ( $subjectCOs as $co ) { | |
$coUsedCount =0; | |
$sumOfCoAttainment =0; | |
foreach($questionAttendedStudents as $questionId => $attendedStudents){ | |
if($attainmentOfStudentScoredSpecifiedValue[$questionId][$co->id] || $attainmentOfStudentScoredSpecifiedValue[$questionId][$co->id] ===0){ | |
$coUsedCount= $coUsedCount+1; | |
$sumOfCoAttainment = $sumOfCoAttainment + $attainmentOfStudentScoredSpecifiedValue[$questionId][$co->id]; | |
} | |
} | |
if($coUsedCount>0){ | |
$coAttainment[$co->id] = $sumOfCoAttainment/$coUsedCount; | |
} | |
} | |
}else{ | |
foreach ( $subjectCOs as $co ) { | |
$goalCount= count($coAttainmentRule->goals); | |
foreach($coAttainmentRule->goals as $gIndex => $goal){ | |
$numberOfStudentsWithSpecifiedAttainment=0; | |
$percentageOfStudentsWithSpecifiedAttainment=0; | |
foreach ($studentDetails as $student_id => $studentName) { | |
if($studentDetailsCO[$student_id][$co->id] >= $goal->attain_percent){ | |
$numberOfStudentsWithSpecifiedAttainment = $numberOfStudentsWithSpecifiedAttainment+1; | |
} | |
} | |
if($totalStudentStrength){ | |
$percentageOfStudentsWithSpecifiedAttainment = ($numberOfStudentsWithSpecifiedAttainment/$totalStudentStrength)*100; | |
if($percentageOfStudentsWithSpecifiedAttainment >= $goal->student_percent && $percentageOfStudentsWithSpecifiedAttainment !=0){ | |
$coValue = $goal->descriptor->weightage; | |
$coAttainment[$co->id] = $coValue; | |
break; | |
} | |
} | |
} | |
} | |
} | |
break; | |
case AttainmentCalculationType::N_STUDENT_N_PERCENT_SLABBED_AVERAGE: | |
foreach ( $subjectCOs as $co ) { | |
$goalCount= count($coAttainmentRule->goalsWithSlab); | |
foreach($coAttainmentRule->goalsWithSlab as $gIndex => $goal){ | |
$numberOfStudentsWithSpecifiedAttainment=0; | |
$percentageOfStudentsWithSpecifiedAttainment=0; | |
foreach ($studentDetails as $student_id => $studentName) { | |
if($studentDetailsCO[$student_id][$co->id] >= $goal->thresholdMark){ | |
$numberOfStudentsWithSpecifiedAttainment = $numberOfStudentsWithSpecifiedAttainment+1; | |
} | |
} | |
$didNotMatchToAnyGoalsSlab = true; | |
if($totalStudentStrength){ | |
$percentageOfStudentsWithSpecifiedAttainment = ($numberOfStudentsWithSpecifiedAttainment/$totalStudentStrength)*100; | |
if (($percentageOfStudentsWithSpecifiedAttainment >= $goal->min->percent && $percentageOfStudentsWithSpecifiedAttainment < $goal->max->percent) || ($goal->min->percent == $goal->max->percent && $percentageOfStudentsWithSpecifiedAttainment == $goal->max->percent) || ($percentageOfStudentsWithSpecifiedAttainment == $goal->max->percent && $percentageOfStudentsWithSpecifiedAttainment == 100)) { | |
$didNotMatchToAnyGoalsSlab = false; | |
if(($goal->max->percent - $goal->min->percent) == 0) | |
$coValue = $goal->min->descriptor; | |
else if($goal->max->descriptor == $goal->min->descriptor) | |
$coValue = $goal->min->descriptor; | |
else | |
$coValue = $goal->min->descriptor + (($percentageOfStudentsWithSpecifiedAttainment - $goal->min->percent) / ($goal->max->percent - $goal->min->percent)); //coValue = min_range + (coValueInPercent - lower_range_slab)/ (higher_range_slab - lower_range_slab) This formula converts out co to descriptor range | |
break; | |
} | |
} | |
} | |
if($didNotMatchToAnyGoalsSlab){ | |
$coValue = 0; | |
$coAttainment[$co->id] = $coValue; | |
}else{ | |
// $coValue = round($coValue,0); | |
$coAttainment[$co->id] = $coValue; | |
} | |
} | |
break; | |
} | |
$assessmentCourseWiseCoValue=[]; | |
foreach ($coAttainment as $coId => $coValue) { | |
$nbaSubjectAssessmentCoValue = new NBASubjectAssessmentCoValue(); | |
$nbaSubjectAssessmentCoValue->assessmentId = $assessmentStudentCOList[0]->assessmentId; | |
$nbaSubjectAssessmentCoValue->assessmentTypeId = $assessmentStudentCOList[0]->assessmentTypeId; | |
$nbaSubjectAssessmentCoValue->coId = $coId; | |
$nbaSubjectAssessmentCoValue->nodeId = $nodeId; | |
if($coAttainmentRule->type == AttainmentCalculationType::NSTUDENT_NPERCENT && $coPoCourseWiseCalculationDisplayStyle!=NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_AND_CALCULATION_TWO){ | |
$nbaSubjectAssessmentCoValue->value = (int) $coValue; | |
}else{ | |
$nbaSubjectAssessmentCoValue->value = (float) $coValue; | |
} | |
$nbaSubjectAssessmentCoValue->staffId = $staffId ? $staffId : $_SESSION['staffID'];//Here staff is the one who enters mark to students | |
$nbaSubjectAssessmentCoValue->batchId = $assessmentStudentCOList[0]->batchId; | |
$nbaSubjectAssessmentCoValue->semId = $assessmentStudentCOList[0]->semId; | |
$nbaSubjectAssessmentCoValue->subjectId = $assessmentStudentCOList[0]->subjectId; | |
$nbaSubjectAssessmentCoValue->createdBy = $_SESSION['staffID']; | |
$nbaSubjectAssessmentCoValue->updatedBy = $_SESSION['staffID']; | |
$assessmentCourseWiseCoValue[] = $nbaSubjectAssessmentCoValue; | |
} | |
return $assessmentCourseWiseCoValue; | |
} | |
public function courseWisePOAttainmentCalculation($assessmentStudentPOList, $nodeId){ | |
$coPoCourseWiseCalculationDisplayStyle = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_PO_CALCULATION_DISPlAY_STYLE_IN_TREE_NODE); | |
$subjectPOs = $this->getProgramOutcomeListByBatchId($_REQUEST['batchId']); | |
$ruleForCalculation = true; | |
if ($coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_IN_TREE_NODE || $coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_AND_CALCULATION_TWO) { | |
$coPoAttainmentRuleDetails = CoPoAttainmentService::getInstance()->getRulesForCoAndPoAttainment($_REQUEST['batchId'], $_REQUEST['semId'], $_REQUEST['subjectId'], $nodeId, $ruleForCalculation); | |
}else{ | |
$coPoAttainmentRuleDetails = CoPoAttainmentService::getInstance()->getRulesForCoAndPoAttainment($_REQUEST['batchId'], $_REQUEST['semId'], $_REQUEST['subjectId']); | |
} | |
$totalPOValues=[]; | |
$coPoAttainment=[]; | |
foreach ($assessmentStudentPOList as $studentCoDetails) { | |
$studentDetails[$studentCoDetails->studentId] = $studentCoDetails->studentName; | |
$studentDetailsPO[$studentCoDetails->studentId][$studentCoDetails->poId] = $studentCoDetails->value; | |
$totalPOValues[$studentCoDetails->poId]+=sprintf("%01.2f",$studentCoDetails->value); | |
} | |
$totalStudentStrength = count($studentDetails); | |
if (empty($coPoAttainmentRuleDetails)) { | |
throw new ProfessionalException(ProfessionalException::ATTAINMENT_RULES_NOT_DEFINED, 'Please Define Co And Po Attainment rules...'); | |
}else{ | |
$coPoAttainmentRule = $coPoAttainmentRuleDetails->rule; | |
$coAttainmentType = $coPoAttainmentRule->type; | |
$coAttainmentGoals = $coPoAttainmentRule->goals; | |
} | |
$maxDescriptorValue = CoPoAttainmentService::getInstance()->getMaxDescriptorDetails(); | |
if (empty($maxDescriptorValue)) { | |
throw new ProfessionalException(ProfessionalException::DESCRIPTOR_VALUES_NOT_DEFINED, 'Please Make Sure Descriptor Values Are Defined'); | |
} | |
$maxDescriptorValue = $maxDescriptorValue->descriptorValue; | |
switch ($coPoAttainmentRule->type) { | |
case AttainmentCalculationType::SIMPLE_AVERAGE: | |
foreach($totalPOValues as $poId => $poTotal){ | |
$poValue = 0; | |
if(count($totalStudentStrength)){ | |
$poValue = $poTotal / $totalStudentStrength; | |
$poValue = ($poValue / 100) * $maxDescriptorValue; | |
$coPoAttainment[$poId] = $poValue; | |
} | |
} | |
break; | |
case AttainmentCalculationType::SLABBED_AVERAGE: | |
foreach($totalPOValues as $poId => $poTotal){ | |
$poValue = 0; | |
$didNotMatchToAnySlab = true; | |
if(count($totalStudentStrength)){ | |
$poValue = $poTotal / $totalStudentStrength; | |
foreach ($coPoAttainmentRule->slabs as $slab) { | |
if (($poValue >= $slab->min->percent && $poValue < $slab->max->percent) || ($slab->min->percent == $slab->max->percent && $poValue == $slab->max->percent) || ($poValue == $slab->max->percent && $poValue == 100)) { | |
$didNotMatchToAnySlab = false; | |
if(($slab->max->percent - $slab->min->percent) == 0) | |
$poValue = $slab->min->descriptor; | |
else | |
$poValue = $slab->min->descriptor + (($poValue - $slab->min->percent) / ($slab->max->percent - $slab->min->percent)); //poValue = min_range + (poValueInPercent - lower_range_slab)/ (higher_range_slab - lower_range_slab) This formula converts out co to descriptor range | |
break; | |
} | |
} | |
} | |
if($didNotMatchToAnySlab){ | |
$poValue = 0; | |
$coPoAttainment[$poId] = $poValue; | |
}else{ | |
// $poValue = round($poValue,0); | |
$coPoAttainment[$poId] = $poValue; | |
} | |
} | |
break; | |
case AttainmentCalculationType::NSTUDENT_NPERCENT: | |
$coPoAttainmentRule->goals = CoPoAttainmentService::getInstance()->populateDescriptorValuesFromIds($coPoAttainmentRule->goals); | |
foreach ( $subjectPOs as $po ) { | |
$goalCount= count($coPoAttainmentRule->goals); | |
foreach($coPoAttainmentRule->goals as $gIndex => $goal){ | |
$numberOfStudentsWithSpecifiedAttainment=0; | |
$percentageOfStudentsWithSpecifiedAttainment=0; | |
foreach ($studentDetails as $student_id => $studentName) { | |
if($studentDetailsPO[$student_id][$po->id] >= $goal->attain_percent){ | |
$numberOfStudentsWithSpecifiedAttainment = $numberOfStudentsWithSpecifiedAttainment+1; | |
} | |
} | |
if($totalStudentStrength){ | |
$percentageOfStudentsWithSpecifiedAttainment = ($numberOfStudentsWithSpecifiedAttainment/$totalStudentStrength)*100; | |
if($percentageOfStudentsWithSpecifiedAttainment >= $goal->student_percent && $percentageOfStudentsWithSpecifiedAttainment !=0){ | |
$poValue = $goal->descriptor->weightage; | |
$coPoAttainment[$po->id] = $poValue; | |
break; | |
} | |
} | |
} | |
} | |
break; | |
case AttainmentCalculationType::N_STUDENT_N_PERCENT_SLABBED_AVERAGE: | |
foreach ( $subjectPOs as $po ) { | |
$goalCount= count($coPoAttainmentRule->goalsWithSlab); | |
foreach($coPoAttainmentRule->goalsWithSlab as $gIndex => $goal){ | |
$numberOfStudentsWithSpecifiedAttainment=0; | |
$percentageOfStudentsWithSpecifiedAttainment=0; | |
foreach ($studentDetails as $student_id => $studentName) { | |
if($studentDetailsPO[$student_id][$po->id] >= $goal->thresholdMark){ | |
$numberOfStudentsWithSpecifiedAttainment = $numberOfStudentsWithSpecifiedAttainment+1; | |
} | |
} | |
$didNotMatchToAnyGoalsSlab = true; | |
if($totalStudentStrength){ | |
$percentageOfStudentsWithSpecifiedAttainment = ($numberOfStudentsWithSpecifiedAttainment/$totalStudentStrength)*100; | |
if (($percentageOfStudentsWithSpecifiedAttainment >= $goal->min->percent && $percentageOfStudentsWithSpecifiedAttainment < $goal->max->percent) || ($goal->min->percent == $goal->max->percent && $percentageOfStudentsWithSpecifiedAttainment == $goal->max->percent) || ($percentageOfStudentsWithSpecifiedAttainment == $goal->max->percent && $percentageOfStudentsWithSpecifiedAttainment == 100)) { | |
$didNotMatchToAnyGoalsSlab = false; | |
if(($goal->max->percent - $goal->min->percent) == 0) | |
$poValue = $goal->min->descriptor; | |
else if($goal->max->descriptor == $goal->min->descriptor) | |
$poValue = $goal->min->descriptor; | |
else | |
$poValue = $goal->min->descriptor + (($percentageOfStudentsWithSpecifiedAttainment - $goal->min->percent) / ($goal->max->percent - $goal->min->percent)); //poValue = min_range + (coValueInPercent - lower_range_slab)/ (higher_range_slab - lower_range_slab) This formula converts out po to descriptor range | |
break; | |
} | |
} | |
} | |
if($didNotMatchToAnyGoalsSlab){ | |
$poValue = 0; | |
$coAttainment[$po->id] = $poValue; | |
}else{ | |
// $poValue = round($poValue,0); | |
$coAttainment[$po->id] = $poValue; | |
} | |
} | |
break; | |
} | |
$assessmentCourseWisePoValue=[]; | |
foreach ($coPoAttainment as $poId => $poValue) { | |
$nbaSubjectAssessmentPoValue = new NBASubjectAssessmentPoValue(); | |
$nbaSubjectAssessmentPoValue->assessmentId = $assessmentStudentPOList[0]->assessmentId; | |
$nbaSubjectAssessmentPoValue->assessmentTypeId = $assessmentStudentPOList[0]->assessmentTypeId; | |
$nbaSubjectAssessmentPoValue->poId = $poId; | |
$nbaSubjectAssessmentPoValue->nodeId = $nodeId; | |
$nbaSubjectAssessmentPoValue->value = (int) $poValue; | |
if($coPoAttainmentRule->type == AttainmentCalculationType::NSTUDENT_NPERCENT){ | |
$nbaSubjectAssessmentPoValue->value = (int) $poValue; | |
}else{ | |
$nbaSubjectAssessmentPoValue->value = (float) $poValue; | |
} | |
$nbaSubjectAssessmentPoValue->staffId = $staffId ? $staffId : $_SESSION['staffID'];//Here staff is the one who enters mark to students | |
$nbaSubjectAssessmentPoValue->batchId = $assessmentStudentPOList[0]->batchId; | |
$nbaSubjectAssessmentPoValue->semId = $assessmentStudentPOList[0]->semId; | |
$nbaSubjectAssessmentPoValue->subjectId = $assessmentStudentPOList[0]->subjectId; | |
$nbaSubjectAssessmentPoValue->createdBy = $_SESSION['staffID']; | |
$nbaSubjectAssessmentPoValue->updatedBy = $_SESSION['staffID']; | |
$assessmentCourseWisePoValue[] = $nbaSubjectAssessmentPoValue; | |
} | |
return $assessmentCourseWisePoValue; | |
} | |
public function constructSubjectAssessmentNodeAttainmentRequest($nodeId) { | |
$subjectAssessmentNodeReq = new GetAllSubjectAssessmentNodeRequest(); | |
$subjectAssessmentNodeReq->subjectId = $_REQUEST['subjectId']; | |
$subjectAssessmentNodeReq->batchId = $_REQUEST['batchId']; | |
$subjectAssessmentNodeReq->semId = $_REQUEST['semId']; | |
$subjectAssessmentNodeReq->staffId = $_REQUEST['staffId']; | |
$subjectAssessmentNodeReq->nodeId = $nodeId; | |
return $subjectAssessmentNodeReq; | |
} | |
/** | |
* To Do: | |
* 1)Add update functionality | |
* 2)There are many cases to be handled inorder to rewrite service as update... | |
* what happens when co mapping is deleted from an assessment | |
* what happens when an assessment is deleted altogether after a report | |
* is calculated | |
* | |
* @param [type] $assessmentCoList | |
* @return void | |
*/ | |
public function saveCoValuesForSubjectAssessmentCourseWiseCalculetion($assessmentCoList) | |
{ | |
if (!empty($assessmentCoList)) { | |
$this->insertCoValuesForSubjectAssessmentCourseWiseCalculetion($assessmentCoList); | |
} | |
$assessmentCo = $assessmentCoList[0]; | |
// $this->deleteCoValuesOfSubjectAssessmentCourseWiseCalculation($assessmentCo->assessmentId, $assessmentCo->assessmentTypeId, $assessmentCo->batchId, $assessmentCo->semId, $assessmentCo->subjectId); | |
} | |
private function deleteCoValuesOfSubjectAssessmentCourseWiseCalculation($assessmentId, $assessmentTypeId, $batchId, $semId, $subjectId) | |
{ | |
$sql = ""; | |
$assessmentId = $this->realEscapeString($assessmentId); | |
$assessmentTypeId = $this->realEscapeString($assessmentTypeId); | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$subjectId = $this->realEscapeString($subjectId); | |
$sql = "DELETE FROM nba_subject_assessment_co_value WHERE assessment_id = '$assessmentId' AND assessment_type_id = '$assessmentTypeId' AND batch_id = '$batchId' AND sem_id = '$semId' AND subject_id = '$subjectId'"; | |
try { | |
$this->executeQuery($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
/** | |
* !!!Always Provide Assessments Of Same Type!!! | |
* | |
* @param NBASubjectAssessmentCoValue[] $assessmentCoList | |
* @return void | |
*/ | |
private function insertCoValuesForSubjectAssessmentCourseWiseCalculetion($courseWiseCoList) | |
{ | |
$sql = ""; | |
$courseWiseCoList = $this->realEscapeArray($courseWiseCoList); | |
$sql = "INSERT INTO nba_course_wise_node_co_value (node_id, co_id, value, staff_id, batch_id, sem_id, subject_id, createdBy, createdDate, updatedBy, updatedDate) VALUES "; | |
$values = []; | |
foreach ($courseWiseCoList as $courseWiseCo) { | |
$values[] = "('$courseWiseCo->nodeId', '$courseWiseCo->coId', '$courseWiseCo->value', '$courseWiseCo->staffId', '$courseWiseCo->batchId', '$courseWiseCo->semId', '$courseWiseCo->subjectId', '$courseWiseCo->createdBy', UTC_TIMESTAMP(), '$courseWiseCo->updatedBy', UTC_TIMESTAMP())"; | |
} | |
$sql .= implode(',', $values); | |
try { | |
$this->executeQuery($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
/** | |
* !!!Always Provide Assessments Of Same Type!!! | |
* | |
* @param NBASubjectAssessmentCoValue[] $assessmentCoList | |
* @return void | |
*/ | |
private function insertPoValuesForSubjectAssessmentCourseWiseCalculetion($courseWisePoList) | |
{ | |
$sql = ""; | |
$courseWisePoList = $this->realEscapeArray($courseWisePoList); | |
$sql = "INSERT INTO nba_course_wise_node_po_value (node_id, po_id, value, staff_id, batch_id, sem_id, subject_id, createdBy, createdDate, updatedBy, updatedDate) VALUES "; | |
$values = []; | |
foreach ($courseWisePoList as $courseWisePo) { | |
$values[] = "('$courseWisePo->nodeId', '$courseWisePo->poId', '$courseWisePo->value', '$courseWisePo->staffId', '$courseWisePo->batchId', '$courseWisePo->semId', '$courseWisePo->subjectId', '$courseWisePo->createdBy', UTC_TIMESTAMP(), '$courseWisePo->updatedBy', UTC_TIMESTAMP())"; | |
} | |
$sql .= implode(',', $values); | |
try { | |
$this->executeQuery($sql); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
} | |
/** | |
* | |
* | |
* @param [type] $nodeId | |
* @param [type] $batchId | |
* @param [type] $semId | |
* @param [type] $subjectId | |
* @return void | |
*/ | |
public function getAllCalculatedCourseWiseCosFromNodeCoValueTable($nodeId, $batchId, $semId, $subjectId) | |
{ | |
$nodeId = $this->realEscapeString($nodeId); | |
$batchId = $this->realEscapeString($batchId); | |
$semId = $this->realEscapeString($semId); | |
$subjectId = $this->realEscapeString($subjectId); | |
$sql = "SELECT | |
cpr.nba_program_outcome_id AS poId, | |
cpr.nba_course_outcome_id AS coId, | |
ncwncv.staff_id as staffId, | |
ncwncv.value AS coContribution, | |
d.weightage | |
FROM | |
nba_course_wise_node_co_value ncwncv | |
INNER JOIN | |
nba_co_po_relation cpr ON cpr.nba_course_outcome_id = ncwncv.co_id | |
INNER JOIN | |
nba_descriptor d ON d.id = cpr.nba_descriptor_id | |
WHERE | |
ncwncv.node_id = '$nodeId' | |
AND ncwncv.batch_id = '$batchId' | |
AND ncwncv.sem_id = '$semId' | |
AND ncwncv.subject_id = '$subjectId'"; | |
$responseList = []; | |
try { | |
$responseList = $this->executeQueryForList($sql, $this->mapper[NbaCoPoServiceMapper::GET_CO_VALUES_FOR_AN_ASSESSMENT_FOR_COURSE_WISE_CALCULATION]); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
} | |
return $responseList; | |
} | |
public function courseWiseAttainmentCalculationForUniversity($assessmentStudentCOList, $nodeId){ | |
$coPoCourseWiseCalculationDisplayStyle = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_PO_CALCULATION_DISPlAY_STYLE_IN_TREE_NODE); | |
$subjectCOs = NbaCoService::getInstance()->getAllCosBySubjectIdBatchIdAndSemId($_REQUEST['subjectId'], $_REQUEST['batchId'], $_REQUEST['semId']); | |
$ruleForCalculation = true; | |
if ($coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_IN_TREE_NODE || $coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_AND_CALCULATION_TWO) { | |
$coAttainmentRuleDetails = CoPoAttainmentService::getInstance()->getRulesForCoAndPoAttainment($_REQUEST['batchId'], $_REQUEST['semId'], $_REQUEST['subjectId'], $nodeId, $ruleForCalculation); | |
}else{ | |
$coAttainmentRuleDetails = CoPoAttainmentService::getInstance()->getRulesForCoAndPoAttainment($_REQUEST['batchId'], $_REQUEST['semId'], $_REQUEST['subjectId']); | |
} | |
$totalCOValues=[]; | |
$coAttainment=[]; | |
foreach ($assessmentStudentCOList as $studentCoDetails) { | |
$studentDetails[$studentCoDetails->studentId] = $studentCoDetails->studentName; | |
$studentDetailsCO[$studentCoDetails->studentId][$studentCoDetails->coId] = $studentCoDetails->value; | |
$totalCOValues[$studentCoDetails->coId]+=sprintf("%01.2f",$studentCoDetails->value); | |
} | |
$totalStudentStrength = count($studentDetails); | |
if (empty($coAttainmentRuleDetails)) { | |
throw new ProfessionalException(ProfessionalException::ATTAINMENT_RULES_NOT_DEFINED, 'Please Define Co And Po Attainment rules...'); | |
}else{ | |
$coAttainmentRule = $coAttainmentRuleDetails->rule; | |
$coAttainmentType = $coAttainmentRule->type; | |
$coAttainmentGoals = $coAttainmentRule->goals; | |
} | |
$maxDescriptorValue = CoPoAttainmentService::getInstance()->getMaxDescriptorDetails(); | |
if (empty($maxDescriptorValue)) { | |
throw new ProfessionalException(ProfessionalException::DESCRIPTOR_VALUES_NOT_DEFINED, 'Please Make Sure Descriptor Values Are Defined'); | |
} | |
$maxDescriptorValue = $maxDescriptorValue->descriptorValue; | |
switch ($coAttainmentRule->type) { | |
case AttainmentCalculationType::SIMPLE_AVERAGE: | |
foreach($totalCOValues as $coId => $coTotal){ | |
$coValue = 0; | |
if(count($totalStudentStrength)){ | |
$coValue = $coTotal / $totalStudentStrength; | |
$coValue = ($coValue / 100) * $maxDescriptorValue; | |
$coAttainment[$coId] = $coValue; | |
} | |
} | |
break; | |
case AttainmentCalculationType::SLABBED_AVERAGE: | |
foreach($totalCOValues as $coId => $coTotal){ | |
$coValue = 0; | |
$didNotMatchToAnySlab = true; | |
if(count($totalStudentStrength)){ | |
$coValue = $coTotal / $totalStudentStrength; | |
foreach ($coAttainmentRule->slabs as $slab) { | |
if (($coValue >= $slab->min->percent && $coValue < $slab->max->percent) || ($slab->min->percent == $slab->max->percent && $coValue == $slab->max->percent) || ($coValue == $slab->max->percent && $coValue == 100)) { | |
$didNotMatchToAnySlab = false; | |
if(($slab->max->percent - $slab->min->percent) == 0) | |
$coValue = $slab->min->descriptor; | |
else | |
$coValue = $slab->min->descriptor + (($coValue - $slab->min->percent) / ($slab->max->percent - $slab->min->percent)); //coValue = min_range + (coValueInPercent - lower_range_slab)/ (higher_range_slab - lower_range_slab) This formula converts out co to descriptor range | |
break; | |
} | |
} | |
} | |
if($didNotMatchToAnySlab){ | |
$coValue = 0; | |
$coAttainment[$coId] = $coValue; | |
}else{ | |
// $coValue = round($coValue,0); | |
$coAttainment[$coId] = $coValue; | |
} | |
} | |
break; | |
case AttainmentCalculationType::NSTUDENT_NPERCENT: | |
$coAttainmentRule->goals = CoPoAttainmentService::getInstance()->populateDescriptorValuesFromIds($coAttainmentRule->goals); | |
$questionAttendedStudents =[]; | |
foreach ( $subjectCOs as $co ) { | |
$goalCount= count($coAttainmentRule->goals); | |
foreach($coAttainmentRule->goals as $gIndex => $goal){ | |
$numberOfStudentsWithSpecifiedAttainment=0; | |
$percentageOfStudentsWithSpecifiedAttainment=0; | |
foreach ($studentDetails as $student_id => $studentName) { | |
if($studentDetailsCO[$student_id][$co->id] >= $goal->attain_percent){ | |
$numberOfStudentsWithSpecifiedAttainment = $numberOfStudentsWithSpecifiedAttainment+1; | |
} | |
} | |
if($totalStudentStrength){ | |
$percentageOfStudentsWithSpecifiedAttainment = ($numberOfStudentsWithSpecifiedAttainment/$totalStudentStrength)*100; | |
if($percentageOfStudentsWithSpecifiedAttainment >= $goal->student_percent && $percentageOfStudentsWithSpecifiedAttainment !=0){ | |
$coValue = $goal->descriptor->weightage; | |
$coAttainment[$co->id] = $coValue; | |
break; | |
} | |
} | |
} | |
} | |
break; | |
case AttainmentCalculationType::N_STUDENT_N_PERCENT_SLABBED_AVERAGE: | |
foreach ( $subjectCOs as $co ) { | |
$goalCount= count($coAttainmentRule->goalsWithSlab); | |
foreach($coAttainmentRule->goalsWithSlab as $gIndex => $goal){ | |
$numberOfStudentsWithSpecifiedAttainment=0; | |
$percentageOfStudentsWithSpecifiedAttainment=0; | |
foreach ($studentDetails as $student_id => $studentName) { | |
if($studentDetailsCO[$student_id][$co->id] >= $goal->thresholdMark){ | |
$numberOfStudentsWithSpecifiedAttainment = $numberOfStudentsWithSpecifiedAttainment+1; | |
} | |
} | |
$didNotMatchToAnyGoalsSlab = true; | |
if($totalStudentStrength){ | |
$percentageOfStudentsWithSpecifiedAttainment = ($numberOfStudentsWithSpecifiedAttainment/$totalStudentStrength)*100; | |
if (($percentageOfStudentsWithSpecifiedAttainment >= $goal->min->percent && $percentageOfStudentsWithSpecifiedAttainment < $goal->max->percent) || ($goal->min->percent == $goal->max->percent && $percentageOfStudentsWithSpecifiedAttainment == $goal->max->percent) || ($percentageOfStudentsWithSpecifiedAttainment == $goal->max->percent && $percentageOfStudentsWithSpecifiedAttainment == 100)) { | |
$didNotMatchToAnyGoalsSlab = false; | |
if(($goal->max->percent - $goal->min->percent) == 0) | |
$coValue = $goal->min->descriptor; | |
else if($goal->max->descriptor == $goal->min->descriptor) | |
$coValue = $goal->min->descriptor; | |
else | |
$coValue = $goal->min->descriptor + (($percentageOfStudentsWithSpecifiedAttainment - $goal->min->percent) / ($goal->max->percent - $goal->min->percent)); //coValue = min_range + (coValueInPercent - lower_range_slab)/ (higher_range_slab - lower_range_slab) This formula converts out co to descriptor range | |
break; | |
} | |
} | |
} | |
if($didNotMatchToAnyGoalsSlab){ | |
$coValue = 0; | |
$coAttainment[$co->id] = $coValue; | |
}else{ | |
// $coValue = round($coValue,0); | |
$coAttainment[$co->id] = $coValue; | |
} | |
} | |
break; | |
} | |
$assessmentCourseWiseCoValue=[]; | |
foreach ($coAttainment as $coId => $coValue) { | |
$nbaSubjectAssessmentCoValue = new NBASubjectAssessmentCoValue(); | |
$nbaSubjectAssessmentCoValue->assessmentId = $assessmentStudentCOList[0]->assessmentId; | |
$nbaSubjectAssessmentCoValue->assessmentTypeId = $assessmentStudentCOList[0]->assessmentTypeId; | |
$nbaSubjectAssessmentCoValue->coId = $coId; | |
$nbaSubjectAssessmentCoValue->nodeId = $nodeId; | |
if($coAttainmentRule->type == AttainmentCalculationType::NSTUDENT_NPERCENT){ | |
$nbaSubjectAssessmentCoValue->value = (int) $coValue; | |
}else{ | |
$nbaSubjectAssessmentCoValue->value = (float) $coValue; | |
} | |
$nbaSubjectAssessmentCoValue->staffId = $staffId ? $staffId : $_SESSION['staffID'];//Here staff is the one who enters mark to students | |
$nbaSubjectAssessmentCoValue->batchId = $assessmentStudentCOList[0]->batchId; | |
$nbaSubjectAssessmentCoValue->semId = $assessmentStudentCOList[0]->semId; | |
$nbaSubjectAssessmentCoValue->subjectId = $assessmentStudentCOList[0]->subjectId; | |
$nbaSubjectAssessmentCoValue->createdBy = $_SESSION['staffID']; | |
$nbaSubjectAssessmentCoValue->updatedBy = $_SESSION['staffID']; | |
$assessmentCourseWiseCoValue[] = $nbaSubjectAssessmentCoValue; | |
} | |
return $assessmentCourseWiseCoValue; | |
} | |
public function calculateCoOfOnlineExamForSelectAllAnswerdAndMandatoryUnAswered($onlineExamId, $batchId, $semId, $subjectId, $nodeId) | |
{ | |
$onlineExamId = $onlineExamId; | |
$sql = ""; | |
$assessmentCOList = []; | |
$assessmentTypeId = NbaCoPoService::getInstance()->getAssessmentTypeIdFromCode(AssessmentType::ONLINE_EXAM); | |
$onlineExamId = trim(sql_real_escape_string($onlineExamId)); | |
// $coPoCourseWiseCalculationDisplayStyle = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_PO_CALCULATION_DISPlAY_STYLE_IN_TREE_NODE); | |
// $coPoCourseWiseCalculationDisplayStyle = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_PO_CALCULATION_AND_DISPlAY_STYLE_IN_TREE_NODE); | |
// $coValueCalculationMethod = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_BASE_CO_VALUE_CALCULATION_FROM_ASSESSMENTS); | |
$coPoCourseWiseCalculationDisplayStyle = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_PO_CALCULATION_DISPlAY_STYLE_IN_TREE_NODE); | |
$coValueCalculationMethod = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_CO_VALUE_CALCULATION_FROM_ASSESSMENTS_METHOD); | |
// $sql = "select batchName from batches where batchID=\"" . $batchID . "\""; | |
// $result = sql_query($sql, $connect); | |
// $row = sql_fetch_array($result); | |
// $batchName = preg_replace('/\s+/', '', $row[0]); | |
// $fileName = $batchName . "_" . date("d-m-Y", strtotime($date)); | |
// $fileName = preg_replace('/\s+/', '', $fileName); | |
$result = StudentService::getInstance()->getAllStudentsByBatchIdSemIdSubjectId($batchId, $semId, $subjectId); | |
$count = 1; | |
$COcount = 0; | |
$sql_count = "SELECT id, code, objective, order_no FROM nba_course_outcome WHERE batchID=\"" . $batchId . "\" and subjectID = \"" . $subjectId . "\" ORDER BY order_no ASC"; | |
$result_count = sql_query($sql_count, $connect); | |
$COcount = sql_num_rows($result_count); | |
$colspan = $COcount + 3; | |
while ($row_count = sql_fetch_array($result_count)) { | |
$nba_course_outcomes[$row_count['id']] = $row_count['code']; | |
} | |
$count = count($nba_course_outcomes); | |
if (!$count) { | |
return null; | |
} | |
$sbsIdDetails = SubjectService::getInstance()->getSbsDetailsByStaffId($batchId, $semId, $_SESSION['staffID'], $subjectId); | |
$pseudoSubject = SubjectService::getInstance()->getPseudoSubjectBySbsId($sbsIdDetails->sbsID); | |
if ( $pseudoSubject && $pseudoSubject->pseudosubjectID ) { | |
$contexts[] = '"pseudoSubjectId":"'.$pseudoSubject->pseudosubjectID.'"'; | |
}else{ | |
if ( $batchId ) { | |
$contexts[] = '"batchId":"'.$batchId.'"'; | |
} | |
if ( $semId ) { | |
$contexts[] = '"semId":"'.$semId.'"'; | |
} | |
if ( $subjectId ) { | |
$contexts[] = '"subjectId":"'.$subjectId.'"'; | |
} | |
} | |
$conditions .= " AND JSON_CONTAINS(oee.identifying_context, '{" . implode (",", $contexts ) . "}')"; | |
foreach ($result as $student) { | |
$denominatorValueArray=[]; | |
$nominatorValueArray=[]; | |
$studentId = $student->id; | |
$sql_oe = "SELECT | |
oee.id | |
FROM | |
oe_exams oee | |
LEFT JOIN | |
oe_exam_user_mark oeum ON (oee.id = oeum.oe_exams_id AND oeum.user_id = '$studentId' AND oeum.user_type= 'STUDENT') | |
WHERE oee.is_deleted = 0 AND oee.id= '$onlineExamId' AND ( oee.type = 'QUIZ' OR oee.type = 'EXAM_CONTROLLER' OR oee.type = 'OBE_MARK_ENTRY' ) | |
$conditions | |
GROUP BY oee.id"; | |
$oeExams = $this->executeQueryForList($sql_oe); | |
foreach ($oeExams as $exam) { | |
$oeExamId = $exam->id; | |
$studentMarkList = NbaCoService::getInstance()->getCoDetailsOfOnlineExamForSelectAllAnswerdAndMandatoryUnAswered($oeExamId, $studentId,$batchId,$semId,$subjectId); | |
$validStudentQuestionIds=NbaCoService::getInstance()->getSectionWiseValidQuestionIdsSelectAllAnswerdAndMandatoryUnAsweredForCoCalculationOfAStudentForOnlineExam($oeExamId,$studentId); | |
if (!empty($studentMarkList)) { | |
$totalCoPercentList = NbaCoService::getInstance()->calculateTotalCOPercentsOnlineExam($validStudentQuestionIds->nbaCourseOutcomeQuestionsIdList, $batchId, $semId, $subjectId); | |
foreach ($studentMarkList as $row_mark) { | |
$row_mark = (array)$row_mark; | |
if (!in_array($row_mark['oe_exam_questions_id'], $validStudentQuestionIds->nbaCourseOutcomeQuestionsIdList)) { | |
continue; | |
} | |
$mark_obtained = $row_mark['markObtained']; | |
$staffId = $row_mark["created_by"]; | |
$maxMark = $row_mark['mark']; | |
foreach($row_mark['cos'] as $coDetails){ | |
$nba_course_outcome_id = $coDetails->coId; | |
$course_outcome_value = $coDetails->value; | |
$course_outcome_value = $course_outcome_value / 100; | |
//this is only for course wise type 2 calculation | |
if ($coPoCourseWiseCalculationDisplayStyle==NbaMethod::OBE_CO_PO_CALCULATION_COURSE_WISE_DISPlAY_AND_CALCULATION_TWO){ | |
$studentQuestionCoDetails = new NBASubjectAssessmentCoValue(); | |
$value = (($mark_obtained / $maxMark) * ($course_outcome_value))*100; | |
$studentQuestionCoDetails->markCOPercentage = $value; | |
$studentQuestionCoDetails->studentId = $studentId; | |
$studentQuestionCoDetails->questionId = $row_mark['oe_exam_questions_id']; | |
$studentQuestionCoDetails->coId = $nba_course_outcome_id; | |
$assessmentStudentQuestionMarkCOList[] = $studentQuestionCoDetails; | |
} | |
if ($coValueCalculationMethod==NbaMethod::OBE_CO_VALUE_CALCULATION_FROM_ASSESSMENTS_METHOD_TWO){ | |
$denominatorValue =($maxMark*($coDetails->value/100)); | |
$denominatorValueArray[$nba_course_outcome_id] += $denominatorValue; | |
$nominatorValue =($mark_obtained*($coDetails->value/100)); | |
$nominatorValueArray[$nba_course_outcome_id] += $nominatorValue; | |
}else{ | |
$per_percent = $totalCoPercentList[$nba_course_outcome_id] / 100; | |
$percentage = ($mark_obtained / $maxMark) * ($course_outcome_value); | |
$exactValue = ($percentage / $per_percent) * 100; | |
$CoArr[$studentId][$nba_course_outcome_id] += $exactValue; | |
} | |
} | |
} | |
if ($coValueCalculationMethod==NbaMethod::OBE_CO_VALUE_CALCULATION_FROM_ASSESSMENTS_METHOD_TWO){ | |
foreach ($nominatorValueArray as $coId => $nominatorValue) { | |
$CoArr[$studentId][$coId]= ($nominatorValue/$denominatorValueArray[$coId])*100; | |
} | |
} | |
} | |
} | |
} | |
foreach ($CoArr as $studentId => $nbaCourseOutcomes) { | |
foreach ($nbaCourseOutcomes as $coId => $coValue) { | |
$nbaSubjectAssessmentCoValue = new NBASubjectAssessmentCoValue(); | |
$nbaSubjectAssessmentCoValue->assessmentId = $onlineExamId; | |
$nbaSubjectAssessmentCoValue->assessmentTypeId = $assessmentTypeId; | |
$nbaSubjectAssessmentCoValue->coId = $coId; | |
$nbaSubjectAssessmentCoValue->value = $coValue; | |
$nbaSubjectAssessmentCoValue->studentId = $studentId; | |
$nbaSubjectAssessmentCoValue->staffId = $staffId ? $staffId : $_SESSION['staffID'];//Here staff is the one who enters mark to students | |
$nbaSubjectAssessmentCoValue->batchId = $batchId; | |
$nbaSubjectAssessmentCoValue->semId = $semId; | |
$nbaSubjectAssessmentCoValue->subjectId = $subjectId; | |
$nbaSubjectAssessmentCoValue->createdBy = $_SESSION['staffID']; | |
$nbaSubjectAssessmentCoValue->updatedBy = $_SESSION['staffID']; | |
$assessmentCOList[] = $nbaSubjectAssessmentCoValue; | |
} | |
} | |
if (empty($assessmentCOList)) { | |
$this->deleteCoValuesOfSubjectAssessment($onlineExamId, $assessmentTypeId, $batchId, $semId, $subjectId); | |
throw new ProfessionalException(ProfessionalException::EMPTY_CO_ASSESSMENT_LIST_GIVEN, 'Atleast 1 Co must be given'); | |
} | |
$assessmentCourseWiseCOList=$this->courseWiseAttainmentCalculation($assessmentCOList, $nodeId, $assessmentStudentQuestionMarkCOList); | |
$this->saveCoValuesForSubjectAssessmentCourseWiseCalculetion($assessmentCourseWiseCOList); | |
$this->saveCoValuesForSubjectAssessments($assessmentCOList); | |
} | |
} |