@@ -26,18 +26,17 @@ public function getCustomerUserComplaintsLimitedList(
2626 CustomerUser $ customerUser ,
2727 int $ limit ,
2828 int $ offset ,
29- ? string $ search = null ,
29+ ComplaintFilter $ filter ,
3030 ): array {
3131 $ queryBuilder = $ this ->createCustomerUserComplaintsQueryBuilder ($ customerUser )
3232 ->orderBy ('c.createdAt ' , 'DESC ' )
3333 ->addOrderBy ('c.id ' , 'DESC ' )
3434 ->setMaxResults ($ limit )
3535 ->setFirstResult ($ offset );
3636
37+ $ this ->applyFilterToQueryBuilder ($ queryBuilder , $ filter );
3738
38- return $ this ->applySearchToQueryBuilder ($ queryBuilder , $ search )
39- ->getQuery ()
40- ->getResult ();
39+ return $ queryBuilder ->getQuery ()->getResult ();
4140 }
4241
4342 /**
@@ -47,41 +46,75 @@ public function getCustomerComplaintsLimitedList(
4746 Customer $ customer ,
4847 int $ limit ,
4948 int $ offset ,
50- ? string $ search = null ,
49+ ComplaintFilter $ filter ,
5150 ): array {
5251 $ queryBuilder = $ this ->createCustomerComplaintsQueryBuilder ($ customer )
5352 ->orderBy ('c.createdAt ' , 'DESC ' )
5453 ->addOrderBy ('c.id ' , 'DESC ' )
5554 ->setMaxResults ($ limit )
5655 ->setFirstResult ($ offset );
5756
58- return $ this ->applySearchToQueryBuilder ($ queryBuilder , $ search )
59- -> getQuery ()
60- ->getResult ();
57+ $ this ->applyFilterToQueryBuilder ($ queryBuilder , $ filter );
58+
59+ return $ queryBuilder -> getQuery () ->getResult ();
6160 }
6261
6362 public function getCustomerUserComplaintsListCount (
6463 CustomerUser $ customerUser ,
65- ? string $ search = null ,
64+ ComplaintFilter $ filter ,
6665 ): int {
6766 $ queryBuilder = $ this ->createCustomerUserComplaintsQueryBuilder ($ customerUser )
68- ->select ('COUNT(c ) ' );
67+ ->select ('COUNT(DISTINCT c.id ) ' );
6968
70- return $ this ->applySearchToQueryBuilder ($ queryBuilder , $ search )
71- -> getQuery ()
72- ->getSingleScalarResult ();
69+ $ this ->applyFilterToQueryBuilder ($ queryBuilder , $ filter );
70+
71+ return $ queryBuilder -> getQuery () ->getSingleScalarResult ();
7372 }
7473
7574 public function getCustomerComplaintsListCount (
7675 Customer $ customer ,
77- ? string $ search = null ,
76+ ComplaintFilter $ filter ,
7877 ): int {
7978 $ queryBuilder = $ this ->createCustomerComplaintsQueryBuilder ($ customer )
80- ->select ('COUNT(c ) ' );
79+ ->select ('COUNT(DISTINCT c.id ) ' );
8180
82- return $ this ->applySearchToQueryBuilder ($ queryBuilder , $ search )
83- ->getQuery ()
84- ->getSingleScalarResult ();
81+ $ this ->applyFilterToQueryBuilder ($ queryBuilder , $ filter );
82+
83+ return $ queryBuilder ->getQuery ()->getSingleScalarResult ();
84+ }
85+
86+ /**
87+ * @return array<int, int>
88+ */
89+ public function getCustomerUserComplaintStatusCounts (
90+ CustomerUser $ customerUser ,
91+ ComplaintFilter $ filter ,
92+ ): array {
93+ $ queryBuilder = $ this ->createCustomerUserComplaintsQueryBuilder ($ customerUser )
94+ ->join ('c.status ' , 'cs ' )
95+ ->select ('cs.id AS statusId, COUNT(DISTINCT c.id) AS complaintsCount ' )
96+ ->groupBy ('cs.id ' );
97+
98+ $ this ->applyFilterToQueryBuilder ($ queryBuilder , $ filter );
99+
100+ return $ this ->extractComplaintStatusCountsByStatusId ($ queryBuilder ->getQuery ()->getArrayResult ());
101+ }
102+
103+ /**
104+ * @return array<int, int>
105+ */
106+ public function getCustomerComplaintStatusCounts (
107+ Customer $ customer ,
108+ ComplaintFilter $ filter ,
109+ ): array {
110+ $ queryBuilder = $ this ->createCustomerComplaintsQueryBuilder ($ customer )
111+ ->join ('c.status ' , 'cs ' )
112+ ->select ('cs.id AS statusId, COUNT(DISTINCT c.id) AS complaintsCount ' )
113+ ->groupBy ('cs.id ' );
114+
115+ $ this ->applyFilterToQueryBuilder ($ queryBuilder , $ filter );
116+
117+ return $ this ->extractComplaintStatusCountsByStatusId ($ queryBuilder ->getQuery ()->getArrayResult ());
85118 }
86119
87120 protected function createCustomerUserComplaintsQueryBuilder (
@@ -129,22 +162,56 @@ protected function createQueryBuilder(): QueryBuilder
129162 ->select ('c ' );
130163 }
131164
132- protected function applySearchToQueryBuilder (QueryBuilder $ queryBuilder , ? string $ search = null ): QueryBuilder
165+ protected function applyFilterToQueryBuilder (QueryBuilder $ queryBuilder , ComplaintFilter $ filter ): void
133166 {
134- if ($ search === null ) {
135- return $ queryBuilder ;
167+ if ($ filter ->getCreatedAfter () !== null ) {
168+ $ queryBuilder ->andWhere ('c.createdAt >= :createdAfter ' )
169+ ->setParameter ('createdAfter ' , $ filter ->getCreatedAfter ());
170+ }
171+
172+ if ($ filter ->getCreatedBefore () !== null ) {
173+ $ queryBuilder ->andWhere ('c.createdAt <= :createdBefore ' )
174+ ->setParameter ('createdBefore ' , $ filter ->getCreatedBefore ());
175+ }
176+
177+ if ($ filter ->getSearch () !== null ) {
178+ $ search = $ this ->databaseSearchingHelper ->getFullTextLikeSearchString ($ filter ->getSearch ());
179+
180+ $ queryBuilder
181+ ->distinct ()
182+ ->leftJoin ('c.items ' , 'ci ' )
183+ ->leftJoin ('ci.orderItem ' , 'oi ' )
184+ ->andWhere (
185+ $ queryBuilder ->expr ()->orX (
186+ 'NORMALIZED(c.number) LIKE NORMALIZED(:search) ' ,
187+ 'NORMALIZED(oi.name) LIKE NORMALIZED(:search) ' ,
188+ 'NORMALIZED(oi.catnum) LIKE NORMALIZED(:search) ' ,
189+ ),
190+ )
191+ ->setParameter ('search ' , $ search );
192+ }
193+
194+ if ($ filter ->getStatuses () === null || count ($ filter ->getStatuses ()) <= 0 ) {
195+ return ;
196+ }
197+
198+ $ queryBuilder ->andWhere ('c.status IN (:statuses) ' )
199+ ->setParameter ('statuses ' , $ filter ->getStatuses ());
200+ }
201+
202+ /**
203+ * @param array<int, array{statusId: int|string, complaintsCount: int|string}> $complaintStatusCounts
204+ * @return array<int, int>
205+ */
206+ protected function extractComplaintStatusCountsByStatusId (array $ complaintStatusCounts ): array
207+ {
208+ $ complaintStatusCountsByStatusId = [];
209+
210+ foreach ($ complaintStatusCounts as $ complaintStatusCount ) {
211+ $ complaintStatusCountsByStatusId [(int )$ complaintStatusCount ['statusId ' ]] =
212+ (int )$ complaintStatusCount ['complaintsCount ' ];
136213 }
137214
138- return $ queryBuilder
139- ->leftJoin ('c.items ' , 'ci ' )
140- ->leftJoin ('ci.orderItem ' , 'oi ' )
141- ->andWhere (
142- $ queryBuilder ->expr ()->orX (
143- 'NORMALIZED(c.number) LIKE NORMALIZED(:search) ' ,
144- 'NORMALIZED(oi.name) LIKE NORMALIZED(:search) ' ,
145- 'NORMALIZED(oi.catnum) LIKE NORMALIZED(:search) ' ,
146- ),
147- )
148- ->setParameter ('search ' , $ this ->databaseSearchingHelper ->getFullTextLikeSearchString ($ search ));
215+ return $ complaintStatusCountsByStatusId ;
149216 }
150217}
0 commit comments