RTIX / src /domain /models /subscription.rs
github-actions
deploy: clean backend production release
7856e60
Raw
History Blame Contribute Delete
2.69 kB
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
/// A recurring billing plan defined by a merchant.
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)]
pub struct SubscriptionPlan {
pub id: String,
pub merchant_id: String,
pub name: String,
pub description: Option<String>,
pub price_inr: f64,
/// Billing cycle length in days (30 = monthly, 365 = annual).
pub interval_days: i32,
pub trial_days: i32,
pub is_active: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
/// A single subscriber enrolled in a merchant's plan.
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)]
pub struct Subscription {
pub id: String,
pub merchant_id: String,
pub plan_id: String,
pub subscriber_email: String,
pub subscriber_phone: Option<String>,
pub subscriber_name: String,
pub status: String,
pub current_period_start: DateTime<Utc>,
pub current_period_end: DateTime<Utc>,
pub cancelled_at: Option<DateTime<Utc>>,
pub cancel_reason: Option<String>,
pub metadata: Option<serde_json::Value>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
/// A billing attempt record for a subscription cycle.
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)]
pub struct SubscriptionBillingEvent {
pub id: String,
pub subscription_id: String,
pub merchant_id: String,
pub amount_inr: f64,
pub status: String,
pub transaction_id: Option<String>,
pub attempt_count: i32,
pub billed_at: DateTime<Utc>,
pub settled_at: Option<DateTime<Utc>>,
pub failure_reason: Option<String>,
}
// ─── Request / Response DTOs ─────────────────────────────────────────────────
#[derive(Debug, Deserialize)]
pub struct CreatePlanRequest {
pub name: String,
pub description: Option<String>,
pub price_inr: f64,
pub interval_days: i32,
pub trial_days: Option<i32>,
}
#[derive(Debug, Deserialize)]
pub struct CreateSubscriptionRequest {
pub plan_id: String,
pub subscriber_email: String,
pub subscriber_phone: Option<String>,
pub subscriber_name: String,
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Deserialize)]
pub struct CancelSubscriptionRequest {
pub reason: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct SubscriptionSummary {
pub active_count: i64,
pub trial_count: i64,
pub cancelled_count: i64,
pub past_due_count: i64,
pub mrr_inr: f64, // Monthly Recurring Revenue
pub arr_inr: f64, // Annual Run Rate
}