Skip to content

Commit

Permalink
Add HasOrderCriteria condition for scenarios
Browse files Browse the repository at this point in the history
remp/crm#1570
  • Loading branch information
rootpd committed Jan 6, 2021
1 parent 0789f44 commit d7c9687
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/ProductsModule.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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)
);
}
}
34 changes: 34 additions & 0 deletions src/Scenarios/HasOrderCriteria.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace Crm\ProductsModule\Scenarios;

use Crm\ApplicationModule\Criteria\Params\BooleanParam;
use Crm\ApplicationModule\Criteria\ScenariosCriteriaInterface;
use Nette\Database\Table\IRow;
use Nette\Database\Table\Selection;

class HasOrderCriteria implements ScenariosCriteriaInterface
{
public function params(): array
{
return [
new BooleanParam('has_order', $this->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';
}
}
100 changes: 100 additions & 0 deletions src/Tests/HasOrderCriteriaTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
<?php

namespace Crm\ProductsModule\Tests;

use Crm\ApplicationModule\Tests\DatabaseTestCase;
use Crm\PaymentsModule\PaymentItem\PaymentItemContainer;
use Crm\PaymentsModule\Repository\PaymentGatewaysRepository;
use Crm\PaymentsModule\Repository\PaymentsRepository;
use Crm\ProductsModule\Repository\OrdersRepository;
use Crm\ProductsModule\Scenarios\HasOrderCriteria;
use Crm\UsersModule\Auth\UserManager;
use Crm\UsersModule\Repository\UsersRepository;

class HasOrderCriteriaTest extends DatabaseTestCase
{
/** @var PaymentsRepository */
private $paymentsRepository;

/** @var OrdersRepository */
private $ordersRepository;

public function setUp(): void
{
parent::setUp();

$this->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('[email protected]');

$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];
}
}
File renamed without changes.
2 changes: 2 additions & 0 deletions src/config/config.neon
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ services:
- Crm\ProductsModule\Seeders\AddressTypesSeeder
- Crm\ProductsModule\Seeders\ConfigsSeeder

- Crm\ProductsModule\Scenarios\HasOrderCriteria

- Crm\ProductsModule\User\OrdersUserDataProvider

paymentCompleteRedirect:
Expand Down

0 comments on commit d7c9687

Please sign in to comment.