From d7c9687c5182db607b67b90597a7ec7fbb1eb17b Mon Sep 17 00:00:00 2001 From: Peter Dulacka Date: Mon, 21 Dec 2020 11:45:56 +0100 Subject: [PATCH] Add HasOrderCriteria condition for scenarios remp/crm#1570 --- src/ProductsModule.php | 11 +++ src/Scenarios/HasOrderCriteria.php | 34 +++++++ src/Tests/HasOrderCriteriaTest.php | 100 ++++++++++++++++++++ src/{tests => Tests}/ProductManagerTest.php | 0 src/config/config.neon | 2 + 5 files changed, 147 insertions(+) create mode 100644 src/Scenarios/HasOrderCriteria.php create mode 100644 src/Tests/HasOrderCriteriaTest.php rename src/{tests => Tests}/ProductManagerTest.php (100%) diff --git a/src/ProductsModule.php b/src/ProductsModule.php index d849ecb..a28e0e5 100644 --- a/src/ProductsModule.php +++ b/src/ProductsModule.php @@ -5,6 +5,7 @@ use Crm\ApplicationModule\Commands\CommandsContainerInterface; use Crm\ApplicationModule\Config\ApplicationConfig; use Crm\ApplicationModule\Config\ConfigsCache; +use Crm\ApplicationModule\Criteria\ScenariosCriteriaStorage; use Crm\ApplicationModule\CrmModule; use Crm\ApplicationModule\DataProvider\DataProviderManager; use Crm\ApplicationModule\Event\EventsStorage; @@ -22,6 +23,7 @@ use Crm\ProductsModule\Events\PaymentStatusChangeHandler; use Crm\ProductsModule\Events\PaymentStatusChangeNotifyHandler; use Crm\ProductsModule\Repository\ProductsRepository; +use Crm\ProductsModule\Scenarios\HasOrderCriteria; use Crm\ProductsModule\Seeders\AddressTypesSeeder; use Crm\ProductsModule\Seeders\ConfigsSeeder; use Kdyby\Translation\Translator; @@ -247,4 +249,13 @@ public function registerWidgets(WidgetManagerInterface $widgetManager) $this->getInstance(\Crm\ProductsModule\Components\AvgProductsPaymentWidget::class) ); } + + public function registerScenariosCriteria(ScenariosCriteriaStorage $scenariosCriteriaStorage) + { + $scenariosCriteriaStorage->register( + 'payment', + 'has_order', + $this->getInstance(HasOrderCriteria::class) + ); + } } diff --git a/src/Scenarios/HasOrderCriteria.php b/src/Scenarios/HasOrderCriteria.php new file mode 100644 index 0000000..5343cd4 --- /dev/null +++ b/src/Scenarios/HasOrderCriteria.php @@ -0,0 +1,34 @@ +label()), + ]; + } + + public function addCondition(Selection $selection, $values, IRow $criterionItemRow): bool + { + if ($values->selection) { + $selection->where(':orders.id IS NOT NULL'); + } else { + $selection->where(':orders.id IS NULL'); + } + + return true; + } + + public function label(): string + { + return 'Has shop order'; + } +} diff --git a/src/Tests/HasOrderCriteriaTest.php b/src/Tests/HasOrderCriteriaTest.php new file mode 100644 index 0000000..4d578c6 --- /dev/null +++ b/src/Tests/HasOrderCriteriaTest.php @@ -0,0 +1,100 @@ +paymentsRepository = $this->getRepository(PaymentsRepository::class); + $this->ordersRepository = $this->getRepository(OrdersRepository::class); + } + + protected function requiredRepositories(): array + { + return [ + PaymentsRepository::class, + UsersRepository::class, + OrdersRepository::class, + PaymentGatewaysRepository::class, + ]; + } + + protected function requiredSeeders(): array + { + return [ + ]; + } + + public function testHasOrderWithOrder(): void + { + [$paymentSelection, $paymentRow] = $this->prepareData(true); + + $hasOrderCriteria = new HasOrderCriteria(); + $hasOrderCriteria->addCondition($paymentSelection, (object)['selection' => true], $paymentRow); + + $this->assertNotEmpty($paymentSelection->fetch()); + } + + public function testHasOrderWithoutOrder(): void + { + [$paymentSelection, $paymentRow] = $this->prepareData(false); + + $hasOrderCriteria = new HasOrderCriteria(); + $hasOrderCriteria->addCondition($paymentSelection, (object)['selection' => true], $paymentRow); + + $this->assertEmpty($paymentSelection->fetch()); + } + + private function prepareData(bool $withOrder): array + { + /** @var UserManager $userManager */ + $userManager = $this->inject(UserManager::class); + $userRow = $userManager->addNewUser('test@example.com'); + + $gatewayRepository = $this->getRepository(PaymentGatewaysRepository::class); + $gatewayRow = $gatewayRepository->add('test', 'test', 10, true, true); + + $payment = $this->paymentsRepository->add( + null, + $gatewayRow, + $userRow, + new PaymentItemContainer(), + null, + 0.01 // fake amount so we don't have to care about payment items + ); + + $selection = $this->paymentsRepository + ->getTable() + ->where(['payments.id' => $payment->id]); + + if ($withOrder) { + $this->ordersRepository->add( + $payment->id, + null, + null, + null, + null + ); + } + + return [$selection, $payment]; + } +} diff --git a/src/tests/ProductManagerTest.php b/src/Tests/ProductManagerTest.php similarity index 100% rename from src/tests/ProductManagerTest.php rename to src/Tests/ProductManagerTest.php diff --git a/src/config/config.neon b/src/config/config.neon index 8846a0e..42b872f 100644 --- a/src/config/config.neon +++ b/src/config/config.neon @@ -53,6 +53,8 @@ services: - Crm\ProductsModule\Seeders\AddressTypesSeeder - Crm\ProductsModule\Seeders\ConfigsSeeder + - Crm\ProductsModule\Scenarios\HasOrderCriteria + - Crm\ProductsModule\User\OrdersUserDataProvider paymentCompleteRedirect: