* * @method QuestionnaireResponse|null find($id, $lockMode = null, $lockVersion = null) * @method QuestionnaireResponse|null findOneBy(array $criteria, array $orderBy = null) * @method QuestionnaireResponse[] findAll() * @method QuestionnaireResponse[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) */ class QuestionnaireResponseRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { 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(); } /** * @return array keyed by questionnaire key */ public function findByDisposition(Disposition $disposition): array { $responses = []; foreach ($this->findBy(['disposition' => $disposition]) as $response) { $responses[$response->getQuestionnaire()] = $response; } return $responses; } }