diff --git a/spec/QueryBuilder/HasPriceBetweenQueryBuilderSpec.php b/spec/QueryBuilder/HasPriceBetweenQueryBuilderSpec.php index cfb54a42..7d74af55 100644 --- a/spec/QueryBuilder/HasPriceBetweenQueryBuilderSpec.php +++ b/spec/QueryBuilder/HasPriceBetweenQueryBuilderSpec.php @@ -75,4 +75,35 @@ function it_builds_query( 'max_price' => '1000', ])->shouldBeAnInstanceOf(Range::class); } + + function it_converts_fractional_currency_properly( + PriceNameResolverInterface $priceNameResolver, + ChannelContextInterface $channelContext, + ChannelInterface $channel, + CurrencyContextInterface $currencyContext, + CurrencyInterface $currency, + ConcatedNameResolverInterface $channelPricingNameResolver + ): void { + $channel->getCode()->willReturn('web'); + $channelContext->getChannel()->willReturn($channel); + $priceNameResolver->resolveMinPriceName()->willReturn('min_price'); + $priceNameResolver->resolveMaxPriceName()->willReturn('max_price'); + $channel->getBaseCurrency()->willReturn($currency); + $currency->getCode()->willReturn('USD'); + $currencyContext->getCurrencyCode()->willReturn('USD'); + + $channelPricingNameResolver->resolvePropertyName('web')->willReturn('web'); + + $range = $this->buildQuery([ + 'min_price' => '1,23', + 'max_price' => '1000,51', + ]); + + $range->getParam('web')->shouldReturn( + [ + 'gte' => 123, + 'lte' => 100051, + ] + ); + } } diff --git a/src/QueryBuilder/HasPriceBetweenQueryBuilder.php b/src/QueryBuilder/HasPriceBetweenQueryBuilder.php index 44217cab..44be25c0 100644 --- a/src/QueryBuilder/HasPriceBetweenQueryBuilder.php +++ b/src/QueryBuilder/HasPriceBetweenQueryBuilder.php @@ -16,6 +16,7 @@ use BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\PriceNameResolverInterface; use Elastica\Query\AbstractQuery; use Elastica\Query\Range; +use Sylius\Bundle\MoneyBundle\Form\DataTransformer\SyliusMoneyTransformer; use Sylius\Component\Channel\Context\ChannelContextInterface; use Sylius\Component\Core\Model\ChannelInterface; use Sylius\Component\Currency\Context\CurrencyContextInterface; @@ -89,6 +90,7 @@ private function resolveBasePrice(string $price): int private function convertFromString(string $price): int { - return (int) round((int) $price * 100, 2); + $transformer = new SyliusMoneyTransformer(2, false, SyliusMoneyTransformer::ROUND_HALF_UP, 100); + return $transformer->reverseTransform($price); } }