feat: list and show submitted questionnaires to the office
This commit is contained in:
1 parent
890e04f8a6
commit
a35f91ac63
15 files changed
+715
-46
No files matched your search
@@ -4,7 +4,11 @@ namespace App\Repository;
|
||||
|
||||
use App\Entity\Disposition;
|
||||
use App\Entity\QuestionnaireResponse;
|
||||
use App\Enum\QuestionnaireResponseStatus;
|
||||
use App\Model\QuestionnaireResponseFilterDto;
|
||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use Doctrine\ORM\Query;
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
@@ -22,6 +26,60 @@ class QuestionnaireResponseRepository extends ServiceEntityRepository
|
||||
parent::__construct($registry, QuestionnaireResponse::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Submitted responses to one questionnaire for the office's list. Drafts stay out: until the
|
||||
* teamer submits, a response is theirs. Filtered and sorted on the live disposition rather
|
||||
* than the snapshot in `context`, which JSON would make neither sortable nor indexable.
|
||||
*/
|
||||
public function getListQuery(string $questionnaire, QuestionnaireResponseFilterDto $filterDto): Query
|
||||
{
|
||||
$qb = $this->createQueryBuilder('response');
|
||||
|
||||
$qb
|
||||
->select('response', 'disposition', 'teamer', 'assignment', 'destination')
|
||||
->innerJoin('response.disposition', 'disposition')
|
||||
->innerJoin('disposition.teamer', 'teamer')
|
||||
->innerJoin('disposition.assignment', 'assignment')
|
||||
->innerJoin('assignment.destination', 'destination')
|
||||
->where($qb->expr()->andX(
|
||||
$qb->expr()->eq('response.questionnaire', ':questionnaire'),
|
||||
$qb->expr()->eq('response.status', ':submitted')
|
||||
))
|
||||
->setParameter('questionnaire', $questionnaire)
|
||||
->setParameter('submitted', QuestionnaireResponseStatus::SUBMITTED)
|
||||
;
|
||||
|
||||
if (null !== $teamer = $filterDto->getTeamer()) {
|
||||
$qb
|
||||
->andWhere($qb->expr()->eq('disposition.teamer', ':teamer'))
|
||||
->setParameter('teamer', $teamer)
|
||||
;
|
||||
}
|
||||
|
||||
if (null !== $hotel = $filterDto->getHotel()) {
|
||||
$qb
|
||||
->andWhere($qb->expr()->like('destination.hotel', ':hotel'))
|
||||
->setParameter('hotel', '%'.addcslashes($hotel, '%_').'%')
|
||||
;
|
||||
}
|
||||
|
||||
if (null !== $dateFrom = $filterDto->getDateFrom()) {
|
||||
$qb
|
||||
->andWhere($qb->expr()->gte('destination.dateTo', ':dateFrom'))
|
||||
->setParameter('dateFrom', $dateFrom, Types::DATE_IMMUTABLE)
|
||||
;
|
||||
}
|
||||
|
||||
if (null !== $dateTo = $filterDto->getDateTo()) {
|
||||
$qb
|
||||
->andWhere($qb->expr()->lte('destination.dateTo', ':dateTo'))
|
||||
->setParameter('dateTo', $dateTo, Types::DATE_IMMUTABLE)
|
||||
;
|
||||
}
|
||||
|
||||
return $qb->getQuery();
|
||||
}
|
||||
|
||||
public function findOneByDisposition(string $questionnaire, Disposition $disposition): ?QuestionnaireResponse
|
||||
{
|
||||
return $this->findOneBy(['questionnaire' => $questionnaire, 'disposition' => $disposition]);
|
||||
|
||||
Reference in new issue
Block a user