"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