diff --git a/shared/homeless/src/Admin/ClientAdmin.php b/shared/homeless/src/Admin/ClientAdmin.php index 1e380b2..24d56b0 100644 --- a/shared/homeless/src/Admin/ClientAdmin.php +++ b/shared/homeless/src/Admin/ClientAdmin.php @@ -364,7 +364,7 @@ public function getContractStatusFilter(ProxyQueryInterface $queryBuilder, strin $queryBuilder->leftJoin('c1.status', 's1'); $queryBuilder->andWhere('s1.id IN (:statuses)'); - $queryBuilder->setParameter('statuses', array_values($data->getValue()->toArray())); + $queryBuilder->setParameter('statuses', $data->getValue()->toArray()); return true; } diff --git a/shared/homeless/src/Entity/ContractStatus.php b/shared/homeless/src/Entity/ContractStatus.php index 4208421..87992ce 100644 --- a/shared/homeless/src/Entity/ContractStatus.php +++ b/shared/homeless/src/Entity/ContractStatus.php @@ -17,6 +17,18 @@ class ContractStatus extends BaseEntity * SyncId статуса "В процессе выполнения" */ public const int IN_PROCESS = 1; + /** + * SyncId статуса "Не выполнен по причине отказа клиента" + */ + public const int REJECTED_CLIENT_REFUSAL = 5; + /** + * SyncId статуса "Не выполнен по другим причинам" + */ + public const int REJECTED_OTHER = 6; + /** + * SyncId статуса "Не выполнен по причине неявки клиента" + */ + public const int REJECTED_CLIENT_NON_APPEARANCE = 8; #[ORM\Column(type: 'string', nullable: true)] private ?string $name = null; diff --git a/shared/homeless/src/Repository/CertificateTypeRepository.php b/shared/homeless/src/Repository/CertificateTypeRepository.php index 99c0902..5692fae 100644 --- a/shared/homeless/src/Repository/CertificateTypeRepository.php +++ b/shared/homeless/src/Repository/CertificateTypeRepository.php @@ -34,10 +34,10 @@ public function getAvailableForCertificate(Certificate $certificate): array $queryBuilder = $this->createQueryBuilder('t') ->orderBy('t.sort', 'ASC') ->where('t.syncId IN (:types)') - ->setParameter('types', array_values([ + ->setParameter('types', [ CertificateType::REGISTRATION, CertificateType::TRAVEL, - ])) + ]) ; if (!$certificate->getClient()->hasRegistrationDocument()) { diff --git a/shared/homeless/src/Service/ReportService.php b/shared/homeless/src/Service/ReportService.php index dd9aa23..79db88f 100644 --- a/shared/homeless/src/Service/ReportService.php +++ b/shared/homeless/src/Service/ReportService.php @@ -5,6 +5,8 @@ namespace App\Service; +use App\Entity\ContractStatus; +use Doctrine\DBAL\ArrayParameterType; use Doctrine\DBAL\Driver\Exception as DBALDriverException; use Doctrine\DBAL\Exception as DBALException; use Doctrine\ORM\EntityManagerInterface; @@ -120,10 +122,10 @@ public function getClients( AND c.created_at >= :createClientdateFrom AND c.created_at <= :createClientFromTo '); - $stmt->bindValue(':createServicedateFrom', $createServicedateFrom ? date('Y-m-d', strtotime($createServicedateFrom)) : '1960-01-01'); - $stmt->bindValue(':createServiceFromTo', $createServiceFromTo ? date('Y-m-d', strtotime($createServiceFromTo)) : date('Y-m-d')); - $stmt->bindValue(':createClientdateFrom', $createClientdateFrom ? date('Y-m-d', strtotime($createClientdateFrom)) : '1960-01-01'); - $stmt->bindValue(':createClientFromTo', $createClientFromTo ? date('Y-m-d', strtotime($createClientFromTo)) : date('Y-m-d')); + $stmt->bindValue('createServicedateFrom', $createServicedateFrom ? date('Y-m-d', strtotime($createServicedateFrom)) : '1960-01-01'); + $stmt->bindValue('createServiceFromTo', $createServiceFromTo ? date('Y-m-d', strtotime($createServiceFromTo)) : date('Y-m-d')); + $stmt->bindValue('createClientdateFrom', $createClientdateFrom ? date('Y-m-d', strtotime($createClientdateFrom)) : '1960-01-01'); + $stmt->bindValue('createClientFromTo', $createClientFromTo ? date('Y-m-d', strtotime($createClientFromTo)) : date('Y-m-d')); } else { $stmt = $this->entityManager->getConnection()->prepare(' SELECT c.id @@ -131,8 +133,8 @@ public function getClients( WHERE c.created_at >= :createClientdateFrom AND c.created_at <= :createClientFromTo '); - $stmt->bindValue(':createClientdateFrom', $createClientdateFrom ? date('Y-m-d', strtotime($createClientdateFrom)) : '1960-01-01'); - $stmt->bindValue(':createClientFromTo', $createClientFromTo ? date('Y-m-d', strtotime($createClientFromTo)) : date('Y-m-d')); + $stmt->bindValue('createClientdateFrom', $createClientdateFrom ? date('Y-m-d', strtotime($createClientdateFrom)) : '1960-01-01'); + $stmt->bindValue('createClientFromTo', $createClientFromTo ? date('Y-m-d', strtotime($createClientFromTo)) : date('Y-m-d')); } return $stmt->executeQuery()->fetchAllAssociative(); @@ -166,10 +168,10 @@ private function oneOffServices( GROUP BY st.id ORDER BY st.sort '); - $stmt->bindValue(':dateFrom', $dateFrom ?: '1960-01-01'); - $stmt->bindValue(':dateTo', $dateTo ?: date('Y-m-d')); + $stmt->bindValue('dateFrom', $dateFrom ?: '1960-01-01'); + $stmt->bindValue('dateTo', $dateTo ?: date('Y-m-d')); if ($userId) { - $stmt->bindValue(':userId', $userId); + $stmt->bindValue('userId', $userId); } return $stmt->executeQuery()->fetchAllNumeric(); @@ -189,7 +191,40 @@ private function completedItems( 'сколько раз она была предоставлена', 'скольким людям она была предоставлена', ]]); - $stmt = $this->entityManager->getConnection()->prepare(' + $excludeStatuses = [ + ContractStatus::IN_PROCESS, + ContractStatus::REJECTED_CLIENT_REFUSAL, + ContractStatus::REJECTED_OTHER, + ContractStatus::REJECTED_CLIENT_NON_APPEARANCE, + ]; + + if ($userId) { + return $this->entityManager->getConnection()->executeQuery(' + SELECT cit.name, + COUNT(DISTINCT i.id) all_count, + COUNT(DISTINCT c.client_id) client_count + FROM contract_item i + JOIN contract c + ON i.contract_id = c.id + JOIN contract_item_type cit + ON i.type_id = cit.id + WHERE c.status_id NOT IN (:excludeStatuses) + AND i.date >= :dateFrom + AND i.date <= :dateTo + AND ((i.created_by_id IS NOT NULL AND i.created_by_id = :userId) OR (i.created_by_id IS NULL AND c.created_by_id = :userId)) + GROUP BY i.type_id + ORDER BY cit.sort + ', [ + 'excludeStatuses' => $excludeStatuses, + 'dateFrom' => $dateFrom ?: '1960-01-01', + 'dateTo' => $dateTo ?: date('Y-m-d'), + 'userId' => $userId, + ], [ + 'excludeStatuses' => ArrayParameterType::INTEGER, + ])->fetchAllNumeric(); + } + + return $this->entityManager->getConnection()->executeQuery(' SELECT cit.name, COUNT(DISTINCT i.id) all_count, COUNT(DISTINCT c.client_id) client_count @@ -198,19 +233,16 @@ private function completedItems( ON i.contract_id = c.id JOIN contract_item_type cit ON i.type_id = cit.id - WHERE i.date >= :dateFrom + WHERE c.status_id NOT IN (:excludeStatuses) + AND i.date >= :dateFrom AND i.date <= :dateTo - '.($userId ? 'AND ((i.created_by_id IS NOT NULL AND i.created_by_id = :userId) OR (i.created_by_id IS NULL AND c.created_by_id = :userId))' : '').' GROUP BY i.type_id ORDER BY cit.sort - '); - $stmt->bindValue(':dateFrom', $dateFrom ?: '1960-01-01'); - $stmt->bindValue(':dateTo', $dateTo ?: date('Y-m-d')); - if ($userId) { - $stmt->bindValue(':userId', $userId); - } - - return $stmt->executeQuery()->fetchAllNumeric(); + ', [ + 'excludeStatuses' => $excludeStatuses, + 'dateFrom' => $dateFrom ?: '1960-01-01', + 'dateTo' => $dateTo ?: date('Y-m-d'), + ])->fetchAllNumeric(); } /** @@ -267,10 +299,10 @@ private function outgoing( GROUP BY con.id, h.id ORDER BY h.date_to DESC '); - $stmt->bindValue(':dateFrom', $dateFrom ?: '1960-01-01'); - $stmt->bindValue(':dateTo', $dateTo ?: date('Y-m-d')); + $stmt->bindValue('dateFrom', $dateFrom ?: '1960-01-01'); + $stmt->bindValue('dateTo', $dateTo ?: date('Y-m-d')); if ($userId) { - $stmt->bindValue(':userId', $userId); + $stmt->bindValue('userId', $userId); } return $stmt->executeQuery()->fetchAllNumeric(); @@ -324,10 +356,10 @@ private function resultsOfSupport( GROUP BY con.id ORDER BY con.date_to DESC '); - $stmt->bindValue(':dateFrom', $dateFrom ?: '1960-01-01'); - $stmt->bindValue(':dateTo', $dateTo ?: date('Y-m-d')); + $stmt->bindValue('dateFrom', $dateFrom ?: '1960-01-01'); + $stmt->bindValue('dateTo', $dateTo ?: date('Y-m-d')); if ($userId) { - $stmt->bindValue(':userId', $userId); + $stmt->bindValue('userId', $userId); } return $stmt->executeQuery()->fetchAllNumeric(); @@ -374,7 +406,7 @@ private function accompanying(mixed $userId): array ORDER BY con.date_to DESC '); if ($userId) { - $stmt->bindValue(':userId', $userId); + $stmt->bindValue('userId', $userId); } return $stmt->executeQuery()->fetchAllNumeric(); @@ -407,10 +439,10 @@ private function averageCompletedItems( GROUP BY cit.name ORDER BY cit.name '); - $stmt->bindValue(':dateFrom', $dateFrom ?: '2000-01-01'); - $stmt->bindValue(':dateTo', $dateTo ?: date('Y-m-d')); + $stmt->bindValue('dateFrom', $dateFrom ?: '2000-01-01'); + $stmt->bindValue('dateTo', $dateTo ?: date('Y-m-d')); if ($userId) { - $stmt->bindValue(':userId', $userId); + $stmt->bindValue('userId', $userId); } return $stmt->executeQuery()->fetchAllNumeric();