featL min 5000 rub
This commit is contained in:
@@ -22,7 +22,7 @@ class GetPaymentConfigCommand:
|
|||||||
|
|
||||||
|
|
||||||
async def __call__(self) -> PaymentQuote:
|
async def __call__(self) -> PaymentQuote:
|
||||||
quote = await self._payment_quote_service.get_quote(Decimal('1.00'))
|
quote = await self._payment_quote_service.get_reference_quote(Decimal('1.00'))
|
||||||
self._logger.info({'event':'payment_config_requested'})
|
self._logger.info({'event':'payment_config_requested'})
|
||||||
return quote
|
return quote
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from src.application.contracts import ICache, ILogger
|
|||||||
from src.application.domain.exceptions import OrderTotalOutOfRangeException, ServiceUnavailableException
|
from src.application.domain.exceptions import OrderTotalOutOfRangeException, ServiceUnavailableException
|
||||||
|
|
||||||
|
|
||||||
_MIN_USDT_AMOUNT: Decimal = Decimal('1')
|
_MIN_TOTAL_RUB: Decimal = Decimal('5000')
|
||||||
|
|
||||||
_MAX_TOTAL_RUB: Decimal = Decimal('600000')
|
_MAX_TOTAL_RUB: Decimal = Decimal('600000')
|
||||||
|
|
||||||
@@ -105,8 +105,8 @@ class PaymentQuoteService:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def get_quote(self, usdt_amount: Decimal) -> PaymentQuote:
|
async def get_reference_quote(self, usdt_amount: Decimal) -> PaymentQuote:
|
||||||
if usdt_amount < _MIN_USDT_AMOUNT:
|
if usdt_amount <= Decimal('0'):
|
||||||
raise OrderTotalOutOfRangeException(
|
raise OrderTotalOutOfRangeException(
|
||||||
message='Order total is below minimum allowed amount',
|
message='Order total is below minimum allowed amount',
|
||||||
)
|
)
|
||||||
@@ -120,8 +120,17 @@ class PaymentQuoteService:
|
|||||||
return quote
|
return quote
|
||||||
|
|
||||||
|
|
||||||
|
async def get_quote(self, usdt_amount: Decimal) -> PaymentQuote:
|
||||||
|
quote = await self.get_reference_quote(usdt_amount)
|
||||||
|
if quote.total_price < _MIN_TOTAL_RUB:
|
||||||
|
raise OrderTotalOutOfRangeException(
|
||||||
|
message='Order total is below minimum allowed amount',
|
||||||
|
)
|
||||||
|
return quote
|
||||||
|
|
||||||
|
|
||||||
async def get_quote_from_total_rub(self, total_rub: Decimal) -> PaymentQuote:
|
async def get_quote_from_total_rub(self, total_rub: Decimal) -> PaymentQuote:
|
||||||
if total_rub <= Decimal('0'):
|
if total_rub < _MIN_TOTAL_RUB:
|
||||||
raise OrderTotalOutOfRangeException(
|
raise OrderTotalOutOfRangeException(
|
||||||
message='Order total is below minimum allowed amount',
|
message='Order total is below minimum allowed amount',
|
||||||
)
|
)
|
||||||
@@ -133,17 +142,6 @@ class PaymentQuoteService:
|
|||||||
|
|
||||||
usdt_exchange_rate, gas_fee = await self._load_prices()
|
usdt_exchange_rate, gas_fee = await self._load_prices()
|
||||||
|
|
||||||
if total_rub <= gas_fee:
|
|
||||||
raise OrderTotalOutOfRangeException(
|
|
||||||
message='Order total is below minimum allowed amount',
|
|
||||||
)
|
|
||||||
|
|
||||||
min_quote = self._compose_quote(_MIN_USDT_AMOUNT, usdt_exchange_rate, gas_fee)
|
|
||||||
if min_quote is None or min_quote.total_price > total_rub:
|
|
||||||
raise OrderTotalOutOfRangeException(
|
|
||||||
message='Order total is below minimum allowed amount',
|
|
||||||
)
|
|
||||||
|
|
||||||
u_budget = ((total_rub - gas_fee) / usdt_exchange_rate).quantize(Decimal('0.01'), rounding=ROUND_DOWN)
|
u_budget = ((total_rub - gas_fee) / usdt_exchange_rate).quantize(Decimal('0.01'), rounding=ROUND_DOWN)
|
||||||
u_cap = ((_MAX_TOTAL_RUB - gas_fee) / (usdt_exchange_rate * Decimal('1.04'))).quantize(
|
u_cap = ((_MAX_TOTAL_RUB - gas_fee) / (usdt_exchange_rate * Decimal('1.04'))).quantize(
|
||||||
Decimal('0.01'),
|
Decimal('0.01'),
|
||||||
@@ -151,12 +149,12 @@ class PaymentQuoteService:
|
|||||||
)
|
)
|
||||||
u_upper = min(u_budget, u_cap)
|
u_upper = min(u_budget, u_cap)
|
||||||
n_hi = int((u_upper * 100).to_integral_value(rounding=ROUND_DOWN))
|
n_hi = int((u_upper * 100).to_integral_value(rounding=ROUND_DOWN))
|
||||||
if n_hi < 100:
|
if n_hi < 1:
|
||||||
raise OrderTotalOutOfRangeException(
|
raise OrderTotalOutOfRangeException(
|
||||||
message='Order total is below minimum allowed amount',
|
message='Order total is below minimum allowed amount',
|
||||||
)
|
)
|
||||||
|
|
||||||
n_lo = 100
|
n_lo = 1
|
||||||
best_cent: int | None = None
|
best_cent: int | None = None
|
||||||
while n_lo <= n_hi:
|
while n_lo <= n_hi:
|
||||||
mid = (n_lo + n_hi) // 2
|
mid = (n_lo + n_hi) // 2
|
||||||
|
|||||||
Reference in New Issue
Block a user