From d3d30d3ad044e13b552457fcc6566389af2b39c7 Mon Sep 17 00:00:00 2001 From: Peter Dulacka Date: Tue, 31 Mar 2020 12:39:25 +0200 Subject: [PATCH] Adding payment item types parameter to payment segment criteria remp/crm#1130 --- .../Repositories/PaymentItemsRepository.php | 5 ++++ src/segment/PaymentCriteria.php | 29 +++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/model/Repositories/PaymentItemsRepository.php b/src/model/Repositories/PaymentItemsRepository.php index 07ac04b..bb07d4b 100644 --- a/src/model/Repositories/PaymentItemsRepository.php +++ b/src/model/Repositories/PaymentItemsRepository.php @@ -73,4 +73,9 @@ final public function getByType(IRow $payment, string $paymentItemType): array { return $payment->related('payment_items')->where('type = ?', $paymentItemType)->fetchAll(); } + + final public function getTypes(): array + { + return $this->getTable()->select('DISTINCT type')->fetchPairs('type', 'type'); + } } diff --git a/src/segment/PaymentCriteria.php b/src/segment/PaymentCriteria.php index b55bf07..fe3b591 100644 --- a/src/segment/PaymentCriteria.php +++ b/src/segment/PaymentCriteria.php @@ -2,8 +2,9 @@ namespace Crm\PaymentsModule\Segment; -use Crm\PaymentsModule\Repository\PaymentsRepository; use Crm\ApplicationModule\Criteria\CriteriaInterface; +use Crm\PaymentsModule\Repository\PaymentItemsRepository; +use Crm\PaymentsModule\Repository\PaymentsRepository; use Crm\SegmentModule\Criteria\Fields; use Crm\SegmentModule\Params\BooleanParam; use Crm\SegmentModule\Params\DateTimeParam; @@ -16,13 +17,17 @@ class PaymentCriteria implements CriteriaInterface { private $paymentsRepository; + private $paymentItemsRepository; + private $subscriptionTypesRepository; public function __construct( PaymentsRepository $paymentsRepository, + PaymentItemsRepository $paymentItemsRepository, SubscriptionTypesRepository $subscriptionTypesRepository ) { $this->paymentsRepository = $paymentsRepository; + $this->paymentItemsRepository = $paymentItemsRepository; $this->subscriptionTypesRepository = $subscriptionTypesRepository; } @@ -58,6 +63,15 @@ public function params(): array null, array_keys($this->paymentsRepository->getStatusPairs()) ), + new StringArrayParam( + "item_types", + "Payment item types", + "Filters users with payments with specific types of payment items", + false, + [], + null, + array_keys($this->paymentItemsRepository->getTypes()) + ), new NumberArrayParam( "subscription_type", "Subscription type", @@ -86,8 +100,12 @@ public function join(ParamsBag $params): string $where[] = " payments.status IN ({$params->stringArray('status')->escapedString()}) "; } + if ($params->has('item_types')) { + $where[] = " payment_items.type IN ({$params->stringArray('item_types')->escapedString()}) "; + } + if ($params->has('created')) { - $where += $params->datetime('created')->escapedConditions('payments.created_at'); + $where = array_merge($where, $params->datetime('created')->escapedConditions('payments.created_at')); } if ($params->has('subscription_type')) { @@ -97,6 +115,7 @@ public function join(ParamsBag $params): string return "SELECT DISTINCT(payments.user_id) AS id, " . Fields::formatSql($this->fields()) . " FROM payments + LEFT JOIN payment_items ON payment_items.payment_id = payments.id WHERE " . implode(" AND ", $where); } @@ -110,6 +129,12 @@ public function title(ParamsBag $paramBag): string $result .= ' with payment'; } + if ($paramBag->has('item_types')) { + $result .= " with {$paramBag->stringArray('item_types')->escapedString()} items"; + } else { + $result .= ' with all item types'; + } + if ($paramBag->has('additional_amount')) { if ($paramBag->boolean('additional_amount')->isTrue()) { $result .= ' with additional amount';