import { IPlan, PlanFeatures } from "../../Models/Plans/Plans.interface"; import { IPlanSuscriptionDocument } from "./PlanSubscriptions.Adapter.Mongoose"; export type FindPlanSuscripcionsParams = { sessionUser: string; mpPreferenceId?: string; mpStatus?: string; }; export type CreatePlanSuscriptionParams = { userId: string; planId: string; mpPlanId: string; startDate: Date; endDate: Date; isActive?: boolean; autoRenew: boolean; mpPayerId?: number; mpPayerEmail?: string; mpStatus?: string; mpDateCreated?: Date; mpInitPoint?: string; mpPreferenceId?: string; billingMonths?: number; pendingPaymentInitPoint?: string; pendingPaymentPreferenceId?: string; pendingPaymentBillingMonths?: number; pendingPaymentType?: "extension" | "upgrade"; pendingPaymentPlanId?: string; pendingPaymentCurrentPlanPrice?: number; pendingPaymentRequestedPlanPrice?: number; pendingPaymentProratedAmount?: number; pendingPaymentRemainingDays?: number; pendingPaymentPeriodEndDate?: Date; lastPaymentStatus?: LastPlanPaymentStatus; lastPaymentPreferenceId?: string; lastPaymentAt?: Date; lastPaymentType?: LastPlanPaymentType; downgradedFromPlanId?: string; downgradedFromPlanName?: string; downgradedFromPlanCode?: string; downgradedAt?: Date; downgradeReason?: DowngradeReason; }; export type CancellPlanSuscriptionParams = { sessionUser: string; }; export type CreateMPPreApprovalParams = { planId: string; sessionUser: string; months: number; }; export type CheckFeatureParams = { userId: string; feature: PlanFeatures; }; export enum MP_PRE_APPROVAL_STATUS { READY_TO_START = "ready_to_start", NO_PAYER_EMAIL = "no_payer_email", } export type MPPreApprovalResponse = { init_point: string; status: MP_PRE_APPROVAL_STATUS; }; export type ToFreePlanParams = { sessionUser: string; downgradeReason?: DowngradeReason; }; export type ToMpParams = { planId: string; sessionUser: string; months: number; }; export type CheckMpStatusParams = { mpPreferenceId: string; sessionUser: string; }; export type DeletePlanSuscriptionByUserParams = { sessionUser: string; }; export type GetSubscriptionInitPointParams = { sessionUser: string; }; export type VerifyPendingPlanPaymentParams = { sessionUser: string; }; export type VerifyPendingPlanPaymentResponse = { status: "approved" | "pending" | "not_found" | "rejected" | "failed" | "cancelled"; approved: boolean; message: string; subscriptionId?: string; paymentId?: string; paymentType?: "new" | "extension" | "upgrade"; }; export type LastPlanPaymentStatus = "rejected" | "failed" | "cancelled"; export type LastPlanPaymentType = "new" | "extension" | "upgrade"; export type DowngradeReason = "expired"; export interface GetSuscriptionInitPointResponse { init_point: string; } export interface IPlanSuscription { id?: string; userId: string; // Referencia al ID del usuario planId: string; // Referencia al ID del plan suscrito mpPlanId: string; //Referencia al ultimo plan contratado por mercadopago. startDate: Date; // Fecha de inicio de la suscripción endDate: Date; // Fecha de finalización de la suscripción isActive: boolean; // Estado de la suscripción (activa o no) autoRenew: boolean; // Indica si la suscripción se renueva automáticamente paymentMethod: string; // Método de pago usado para la suscripción mpPayerId: number; // ID del pagador en MercadoPago. mpPayerEmail: string; // Email del pagador en MercadoPago. mpStatus: string; // Estado de la suscripción en MercadoPago. mpDateCreated: Date; // Fecha de creación de la suscripción en MercadoPago. mpInitPoint: string; // URL de inicio de la suscripción en MercadoPago. mpPreferenceId: string; // ID de la preferencia en MercadoPago. billingMonths?: number; // Cantidad de meses comprados para pagos únicos. pendingPaymentInitPoint?: string; // URL de pago pendiente para extender el plan actual. pendingPaymentPreferenceId?: string; // ID de preferencia pendiente para extender el plan actual. pendingPaymentBillingMonths?: number; // Meses pendientes de acreditar al aprobarse la extensión. pendingPaymentType?: "extension" | "upgrade"; pendingPaymentPlanId?: string; pendingPaymentCurrentPlanPrice?: number; pendingPaymentRequestedPlanPrice?: number; pendingPaymentProratedAmount?: number; pendingPaymentRemainingDays?: number; pendingPaymentPeriodEndDate?: Date; lastPaymentStatus?: LastPlanPaymentStatus; lastPaymentPreferenceId?: string; lastPaymentAt?: Date; lastPaymentType?: LastPlanPaymentType; downgradedFromPlanId?: string; downgradedFromPlanName?: string; downgradedFromPlanCode?: string; downgradedAt?: Date; downgradeReason?: DowngradeReason; } export interface ISubscriptionInfo { id: string; plan: IPlan; startDate: Date; endDate: Date; isActive: boolean; autoRenew: boolean; mpStatus: string; mpDateCreated: Date; pendingPaymentInitPoint?: string; pendingPaymentPreferenceId?: string; pendingPaymentType?: "extension" | "upgrade"; lastPaymentStatus?: LastPlanPaymentStatus; lastPaymentPreferenceId?: string; lastPaymentAt?: Date; lastPaymentType?: LastPlanPaymentType; downgradedFromPlanId?: string; downgradedFromPlanName?: string; downgradedFromPlanCode?: string; downgradedAt?: Date; downgradeReason?: DowngradeReason; } export interface IPlanSuscriptionsAdapter { find(filters: FindPlanSuscripcionsParams): Promise; findOne(data: FindPlanSuscripcionsParams): Promise; create(data: CreatePlanSuscriptionParams): Promise; delete(data: CancellPlanSuscriptionParams): Promise; } export interface IPlanSuscriptionsManager { planSuscriptions: IPlanSuscriptionsAdapter; create(data: CreateMPPreApprovalParams): Promise; cancell(data: CancellPlanSuscriptionParams): Promise; findOne(data: FindPlanSuscripcionsParams): Promise; getSubscriptionByUser(data: FindPlanSuscripcionsParams): Promise; checkFeature(data: CheckFeatureParams): Promise; isSubscriptionActive(data: FindPlanSuscripcionsParams): Promise; toFreePlan(data: ToFreePlanParams): Promise; toMP(data: ToMpParams): Promise; deletePlanSuscriptionByUser(data: DeletePlanSuscriptionByUserParams): Promise; getInitPoint(data: GetSubscriptionInitPointParams): Promise; }