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, 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, pub updated_at: DateTime, } /// 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, pub subscriber_name: String, pub status: String, pub current_period_start: DateTime, pub current_period_end: DateTime, pub cancelled_at: Option>, pub cancel_reason: Option, pub metadata: Option, pub created_at: DateTime, pub updated_at: DateTime, } /// 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, pub attempt_count: i32, pub billed_at: DateTime, pub settled_at: Option>, pub failure_reason: Option, } // ─── Request / Response DTOs ───────────────────────────────────────────────── #[derive(Debug, Deserialize)] pub struct CreatePlanRequest { pub name: String, pub description: Option, pub price_inr: f64, pub interval_days: i32, pub trial_days: Option, } #[derive(Debug, Deserialize)] pub struct CreateSubscriptionRequest { pub plan_id: String, pub subscriber_email: String, pub subscriber_phone: Option, pub subscriber_name: String, pub metadata: Option, } #[derive(Debug, Deserialize)] pub struct CancelSubscriptionRequest { pub reason: Option, } #[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 }