HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/dvpis2026/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();
    }
}