diff --git a/apps/payments/src/ai_credits.rs b/apps/payments/src/ai_credits.rs index 78cb2e8..c267582 100644 --- a/apps/payments/src/ai_credits.rs +++ b/apps/payments/src/ai_credits.rs @@ -151,17 +151,18 @@ async fn validate_coupon( original_price: i32, ) -> Result, String> { // Get coupon details - let coupon: Option<(Uuid, String, i32, Option, i32, i32, Vec)> = sqlx::query_as( + let coupon: Option<(Uuid, String, i32, Option, i32, i32, Vec, i32)> = sqlx::query_as( r#" - SELECT - id, discount_type, + SELECT + id, discount_type, CAST(discount_value * 100 AS INTEGER) as discount_value, CAST(max_discount_amount * 100 AS INTEGER) as max_discount_amount, - max_redemptions_per_user, redemptions_used, applicable_package_ids + max_redemptions_per_user, redemptions_used, applicable_package_ids, + max_redemptions FROM ai_coupons - WHERE code = $1 - AND is_active = TRUE - AND valid_from <= NOW() + WHERE code = $1 + AND is_active = TRUE + AND valid_from <= NOW() AND (valid_until IS NULL OR valid_until > NOW()) "# ) @@ -170,12 +171,12 @@ async fn validate_coupon( .await .map_err(|e| format!("DB error: {e}"))?; - let Some((coupon_id, discount_type, discount_value, max_discount_amount, max_per_user, total_redemptions, applicable_packages)) = coupon else { + let Some((coupon_id, discount_type, discount_value, max_discount_amount, max_per_user, total_redemptions, applicable_packages, global_limit)) = coupon else { return Ok(None); // Coupon not found or invalid }; - // Check if coupon has remaining redemptions - if total_redemptions >= max_per_user { + // Check if coupon has remaining global redemptions + if total_redemptions >= global_limit { return Err("Coupon redemption limit reached".to_string()); }