@ilysion_in_life

Как правильно сформулировать систему скидок?

Добрый день, можете подсказать? у меня есть массив вот я вывожу с модели
$model = Yii::app()->db->createCommand()-> 
select( '*' )-> 
from('DiscountRegular')-> 
where('active = "1"')-> 
queryAll();

данные такие
array(2) { 
[0]=> 
array(7) { 
["id"]=> 
string(1) "1" 
["name"]=> 
string(6) "7roses" 
["active"]=> 
string(1) "1" 
["sum"]=> 
string(2) "10" 
["start_date"]=> 
string(19) "2018-10-25 13:40:07" 
["end_date"]=> 
string(19) "2018-11-30 09:45:28" 
["price"]=> 
string(3) "351" 
} 
[1]=> 
array(7) { 
["id"]=> 
string(1) "2" 
["name"]=> 
string(1) "2" 
["active"]=> 
string(1) "1" 
["sum"]=> 
string(2) "20" 
["start_date"]=> 
string(19) "2018-10-30 10:25:40" 
["end_date"]=> 
string(19) "2018-11-30 10:25:40" 
["price"]=> 
string(3) "250" 
} 
}

как мне перебрать такой пример
если в покупателя общая сумма оплачена 250 или больше тогда ему % скидки будет 20% а если больше 351 или равно тогда 10% условие я сделал такое
if($result == $model[0]['price'] or $result > $model[0]['price']){

т.е мне надо как то сделать что бы действовала скидка по значению ["price"] а у меня почему то сейчас работает не правильно хоть и указанна сума покупок 351 скидка на 250 не работает
я это всё сделал так
public function checkDiscount($price) 
{ 
$model = Yii::app()->db->createCommand()-> 
select( '*' )-> 
from('DiscountRegular')-> 
where('active = "1"')-> 
queryAll(); 

$regular_discount = DiscountRegular::calculateDiscount(); 
$result = preg_replace("/\..+/", "", $regular_discount); 

if($result == $model[0]['price'] or $result > $model[0]['price']){ 
$timestamp_start = strtotime($model[0]['start_date']); 
$timestamp_stop = strtotime($model[0]['end_date']); 


if($timestamp_start <= time() && $timestamp_stop >= time() && $model[0]['active'] == '1') 
{ 
$percent = $model[0]['sum']; 
$number_percent = $price / 100 * $percent; 
$result = $price - $number_percent; 

return $result; 

}else{ 
return false; 
} 
}else{ 
return false; 
} 
}
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 1
@xtress
Web-dev
Во-первых, вы можете рассказать, что происходит здесь (и что получается на данном этапе):
$regular_discount = DiscountRegular::calculateDiscount(); 
$result = preg_replace("/\..+/", "", $regular_discount);


Во-вторых, если брать ваше условие:
если в покупателя общая сумма оплачена 250 или больше тогда ему % скидки будет 20% а если больше 351 или равно тогда 10% условие я сделал такое

то, каким образом
хоть и указанна сума покупок 351 скидка на 250 не работает
это должно примениться? Ваше условие говорит однозначно - скидка = 20%, при 250<=сумма<351; скидка = 10%, при сумме>=351. Т.е., кмк, вы неправильно сформулировали задачу.
p.s.
Ну, и, в-третьих: а данные у вас все в строках хранятся в бд? (какой тип полей?) Если нет, то почему сразу не выполнить общий запрос вида
SELECT dr0_.sum AS percentage, dr0_.price as minOrderSum FROM DiscountRegular AS dr0_ WHERE dr0_.active = 1 AND dr0_.start_date >= CURRENT_TIMESTAMP() AND dr0_.end_date < CURRENT_TIMESTAMP() AND dr0_.price >= ?сумма_заказа

Естественно перенеся его на вашу ORM, используемую в проекте. А затем:
$applicableDiscounts = $queryResults; //результаты запроса выше
$currentPercentage = 0;
$prevMinOrderSum = 0; //нужно для запоминания текущих границ скидки, чтобы не применялась тупо последняя выбранная из бд скидка
foreach ($applicableDiscounts as $discountData) {
    if ($price >= $discountData['minOrderSum'] && $discountData['minOrderSum'] > $prevMinOrderSum) { //где $price - сумма вашего заказа
        $currentPercentage = $discountData['percentage'];
        $prevMinOrderSum = $discountData['minOrderSum'];
    }
}
$finalPrice = $price * (1 - $currentPercentage / 100);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы