1. Надо прежде определиться с:
- порядком начисления скидок
- действуют ли скидки пользователя при наличии скидки товара
- возможно выбирается большая из них
Это все бизнес вопросы, а не вопросы программирования, Вы у заказчика уточните это, а потом уже реализовывайте
2. У Вас заказ скорее всего имеет сущность "order" и связанные сущности "order_item". Если это не так, то еще раз задумайтесь, почему Вы так не сделали. Поэтому расчет должен идти для каждой "order_item" получая в результате некую стоимость, допустим перед сохранением
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
$this->item_cost = $this->product->base_price * $this->item_count * $this->getDiscount($user_id);
return true;
} else {
return false;
}
}
getDiscount содержит логику просчета скидки зависимо от пользователя и скидки товара и логики расчета выданной Вам заказчиком.
А для сущности "order" просто считаете сумму стоимости всех "order_item"
3. Возможно нужно реализовать несколько механизмов и выбор одного из них вынести в настройки или давать возможность указывать для каждого товара, которому назначается скидка. Будет сложнее, но более гибко и удобнее пользователю. Тогда в getDiscount будет switch case зависимый от какого-нибудь
Yii::$app->setting->get('discount-type')
или
$this->product->discountType