301 lines
10 KiB
JavaScript
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
|