@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.
@@ -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