<?php
namespace App\Repository;
use App\Entity\Flat;
use App\Entity\Building;
use App\Entity\Resident;
use App\Services\FlatService;
use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
use App\Entity\User;
use Doctrine\ORM\Query\Expr\Join;
use PDepend\Util\Coverage\Factory;
use PDepend\Util\Type;
use App\Utils\ApiV2\ListItemsOptions as ListItemsOptionsV2;
/**
* @method Flat|null find($id, $lockMode = null, $lockVersion = null)
* @method Flat|null findOneBy(array $criteria, array $orderBy = null)
* @method Flat[] findAll()
* @method Flat[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class FlatRepository extends BaseRepository
{
/**
* BuildingRepository constructor.
*
* @param ManagerRegistry $registry
*/
public function __construct(ManagerRegistry $registry)
{
$this->entityClass = Flat::class;
parent::__construct($registry);
}
public function flush(): void
{
$this->_em->flush();
}
/**
* @param int $buildingId
*
* @return array<mixed>
*/
public function getFlatsByBuildingIdNoUser(int $buildingId): array
{
return $this->createQueryBuilder('f')
->innerJoin('f.building', 'b')
->where('f.building = :building')
->andWhere('f.archived = 0')
->select([
'f.id',
'f.displayFlatId',
'f.ownerName',
'f.ownerLastname',
'f.companyName',
'f.type',
'f.subType',
'b.id as buildingId'
])
->setParameter('building', $buildingId)
->getQuery()
->getResult();
}
/**
* @param User $user
* @param Building $building
* @param int $archived
* @return array<mixed>
*/
public function getFlatsByBuilding(User $user, Building $building, int $archived = 0): array
{
$query = $this->createQueryBuilder('f')
->select('f, u')
->innerJoin('f.user', 'u')
->where('f.user = :user')
->andWhere('f.building = :building');
if ($archived) {
$query->andWhere('f.archived = 0');
}
return $query
->setParameters([
'user' => $user,
'building' => $building
])
->orderBy('f.displayFlatId', 'ASC')
->getQuery()
->getArrayResult();
}
/**
* @param User $user
* @param Building $building
* @param int $archived
* @return array<mixed>
*/
public function getFlatsByBuildingOrderedById(User $user, Building $building, int $archived = 0): array
{
$query = $this->createQueryBuilder('f')
->select('f, u')
->innerJoin('f.user', 'u')
->where('f.user = :user')
->andWhere('f.building = :building');
if ($archived) {
$query->andWhere('f.archived = 0');
}
$query = $query
->setParameters([
'user' => $user,
'building' => $building
])
->orderBy('f.id', 'ASC')
->getQuery()
->getArrayResult();
usort($query, fn($a, $b) => (int) $a['displayFlatId'] <=> (int) $b['displayFlatId']);
return $query;
}
/**
* @param User $user
* @param Building $building
* @param int $archived
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function countFlatsByBuildingWithOccupant(User $user, Building $building, int $archived = 0): int
{
return $this->createQueryBuilder('f')
->select('count(f.id)')
->innerJoin('f.user', 'u')
->where('f.user = :user')
->andWhere('f.building = :building')
->andWhere('f.occupantEmail is not null')
->andWhere('f.archived = 0')
->setParameters([
'user' => $user,
'building' => $building
])
->getQuery()
->getSingleScalarResult();
}
/**
* @param User $user
* @param Building $building
* @param int $archived
* @return float|null
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function getFlatsByBuildingOldDebitSum(User $user, Building $building, int $archived = 0): float|null
{
$query = $this->createQueryBuilder('f')
->select('sum(f.oldDebit) as sumOldDebit')
->innerJoin('f.user', 'u')
->where('f.user = :user')
->andWhere('f.building = :building');
if ($archived) {
$query->andWhere('f.archived = 0');
}
return $query
->setParameters([
'user' => $user,
'building' => $building
])->getQuery()
->getSingleScalarResult();
}
/**
* @param User $user
* @param Building $building
* @param int $archived
* @return array<Flat>
*/
public function getFlatsByBuildingArray(User $user, Building $building, int $archived = 0): array
{
$query = $this->createQueryBuilder('f')
->select('f, u')
->innerJoin('f.user', 'u')
->where('f.user = :user')
->andWhere('f.building = :building');
if ($archived) {
$query->andWhere('f.archived = 0');
}
return $query
->setParameters([
'user' => $user,
'building' => $building
])
->orderBy('f.displayFlatId', 'ASC')
->getQuery()
->getResult();
}
/**
* @param array<User> $users
* @param DateTime|null $lastDayOfPreviousMont
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function getActiveFlatsByUser(array $users, DateTime $lastDayOfPreviousMont = null): int
{
$query = $this->createQueryBuilder('f')
->select('count(f.id)')
->leftJoin('f.building', 'b')
->where('b.activeStatus = 1')
->andWhere('f.user in (:users)')
->andWhere('f.archived = 0');
if (!empty($lastDayOfPreviousMont)) {
$query->andWhere('f.createdAt < :lastDayOfPreviousMonth')
->setParameter('lastDayOfPreviousMonth', $lastDayOfPreviousMont);
}
return $query->setParameter('users', $users)
->getQuery()
->getSingleScalarResult();
}
/**
* @param int $user
* @return array<Flat>
*/
public function getActiveFlatsObjectsByUser(int $user): array
{
return $this->createQueryBuilder('f')
->leftJoin('f.building', 'b')
->where('b.activeStatus = 1')
->andWhere('f.user = :user')
->andWhere('f.archived = 0')
->setParameters([
'user' => $user,
])
->getQuery()
->getResult();
}
/**
* @param User $user
* @param Building $building
* @return array<Flat>
*/
public function getActiveFlatsByUserAndBuilding(User $user, Building $building): array
{
return $this->createQueryBuilder('f')
->where('f.building = :building')
->andWhere('f.user = :user')
->setParameters([
'user' => $user,
'building' => $building
])
->getQuery()
->getResult();
}
/**
* @param User $user
* @return array<Flat>
*/
public function getActiveFlatsArrayByUser(User $user): array
{
return $this->createQueryBuilder('f')
->leftJoin('f.building', 'b')
->where('b.activeStatus = 1')
->andWhere('f.user = :user')
->setParameters([
'user' => $user,
])
->getQuery()
->getArrayResult();
}
/**
* @param User $user
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function getInactiveFlatsByUser(User $user): int
{
return $this->createQueryBuilder('f')
->select('count(f.id)')
->leftJoin('f.building', 'b')
->where('b.activeStatus = 0')
->andWhere('f.user = :user')
->setParameters([
'user' => $user,
])
->getQuery()
->getSingleScalarResult();
}
/**
* @param array<int> $flatIds
*
* @return array<Flat>
*/
public function findByIds(array $flatIds): array
{
$qb = $this->createQueryBuilder('f');
return $qb->where($qb->expr()->in('f.id', $flatIds))
->getQuery()
->getResult();
}
/**
* @param User $user
* @param Building $building
* @param int $archived
*
* @return array<Flat>
*/
public function getFlatsObjByBuilding(User $user, Building $building, int $archived = 0): array
{
$query = $this->createQueryBuilder('f')
->where('f.user = :user')
->andWhere('f.building = :building');
if ($archived) {
$query->andWhere('f.archived = 0');
}
$query
->setParameters([
'user' => $user,
'building' => $building
])
->orderBy('f.displayFlatId', 'ASC');
return $query
->getQuery()
->getResult();
}
/**
* @param User $user
* @param Building $building
* @param string $number
* @return Flat|null
* @throws NonUniqueResultException
*/
public function getFlatsObjByBuildingAndDisplayFlatId(User $user, Building $building, string $number): ?Flat
{
return $this->createQueryBuilder('f')
->where('f.user = :user')
->andWhere('f.building = :building')
->andWhere('f.displayFlatId = :number')
->setParameters([
'user' => $user,
'building' => $building,
'number' => $number
])
->getQuery()
->getOneOrNullResult();
}
/**
* @param User $user
* @param int $id
*
* @return Flat
* @throws NonUniqueResultException
*/
public function getFlatById(User $user, int $id): Flat
{
return $this->createQueryBuilder('f')
->where('f.user = :user')
->andWhere('f.id = :id')
->setParameters([
'user' => $user,
'id' => $id
])
->getQuery()
->getOneOrNullResult();
}
/**
* @param User $user
* @param array<int> $ids
*
* @return array<Flat>
* @throws NonUniqueResultException
*/
public function getFlatsById(User $user, array $ids): array
{
return $this->createQueryBuilder('f')
->where('f.user = :user')
->andWhere('f.id IN (:ids)')
->setParameters([
'user' => $user,
'ids' => $ids
])
->getQuery()
->getOneOrNullResult();
}
/**
* @param Building $building
* @param array<int|string> $ids
* @param bool|null $exclude
* @return array<string>
* @throws NonUniqueResultException
*/
public function getSumFlatsById(Building $building, array $ids, bool $exclude = null): array
{
$query = $this->createQueryBuilder('f')
->select('sum(f.members) as totalMembers, sum(f.size) as sizeTotal')
->where('f.building = :building')
->andWhere('f.archived = 0');
if ($exclude) {
$query->andWhere('f.displayFlatId NOT IN (:ids)');
} else {
$query->andWhere('f.displayFlatId IN (:ids)');
}
$query->setParameters([
'ids' => $ids,
'building' => $building
]);
return $query->getQuery()
->getOneOrNullResult();
}
/**
* @param array<Flat> $flats
*
* @return array<Flat>
*/
public function assoccFlatArray(array $flats): array
{
$ret = [];
$ret['all'] = 'All';
/** @var Flat $flat */
foreach ($flats as $flat) {
$ret[$flat['displayFlatId']] = $flat['id'];
}
return $ret;
}
/**
* @param Building $building
* @param array<mixed> $flatNumbersComplex
*
* @return array<Flat>
*/
public function getDistinctFlatSizesFiltered(Building $building, array $flatNumbersComplex): array
{
$query = $this->createQueryBuilder('f')
->select('f.size')
->where('f.building = :building');
if ($flatNumbersComplex['participants'][0] != 0) {
if ($flatNumbersComplex['excludeFromBill']) {
$query->andWhere('f.displayFlatId NOT IN (:flatNumbers)');
} else {
$query->andWhere('f.displayFlatId IN (:flatNumbers)');
}
$query->setParameters([
'building' => $building,
'flatNumbers' => $flatNumbersComplex['participants']
]);
} else {
$query->setParameters([
'building' => $building
]);
}
$values = $query->distinct()
->getQuery()
->getArrayResult();
asort($values);
return $values;
}
/**
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function countFlats(): int
{
return (int)$this->createQueryBuilder('f')
->select('count(f.id) as sumFlats')
->getQuery()
->getSingleScalarResult();
}
/**
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function countActiveFlats(): int
{
return (int)$this->createQueryBuilder('f')
->innerJoin('f.building', 'b')
->where('b.activeStatus = 1')
->select('count(f.id) as sumFlats')
->getQuery()
->getSingleScalarResult();
}
/**
* @param Building $building
* @param User $user
* @return array<string>
*/
public function getFlatEmails(Building $building, User $user): array
{
$emails = $this->createQueryBuilder('f')
->select('f.ownerEmail')
->where('f.building = :building')
->andWhere('f.user = :user')
->setParameters([
'building' => $building,
'user' => $user
])
->getQuery()
->getArrayResult();
$filteredEmails = [];
foreach ($emails as $email) {
if ($email['ownerEmail'] != '') {
$filteredEmails[] = $email['ownerEmail'];
}
}
return $filteredEmails;
}
/**
* @param User $user
* @param Building $building
* @return float
* @throws NonUniqueResultException
*/
public function getBuildingFlatsCurrentDebitSum(User $user, Building $building): float
{
return $this->createQueryBuilder('f')
->select('sum(f.debit) as currentDebitSum')
->where('f.user = :user')
->andWhere('f.building = :building')
->setParameters([
'user' => $user,
'building' => $building
])
->getQuery()
->getOneOrNullResult();
}
/**
* @param Building $building
* @return array<Flat>
*/
public function getFlatsWithEmail(Building $building): array
{
return $this->createQueryBuilder('f')
->andWhere('f.building = :building')
->andWhere('f.ownerEmail is not null')
->setParameters([
'building' => $building
])
->getQuery()
->getResult();
}
/**
* @param Building $building
* @return array<array<string>>
*/
public function getDistinctOwnerEmails(Building $building): array
{
return $this->createQueryBuilder('f')
->select('DISTINCT f.ownerEmail')
->andWhere('f.building = :building')
->andWhere('f.ownerEmail IS NOT NULL')
->andWhere('f.emailCanBeUsed = 1')
->andWhere('f.archived = 0')
->setParameters([
'building' => $building
])
->getQuery()
->getResult();
}
/**
* @param User $user
* @param Building $building
*
* @return array<Flat>
*/
public function findFlatsWithDebitByBuilding(User $user, Building $building): array
{
return $this->createQueryBuilder('f')
->where('f.user = :user')
->andWhere('f.building = :building')
->andWhere('f.archived = 0')
->andWhere('(f.debit + f.oldDebit)<>0 OR f.previousBill is not null')
->setParameters([
'user' => $user,
'building' => $building
])
->orderBy('f.displayFlatId + 0', 'ASC')
->getQuery()
->getResult();
}
/**
* @param int $start
* @param int $limit
*
* @return array<mixed>
*/
public function findFlatsForMoneyLogData(int $start, int $limit): array
{
return $this->createQueryBuilder('f')
->setFirstResult($start)
->setMaxResults($limit)
->getQuery()
->getResult();
}
/**
* @param Building $building
* @return int|mixed|string|null
* @throws NonUniqueResultException
*/
public function findLastArchiveFlatsByBuilding(Building $building): mixed
{
return $this->createQueryBuilder('f')
->select('f.displayFlatId')
->andWhere('f.building = :building')
->andWhere('f.archived = 1')
->setParameters([
'building' => $building
])
->orderBy('f.archivedAt', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
/**
* @param User $user
* @param Building $building
* @return string
* @throws NonUniqueResultException|NoResultException
*/
public function countArchiveFlatsByBuilding(User $user, Building $building): string
{
return $this->createQueryBuilder('f')
->select('count(f)')
->where('f.user = :user')
->andWhere('f.building = :building')
->andWhere('f.archived = 1')
->setParameters([
'user' => $user,
'building' => $building
])
->getQuery()
->getSingleScalarResult();
}
/**
* @param Flat $currentFlat
* @param User $user
*
* @return array<Flat>
*/
public function getArchivedFlatsByCurrentFlat(Flat $currentFlat, User $user): array
{
return $this->createQueryBuilder('f')
->where('f.user = :user')
->andWhere('f.currentFlat = :currentFlat')
->andWhere('f.archived = 1')
->setParameters([
'currentFlat' => $currentFlat,
'user' => $user
])
->getQuery()
->getResult();
}
/**
* @param User $user
* @param Building $building
*
* @return array<Flat>
*/
public function findArchivedFlatsWithDebitByBuilding(User $user, Building $building): array
{
return $this->createQueryBuilder('f')
->where('f.user = :user')
->andWhere('f.building = :building')
->andWhere('f.archived = 1')
->andWhere('((f.debit + f.previousBill) <> 0) OR (f.oldDebit > 0)')
->setParameters([
'user' => $user,
'building' => $building
])
->orderBy('f.displayFlatId + 0', 'ASC')
->getQuery()
->getResult();
}
/**
* @param Building $building
* @param string $flatNumber
* @return Flat|null
* @throws NonUniqueResultException
*/
public function getFlatByFlatNumber(Building $building, string $flatNumber): ?Flat
{
return $this->createQueryBuilder('f')
->where('f.building = :building')
->andWhere('f.displayFlatId = :flatNumber')
->setParameters([
'building' => $building,
'flatNumber' => $flatNumber
])
->getQuery()
->getOneOrNullResult();
}
/**
* @param User $user
* @param Building $building
* @return array<Flat>
*/
public function getArchivedFlatsObjByBuilding(User $user, Building $building): array
{
$query = $this->createQueryBuilder('f')
->where('f.user = :user')
->andWhere('f.building = :building')
->andWhere('f.archived = 1')
->setParameters([
'user' => $user,
'building' => $building
])
->orderBy('f.displayFlatId', 'ASC');
return $query
->getQuery()
->getResult();
}
/**
* @param User $user
* @param Building $building
* @return array<Flat>
*/
public function getFlatsObjectsByBuilding(User $user, Building $building): array
{
$query = $this->createQueryBuilder('f')
->where('f.user = :user')
->andWhere('f.building = :building')
->andWhere('f.archived = 0')
->setParameters([
'user' => $user,
'building' => $building
])
->orderBy('f.displayFlatId', 'ASC');
return $query
->getQuery()
->getResult();
}
/**
* @param User $user
* @param Building $building
* @param bool $haveEmail
* @return array<Flat>
*/
public function getFlatsByEmailForOldDebit(User $user, Building $building, bool $haveEmail): array
{
$query = $this->createQueryBuilder('f')
->where('f.user = :user')
->andWhere('f.building = :building')
->andWhere('f.oldDebit > 0')
->setParameters([
'user' => $user,
'building' => $building,
]);
if ($haveEmail) {
$query->andWhere('f.emailCanBeUsed = 1');
} else {
$query->andWhere('f.emailCanBeUsed = 0');
}
return $query
->orderBy('f.displayFlatId', 'ASC')
->getQuery()
->getResult();
}
/**
* @param Building $building
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function countFlatsByPhoneNumberForOldDebit(Building $building): int
{
return $this->createQueryBuilder('f')
->select('COUNT(f.id)')
->where('f.building = :building')
->andWhere('f.oldDebit > 0')
->andWhere('f.ownerPhoneNumber is not null')
->setParameters([
'building' => $building,
])
->getQuery()
->getSingleScalarResult();
}
/**
* @param Building $building
* @return array<Flat>
*/
public function getFlatsByPhoneNumberForOldDebit(Building $building): array
{
return $this->createQueryBuilder('f')
->where('f.building = :building')
->andWhere('f.oldDebit > 0')
->andWhere('f.ownerPhoneNumber is not null')
->setParameters([
'building' => $building,
])
->orderBy('f.displayFlatId', 'ASC')
->getQuery()
->getResult();
}
/**
* @param Building $building
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function countFlatsByPhoneNumberForSendBill(Building $building): int
{
return $this->createQueryBuilder('f')
->select('COUNT(f.id)')
->where('f.building = :building')
->andWhere('f.ownerPhoneNumber is not null')
->setParameters([
'building' => $building,
])
->getQuery()
->getSingleScalarResult();
}
/**
* @param Building $building
* @return array<Flat>
*/
public function getFlatsCountByTypeAndBuilding(Building $building): array
{
return $this->createQueryBuilder('f', 'f.type')
->select('f.type, count(f.type) as sumFlats')
->where('f.building = :building')
->andWhere('f.archived = 0')
->setParameters([
'building' => $building,
])
->groupBy('f.type')
->getQuery()
->getArrayResult();
}
/**
* @param User $user
* @param Building $building
* @return array<Flat>
*/
public function getFlatsDetailsByBuilding(User $user, Building $building): array
{
return $this->createQueryBuilder('f', 'f.displayFlatId')
->select(
'f.displayFlatId as flatDisplayId,
f.members as flatMembers,
f.size as flatSize,
f.type as flatType'
)
->where('f.user = :user')
->andWhere('f.building = :building')
->andWhere('f.archived = 0')
->setParameters([
'user' => $user,
'building' => $building
])
->orderBy('f.displayFlatId', 'ASC')
->getQuery()
->getArrayResult();
}
/**
* @param User $user
* @return array<Flat>
*/
public function getFlatsByMobileAppUser(User $user): array
{
$query = $this->createQueryBuilder('f')
->where('f.flatUser = :user')
->andWhere('f.archived = 0')
->setParameters([
'user' => $user,
])
->orderBy('f.displayFlatId', 'ASC');
return $query
->getQuery()
->getResult();
}
/**
* @param DateTime $startDate
* @param DateTime|null $endDate
* @return array<mixed>
*/
public function getFlatImportReviewByDate(DateTime $startDate, ?DateTime $endDate): array
{
$result = $this->createQueryBuilder('f')
->select('count(f.id) as flatNumber, u.email as user')
->innerJoin('f.user', 'u', Join::WITH, 'f.user = u.id')
->where('f.createdAt >= :startDate')
->groupBy('user')
->setParameters([
'startDate' => $startDate,
]);
if ($endDate) {
$result
->andWhere('f.createdAt <= :endDate')
->setParameter('endDate', $endDate);
}
return $result
->getQuery()
->getResult();
}
/**
* @param User $user
* @param Building $building
* @param int $archived
* @return array<Flat>
*/
public function getActiveFlatsByUserAndBuildingAndDebit(User $user, Building $building, int $archived): array
{
return $this->createQueryBuilder('f')
->where('f.building = :building')
->andWhere('f.user =:user')
->andWhere('(f.debit + f.previousBill) > 0')
->andWhere('f.archived = :archived')
->setParameters([
'user' => $user,
'building' => $building,
'archived' => $archived
])
->getQuery()
->getResult();
}
/**
* @param Building $building
* @return float
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function calculateBuildingSize(Building $building): float
{
return $this->createQueryBuilder('f')
->select('sum(f.size)')
->where('f.building = :building')
->andWhere('f.archived = 0')
->setParameters([
'building' => $building
])
->getQuery()
->getSingleScalarResult();
}
/**
* @param Building $building
* @return array<Flat>
*/
public function getFlatsWithActiveEmailForDictionary(Building $building): array
{
$emails = $this->createQueryBuilder('f')
->select('f.ownerEmail')
->where('f.building = :building')
->andWhere('f.emailCanBeUsed = 1')
->setParameter('building', $building)
->getQuery()
->getArrayResult();
$filteredEmails = [];
foreach ($emails as $email) {
if ($email['ownerEmail'] != '') {
if (!in_array($email['ownerEmail'], $filteredEmails)) {
$filteredEmails[] = $email['ownerEmail'];
}
}
}
return $filteredEmails;
}
/**
* @param Building $building
* @param User $user
* @return array<Flat>
*/
public function findFlatByOwner(Building $building, User $user): array
{
return $this->createQueryBuilder('f')
->select('f.ownerName, f.ownerLastname, f.displayFlatId, f.type, f.companyName, f.type')
->where('f.building = :building')
->andWhere('f.user = :user')
->andWhere('f.archived = 0')
->setParameters([
'user' => $user,
'building' => $building
])
->getQuery()
->getResult();
}
/**
* @return array<Flat>
*/
public function getAllArchivedFlats(): array
{
return $this->createQueryBuilder('f')
->where('f.archived = 1')
->getQuery()
->getResult();
}
/**
* @param User $user
* @param Building $building
* @return array<mixed>|null
* @throws NonUniqueResultException
*/
public function findFlatsBillDebitAndPreviousBillSum(User $user, Building $building): ?array
{
return $this->createQueryBuilder('f')
->select('(sum(f.debit + f.previousBill)) as billSum')
->where('f.user = :user')
->andWhere('f.building = :building')
->andWhere('f.archived = 0')
->setParameters([
'user' => $user,
'building' => $building
])
->getQuery()
->getOneOrNullResult();
}
/**
* @param array<User> $users
* @return array<Flat>
*/
public function findFlatsForInvoice(array $users): array
{
return $this->createQueryBuilder('f')
->where('f.eInvoice = true')
->andwhere('f.user IN (:users)')
->setParameters([
'users' => $users
])
->getQuery()
->getResult();
}
/**
* @param Building $building
* @param ListItemsOptionsV2 $options
* @return array<Flat>
*/
public function getFlatsByBuildingPaginated(Building $building, ListItemsOptionsV2 $options): array
{
return $this->createQueryBuilder('f')
->where('f.building = :building')
->andWhere('f.archived = 0')
->orderBy('f.' . $options->getOrderByColumn(), $options->getOrderByDirection())
->setParameter('building', $building)
->setMaxResults($options->getLimit())
->setFirstResult($options->getOffset())
->getQuery()
->getResult();
}
/**
* @param Building $building
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function countFlatsByBuildingPaginated(Building $building): int
{
return $this->createQueryBuilder('f')
->select('count(f.id) as sumFlats')
->where('f.building = :building')
->andWhere('f.archived = 0')
->setParameter('building', $building)
->getQuery()
->getSingleScalarResult();
}
/**
* @param int $limit
* @param int $offset
* @return array<int, array<string, int>>
*/
public function getAllFlats(int $limit, int $offset): array
{
return $this->createQueryBuilder('f')
->select('f.id')
->orderBy('f.id')
->setMaxResults($limit)
->setFirstResult($offset)
->getQuery()
->getArrayResult();
}
/**
* @param array<User> $users
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function countFlatsForInvoice(array $users): int
{
return $this->createQueryBuilder('f')
->select('count(f.id) as sumFlats')
->andwhere('f.user IN (:users)')
->andWhere('f.eInvoice = true')
->setParameter('users', $users)
->getQuery()
->getSingleScalarResult();
}
/**
* @param array<User> $users
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function countFlatsForPrintBill(array $users): int
{
return $this->createQueryBuilder('f')
->select('count(f.id) as sumFlats')
->andwhere('f.user IN (:users)')
->andWhere('f.printBill = true')
->setParameter('users', $users)
->getQuery()
->getSingleScalarResult();
}
/**
* @param Building $building
* @param int $limit
* @param int $offset
* @return array<Flat>
*/
public function getAllFlatsByBuilding(Building $building, int $limit, int $offset): array
{
return $this->createQueryBuilder('f')
->where('f.building = :building')
->andWhere('f.archived = 0')
->orderBy('f.id')
->setParameter('building', $building)
->setMaxResults($limit)
->setFirstResult($offset)
->getQuery()
->getResult();
}
/**
* @param Resident $resident
* @return array<Flat>
*/
public function getAllFlatsByResident(Resident $resident): array
{
return $this->createQueryBuilder('f')
->where('f.resident = :resident')
->andWhere('f.archived = 0')
->orderBy('f.id')
->setParameter('resident', $resident)
->getQuery()
->getResult();
}
/**
* @param int $buildingId
* @return array<Flat>
*/
public function findFlatsByBuildingAndOwnerPhoneNumber(int $buildingId): array
{
return $this->createQueryBuilder('f')
->where('f.building = :buildingId')
->andWhere('f.ownerPhoneNumber IS NOT NULL')
->setParameter('buildingId', $buildingId)
->orderBy('f.displayFlatId', 'ASC')
->getQuery()
->getResult();
}
}