File: /var/www/dvpis2025/dvpis.kaunokolegija.lt/src/Repository/LecturerPlanHistoryRepository.php
<?php
namespace App\Repository;
use App\Entity\Lecturer;
use Doctrine\ORM\EntityRepository;
/**
* LecturerPlanHistoryRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class LecturerPlanHistoryRepository extends EntityRepository
{
public function findAllQueryBuilder($filter = null)
{
$query = $this->createQueryBuilder('lp')
->join('lp.lecturer', 'l')
->join('lp.academicGroupPlans', 'agp')
->join('agp.studiesProgramPlan', 'spp')
->join('spp.studiesProgram', 'sp')
->join('sp.department', 'd')
->join('d.academicUnit', 'au')
->addOrderBy('agp.academicGroup', 'ASC')
->addOrderBy('agp.studiesProgramPlan', 'ASC');
if (!empty($filter->get('academicUnit'))) {
$query->andWhere('au.id = :auid');
$query->setParameter(':auid', $filter->get('academicUnit'));
}
if (!empty($filter->get('department'))) {
$query->andWhere('d.id = :did');
$query->setParameter(':did', $filter->get('department'));
}
if (!empty($filter->get('studiesProgram'))) {
$query->andWhere('sp.id = :spid');
$query->setParameter(':spid', $filter->get('studiesProgram'));
}
if (!empty($filter->get('academicGroup'))) {
$query->andWhere('agp.academicGroup = :agid');
$query->setParameter(':agid', $filter->get('academicGroup'));
}
if (!empty($filter->get('semester'))) {
$query->andWhere('spp.semester = :agsem');
$query->setParameter(':agsem', $filter->get('semester'));
}
if (!empty($filter->get('studiesModule'))) {
$query->andWhere('spp.studiesModule = :sppsm');
$query->setParameter(':sppsm', $filter->get('studiesModule'));
}
$results = $query->getQuery()->getResult();
$return = [];
foreach ($results as $result) {
$return[$result->getId()] = $result;
}
return $return;
}
public function getLecturerPlanHoursGroupByLecturer($filter = null)
{
$query = $this->createQueryBuilder('lp')
->join('lp.lecturer', 'l')
->join('lp.academicGroupPlans', 'agp')
->join('agp.studiesProgramPlan', 'spp')
->join('spp.studiesProgram', 'sp')
->join('sp.department', 'd')
->join('d.academicUnit', 'au')
// ->where('l.id = 470')
->groupBy('lp.lecturer')
->select('SUM('
. 'COALESCE(lp.theoryHours,0) + '
. 'COALESCE(lp.practicGroup,0) + '
. 'COALESCE(lp.practicGroup1,0) + '
. 'COALESCE(lp.practicGroup2,0) + '
. 'COALESCE(lp.consultationHours,0) + '
. 'COALESCE(lp.egzamHours,0)'
. ') as sumContact, '
. 'SUM('
. 'COALESCE(lp.scoreHours,0) + '
. 'COALESCE(lp.prepareContactHours,0) + '
. 'COALESCE(lp.additionalConsultationHours,0) +'
. 'COALESCE(lp.studiesModuleDescriptionHours,0) +'
. 'COALESCE(lp.studiesModulePreparationHours,0) +'
. 'COALESCE(lp.studiesModuleRenewHours,0)'
. ') as sumNotContact,'
. 'l.id as lecturerId')
->addOrderBy('agp.academicGroup', 'ASC')
->addOrderBy('agp.studiesProgramPlan', 'ASC');
$results = $query->getQuery()->getResult();
//remove stream, sum all streams, then divide by stream count
$query = $this->createQueryBuilder('lp')
->join('lp.lecturer', 'l')
->join('lp.academicGroupPlans', 'agp')
->join('agp.academicGroup', 'ag')
->groupBy('l, lp')
// ->where('l.id = 470')
->having('COUNT(agp.id) > 1')
->select('SUM('
. 'COALESCE(lp.theoryHours,0) + '
. 'COALESCE(lp.practicGroup,0) + '
. 'COALESCE(lp.practicGroup1,0) + '
. 'COALESCE(lp.practicGroup2,0) + '
. 'COALESCE(lp.consultationHours,0) + '
. 'COALESCE(lp.egzamHours,0)'
. ') as sumContact, '
. 'SUM('
. 'COALESCE(lp.scoreHours,0) + '
. 'COALESCE(lp.prepareContactHours,0) + '
. 'COALESCE(lp.additionalConsultationHours,0) +'
. 'COALESCE(lp.studiesModuleDescriptionHours,0) +'
. 'COALESCE(lp.studiesModulePreparationHours,0) +'
. 'COALESCE(lp.studiesModuleRenewHours,0)'
. ') as sumNotContact,'
. 'l.id as lecturerId,'
. 'COUNT(agp.id) as cnt')
->addOrderBy('agp.academicGroup', 'ASC')
->addOrderBy('agp.studiesProgramPlan', 'ASC');
$resultsStreams = $query->getQuery()->getResult();
$streamLecturer = [];
foreach ($resultsStreams as $resultsStream) {
if (!isset($streamLecturer[$resultsStream['lecturerId']])) {
$streamLecturer[$resultsStream['lecturerId']] = [
'sumContact' => 0,
'sumNotContact' => 0,
];
}
$streamLecturer[$resultsStream['lecturerId']]['sumContact'] += ($resultsStream['sumContact'] / $resultsStream['cnt'] * ($resultsStream['cnt'] - 1));
$streamLecturer[$resultsStream['lecturerId']]['sumNotContact'] += ($resultsStream['sumNotContact'] / $resultsStream['cnt'] * ($resultsStream['cnt'] - 1));
}
$return = [];
foreach ($results as $result) {
//if isset stream then remove stream duplicates of it
if (isset($streamLecturer[$result['lecturerId']])) {
$result['sumContact'] = $result['sumContact'] - $streamLecturer[$result['lecturerId']]['sumContact'];
$result['sumNotContact'] = $result['sumNotContact'] - $streamLecturer[$result['lecturerId']]['sumNotContact'];
}
$return[$result['lecturerId']] = $result;
}
return $return;
}
public function getLecturerPlanActivityPlan(Lecturer $lecturer)
{
$query = $this->createQueryBuilder('lp')
->join('lp.lecturer', 'l')
->join('lp.academicGroupPlans', 'agp')
->join('agp.lecturerPlans', 'lp2')
->join('lp.lecturerPosition', 'lpos')
->join('agp.studiesProgramPlan', 'spp')
->join('spp.studiesProgram', 'sp')
->leftJoin('spp.teachingLanguage', 'tl')
->join('sp.department', 'd')
->join('d.academicUnit', 'au')
->select('lp, agp, lp2, spp, l, lpos, tl')
->where('lp.lecturer = :lecturer')
->setParameter(':lecturer', $lecturer)
->addOrderBy('agp.academicGroup', 'ASC')
->addOrderBy('agp.studiesProgramPlan', 'ASC');
return $query->getQuery()->getResult();
}
public function deleteAll()
{
return $this->createQueryBuilder("lph")
->delete()->getQuery()->execute();
}
}