Skip to content

Commit 29604e0

Browse files
authored
Merge pull request #45 from BitBagCommerce/dev
Add the possibility to filter through various currencies
2 parents 3bcd0fa + 36f5a0a commit 29604e0

File tree

7 files changed

+66
-17
lines changed

7 files changed

+66
-17
lines changed

spec/QueryBuilder/HasPriceBetweenQueryBuilderSpec.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,25 @@
2020
use PhpSpec\ObjectBehavior;
2121
use Sylius\Component\Channel\Context\ChannelContextInterface;
2222
use Sylius\Component\Core\Model\ChannelInterface;
23+
use Sylius\Component\Currency\Context\CurrencyContextInterface;
24+
use Sylius\Component\Currency\Converter\CurrencyConverterInterface;
25+
use Sylius\Component\Currency\Model\CurrencyInterface;
2326

2427
final class HasPriceBetweenQueryBuilderSpec extends ObjectBehavior
2528
{
2629
function let(
2730
PriceNameResolverInterface $priceNameResolver,
2831
ConcatedNameResolverInterface $channelPricingNameResolver,
29-
ChannelContextInterface $channelContext
32+
ChannelContextInterface $channelContext,
33+
CurrencyContextInterface $currencyContext,
34+
CurrencyConverterInterface $currencyConverter
3035
): void {
3136
$this->beConstructedWith(
3237
$priceNameResolver,
3338
$channelPricingNameResolver,
34-
$channelContext
39+
$channelContext,
40+
$currencyContext,
41+
$currencyConverter
3542
);
3643
}
3744

@@ -49,14 +56,17 @@ function it_builds_query(
4956
PriceNameResolverInterface $priceNameResolver,
5057
ChannelContextInterface $channelContext,
5158
ChannelInterface $channel,
59+
CurrencyContextInterface $currencyContext,
60+
CurrencyInterface $currency,
5261
ConcatedNameResolverInterface $channelPricingNameResolver
5362
): void {
5463
$channel->getCode()->willReturn('web');
55-
5664
$channelContext->getChannel()->willReturn($channel);
57-
5865
$priceNameResolver->resolveMinPriceName()->willReturn('min_price');
5966
$priceNameResolver->resolveMaxPriceName()->willReturn('max_price');
67+
$channel->getBaseCurrency()->willReturn($currency);
68+
$currency->getCode()->willReturn('USD');
69+
$currencyContext->getCurrencyCode()->willReturn('USD');
6070

6171
$channelPricingNameResolver->resolvePropertyName('web')->willReturn('web');
6272

src/Form/Type/PriceFilterType.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,21 @@
1414

1515
use BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\PriceNameResolverInterface;
1616
use Sylius\Bundle\MoneyBundle\Form\Type\MoneyType;
17+
use Sylius\Component\Currency\Context\CurrencyContextInterface;
1718
use Symfony\Component\Form\FormBuilderInterface;
1819

1920
final class PriceFilterType extends AbstractFilterType
2021
{
2122
/** @var PriceNameResolverInterface */
2223
private $priceNameResolver;
2324

24-
public function __construct(PriceNameResolverInterface $priceNameResolver)
25+
/** @var CurrencyContextInterface */
26+
private $currencyContext;
27+
28+
public function __construct(PriceNameResolverInterface $priceNameResolver, CurrencyContextInterface $currencyContext)
2529
{
2630
$this->priceNameResolver = $priceNameResolver;
31+
$this->currencyContext = $currencyContext;
2732
}
2833

2934
public function buildForm(FormBuilderInterface $builder, array $options): void
@@ -32,10 +37,12 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
3237
->add($this->priceNameResolver->resolveMinPriceName(), MoneyType::class, [
3338
'label' => 'bitbag_sylius_elasticsearch_plugin.ui.min_price',
3439
'required' => false,
40+
'currency' => $this->currencyContext->getCurrencyCode(),
3541
])
3642
->add($this->priceNameResolver->resolveMaxPriceName(), MoneyType::class, [
3743
'label' => 'bitbag_sylius_elasticsearch_plugin.ui.max_price',
3844
'required' => false,
45+
'currency' => $this->currencyContext->getCurrencyCode(),
3946
])
4047
;
4148
}

src/QueryBuilder/HasPriceBetweenQueryBuilder.php

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
use Elastica\Query\AbstractQuery;
1818
use Elastica\Query\Range;
1919
use Sylius\Component\Channel\Context\ChannelContextInterface;
20+
use Sylius\Component\Core\Model\ChannelInterface;
21+
use Sylius\Component\Currency\Context\CurrencyContextInterface;
22+
use Sylius\Component\Currency\Converter\CurrencyConverterInterface;
2023

2124
final class HasPriceBetweenQueryBuilder implements QueryBuilderInterface
2225
{
@@ -29,23 +32,33 @@ final class HasPriceBetweenQueryBuilder implements QueryBuilderInterface
2932
/** @var ChannelContextInterface */
3033
private $channelContext;
3134

35+
/** @var CurrencyContextInterface */
36+
private $currencyContext;
37+
38+
/** @var CurrencyConverterInterface */
39+
private $currencyConverter;
40+
3241
public function __construct(
3342
PriceNameResolverInterface $priceNameResolver,
3443
ConcatedNameResolverInterface $channelPricingNameResolver,
35-
ChannelContextInterface $channelContext
44+
ChannelContextInterface $channelContext,
45+
CurrencyContextInterface $currencyContext,
46+
CurrencyConverterInterface $currencyConverter
3647
) {
3748
$this->channelPricingNameResolver = $channelPricingNameResolver;
3849
$this->priceNameResolver = $priceNameResolver;
3950
$this->channelContext = $channelContext;
51+
$this->currencyContext = $currencyContext;
52+
$this->currencyConverter = $currencyConverter;
4053
}
4154

4255
public function buildQuery(array $data): ?AbstractQuery
4356
{
4457
$dataMinPrice = $data[$this->priceNameResolver->resolveMinPriceName()];
4558
$dataMaxPrice = $data[$this->priceNameResolver->resolveMaxPriceName()];
4659

47-
$minPrice = $dataMinPrice ? $this->getPriceFromString($dataMinPrice) : 0;
48-
$maxPrice = $dataMaxPrice ? $this->getPriceFromString($dataMaxPrice) : PHP_INT_MAX;
60+
$minPrice = $dataMinPrice ? $this->resolveBasePrice($dataMinPrice) : 0;
61+
$maxPrice = $dataMaxPrice ? $this->resolveBasePrice($dataMaxPrice) : PHP_INT_MAX;
4962

5063
$channelCode = $this->channelContext->getChannel()->getCode();
5164
$propertyName = $this->channelPricingNameResolver->resolvePropertyName($channelCode);
@@ -59,7 +72,22 @@ public function buildQuery(array $data): ?AbstractQuery
5972
return $rangeQuery;
6073
}
6174

62-
private function getPriceFromString(string $price): int
75+
private function resolveBasePrice(string $price): int
76+
{
77+
$price = $this->convertFromString($price);
78+
/** @var ChannelInterface $channel */
79+
$channel = $this->channelContext->getChannel();
80+
$currentCurrencyCode = $this->currencyContext->getCurrencyCode();
81+
$channelBaseCurrencyCode = $channel->getBaseCurrency()->getCode();
82+
83+
if ($currentCurrencyCode !== $channelBaseCurrencyCode) {
84+
$price = $this->currencyConverter->convert($price, $currentCurrencyCode, $channelBaseCurrencyCode);
85+
}
86+
87+
return $price;
88+
}
89+
90+
private function convertFromString(string $price): int
6391
{
6492
return (int) round($price * 100, 2);
6593
}

src/Resources/config/services.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
</imports>
77

88
<services>
9-
<defaults public="true" />
10-
119
<service id="bitbag.sylius_elasticsearch_plugin.string_formatter" class="BitBag\SyliusElasticsearchPlugin\Formatter\StringFormatter" />
1210

1311
<service id="bitbag.sylius_elasticsearch_plugin.twig.extension.unset_array_elements" class="BitBag\SyliusElasticsearchPlugin\Twig\Extension\UnsetArrayElementsExtension">

src/Resources/config/services/form.xml

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,32 @@
77
</service>
88

99
<service id="bitbag_sylius_elasticsearch_plugin.form.type.product_options_filter" class="BitBag\SyliusElasticsearchPlugin\Form\Type\ProductOptionsFilterType">
10-
<tag name="form.type" />
1110
<argument type="service" id="bitbag.sylius_elasticsearch_plugin.context.product_options" />
1211
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.property_name_resolver.option" />
1312
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.form.type.choice_mapper.product_options" />
13+
14+
<tag name="form.type" />
1415
</service>
1516

1617
<service id="bitbag_sylius_elasticsearch_plugin.form.type.product_attributes_filter" class="BitBag\SyliusElasticsearchPlugin\Form\Type\ProductAttributesFilterType">
17-
<tag name="form.type" />
1818
<argument type="service" id="bitbag.sylius_elasticsearch_plugin.context.product_attributes" />
1919
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.property_name_resolver.attribute" />
2020
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.form.type.choice_mapper.product_attributes" />
21+
22+
<tag name="form.type" />
2123
</service>
2224

2325
<service id="bitbag_sylius_elasticsearch_plugin.form.type.price_filter" class="BitBag\SyliusElasticsearchPlugin\Form\Type\PriceFilterType">
24-
<tag name="form.type" />
2526
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.property_name_resolver.price" />
27+
<argument type="service" id="sylius.context.currency.channel_aware" />
28+
29+
<tag name="form.type" />
2630
</service>
2731

2832
<service id="bitbag_sylius_elasticsearch_plugin.form.type.shop_products_filter" class="BitBag\SyliusElasticsearchPlugin\Form\Type\ShopProductsFilterType">
29-
<tag name="form.type" />
3033
<argument>%bitbag_es_shop_name_property_prefix%</argument>
34+
35+
<tag name="form.type" />
3136
</service>
3237

3338
<service id="bitbag_sylius_elasticsearch_plugin.form.type.choice_mapper.product_options" class="BitBag\SyliusElasticsearchPlugin\Form\Type\ChoiceMapper\ProductOptionsMapper">

src/Resources/config/services/property_name_resolver.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
44
<services>
5-
65
<service id="bitbag_sylius_elasticsearch_plugin.property_name_resolver.name" class="BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\ConcatedNameResolver">
76
<argument>%bitbag_es_shop_name_property_prefix%</argument>
87
</service>

src/Resources/config/services/query_builder.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.property_name_resolver.price" />
3838
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.property_name_resolver.channel_pricing" />
3939
<argument type="service" id="sylius.context.channel" />
40+
<argument type="service" id="sylius.context.currency.channel_aware" />
41+
<argument type="service" id="sylius.currency_converter" />
4042
</service>
4143

4244
<service id="bitbag_sylius_elasticsearch_plugin.query_builder.shop_products" class="BitBag\SyliusElasticsearchPlugin\QueryBuilder\ShopProductsQueryBuilder">
@@ -50,7 +52,7 @@
5052
<argument>%bitbag_es_shop_option_property_prefix%</argument>
5153
<argument>%bitbag_es_shop_attribute_property_prefix%</argument>
5254
</service>
53-
55+
5456
<service id="bitbag_sylius_elasticsearch_plugin.query_builder.product_options_by_taxon" class="BitBag\SyliusElasticsearchPlugin\QueryBuilder\ProductOptionsByTaxonQueryBuilder">
5557
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.has_option_taxon" />
5658
</service>

0 commit comments

Comments
 (0)