@saasicat/spec 1.0.0-rc.25 → 1.0.0-rc.26
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/admin-api.openapi.yaml +339 -1
- package/package.json +1 -1
- package/prisma-fragments/08-subscription-contract.prisma +2 -0
- package/prisma-fragments/13-subscriber.prisma +1 -0
- package/prisma-fragments/15-subscriber-ledger.prisma +1 -0
- package/prisma-fragments/20-subscription-invoice.prisma +145 -0
- package/prisma-fragments/21-feature-withdrawal.prisma +56 -0
- package/prisma-fragments/22-subscription-invoice-archive.prisma +34 -0
- package/prisma-fragments/README.md +24 -21
- package/schemas/admin-manifest.schema.json +2 -1
- package/schemas/plan-catalog.schema.json +32 -1
- package/schemas/subscriber-ledger.schema.json +3 -2
- package/sql/1.0-a-correction-carries-its-order.postgres.sql +27 -4
- package/sql/1.0-a-feature-is-withdrawn.postgres.sql +49 -0
- package/sql/1.0-an-invoice-document-is-archived.postgres.sql +123 -0
- package/sql/1.0-an-invoice-is-issued.postgres.sql +171 -0
- package/sql/constraints.postgres.sql +7 -0
- package/sql/reference-schema.postgres.sql +159 -0
|
@@ -22,6 +22,9 @@
|
|
|
22
22
|
-- prisma-fragments/17-subscription-notice.prisma
|
|
23
23
|
-- prisma-fragments/18-version-retirement.prisma
|
|
24
24
|
-- prisma-fragments/19-bundle-version-retirement.prisma
|
|
25
|
+
-- prisma-fragments/20-subscription-invoice.prisma
|
|
26
|
+
-- prisma-fragments/21-feature-withdrawal.prisma
|
|
27
|
+
-- prisma-fragments/22-subscription-invoice-archive.prisma
|
|
25
28
|
-- plus the normative constraints from sql/constraints.postgres.sql.
|
|
26
29
|
-- Do not edit by hand — change the fragments/constraints and regenerate.
|
|
27
30
|
|
|
@@ -804,6 +807,107 @@ CREATE TABLE "bundle_version_retirements" (
|
|
|
804
807
|
CONSTRAINT "bundle_version_retirements_pkey" PRIMARY KEY ("id")
|
|
805
808
|
);
|
|
806
809
|
|
|
810
|
+
-- CreateTable
|
|
811
|
+
CREATE TABLE "subscription_invoices" (
|
|
812
|
+
"id" TEXT NOT NULL,
|
|
813
|
+
"number" TEXT NOT NULL,
|
|
814
|
+
"numberPrefix" TEXT NOT NULL,
|
|
815
|
+
"numberYear" INTEGER NOT NULL,
|
|
816
|
+
"numberSequence" INTEGER NOT NULL,
|
|
817
|
+
"tenantId" TEXT NOT NULL,
|
|
818
|
+
"subscriberId" TEXT NOT NULL,
|
|
819
|
+
"subscriptionId" TEXT NOT NULL,
|
|
820
|
+
"contractId" TEXT NOT NULL,
|
|
821
|
+
"issuedAt" TIMESTAMP(3) NOT NULL,
|
|
822
|
+
"issueDate" DATE NOT NULL,
|
|
823
|
+
"dueDate" DATE NOT NULL,
|
|
824
|
+
"servicePeriodFrom" DATE NOT NULL,
|
|
825
|
+
"servicePeriodUntil" DATE NOT NULL,
|
|
826
|
+
"currency" TEXT NOT NULL,
|
|
827
|
+
"issuerParty" JSONB NOT NULL,
|
|
828
|
+
"subscriberParty" JSONB NOT NULL,
|
|
829
|
+
"footer" JSONB NOT NULL DEFAULT '[]',
|
|
830
|
+
"taxTreatment" JSONB NOT NULL,
|
|
831
|
+
"taxes" JSONB NOT NULL,
|
|
832
|
+
"totalNet" DECIMAL(12,2) NOT NULL,
|
|
833
|
+
"totalTax" DECIMAL(12,2) NOT NULL,
|
|
834
|
+
"totalGross" DECIMAL(12,2) NOT NULL,
|
|
835
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
836
|
+
|
|
837
|
+
CONSTRAINT "subscription_invoices_pkey" PRIMARY KEY ("id")
|
|
838
|
+
);
|
|
839
|
+
|
|
840
|
+
-- CreateTable
|
|
841
|
+
CREATE TABLE "subscription_invoice_lines" (
|
|
842
|
+
"id" TEXT NOT NULL,
|
|
843
|
+
"invoiceId" TEXT NOT NULL,
|
|
844
|
+
"position" INTEGER NOT NULL,
|
|
845
|
+
"chargeId" TEXT NOT NULL,
|
|
846
|
+
"contractLineItemId" TEXT NOT NULL,
|
|
847
|
+
"title" TEXT NOT NULL,
|
|
848
|
+
"origin" TEXT NOT NULL,
|
|
849
|
+
"source" TEXT NOT NULL,
|
|
850
|
+
"periodFrom" DATE NOT NULL,
|
|
851
|
+
"periodUntil" DATE NOT NULL,
|
|
852
|
+
"amountNet" DECIMAL(10,2) NOT NULL,
|
|
853
|
+
"taxRate" DECIMAL(5,2) NOT NULL,
|
|
854
|
+
|
|
855
|
+
CONSTRAINT "subscription_invoice_lines_pkey" PRIMARY KEY ("id")
|
|
856
|
+
);
|
|
857
|
+
|
|
858
|
+
-- CreateTable
|
|
859
|
+
CREATE TABLE "subscription_invoice_documents" (
|
|
860
|
+
"invoiceId" TEXT NOT NULL,
|
|
861
|
+
"checksum" TEXT NOT NULL,
|
|
862
|
+
"mediaType" TEXT NOT NULL,
|
|
863
|
+
"fileName" TEXT NOT NULL,
|
|
864
|
+
"size" INTEGER NOT NULL,
|
|
865
|
+
"renderedAt" TIMESTAMP(3) NOT NULL,
|
|
866
|
+
"archivedAt" TIMESTAMP(3),
|
|
867
|
+
"deliveryClaimedAt" TIMESTAMP(3),
|
|
868
|
+
"deliveredAt" TIMESTAMP(3),
|
|
869
|
+
"deliveredTo" TEXT,
|
|
870
|
+
|
|
871
|
+
CONSTRAINT "subscription_invoice_documents_pkey" PRIMARY KEY ("invoiceId")
|
|
872
|
+
);
|
|
873
|
+
|
|
874
|
+
-- CreateTable
|
|
875
|
+
CREATE TABLE "subscription_invoice_numbers" (
|
|
876
|
+
"year" INTEGER NOT NULL,
|
|
877
|
+
"last" INTEGER NOT NULL,
|
|
878
|
+
|
|
879
|
+
CONSTRAINT "subscription_invoice_numbers_pkey" PRIMARY KEY ("year")
|
|
880
|
+
);
|
|
881
|
+
|
|
882
|
+
-- CreateTable
|
|
883
|
+
CREATE TABLE "feature_withdrawals" (
|
|
884
|
+
"id" TEXT NOT NULL,
|
|
885
|
+
"featureKey" TEXT NOT NULL,
|
|
886
|
+
"reason" TEXT NOT NULL,
|
|
887
|
+
"effectiveFrom" TIMESTAMP(3) NOT NULL,
|
|
888
|
+
"liftedFrom" TIMESTAMP(3),
|
|
889
|
+
"reductions" JSONB NOT NULL DEFAULT '[]',
|
|
890
|
+
"announcedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
891
|
+
"announcedBy" TEXT NOT NULL,
|
|
892
|
+
"liftedAt" TIMESTAMP(3),
|
|
893
|
+
"liftedBy" TEXT,
|
|
894
|
+
"toldAt" TIMESTAMP(3),
|
|
895
|
+
|
|
896
|
+
CONSTRAINT "feature_withdrawals_pkey" PRIMARY KEY ("id")
|
|
897
|
+
);
|
|
898
|
+
|
|
899
|
+
-- CreateTable
|
|
900
|
+
CREATE TABLE "subscription_invoice_archive" (
|
|
901
|
+
"invoiceId" TEXT NOT NULL,
|
|
902
|
+
"checksum" TEXT NOT NULL,
|
|
903
|
+
"mediaType" TEXT NOT NULL,
|
|
904
|
+
"fileName" TEXT NOT NULL,
|
|
905
|
+
"content" BYTEA NOT NULL,
|
|
906
|
+
"archivedAt" TIMESTAMP(3) NOT NULL,
|
|
907
|
+
|
|
908
|
+
CONSTRAINT "subscription_invoice_archive_pkey" PRIMARY KEY ("invoiceId")
|
|
909
|
+
);
|
|
910
|
+
|
|
807
911
|
-- CreateIndex
|
|
808
912
|
CREATE UNIQUE INDEX "subscriptions_tenantId_key" ON "subscriptions"("tenantId");
|
|
809
913
|
|
|
@@ -1068,6 +1172,33 @@ CREATE INDEX "version_retirements_retiredPlanVersionId_idx" ON "version_retireme
|
|
|
1068
1172
|
-- CreateIndex
|
|
1069
1173
|
CREATE INDEX "bundle_version_retirements_retiredBundleVersionId_idx" ON "bundle_version_retirements"("retiredBundleVersionId");
|
|
1070
1174
|
|
|
1175
|
+
-- CreateIndex
|
|
1176
|
+
CREATE UNIQUE INDEX "subscription_invoices_number_key" ON "subscription_invoices"("number");
|
|
1177
|
+
|
|
1178
|
+
-- CreateIndex
|
|
1179
|
+
CREATE INDEX "subscription_invoices_subscriberId_issuedAt_idx" ON "subscription_invoices"("subscriberId", "issuedAt");
|
|
1180
|
+
|
|
1181
|
+
-- CreateIndex
|
|
1182
|
+
CREATE INDEX "subscription_invoices_subscriptionId_idx" ON "subscription_invoices"("subscriptionId");
|
|
1183
|
+
|
|
1184
|
+
-- CreateIndex
|
|
1185
|
+
CREATE UNIQUE INDEX "subscription_invoices_numberYear_numberSequence_key" ON "subscription_invoices"("numberYear", "numberSequence");
|
|
1186
|
+
|
|
1187
|
+
-- CreateIndex
|
|
1188
|
+
CREATE UNIQUE INDEX "subscription_invoice_lines_chargeId_key" ON "subscription_invoice_lines"("chargeId");
|
|
1189
|
+
|
|
1190
|
+
-- CreateIndex
|
|
1191
|
+
CREATE INDEX "subscription_invoice_lines_contractLineItemId_idx" ON "subscription_invoice_lines"("contractLineItemId");
|
|
1192
|
+
|
|
1193
|
+
-- CreateIndex
|
|
1194
|
+
CREATE UNIQUE INDEX "subscription_invoice_lines_invoiceId_position_key" ON "subscription_invoice_lines"("invoiceId", "position");
|
|
1195
|
+
|
|
1196
|
+
-- CreateIndex
|
|
1197
|
+
CREATE INDEX "subscription_invoice_documents_archivedAt_idx" ON "subscription_invoice_documents"("archivedAt");
|
|
1198
|
+
|
|
1199
|
+
-- CreateIndex
|
|
1200
|
+
CREATE INDEX "feature_withdrawals_featureKey_idx" ON "feature_withdrawals"("featureKey");
|
|
1201
|
+
|
|
1071
1202
|
-- AddForeignKey
|
|
1072
1203
|
ALTER TABLE "subscriptions" ADD CONSTRAINT "subscriptions_planVersionId_fkey" FOREIGN KEY ("planVersionId") REFERENCES "plan_versions"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
1073
1204
|
|
|
@@ -1137,6 +1268,27 @@ ALTER TABLE "subscriber_ledger_entries" ADD CONSTRAINT "subscriber_ledger_entrie
|
|
|
1137
1268
|
-- AddForeignKey
|
|
1138
1269
|
ALTER TABLE "subscriber_ledger_entries" ADD CONSTRAINT "subscriber_ledger_entries_contractLineItemId_fkey" FOREIGN KEY ("contractLineItemId") REFERENCES "contract_line_items"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
1139
1270
|
|
|
1271
|
+
-- AddForeignKey
|
|
1272
|
+
ALTER TABLE "subscription_invoices" ADD CONSTRAINT "subscription_invoices_subscriberId_fkey" FOREIGN KEY ("subscriberId") REFERENCES "subscribers"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
1273
|
+
|
|
1274
|
+
-- AddForeignKey
|
|
1275
|
+
ALTER TABLE "subscription_invoices" ADD CONSTRAINT "subscription_invoices_contractId_fkey" FOREIGN KEY ("contractId") REFERENCES "subscription_contracts"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
1276
|
+
|
|
1277
|
+
-- AddForeignKey
|
|
1278
|
+
ALTER TABLE "subscription_invoice_lines" ADD CONSTRAINT "subscription_invoice_lines_invoiceId_fkey" FOREIGN KEY ("invoiceId") REFERENCES "subscription_invoices"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
1279
|
+
|
|
1280
|
+
-- AddForeignKey
|
|
1281
|
+
ALTER TABLE "subscription_invoice_lines" ADD CONSTRAINT "subscription_invoice_lines_chargeId_fkey" FOREIGN KEY ("chargeId") REFERENCES "subscriber_ledger_entries"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
1282
|
+
|
|
1283
|
+
-- AddForeignKey
|
|
1284
|
+
ALTER TABLE "subscription_invoice_lines" ADD CONSTRAINT "subscription_invoice_lines_contractLineItemId_fkey" FOREIGN KEY ("contractLineItemId") REFERENCES "contract_line_items"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
1285
|
+
|
|
1286
|
+
-- AddForeignKey
|
|
1287
|
+
ALTER TABLE "subscription_invoice_documents" ADD CONSTRAINT "subscription_invoice_documents_invoiceId_fkey" FOREIGN KEY ("invoiceId") REFERENCES "subscription_invoices"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
1288
|
+
|
|
1289
|
+
-- AddForeignKey
|
|
1290
|
+
ALTER TABLE "subscription_invoice_archive" ADD CONSTRAINT "subscription_invoice_archive_invoiceId_fkey" FOREIGN KEY ("invoiceId") REFERENCES "subscription_invoices"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
1291
|
+
|
|
1140
1292
|
-- =============================================================================
|
|
1141
1293
|
-- SaaSiCat — normative PostgreSQL constraints the Prisma DSL cannot express.
|
|
1142
1294
|
-- =============================================================================
|
|
@@ -1205,6 +1357,13 @@ ALTER TABLE subscription_bundles
|
|
|
1205
1357
|
CREATE UNIQUE INDEX IF NOT EXISTS maintenance_windows_one_open
|
|
1206
1358
|
ON maintenance_windows ((true)) WHERE "endedAt" IS NULL;
|
|
1207
1359
|
|
|
1360
|
+
-- At most ONE withdrawal of a feature is not lifted. A lifted one keeps its row
|
|
1361
|
+
-- with `liftedFrom` set and leaves the index, so the feature can be withdrawn
|
|
1362
|
+
-- again from that date. Two operators announcing at the same moment therefore
|
|
1363
|
+
-- land one withdrawal, because the second insert meets the first.
|
|
1364
|
+
CREATE UNIQUE INDEX IF NOT EXISTS feature_withdrawals_one_open_per_feature
|
|
1365
|
+
ON feature_withdrawals ("featureKey") WHERE "liftedFrom" IS NULL;
|
|
1366
|
+
|
|
1208
1367
|
-- A subscriber is live for at most ONE tenant, and a tenant has at most ONE
|
|
1209
1368
|
-- live subscriber. A link that ended keeps its row with `unlinkedAt` set, so the
|
|
1210
1369
|
-- tenants a subscriber had before stay in its history. Two partial unique
|