/** * @param FilterCriteria $filterCriteria * * @return Operation[] */ public function filter(FilterCriteria $filterCriteria) { $query = $this->operationRepository->select(); $query->where(['family_id', '=', $filterCriteria->getFamilyId()]); if ($filterCriteria->getCategoryId()) { $query->andWhere(['category_id', '=', $filterCriteria->getCategoryId()]); } if ($filterCriteria->getStartDate() || $filterCriteria->getEndDate()) { if ($filterCriteria->getStartDate()) { $startDate = date_create($filterCriteria->getStartDate())->format('Y-m-d 00:00:00'); $query->andWhere(['create_date', '>=', $startDate]); } if ($filterCriteria->getEndDate()) { $endDate = date_create($filterCriteria->getEndDate())->format('Y-m-d 23:59:59'); $query->andWhere(['create_date', '<=', $endDate]); } } elseif ($filterCriteria->getPeriod()) { switch ($filterCriteria->getPeriod()) { case FilterCriteria::FILTER_PERIOD_MONTH: $period = date_create('first day of this month')->format('Y-m-d 00:00:00'); break; case FilterCriteria::FILTER_PERIOD_WEEK: $period = date_create('last Monday')->format('Y-m-d 00:00:00'); break; default: $period = false; } if ($period) { $query->andWhere(['create_date', '>=', $period]); } } if ($filterCriteria->getOperationType()) { $query->andWhere(['operation_type', '=', $filterCriteria->getOperationType()]); } if ($filterCriteria->getOrderBy()) { list($orderField, $order) = $filterCriteria->getOrderBy(); $query->orderBy($orderField, $order); } $range = $filterCriteria->getRange(); if ($range) { $query->limit($range->getLimit(), $range->getOffset()); } return $query->all(); }