@varaos/db 1.3.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Warnings:
|
|
3
|
+
|
|
4
|
+
- A unique constraint covering the columns `[razorpaySubscriptionId]` on the table `Subscription` will be added. If there are existing duplicate values, this will fail.
|
|
5
|
+
|
|
6
|
+
*/
|
|
7
|
+
-- CreateIndex
|
|
8
|
+
CREATE UNIQUE INDEX "Subscription_razorpaySubscriptionId_key" ON "public"."Subscription"("razorpaySubscriptionId");
|
package/prisma/migrations/20260125074301_2026_01_25_billing_financial_primitives/migration.sql
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Warnings:
|
|
3
|
+
|
|
4
|
+
- You are about to drop the column `processed` on the `BillingEvent` table. All the data in the column will be lost.
|
|
5
|
+
- You are about to drop the column `razorpayInvoiceId` on the `Invoice` table. All the data in the column will be lost.
|
|
6
|
+
- The `status` column on the `Job` table would be dropped and recreated. This will lead to data loss if there is data in the column.
|
|
7
|
+
- You are about to drop the column `razorpayCustomerId` on the `Subscription` table. All the data in the column will be lost.
|
|
8
|
+
- You are about to drop the column `razorpayPlanId` on the `Subscription` table. All the data in the column will be lost.
|
|
9
|
+
- You are about to drop the column `razorpaySubscriptionId` on the `Subscription` table. All the data in the column will be lost.
|
|
10
|
+
- A unique constraint covering the columns `[provider,eventId]` on the table `BillingEvent` will be added. If there are existing duplicate values, this will fail.
|
|
11
|
+
- A unique constraint covering the columns `[provider,providerInvoiceId]` on the table `Invoice` will be added. If there are existing duplicate values, this will fail.
|
|
12
|
+
- A unique constraint covering the columns `[provider,providerPaymentMethodId]` on the table `PaymentMethod` will be added. If there are existing duplicate values, this will fail.
|
|
13
|
+
- A unique constraint covering the columns `[providerSubscriptionId]` on the table `Subscription` will be added. If there are existing duplicate values, this will fail.
|
|
14
|
+
- Changed the type of `provider` on the `BillingEvent` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required.
|
|
15
|
+
- Added the required column `billingCustomerId` to the `Invoice` table without a default value. This is not possible if the table is not empty.
|
|
16
|
+
- Added the required column `provider` to the `Invoice` table without a default value. This is not possible if the table is not empty.
|
|
17
|
+
- Added the required column `providerInvoiceId` to the `Invoice` table without a default value. This is not possible if the table is not empty.
|
|
18
|
+
- Changed the type of `status` on the `Invoice` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required.
|
|
19
|
+
- Added the required column `billingCustomerId` to the `PaymentMethod` table without a default value. This is not possible if the table is not empty.
|
|
20
|
+
- Added the required column `providerPaymentMethodId` to the `PaymentMethod` table without a default value. This is not possible if the table is not empty.
|
|
21
|
+
- Changed the type of `provider` on the `PaymentMethod` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required.
|
|
22
|
+
- Changed the type of `type` on the `PaymentMethod` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required.
|
|
23
|
+
- Added the required column `billingCustomerId` to the `Subscription` table without a default value. This is not possible if the table is not empty.
|
|
24
|
+
- Added the required column `provider` to the `Subscription` table without a default value. This is not possible if the table is not empty.
|
|
25
|
+
- Added the required column `providerSubscriptionId` to the `Subscription` table without a default value. This is not possible if the table is not empty.
|
|
26
|
+
|
|
27
|
+
*/
|
|
28
|
+
-- CreateEnum
|
|
29
|
+
CREATE TYPE "public"."BillingProvider" AS ENUM ('razorpay', 'stripe', 'juspay');
|
|
30
|
+
|
|
31
|
+
-- CreateEnum
|
|
32
|
+
CREATE TYPE "public"."SubscriptionEventType" AS ENUM ('created', 'activated', 'trial_started', 'trial_ended', 'charged', 'payment_failed', 'payment_recovered', 'paused', 'resumed', 'plan_changed', 'quantity_changed', 'canceled', 'completed', 'expired', 'refunded');
|
|
33
|
+
|
|
34
|
+
-- CreateEnum
|
|
35
|
+
CREATE TYPE "public"."InvoiceStatus" AS ENUM ('draft', 'open', 'paid', 'partially_paid', 'failed', 'void', 'refunded');
|
|
36
|
+
|
|
37
|
+
-- CreateEnum
|
|
38
|
+
CREATE TYPE "public"."PaymentMethodType" AS ENUM ('card', 'upi', 'bank', 'wallet');
|
|
39
|
+
|
|
40
|
+
-- CreateEnum
|
|
41
|
+
CREATE TYPE "public"."PaymentMethodStatus" AS ENUM ('active', 'inactive', 'expired', 'revoked');
|
|
42
|
+
|
|
43
|
+
-- CreateEnum
|
|
44
|
+
CREATE TYPE "public"."BillingEventStatus" AS ENUM ('received', 'processing', 'processed', 'failed');
|
|
45
|
+
|
|
46
|
+
-- CreateEnum
|
|
47
|
+
CREATE TYPE "public"."BillingLedgerEntryType" AS ENUM ('charge', 'refund', 'credit', 'debit', 'adjustment');
|
|
48
|
+
|
|
49
|
+
-- CreateEnum
|
|
50
|
+
CREATE TYPE "public"."BillingLedgerDirection" AS ENUM ('debit', 'credit');
|
|
51
|
+
|
|
52
|
+
-- CreateEnum
|
|
53
|
+
CREATE TYPE "public"."JobStatus" AS ENUM ('pending', 'scheduled', 'running', 'completed', 'failed', 'dead');
|
|
54
|
+
|
|
55
|
+
-- CreateEnum
|
|
56
|
+
CREATE TYPE "public"."CouponDiscountType" AS ENUM ('percentage', 'flat');
|
|
57
|
+
|
|
58
|
+
-- CreateEnum
|
|
59
|
+
CREATE TYPE "public"."CouponRedemptionScope" AS ENUM ('subscription', 'invoice', 'one_time');
|
|
60
|
+
|
|
61
|
+
-- DropIndex
|
|
62
|
+
DROP INDEX "public"."BillingEvent_eventId_key";
|
|
63
|
+
|
|
64
|
+
-- DropIndex
|
|
65
|
+
DROP INDEX "public"."Subscription_razorpayCustomerId_idx";
|
|
66
|
+
|
|
67
|
+
-- DropIndex
|
|
68
|
+
DROP INDEX "public"."Subscription_razorpaySubscriptionId_idx";
|
|
69
|
+
|
|
70
|
+
-- DropIndex
|
|
71
|
+
DROP INDEX "public"."Subscription_razorpaySubscriptionId_key";
|
|
72
|
+
|
|
73
|
+
-- AlterTable
|
|
74
|
+
ALTER TABLE "public"."BillingEvent" DROP COLUMN "processed",
|
|
75
|
+
ADD COLUMN "status" "public"."BillingEventStatus" NOT NULL DEFAULT 'received',
|
|
76
|
+
DROP COLUMN "provider",
|
|
77
|
+
ADD COLUMN "provider" "public"."BillingProvider" NOT NULL;
|
|
78
|
+
|
|
79
|
+
-- AlterTable
|
|
80
|
+
ALTER TABLE "public"."Invoice" DROP COLUMN "razorpayInvoiceId",
|
|
81
|
+
ADD COLUMN "billingCustomerId" TEXT NOT NULL,
|
|
82
|
+
ADD COLUMN "hostedInvoiceUrl" TEXT,
|
|
83
|
+
ADD COLUMN "provider" "public"."BillingProvider" NOT NULL,
|
|
84
|
+
ADD COLUMN "providerInvoiceId" TEXT NOT NULL,
|
|
85
|
+
DROP COLUMN "status",
|
|
86
|
+
ADD COLUMN "status" "public"."InvoiceStatus" NOT NULL,
|
|
87
|
+
ALTER COLUMN "periodStart" DROP NOT NULL,
|
|
88
|
+
ALTER COLUMN "periodEnd" DROP NOT NULL;
|
|
89
|
+
|
|
90
|
+
-- AlterTable
|
|
91
|
+
ALTER TABLE "public"."Job" DROP COLUMN "status",
|
|
92
|
+
ADD COLUMN "status" "public"."JobStatus" NOT NULL DEFAULT 'pending';
|
|
93
|
+
|
|
94
|
+
-- AlterTable
|
|
95
|
+
ALTER TABLE "public"."PaymentMethod" ADD COLUMN "billingCustomerId" TEXT NOT NULL,
|
|
96
|
+
ADD COLUMN "providerPaymentMethodId" TEXT NOT NULL,
|
|
97
|
+
ADD COLUMN "status" "public"."PaymentMethodStatus" NOT NULL DEFAULT 'active',
|
|
98
|
+
DROP COLUMN "provider",
|
|
99
|
+
ADD COLUMN "provider" "public"."BillingProvider" NOT NULL,
|
|
100
|
+
DROP COLUMN "type",
|
|
101
|
+
ADD COLUMN "type" "public"."PaymentMethodType" NOT NULL,
|
|
102
|
+
ALTER COLUMN "isDefault" SET DEFAULT false;
|
|
103
|
+
|
|
104
|
+
-- AlterTable
|
|
105
|
+
ALTER TABLE "public"."Subscription" DROP COLUMN "razorpayCustomerId",
|
|
106
|
+
DROP COLUMN "razorpayPlanId",
|
|
107
|
+
DROP COLUMN "razorpaySubscriptionId",
|
|
108
|
+
ADD COLUMN "billingCustomerId" TEXT NOT NULL,
|
|
109
|
+
ADD COLUMN "provider" "public"."BillingProvider" NOT NULL,
|
|
110
|
+
ADD COLUMN "providerPlanId" TEXT,
|
|
111
|
+
ADD COLUMN "providerSubscriptionId" TEXT NOT NULL;
|
|
112
|
+
|
|
113
|
+
-- CreateTable
|
|
114
|
+
CREATE TABLE "public"."BillingCustomer" (
|
|
115
|
+
"id" TEXT NOT NULL,
|
|
116
|
+
"userId" TEXT NOT NULL,
|
|
117
|
+
"provider" "public"."BillingProvider" NOT NULL,
|
|
118
|
+
"providerCustomerId" TEXT NOT NULL,
|
|
119
|
+
"email" TEXT,
|
|
120
|
+
"metadata" JSONB,
|
|
121
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
122
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
123
|
+
|
|
124
|
+
CONSTRAINT "BillingCustomer_pkey" PRIMARY KEY ("id")
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
-- CreateTable
|
|
128
|
+
CREATE TABLE "public"."SubscriptionEvent" (
|
|
129
|
+
"id" TEXT NOT NULL,
|
|
130
|
+
"subscriptionId" TEXT NOT NULL,
|
|
131
|
+
"provider" "public"."BillingProvider" NOT NULL,
|
|
132
|
+
"eventType" "public"."SubscriptionEventType" NOT NULL,
|
|
133
|
+
"payload" JSONB NOT NULL,
|
|
134
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
135
|
+
|
|
136
|
+
CONSTRAINT "SubscriptionEvent_pkey" PRIMARY KEY ("id")
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
-- CreateTable
|
|
140
|
+
CREATE TABLE "public"."BillingLedger" (
|
|
141
|
+
"id" TEXT NOT NULL,
|
|
142
|
+
"userId" TEXT NOT NULL,
|
|
143
|
+
"billingCustomerId" TEXT NOT NULL,
|
|
144
|
+
"provider" "public"."BillingProvider" NOT NULL,
|
|
145
|
+
"entryType" "public"."BillingLedgerEntryType" NOT NULL,
|
|
146
|
+
"direction" "public"."BillingLedgerDirection" NOT NULL,
|
|
147
|
+
"amount" INTEGER NOT NULL,
|
|
148
|
+
"currency" TEXT NOT NULL,
|
|
149
|
+
"referenceType" TEXT NOT NULL,
|
|
150
|
+
"referenceId" TEXT NOT NULL,
|
|
151
|
+
"description" TEXT,
|
|
152
|
+
"metadata" JSONB,
|
|
153
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
154
|
+
|
|
155
|
+
CONSTRAINT "BillingLedger_pkey" PRIMARY KEY ("id")
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
-- CreateTable
|
|
159
|
+
CREATE TABLE "public"."Coupon" (
|
|
160
|
+
"id" TEXT NOT NULL,
|
|
161
|
+
"code" TEXT NOT NULL,
|
|
162
|
+
"discountType" "public"."CouponDiscountType" NOT NULL,
|
|
163
|
+
"discountValue" INTEGER NOT NULL,
|
|
164
|
+
"currency" TEXT,
|
|
165
|
+
"maxRedemptions" INTEGER,
|
|
166
|
+
"redeemedCount" INTEGER NOT NULL DEFAULT 0,
|
|
167
|
+
"validFrom" TIMESTAMP(3),
|
|
168
|
+
"validUntil" TIMESTAMP(3),
|
|
169
|
+
"applicablePlans" "public"."Plan"[],
|
|
170
|
+
"redemptionScope" "public"."CouponRedemptionScope" NOT NULL,
|
|
171
|
+
"active" BOOLEAN NOT NULL DEFAULT true,
|
|
172
|
+
"metadata" JSONB,
|
|
173
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
174
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
175
|
+
|
|
176
|
+
CONSTRAINT "Coupon_pkey" PRIMARY KEY ("id")
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
-- CreateTable
|
|
180
|
+
CREATE TABLE "public"."RevenueAggregate" (
|
|
181
|
+
"id" TEXT NOT NULL,
|
|
182
|
+
"period" TEXT NOT NULL,
|
|
183
|
+
"provider" "public"."BillingProvider" NOT NULL,
|
|
184
|
+
"grossRevenue" INTEGER NOT NULL,
|
|
185
|
+
"refunds" INTEGER NOT NULL,
|
|
186
|
+
"credits" INTEGER NOT NULL,
|
|
187
|
+
"netRevenue" INTEGER NOT NULL,
|
|
188
|
+
"currency" TEXT NOT NULL,
|
|
189
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
190
|
+
|
|
191
|
+
CONSTRAINT "RevenueAggregate_pkey" PRIMARY KEY ("id")
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
-- CreateIndex
|
|
195
|
+
CREATE INDEX "BillingCustomer_providerCustomerId_idx" ON "public"."BillingCustomer"("providerCustomerId");
|
|
196
|
+
|
|
197
|
+
-- CreateIndex
|
|
198
|
+
CREATE UNIQUE INDEX "BillingCustomer_provider_providerCustomerId_key" ON "public"."BillingCustomer"("provider", "providerCustomerId");
|
|
199
|
+
|
|
200
|
+
-- CreateIndex
|
|
201
|
+
CREATE UNIQUE INDEX "BillingCustomer_userId_provider_key" ON "public"."BillingCustomer"("userId", "provider");
|
|
202
|
+
|
|
203
|
+
-- CreateIndex
|
|
204
|
+
CREATE INDEX "SubscriptionEvent_subscriptionId_createdAt_idx" ON "public"."SubscriptionEvent"("subscriptionId", "createdAt");
|
|
205
|
+
|
|
206
|
+
-- CreateIndex
|
|
207
|
+
CREATE INDEX "BillingLedger_userId_createdAt_idx" ON "public"."BillingLedger"("userId", "createdAt");
|
|
208
|
+
|
|
209
|
+
-- CreateIndex
|
|
210
|
+
CREATE INDEX "BillingLedger_billingCustomerId_createdAt_idx" ON "public"."BillingLedger"("billingCustomerId", "createdAt");
|
|
211
|
+
|
|
212
|
+
-- CreateIndex
|
|
213
|
+
CREATE INDEX "BillingLedger_provider_createdAt_idx" ON "public"."BillingLedger"("provider", "createdAt");
|
|
214
|
+
|
|
215
|
+
-- CreateIndex
|
|
216
|
+
CREATE UNIQUE INDEX "Coupon_code_key" ON "public"."Coupon"("code");
|
|
217
|
+
|
|
218
|
+
-- CreateIndex
|
|
219
|
+
CREATE INDEX "RevenueAggregate_period_idx" ON "public"."RevenueAggregate"("period");
|
|
220
|
+
|
|
221
|
+
-- CreateIndex
|
|
222
|
+
CREATE UNIQUE INDEX "RevenueAggregate_period_provider_currency_key" ON "public"."RevenueAggregate"("period", "provider", "currency");
|
|
223
|
+
|
|
224
|
+
-- CreateIndex
|
|
225
|
+
CREATE INDEX "BillingEvent_provider_eventType_idx" ON "public"."BillingEvent"("provider", "eventType");
|
|
226
|
+
|
|
227
|
+
-- CreateIndex
|
|
228
|
+
CREATE UNIQUE INDEX "BillingEvent_provider_eventId_key" ON "public"."BillingEvent"("provider", "eventId");
|
|
229
|
+
|
|
230
|
+
-- CreateIndex
|
|
231
|
+
CREATE INDEX "Invoice_billingCustomerId_idx" ON "public"."Invoice"("billingCustomerId");
|
|
232
|
+
|
|
233
|
+
-- CreateIndex
|
|
234
|
+
CREATE UNIQUE INDEX "Invoice_provider_providerInvoiceId_key" ON "public"."Invoice"("provider", "providerInvoiceId");
|
|
235
|
+
|
|
236
|
+
-- CreateIndex
|
|
237
|
+
CREATE INDEX "PaymentMethod_billingCustomerId_idx" ON "public"."PaymentMethod"("billingCustomerId");
|
|
238
|
+
|
|
239
|
+
-- CreateIndex
|
|
240
|
+
CREATE UNIQUE INDEX "PaymentMethod_provider_providerPaymentMethodId_key" ON "public"."PaymentMethod"("provider", "providerPaymentMethodId");
|
|
241
|
+
|
|
242
|
+
-- CreateIndex
|
|
243
|
+
CREATE UNIQUE INDEX "Subscription_providerSubscriptionId_key" ON "public"."Subscription"("providerSubscriptionId");
|
|
244
|
+
|
|
245
|
+
-- CreateIndex
|
|
246
|
+
CREATE INDEX "Subscription_provider_providerSubscriptionId_idx" ON "public"."Subscription"("provider", "providerSubscriptionId");
|
|
247
|
+
|
|
248
|
+
-- CreateIndex
|
|
249
|
+
CREATE INDEX "Subscription_billingCustomerId_idx" ON "public"."Subscription"("billingCustomerId");
|
|
250
|
+
|
|
251
|
+
-- AddForeignKey
|
|
252
|
+
ALTER TABLE "public"."Subscription" ADD CONSTRAINT "Subscription_billingCustomerId_fkey" FOREIGN KEY ("billingCustomerId") REFERENCES "public"."BillingCustomer"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
253
|
+
|
|
254
|
+
-- AddForeignKey
|
|
255
|
+
ALTER TABLE "public"."Invoice" ADD CONSTRAINT "Invoice_subscriptionId_fkey" FOREIGN KEY ("subscriptionId") REFERENCES "public"."Subscription"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
256
|
+
|
|
257
|
+
-- AddForeignKey
|
|
258
|
+
ALTER TABLE "public"."Invoice" ADD CONSTRAINT "Invoice_billingCustomerId_fkey" FOREIGN KEY ("billingCustomerId") REFERENCES "public"."BillingCustomer"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
259
|
+
|
|
260
|
+
-- AddForeignKey
|
|
261
|
+
ALTER TABLE "public"."PaymentMethod" ADD CONSTRAINT "PaymentMethod_billingCustomerId_fkey" FOREIGN KEY ("billingCustomerId") REFERENCES "public"."BillingCustomer"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
262
|
+
|
|
263
|
+
-- AddForeignKey
|
|
264
|
+
ALTER TABLE "public"."BillingCustomer" ADD CONSTRAINT "BillingCustomer_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
265
|
+
|
|
266
|
+
-- AddForeignKey
|
|
267
|
+
ALTER TABLE "public"."SubscriptionEvent" ADD CONSTRAINT "SubscriptionEvent_subscriptionId_fkey" FOREIGN KEY ("subscriptionId") REFERENCES "public"."Subscription"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
268
|
+
|
|
269
|
+
-- AddForeignKey
|
|
270
|
+
ALTER TABLE "public"."BillingLedger" ADD CONSTRAINT "BillingLedger_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
271
|
+
|
|
272
|
+
-- AddForeignKey
|
|
273
|
+
ALTER TABLE "public"."BillingLedger" ADD CONSTRAINT "BillingLedger_billingCustomerId_fkey" FOREIGN KEY ("billingCustomerId") REFERENCES "public"."BillingCustomer"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
package/prisma/schema.prisma
CHANGED
|
@@ -119,7 +119,98 @@ enum WorkflowStepRunStatus {
|
|
|
119
119
|
skipped
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
enum BillingProvider {
|
|
123
|
+
razorpay
|
|
124
|
+
stripe
|
|
125
|
+
juspay
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
enum SubscriptionEventType {
|
|
129
|
+
created // Subscription object created (before activation)
|
|
130
|
+
activated // First successful activation
|
|
131
|
+
trial_started // Trial period started
|
|
132
|
+
trial_ended // Trial expired or converted
|
|
133
|
+
|
|
134
|
+
charged // Successful recurring or first charge
|
|
135
|
+
payment_failed // Charge attempt failed
|
|
136
|
+
payment_recovered // Previously failed payment later succeeded
|
|
137
|
+
|
|
138
|
+
paused // Subscription paused (manual or system)
|
|
139
|
+
resumed // Subscription resumed after pause
|
|
140
|
+
|
|
141
|
+
plan_changed // Upgrade / downgrade
|
|
142
|
+
quantity_changed // Seats / units changed (enterprise)
|
|
143
|
+
|
|
144
|
+
canceled // User or system initiated cancellation
|
|
145
|
+
completed // Subscription ran its full course
|
|
146
|
+
expired // Ended due to non-payment / mandate expiry
|
|
147
|
+
|
|
148
|
+
refunded // Full or partial refund issued
|
|
149
|
+
}
|
|
122
150
|
|
|
151
|
+
enum InvoiceStatus {
|
|
152
|
+
draft
|
|
153
|
+
open
|
|
154
|
+
paid
|
|
155
|
+
partially_paid
|
|
156
|
+
failed
|
|
157
|
+
void
|
|
158
|
+
refunded
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
enum PaymentMethodType {
|
|
162
|
+
card
|
|
163
|
+
upi
|
|
164
|
+
bank
|
|
165
|
+
wallet
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
enum PaymentMethodStatus {
|
|
169
|
+
active
|
|
170
|
+
inactive
|
|
171
|
+
expired
|
|
172
|
+
revoked
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
enum BillingEventStatus {
|
|
176
|
+
received
|
|
177
|
+
processing
|
|
178
|
+
processed
|
|
179
|
+
failed
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
enum BillingLedgerEntryType {
|
|
183
|
+
charge
|
|
184
|
+
refund
|
|
185
|
+
credit
|
|
186
|
+
debit
|
|
187
|
+
adjustment
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
enum BillingLedgerDirection {
|
|
191
|
+
debit
|
|
192
|
+
credit
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
enum JobStatus {
|
|
196
|
+
pending
|
|
197
|
+
scheduled
|
|
198
|
+
running
|
|
199
|
+
completed
|
|
200
|
+
failed
|
|
201
|
+
dead
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
enum CouponDiscountType {
|
|
205
|
+
percentage
|
|
206
|
+
flat
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
enum CouponRedemptionScope {
|
|
210
|
+
subscription
|
|
211
|
+
invoice
|
|
212
|
+
one_time
|
|
213
|
+
}
|
|
123
214
|
|
|
124
215
|
/// ─────────────────────────────────────────────
|
|
125
216
|
/// USERS & AUTH
|
|
@@ -148,9 +239,9 @@ model User {
|
|
|
148
239
|
|
|
149
240
|
metadata Json?
|
|
150
241
|
deletedAt DateTime?
|
|
151
|
-
plan Plan
|
|
152
|
-
tokenBalance Int
|
|
153
|
-
creditsUsed Int
|
|
242
|
+
plan Plan @default(free)
|
|
243
|
+
tokenBalance Int @default(0)
|
|
244
|
+
creditsUsed Int @default(0)
|
|
154
245
|
|
|
155
246
|
chatCount Int @default(0)
|
|
156
247
|
workflowCount Int @default(0)
|
|
@@ -178,14 +269,16 @@ model User {
|
|
|
178
269
|
Onboarding Onboarding?
|
|
179
270
|
ChatSession ChatSession[]
|
|
180
271
|
|
|
181
|
-
createdAt
|
|
182
|
-
updatedAt
|
|
183
|
-
posts
|
|
184
|
-
userSessions
|
|
185
|
-
paymentMethods
|
|
186
|
-
userEmails
|
|
187
|
-
invoices
|
|
188
|
-
userFiles
|
|
272
|
+
createdAt DateTime @default(now())
|
|
273
|
+
updatedAt DateTime @updatedAt
|
|
274
|
+
posts Post[]
|
|
275
|
+
userSessions UserSession[]
|
|
276
|
+
paymentMethods PaymentMethod[]
|
|
277
|
+
userEmails UserEmail[]
|
|
278
|
+
invoices Invoice[]
|
|
279
|
+
userFiles UserFile[]
|
|
280
|
+
billingCustomers BillingCustomer[]
|
|
281
|
+
billingLedgers BillingLedger[]
|
|
189
282
|
|
|
190
283
|
@@index([status])
|
|
191
284
|
}
|
|
@@ -482,7 +575,7 @@ model Workflow {
|
|
|
482
575
|
}
|
|
483
576
|
|
|
484
577
|
model WorkflowStep {
|
|
485
|
-
id String
|
|
578
|
+
id String @id @default(uuid())
|
|
486
579
|
workflowId String
|
|
487
580
|
type String
|
|
488
581
|
config Json
|
|
@@ -514,10 +607,10 @@ model WorkflowRun {
|
|
|
514
607
|
}
|
|
515
608
|
|
|
516
609
|
model WorkflowStepRun {
|
|
517
|
-
id String
|
|
610
|
+
id String @id @default(uuid())
|
|
518
611
|
workflowRunId String
|
|
519
612
|
workflowStepId String
|
|
520
|
-
status WorkflowStepRunStatus
|
|
613
|
+
status WorkflowStepRunStatus @default(pending)
|
|
521
614
|
input Json?
|
|
522
615
|
output Json?
|
|
523
616
|
error String?
|
|
@@ -727,85 +820,232 @@ model SecurityEvent {
|
|
|
727
820
|
/// ─────────────────────────────────────────────
|
|
728
821
|
|
|
729
822
|
model Subscription {
|
|
730
|
-
id
|
|
823
|
+
id String @id @default(uuid())
|
|
824
|
+
|
|
731
825
|
userId String
|
|
732
826
|
plan Plan
|
|
733
|
-
status SubscriptionStatus
|
|
827
|
+
status SubscriptionStatus
|
|
828
|
+
|
|
829
|
+
provider BillingProvider // razorpay | stripe | juspay
|
|
830
|
+
providerSubscriptionId String @unique
|
|
831
|
+
providerPlanId String?
|
|
832
|
+
|
|
833
|
+
billingCustomerId String
|
|
734
834
|
|
|
735
|
-
//
|
|
835
|
+
// Lifecycle
|
|
736
836
|
startedAt DateTime
|
|
737
837
|
endedAt DateTime?
|
|
738
838
|
|
|
739
|
-
//
|
|
839
|
+
// Billing cycle
|
|
740
840
|
currentPeriodStart DateTime?
|
|
741
841
|
currentPeriodEnd DateTime?
|
|
742
|
-
|
|
743
|
-
// ── Provider scheduling (informational only)
|
|
744
|
-
nextPayment DateTime?
|
|
745
|
-
|
|
746
|
-
razorpayCustomerId String?
|
|
747
|
-
razorpaySubscriptionId String?
|
|
748
|
-
razorpayPlanId String?
|
|
842
|
+
nextPayment DateTime?
|
|
749
843
|
|
|
750
844
|
metadata Json?
|
|
751
845
|
|
|
752
|
-
user
|
|
846
|
+
user User @relation(fields: [userId], references: [id])
|
|
847
|
+
billingCustomer BillingCustomer @relation(fields: [billingCustomerId], references: [id])
|
|
848
|
+
invoices Invoice[]
|
|
849
|
+
subscriptionEvents SubscriptionEvent[]
|
|
753
850
|
|
|
754
|
-
@@index([
|
|
755
|
-
@@index([
|
|
851
|
+
@@index([provider, providerSubscriptionId])
|
|
852
|
+
@@index([billingCustomerId])
|
|
756
853
|
}
|
|
757
854
|
|
|
758
855
|
model Invoice {
|
|
759
|
-
id
|
|
856
|
+
id String @id @default(uuid())
|
|
857
|
+
|
|
760
858
|
userId String
|
|
761
859
|
subscriptionId String?
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
860
|
+
billingCustomerId String
|
|
861
|
+
|
|
862
|
+
provider BillingProvider // razorpay | stripe | juspay
|
|
863
|
+
providerInvoiceId String
|
|
864
|
+
|
|
865
|
+
amount Int
|
|
866
|
+
currency String
|
|
867
|
+
status InvoiceStatus
|
|
868
|
+
|
|
869
|
+
periodStart DateTime?
|
|
870
|
+
periodEnd DateTime?
|
|
871
|
+
|
|
872
|
+
hostedInvoiceUrl String?
|
|
873
|
+
pdfUrl String?
|
|
874
|
+
|
|
875
|
+
metadata Json?
|
|
770
876
|
|
|
771
877
|
createdAt DateTime @default(now())
|
|
772
878
|
|
|
773
|
-
user
|
|
879
|
+
user User @relation(fields: [userId], references: [id])
|
|
880
|
+
subscription Subscription? @relation(fields: [subscriptionId], references: [id])
|
|
881
|
+
billingCustomer BillingCustomer @relation(fields: [billingCustomerId], references: [id])
|
|
882
|
+
|
|
883
|
+
@@unique([provider, providerInvoiceId])
|
|
884
|
+
@@index([billingCustomerId])
|
|
774
885
|
}
|
|
775
886
|
|
|
776
887
|
model BillingEvent {
|
|
777
|
-
id
|
|
778
|
-
provider String // razorpay
|
|
888
|
+
id String @id @default(uuid())
|
|
779
889
|
|
|
890
|
+
provider BillingProvider // razorpay | stripe | juspay
|
|
780
891
|
eventType String
|
|
781
|
-
eventId String
|
|
892
|
+
eventId String
|
|
782
893
|
|
|
783
|
-
payload
|
|
784
|
-
|
|
894
|
+
payload Json
|
|
895
|
+
|
|
896
|
+
status BillingEventStatus @default(received)
|
|
785
897
|
processedAt DateTime?
|
|
786
898
|
error String?
|
|
787
899
|
|
|
788
900
|
createdAt DateTime @default(now())
|
|
789
901
|
|
|
902
|
+
@@unique([provider, eventId])
|
|
790
903
|
@@index([provider, eventType])
|
|
791
904
|
}
|
|
792
905
|
|
|
793
906
|
model PaymentMethod {
|
|
794
|
-
id
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
907
|
+
id String @id @default(uuid())
|
|
908
|
+
|
|
909
|
+
userId String
|
|
910
|
+
billingCustomerId String
|
|
911
|
+
|
|
912
|
+
provider BillingProvider // razorpay | stripe | juspay
|
|
913
|
+
providerPaymentMethodId String // token_xxx, pm_xxx
|
|
914
|
+
|
|
915
|
+
type PaymentMethodType // card | upi | bank
|
|
916
|
+
brand String?
|
|
917
|
+
last4 String?
|
|
918
|
+
expMonth Int?
|
|
919
|
+
expYear Int?
|
|
920
|
+
|
|
921
|
+
isDefault Boolean @default(false)
|
|
922
|
+
status PaymentMethodStatus @default(active)
|
|
923
|
+
|
|
924
|
+
metadata Json?
|
|
804
925
|
|
|
805
926
|
createdAt DateTime @default(now())
|
|
806
927
|
updatedAt DateTime @updatedAt
|
|
807
928
|
|
|
808
|
-
user
|
|
929
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
930
|
+
billingCustomer BillingCustomer @relation(fields: [billingCustomerId], references: [id])
|
|
931
|
+
|
|
932
|
+
@@unique([provider, providerPaymentMethodId])
|
|
933
|
+
@@index([billingCustomerId])
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
model BillingCustomer {
|
|
937
|
+
id String @id @default(uuid())
|
|
938
|
+
|
|
939
|
+
userId String
|
|
940
|
+
provider BillingProvider // razorpay | stripe | juspay
|
|
941
|
+
providerCustomerId String // cust_xxx, cus_xxx
|
|
942
|
+
|
|
943
|
+
email String?
|
|
944
|
+
metadata Json?
|
|
945
|
+
|
|
946
|
+
createdAt DateTime @default(now())
|
|
947
|
+
updatedAt DateTime @updatedAt
|
|
948
|
+
|
|
949
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
950
|
+
subscriptions Subscription[]
|
|
951
|
+
invoices Invoice[]
|
|
952
|
+
paymentMethods PaymentMethod[]
|
|
953
|
+
billingLedgers BillingLedger[]
|
|
954
|
+
|
|
955
|
+
@@unique([provider, providerCustomerId])
|
|
956
|
+
@@unique([userId, provider])
|
|
957
|
+
@@index([providerCustomerId])
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
model SubscriptionEvent {
|
|
961
|
+
id String @id @default(uuid())
|
|
962
|
+
|
|
963
|
+
subscriptionId String
|
|
964
|
+
provider BillingProvider
|
|
965
|
+
eventType SubscriptionEventType
|
|
966
|
+
payload Json
|
|
967
|
+
|
|
968
|
+
createdAt DateTime @default(now())
|
|
969
|
+
|
|
970
|
+
subscription Subscription @relation(fields: [subscriptionId], references: [id])
|
|
971
|
+
|
|
972
|
+
@@index([subscriptionId, createdAt])
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
model BillingLedger {
|
|
976
|
+
id String @id @default(uuid())
|
|
977
|
+
|
|
978
|
+
userId String
|
|
979
|
+
billingCustomerId String
|
|
980
|
+
|
|
981
|
+
provider BillingProvider
|
|
982
|
+
|
|
983
|
+
entryType BillingLedgerEntryType // charge | refund | credit | debit | adjustment
|
|
984
|
+
direction BillingLedgerDirection // debit | credit
|
|
985
|
+
|
|
986
|
+
amount Int
|
|
987
|
+
currency String
|
|
988
|
+
|
|
989
|
+
referenceType String // invoice | subscription | payment | coupon | reward
|
|
990
|
+
referenceId String
|
|
991
|
+
|
|
992
|
+
description String?
|
|
993
|
+
metadata Json?
|
|
994
|
+
|
|
995
|
+
createdAt DateTime @default(now())
|
|
996
|
+
|
|
997
|
+
user User @relation(fields: [userId], references: [id])
|
|
998
|
+
billingCustomer BillingCustomer @relation(fields: [billingCustomerId], references: [id])
|
|
999
|
+
|
|
1000
|
+
@@index([userId, createdAt])
|
|
1001
|
+
@@index([billingCustomerId, createdAt])
|
|
1002
|
+
@@index([provider, createdAt])
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
model Coupon {
|
|
1006
|
+
id String @id @default(uuid())
|
|
1007
|
+
|
|
1008
|
+
code String @unique
|
|
1009
|
+
|
|
1010
|
+
discountType CouponDiscountType
|
|
1011
|
+
discountValue Int // % or flat amount (minor units)
|
|
1012
|
+
|
|
1013
|
+
currency String? // required for flat discounts
|
|
1014
|
+
|
|
1015
|
+
maxRedemptions Int?
|
|
1016
|
+
redeemedCount Int @default(0)
|
|
1017
|
+
|
|
1018
|
+
validFrom DateTime?
|
|
1019
|
+
validUntil DateTime?
|
|
1020
|
+
|
|
1021
|
+
applicablePlans Plan[]
|
|
1022
|
+
redemptionScope CouponRedemptionScope
|
|
1023
|
+
|
|
1024
|
+
active Boolean @default(true)
|
|
1025
|
+
|
|
1026
|
+
metadata Json?
|
|
1027
|
+
|
|
1028
|
+
createdAt DateTime @default(now())
|
|
1029
|
+
updatedAt DateTime @updatedAt
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
model RevenueAggregate {
|
|
1033
|
+
id String @id @default(uuid())
|
|
1034
|
+
|
|
1035
|
+
period String // YYYY-MM (e.g. 2026-02)
|
|
1036
|
+
provider BillingProvider
|
|
1037
|
+
|
|
1038
|
+
grossRevenue Int
|
|
1039
|
+
refunds Int
|
|
1040
|
+
credits Int
|
|
1041
|
+
netRevenue Int
|
|
1042
|
+
|
|
1043
|
+
currency String
|
|
1044
|
+
|
|
1045
|
+
updatedAt DateTime @updatedAt
|
|
1046
|
+
|
|
1047
|
+
@@unique([period, provider, currency])
|
|
1048
|
+
@@index([period])
|
|
809
1049
|
}
|
|
810
1050
|
|
|
811
1051
|
model WaitList {
|
|
@@ -827,7 +1067,7 @@ model WaitList {
|
|
|
827
1067
|
model Job {
|
|
828
1068
|
id String @id @default(uuid())
|
|
829
1069
|
type String
|
|
830
|
-
status
|
|
1070
|
+
status JobStatus @default(pending)
|
|
831
1071
|
payload Json
|
|
832
1072
|
retries Int @default(0)
|
|
833
1073
|
maxRetries Int @default(3)
|