if (!empty($lid_id)) {
file_put_contents(self::OUT_DIR . '/sale_bonuses_' . $fl . '.json', PHP_EOL . '--' . __LINE__, FILE_APPEND);
- $tipSaleForCheck = $usePromoWriteOff ? Promocode::TIP_SALE_PROMOBONUS : 'sale';
- $writeOffAlready = UsersBonus::find()->where(['lid_id' => $lid_id, 'phone' => $phone, 'tip_sale' => $tipSaleForCheck, 'tip' => 'minus'])->one() != null;
+ // TO8-22: Проверяем дубликат по ЛЮБОМУ tip_sale (sale или promobonus),
+ // чтобы повторный запрос с тем же check_id не начислил кэшбек
+ $writeOffAlready = UsersBonus::find()
+ ->where(['lid_id' => $lid_id, 'phone' => $phone, 'tip' => 'minus'])
+ ->andWhere(['in', 'tip_sale', ['sale', Promocode::TIP_SALE_PROMOBONUS]])
+ ->one() != null;
}
file_put_contents(self::OUT_DIR . '/sale_bonuses_' . $fl . '.json', PHP_EOL . '--' . __LINE__, FILE_APPEND);
+ // TO8-22: Если по этому check_id уже было списание (обычное или промо) — отклоняем повторный запрос
+ if ($writeOffAlready) {
+ return $this->asJson(["error_id" => 7, "error" => "Списание по данному чеку уже произведено"]);
+ }
+
$user_balans_new = $user_balans;
- if ($write_off_bonuses && !$writeOffAlready) {
+ if ($write_off_bonuses) {
// TO8-22: При промо-списании auth_code не требуется (списание автоматическое)
if (!$usePromoWriteOff) {
// Проверка кода только при стандартном списании
"phone" => $phone,
"code" => $result['code'],
], JSON_UNESCAPED_UNICODE));
- return $this->asJson(["error_id" => 10, "error" => "Ошибка активации промокода", "debug" => $e->getMessage()]);
+ return $this->asJson(["error_id" => 10, "error" => "Ошибка активации промокода"]);
}
}
}