add subscription upgrade plan
Build & Push / Pipeline Tests (push) Failing after 2m0s
Build & Push / Build & Push Docker Image (push) Has been skipped
Test / Type Check (all packages) (push) Successful in 53s
Test / API Unit Tests (push) Successful in 1m8s
Test / Homepage Unit Tests (push) Successful in 48s
Test / Carplace Unit Tests (push) Successful in 42s
Test / Admin Unit Tests (push) Successful in 41s
Test / Dashboard Unit Tests (push) Successful in 43s
Test / API Integration Tests (push) Failing after 1m7s

This commit is contained in:
root
2026-08-10 23:23:58 -04:00
parent 5f06256271
commit 7b8f81336a
15 changed files with 1957 additions and 104 deletions
+145
View File
@@ -45,6 +45,28 @@ enum SubscriptionStatus {
UNPAID
}
enum SubscriptionUpgradeRequestType {
IMMEDIATE_PRORATED
AT_RENEWAL
TERM_RESET
}
enum SubscriptionUpgradeRequestStatus {
DRAFT
QUOTED
PAYMENT_PENDING
PAYMENT_REVIEW
CORRECTION_REQUIRED
APPROVED
ACTIVATED
SCHEDULED
REJECTED
EXPIRED
CANCELLED
ACTIVATION_FAILED
SUPERSEDED
}
enum InvoiceStatus {
PENDING
PAID
@@ -618,6 +640,8 @@ model Company {
subscriptionPaymentRef String?
subscription Subscription?
subscriptionUpgradeRequests SubscriptionUpgradeRequest[]
subscriptionPlanHistory SubscriptionPlanHistory[]
billingAccounts BillingAccount[]
billingInvoices BillingInvoice[]
brand BrandSettings?
@@ -692,6 +716,8 @@ model Subscription {
billingInvoices BillingInvoice[]
collectionsCases CollectionsCase[]
events SubscriptionEvent[]
upgradeRequests SubscriptionUpgradeRequest[]
planHistory SubscriptionPlanHistory[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@ -853,6 +879,7 @@ model BillingInvoice {
subscriptionId String?
subscription Subscription? @relation(fields: [subscriptionId], references: [id])
legacySubscriptionInvoice SubscriptionInvoice?
subscriptionUpgradeRequest SubscriptionUpgradeRequest?
invoiceNumber String? @unique
invoiceSequence Int? @unique
invoiceType BillingInvoiceType
@@ -907,6 +934,122 @@ model BillingInvoice {
@@map("billing_invoices")
}
model SubscriptionUpgradeRequest {
id String @id @default(cuid())
companyId String
company Company @relation(fields: [companyId], references: [id], onDelete: Cascade)
subscriptionId String
subscription Subscription @relation(fields: [subscriptionId], references: [id], onDelete: Cascade)
requestType SubscriptionUpgradeRequestType
fromPlan Plan
fromBillingPeriod BillingPeriod
toPlan Plan
toBillingPeriod BillingPeriod
status SubscriptionUpgradeRequestStatus @default(DRAFT)
requestedByEmployeeId String
requestedByEmployee Employee @relation("SubscriptionUpgradeRequester", fields: [requestedByEmployeeId], references: [id])
requestedAt DateTime @default(now())
effectiveAt DateTime?
scheduledFor DateTime?
quoteId String? @unique
quote SubscriptionUpgradeQuote? @relation("ActiveSubscriptionUpgradeQuote", fields: [quoteId], references: [id])
quotes SubscriptionUpgradeQuote[] @relation("SubscriptionUpgradeQuotes")
companyLanguageSnapshot String @default("en")
billingTimezoneSnapshot String @default("Africa/Casablanca")
acceptedTermsVersion String?
acceptedAt DateTime?
cancelledAt DateTime?
cancelledByEmployeeId String?
cancellationReason String?
expiresAt DateTime?
billingInvoiceId String? @unique
billingInvoice BillingInvoice? @relation(fields: [billingInvoiceId], references: [id])
approvedPaymentAttemptId String?
approvedByAdminId String?
approvedByAdmin AdminUser? @relation("SubscriptionUpgradeApprover", fields: [approvedByAdminId], references: [id], onDelete: SetNull)
approvedAt DateTime?
activationKey String? @unique
activatedAt DateTime?
rejectionReason String?
correctionReason String?
version Int @default(1)
metadata Json @default("{}")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([companyId, status])
@@index([subscriptionId, status])
@@index([expiresAt])
@@index([scheduledFor])
@@map("subscription_upgrade_requests")
}
model SubscriptionUpgradeQuote {
id String @id @default(cuid())
upgradeRequestId String
upgradeRequest SubscriptionUpgradeRequest @relation("SubscriptionUpgradeQuotes", fields: [upgradeRequestId], references: [id], onDelete: Cascade)
activeForUpgradeRequest SubscriptionUpgradeRequest? @relation("ActiveSubscriptionUpgradeQuote")
currency String @default("MAD")
currentEligibleNetTermPrice Int
targetNetTermPrice Int
termStart DateTime
renewalDate DateTime
pricingEffectiveAt DateTime
termDays Int
remainingDays Int
prorationNumerator Int
prorationDenominator Int
currentCredit Int
targetRemainingValue Int
discountAmount Int @default(0)
taxAmount Int @default(0)
feeAmount Int @default(0)
subtotalAmount Int
totalAmount Int
calculationVersion String
inputSnapshot Json @default("{}")
integrityHash String
expiresAt DateTime
expiredAt DateTime?
createdAt DateTime @default(now())
@@index([upgradeRequestId])
@@index([expiresAt])
@@map("subscription_upgrade_quotes")
}
model SubscriptionPlanHistory {
id String @id @default(cuid())
subscriptionId String
subscription Subscription @relation(fields: [subscriptionId], references: [id], onDelete: Cascade)
companyId String
company Company @relation(fields: [companyId], references: [id], onDelete: Cascade)
previousPlan Plan
previousBillingPeriod BillingPeriod
newPlan Plan
newBillingPeriod BillingPeriod
changeType String
sourceUpgradeRequestId String?
approvedPaymentAttemptId String?
effectiveAt DateTime
previousTermStart DateTime?
previousTermEnd DateTime?
newTermStart DateTime?
newTermEnd DateTime?
actorType String
actorId String?
approvingAdminId String?
entitlementSnapshot Json @default("{}")
auditCorrelationId String
createdAt DateTime @default(now())
@@unique([sourceUpgradeRequestId])
@@index([subscriptionId])
@@index([companyId])
@@index([changeType])
@@map("subscription_plan_history")
}
model BillingInvoiceLineItem {
id String @id @default(cuid())
invoiceId String
@@ -1365,6 +1508,7 @@ model Employee {
billingContacts BillingContact[]
manualPaymentSubmissions ManualPaymentSubmission[]
manualPaymentDocuments ManualPaymentDocument[]
subscriptionUpgradeRequests SubscriptionUpgradeRequest[] @relation("SubscriptionUpgradeRequester")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@ -2290,6 +2434,7 @@ model AdminUser {
ownedBillingAccounts BillingAccount[] @relation("BillingAccountCollectionsOwner")
confirmedManualPayments BillingPaymentAttempt[] @relation("ManualPaymentConfirmingAdmin")
reviewedManualSubmissions ManualPaymentSubmission[] @relation("ManualPaymentReviewingAdmin")
approvedSubscriptionUpgrades SubscriptionUpgradeRequest[] @relation("SubscriptionUpgradeApprover")
ownedCollectionsCases CollectionsCase[] @relation("CollectionsCaseOwner")
assignedCollectionsTasks CollectionsCallTask[] @relation("CollectionsTaskAssignee")
completedCollectionsTasks CollectionsCallTask[] @relation("CollectionsTaskCompleter")