Files
alrahma_sunday_school_api/apps/api/dist/modules/subscriptions/subscription.repo.js
T
2026-06-11 03:22:12 -04:00

301 lines
10 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.findByCompany = findByCompany;
exports.findById = findById;
exports.findInvoices = findInvoices;
exports.findInvoiceByAmanpay = findInvoiceByAmanpay;
exports.findInvoiceByPaypal = findInvoiceByPaypal;
exports.findInvoiceByPaypalForCompany = findInvoiceByPaypalForCompany;
exports.findInvoiceById = findInvoiceById;
exports.findOrCreateSubscription = findOrCreateSubscription;
exports.activateSubscription = activateSubscription;
exports.startTrial = startTrial;
exports.setPaymentPending = setPaymentPending;
exports.setPastDue = setPastDue;
exports.setSuspended = setSuspended;
exports.setExpired = setExpired;
exports.setCancelled = setCancelled;
exports.setCancelAtPeriodEnd = setCancelAtPeriodEnd;
exports.incrementRetryCount = incrementRetryCount;
exports.updatePlan = updatePlan;
exports.createInvoice = createInvoice;
exports.markInvoicePaid = markInvoicePaid;
exports.markInvoiceFailed = markInvoiceFailed;
exports.markInvoiceVoided = markInvoiceVoided;
exports.updateInvoicePaypal = updateInvoicePaypal;
exports.createPaymentAttempt = createPaymentAttempt;
exports.getPaymentAttempts = getPaymentAttempts;
exports.createEvent = createEvent;
exports.getEvents = getEvents;
exports.findPaymentPendingTimedOut = findPaymentPendingTimedOut;
exports.findPastDueTimedOut = findPastDueTimedOut;
exports.findSuspendedTimedOut = findSuspendedTimedOut;
exports.findTrialsEndedWithoutConversion = findTrialsEndedWithoutConversion;
exports.findSubscriptionsToExpireAtPeriodEnd = findSubscriptionsToExpireAtPeriodEnd;
const prisma_1 = require("../../lib/prisma");
// ─── Subscription queries ─────────────────────────────────────
function findByCompany(companyId) {
return prisma_1.prisma.subscription.findUnique({
where: { companyId },
include: {
invoices: { orderBy: { createdAt: 'desc' }, take: 12 },
events: { orderBy: { occurredAt: 'desc' }, take: 20 },
},
});
}
function findById(id) {
return prisma_1.prisma.subscription.findUnique({
where: { id },
include: { company: true },
});
}
function findInvoices(companyId) {
return prisma_1.prisma.subscriptionInvoice.findMany({
where: { companyId },
orderBy: { createdAt: 'desc' },
take: 50,
});
}
function findInvoiceByAmanpay(transactionId) {
return prisma_1.prisma.subscriptionInvoice.findFirst({
where: { amanpayTransactionId: transactionId },
include: { subscription: true },
});
}
function findInvoiceByPaypal(captureId) {
return prisma_1.prisma.subscriptionInvoice.findFirst({
where: { paypalCaptureId: captureId },
include: { subscription: true },
});
}
function findInvoiceByPaypalForCompany(paypalOrderId, companyId) {
return prisma_1.prisma.subscriptionInvoice.findFirstOrThrow({
where: { paypalCaptureId: paypalOrderId, companyId },
include: { subscription: true },
});
}
function findInvoiceById(id) {
return prisma_1.prisma.subscriptionInvoice.findUniqueOrThrow({
where: { id },
include: { subscription: true },
});
}
// ─── Subscription mutations ───────────────────────────────────
async function findOrCreateSubscription(companyId, plan, billingPeriod, currency) {
const existing = await prisma_1.prisma.subscription.findUnique({ where: { companyId } });
if (existing)
return existing;
return prisma_1.prisma.subscription.create({
data: { companyId, plan: plan, billingPeriod: billingPeriod, currency, status: 'PAYMENT_PENDING' },
});
}
function activateSubscription(id, periodEnd) {
return prisma_1.prisma.subscription.update({
where: { id },
data: {
status: 'ACTIVE',
currentPeriodStart: new Date(),
currentPeriodEnd: periodEnd,
paymentPendingSince: null,
paymentDueAt: null,
pastDueSince: null,
suspendedAt: null,
retryCount: 0,
},
});
}
function startTrial(companyId, plan, billingPeriod, currency, trialEndAt) {
return prisma_1.prisma.subscription.upsert({
where: { companyId },
update: {
plan: plan,
billingPeriod: billingPeriod,
currency,
status: 'TRIALING',
trialStartAt: new Date(),
trialEndAt,
trialUsed: true,
},
create: {
companyId,
plan: plan,
billingPeriod: billingPeriod,
currency,
status: 'TRIALING',
trialStartAt: new Date(),
trialEndAt,
trialUsed: true,
},
});
}
function setPaymentPending(id) {
const now = new Date();
const dueAt = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
return prisma_1.prisma.subscription.update({
where: { id },
data: {
status: 'PAYMENT_PENDING',
paymentPendingSince: now,
paymentDueAt: dueAt,
},
});
}
function setPastDue(id) {
return prisma_1.prisma.subscription.update({
where: { id },
data: {
status: 'PAST_DUE',
pastDueSince: new Date(),
},
});
}
function setSuspended(id) {
return prisma_1.prisma.subscription.update({
where: { id },
data: {
status: 'SUSPENDED',
suspendedAt: new Date(),
},
});
}
function setExpired(id) {
return prisma_1.prisma.subscription.update({
where: { id },
data: { status: 'EXPIRED', endedAt: new Date() },
});
}
function setCancelled(id, immediate) {
if (immediate) {
return prisma_1.prisma.subscription.update({
where: { id },
data: { status: 'CANCELLED', cancelledAt: new Date(), endedAt: new Date() },
});
}
return prisma_1.prisma.subscription.update({
where: { id },
data: { cancelAtPeriodEnd: true },
});
}
function setCancelAtPeriodEnd(companyId, value) {
return prisma_1.prisma.subscription.update({
where: { companyId },
data: { cancelAtPeriodEnd: value },
});
}
function incrementRetryCount(id) {
return prisma_1.prisma.subscription.update({
where: { id },
data: { retryCount: { increment: 1 } },
});
}
function updatePlan(companyId, data) {
return prisma_1.prisma.subscription.update({ where: { companyId }, data });
}
// ─── Invoice mutations ────────────────────────────────────────
function createInvoice(data) {
return prisma_1.prisma.subscriptionInvoice.create({
data: { ...data, status: 'PENDING', paymentProvider: data.paymentProvider },
});
}
function markInvoicePaid(id) {
return prisma_1.prisma.subscriptionInvoice.update({
where: { id },
data: { status: 'PAID', paidAt: new Date(), failedAt: null },
});
}
function markInvoiceFailed(id) {
return prisma_1.prisma.subscriptionInvoice.update({
where: { id },
data: { status: 'FAILED', failedAt: new Date() },
});
}
function markInvoiceVoided(id) {
return prisma_1.prisma.subscriptionInvoice.update({
where: { id },
data: { status: 'VOIDED', voidedAt: new Date() },
});
}
function updateInvoicePaypal(id, captureId) {
return prisma_1.prisma.subscriptionInvoice.update({
where: { id },
data: { status: 'PAID', paidAt: new Date(), paypalCaptureId: captureId, failedAt: null },
});
}
// ─── Payment attempts ─────────────────────────────────────────
function createPaymentAttempt(data) {
return prisma_1.prisma.paymentAttempt.create({
data: { ...data, attemptedAt: new Date() },
});
}
function getPaymentAttempts(invoiceId) {
return prisma_1.prisma.paymentAttempt.findMany({
where: { invoiceId },
orderBy: { attemptedAt: 'desc' },
});
}
// ─── Subscription events ──────────────────────────────────────
function createEvent(data) {
return prisma_1.prisma.subscriptionEvent.create({
data: {
...data,
source: data.source ?? 'system',
payload: (data.payload ?? {}),
occurredAt: new Date(),
},
});
}
function getEvents(subscriptionId) {
return prisma_1.prisma.subscriptionEvent.findMany({
where: { subscriptionId },
orderBy: { occurredAt: 'desc' },
take: 50,
});
}
// ─── Scheduled job helpers ────────────────────────────────────
function findPaymentPendingTimedOut(cutoffDate) {
return prisma_1.prisma.subscription.findMany({
where: {
status: 'PAYMENT_PENDING',
paymentPendingSince: { lte: cutoffDate },
},
include: { company: true },
});
}
function findPastDueTimedOut(cutoffDate) {
return prisma_1.prisma.subscription.findMany({
where: {
status: 'PAST_DUE',
pastDueSince: { lte: cutoffDate },
},
include: { company: true },
});
}
function findSuspendedTimedOut(cutoffDate) {
return prisma_1.prisma.subscription.findMany({
where: {
status: 'SUSPENDED',
suspendedAt: { lte: cutoffDate },
},
include: { company: true },
});
}
function findTrialsEndedWithoutConversion() {
return prisma_1.prisma.subscription.findMany({
where: {
status: 'TRIALING',
trialEndAt: { lte: new Date() },
},
include: { company: { include: { employees: { where: { role: 'OWNER' }, take: 1 } } } },
});
}
function findSubscriptionsToExpireAtPeriodEnd() {
return prisma_1.prisma.subscription.findMany({
where: {
status: 'ACTIVE',
cancelAtPeriodEnd: true,
currentPeriodEnd: { lte: new Date() },
},
include: { company: true },
});
}
//# sourceMappingURL=subscription.repo.js.map