Add SMS templates, prepaid IRT billing, and advertising shortcode 9000590009.

Charge ceil(len/64)*400 IRT per recipient across OTP, customer, and partner SMS; seed new businesses with 500k IRT; default partner sends to the advertising line.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-09-08 16:24:15 +03:30
co-authored by Cursor
parent 4623061a4f
commit 4a1d60dbef
29 changed files with 1170 additions and 61 deletions
+25
View File
@@ -50,6 +50,7 @@ model User {
transactions Transaction[] @relation("TransactionCustomer")
userProducts UserProduct[]
userRoles UserRole[]
smsTemplatesVerified SmsTemplate[] @relation("SmsTemplateVerifier")
@@index([cellNumber], map: "idx_users_cell_number")
@@map("users")
@@ -69,6 +70,28 @@ model UserTitle {
@@map("user_titles")
}
model SmsTemplate {
id BigInt @id @default(autoincrement())
businessId BigInt @map("business_id")
name String @db.VarChar(255)
body String @db.Text
verificationStatus String @default("free") @map("verification_status") @db.VarChar(32)
isVerified Boolean @default(false) @map("is_verified")
verifiedAt DateTime? @map("verified_at") @db.Timestamptz(6)
verifiedBy BigInt? @map("verified_by")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6)
updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @db.Timestamptz(6)
business Business @relation(fields: [businessId], references: [id], onDelete: Cascade, onUpdate: NoAction)
verifier User? @relation("SmsTemplateVerifier", fields: [verifiedBy], references: [id], onDelete: SetNull, onUpdate: NoAction)
@@index([businessId], map: "idx_sms_templates_business_id")
@@index([businessId, isVerified], map: "idx_sms_templates_business_verified")
@@index([verificationStatus], map: "idx_sms_templates_verification_status")
@@index([businessId, verificationStatus], map: "idx_sms_templates_business_status")
@@index([createdAt(sort: Desc)], map: "idx_sms_templates_created_at")
@@map("sms_templates")
}
model Business {
id BigInt @id @default(autoincrement())
name String @db.VarChar(255)
@@ -89,12 +112,14 @@ model Business {
faviconMediaId BigInt? @map("favicon_media_id")
oldBusinessId BigInt? @map("old_business_id")
annualRenewalAt DateTime? @map("annual_renewal_at") @db.Timestamptz(6)
smsBalance Int @default(0) @map("sms_balance")
addresses Address[]
blogs blogs[]
brands Brand[]
categoryAssignments BusinessCategoryAssignment[]
businessCustomers BusinessCustomer[]
businessUsers BusinessUser[]
smsTemplates SmsTemplate[]
faviconMedia Media? @relation("BusinessFavicon", fields: [faviconMediaId], references: [id], onUpdate: NoAction)
logoMedia Media? @relation("BusinessLogo", fields: [logoMediaId], references: [id], onUpdate: NoAction)
logoDarkMedia Media? @relation("BusinessLogoDark", fields: [logoDarkMediaId], references: [id], onUpdate: NoAction)