Database Schema
Ezvento runs on PostgreSQL via Supabase with a 45-model Prisma schema spanning 1,311 lines. Every entity is scoped to a tenant, every mutation is auditable, and soft-delete patterns preserve data integrity.
Schema Overview
Tenant Isolation Pattern
Soft Delete Patterns
Complete Model Reference
All 45 Prisma models grouped by domain. Key fields include the most important columns for understanding the entity; relations list the linked models.
Tenant & Billing3
| Model | Key Fields | Relations |
|---|---|---|
Tenant | id (cuid)namesubdomain (unique)customDomain (unique)plan (TenantPlan)pangstinfssaiNumberaddressstatepincodephoneemailisFrozen (default false)frozenReasonfrozenAt | storesuserscategoriesproductscustomersvendorssettingssubscriptionsemailLogsregionswarehousessessionsroleAssignmentsapprovalRequests |
Subscription | id (cuid)tenantIdplan (TenantPlan)status (SubscriptionStatus, default ACTIVE)currentPeriodStartcurrentPeriodEnddodoCustomerIddodoSubscriptionIddodoPaymentIdrazorpayOrderIdrazorpaySubscriptionId | tenant |
TenantSettings | id (cuid)tenantId (unique)defaultLanguage (default en)currency (default INR)fiscalYearStart (default 4)lowStockAlertDays (default 7)expiryAlertDays (default 7)invoicePrefix (default INV)decimalPlaces (default 2)roundOffEnabled (default true)creditLimitMode (default SOFT)loyaltyEnabled (default true)pointsPerRupee (Decimal 8,2)rupeePerPoint (Decimal 8,2)minimumRedemption (default 100)pointsExpiryDays (default 365)emailNotificationsEnabled (default true)invoiceAutoSend (default true)lowStockEmailAlerts (default true)paymentReminderFrequency (default WEEKLY)shiftSummaryEmail (default false)invoiceHeaderinvoiceFooterinvoiceLogoUrlwhatsappApiKeywhatsappProvider | tenant |
Store & Location5
| Model | Key Fields | Relations |
|---|---|---|
Store | id (cuid)tenantIdregionIdnamecodeaddressstatepincodephonestoreType (StoreType)isActive (default true)isFrozen (default false) | tenantregionlocationsusersinventoryStockssalesInvoicespurchaseInvoicescustomerstablesshiftspaymentConfigcounters |
Location | id (cuid)storeIdwarehouseIdnametype (LocationType)isActive (default true) | storewarehouseinventoryStockssalesInvoicesshifts |
Region | id (cuid)tenantIdnamecodeisActive (default true) | tenantstores |
Warehouse | id (cuid)tenantIdnamecodeaddressstatepincodephoneisActive (default true) | tenantlocations |
Counter | id (cuid)storeIdnamecodeisActive (default true)printerConfigId | storeshiftssessions |
Users & Access Control5
| Model | Key Fields | Relations |
|---|---|---|
User | id (cuid)tenantIdemailphonepasswordHashfirstNamelastNameavatarUrlisOwner (default false)isPlatformAdmin (default false)lastPlatformAdminAtisActive (default true)emailVerified (default false)phoneVerified (default false)lastLoginAtposPinmanagerPinpermissionVersion (default 0)twoFactorEnabled (default false)twoFactorSecrettwoFactorBackupCodes (String[] default [])createdAtupdatedAt | tenantstoreAccesssalesInvoicescancelledInvoicesactivityLogsshiftCashierssessionsrevokedSessionsroleAssignmentsapprovalsRequestedapprovalsApproved |
UserStoreAccess | id (cuid)userIdstoreIdisDefault (default false) | userstore |
Session | id (cuid)userIdtenantIdjti (unique)deviceLabeldeviceFingerprintipAddressuserAgentpermissionVersion (default 0)scopeType (ScopeType)scopeIds (String[] default [])shiftIdcounterIdlastActiveAt (default now)expiresAtrevokedAtrevokedReasonrevokedById | usertenantcounterrevokedBy |
UserRoleAssignment | id (cuid)userIdtenantIdrole (SystemRole)scopeType (ScopeType)scopeIds (String[] default [])isPrimary (default false)isActive (default true)expiresAt | usertenant |
ApprovalRequest | id (cuid)tenantIdstoreIdrequesterIdpermissioncontextData (Json)status (ApprovalStatus, default PENDING)approverIdapprovedAtexpiresAtreasonapproverPinHashAtTimecreatedAt | tenantrequesterapprover |
Product Catalog5
| Model | Key Fields | Relations |
|---|---|---|
Category | id (cuid)tenantIdparentIdnamedescriptionhsnCodeimageUrldefaultGstRateisActive (default true) | tenantparentchildrenproducts |
Product | id (cuid)tenantIdcategoryIdsku (unique per tenant)barcodenamedescriptionbrandhsnCodegstRate (default 18)mrp (Decimal 12,2)costPrice (Decimal 12,2)sellingPrice (Decimal 12,2)reorderLevel (default 10)productType (ProductType, default STANDARD)hasVariants (default false)hasSerialNumber (default false)hasBatchNumber (default false)hasExpiry (default false)imageUrls (String[])isActive (default true)unit (default pcs)weight (Decimal 8,3)weightUnit | tenantcategoryvariantsinventoryStockspurchaseItemssalesItemsbomItems |
ProductVariant | id (cuid)productIdsku (unique per product)barcodenamemrp (Decimal 12,2)costPrice (Decimal 12,2)sellingPrice (Decimal 12,2)attributes (Json)imageUrls (String[])isActive (default true) | productinventoryStockspurchaseItemssalesItems |
MenuItem | id (cuid)tenantIdcategoryIdnamedescriptionprice (Decimal 10,2)imageUrlprepTimeMinutes (default 15)isBom (default false)isActive (default true)taxRate (default 0) | bomItemskotItems |
BOMItem | id (cuid)menuItemIdproductIdquantity (Decimal 8,3)unit (default pcs) | menuItemproduct |
Inventory3
| Model | Key Fields | Relations |
|---|---|---|
InventoryStock | id (cuid)productIdvariantIdstoreIdlocationIdquantity (default 0)reservedQty (default 0)lastStockUpdate (default now) | productvariantstorelocationmovements |
StockMovement | id (cuid)productIdvariantIdstoreIdlocationIdmovementType (StockMovementType)quantityreferenceTypereferenceIdreasonnotescreatedByIdcreatedAtinventoryStockId | InventoryStock |
StockAdjustment | id (cuid)productIdvariantIdstoreIdlocationIdreason (AdjustmentReason)quantityBeforequantityAfternotescreatedByIdcreatedAt | — |
Customers & Loyalty3
| Model | Key Fields | Relations |
|---|---|---|
Customer | id (cuid)tenantIdstoreIdcustomerType (CustomerType, default RETAIL)firstNamelastNamephone (unique per tenant)emailgstinaddresscitystatepincodecreditLimit (default 0, Decimal 12,2)creditBalance (default 0, Decimal 12,2)loyaltyPoints (default 0)loyaltyMultiplier (default 1.0)dateOfBirthisActive (default true) | tenantstoresalesInvoicesloyaltyPointsLogfollowUps |
LoyaltyPointsLog | id (cuid)customerIdpointsreferenceTypereferenceIdnotescreatedAt | customer |
FollowUp | id (cuid)customerIdtypenotesnextDatecreatedAt | customer |
Vendors & Purchases5
| Model | Key Fields | Relations |
|---|---|---|
Vendor | id (cuid)tenantIdnamephoneemailgstin (unique per tenant)panaddresscitystatepincodebankNamebankAccountbankIfsccreditPeriodDays (default 0)isActive (default true) | tenantpurchaseInvoices |
PurchaseOrder | id (cuid)tenantIdvendorIdstoreIdorderNumber (unique per tenant)status (PurchaseOrderStatus, default DRAFT)expectedDatenotescreatedById | items |
PurchaseOrderItem | id (cuid)purchaseOrderIdproductIdvariantIdquantityunitPrice (Decimal 12,2)gstRatereceivedQty (default 0) | purchaseOrder |
PurchaseInvoice | id (cuid)tenantIdvendorIdstoreIdinvoiceNumber (unique per tenant)purchaseOrderIdinvoiceDate (default now)dueDatesubtotal (Decimal 14,2)totalGst (Decimal 14,2)totalAmount (Decimal 14,2)amountPaid (default 0, Decimal 14,2)status (PurchaseStatus, default PENDING)notesvendorInvoicePdfUrlcreatedById | vendoritemsStore |
PurchaseInvoiceItem | id (cuid)purchaseInvoiceIdproductIdvariantIddescriptionbatchNumberexpiryDatequantityreceivedQty (default 0)unitPrice (Decimal 12,2)gstRategstAmount (Decimal 12,2)totalAmount (Decimal 14,2) | purchaseInvoiceproductvariant |
Sales & Billing6
| Model | Key Fields | Relations |
|---|---|---|
SalesInvoice | id (cuid)tenantIdstoreIdlocationIdinvoiceNumberinvoiceType (InvoiceType, default RETAIL_INVOICE)customerIdcreatedByIdinvoiceDate (default now)subtotal (Decimal 14,2)totalDiscount (default 0, Decimal 14,2)totalGst (Decimal 14,2)roundOff (default 0, Decimal 8,2)totalAmount (Decimal 14,2)amountPaid (default 0, Decimal 14,2)amountDue (default 0, Decimal 14,2)paymentStatus (PaymentStatus, default PAID)invoiceStatus (InvoiceStatus, default ACTIVE)billingType (BillingType, default CASH)gstincancelReasoncancelledAtcancelledByIdirn (unique)irnStatus (IRNStatus, default PENDING)irnAckNoirnAckDateirnSignedInvoiceirnSignedQRCodeirnErrorirnRetriedAtnotesparkingSlipNo | storelocationcustomercreatedBycancelledByitemspaymentsreturns |
SalesInvoiceItem | id (cuid)invoiceIdproductIdvariantIddescriptionhsnCodebatchNumberexpiryDateserialNumbers (String[])quantityunitPrice (Decimal 12,2)discountPercent (default 0, Decimal 5,2)discountAmount (default 0, Decimal 12,2)gstRategstAmount (Decimal 12,2)totalAmount (Decimal 14,2) | invoiceproductvariant |
Payment | id (cuid)invoiceIdamount (Decimal 14,2)method (PaymentMethod)referencecollectedByIdphonePeTransactionId (unique)phonePeMerchantTxnIdpaymentStatus (PaymentGatewayStatus, default PENDING)paymentCompletedAtcreatedAt | invoice |
SalesReturn | id (cuid)invoiceIdreturnNumberreturnDate (default now)totalAmount (Decimal 14,2)reasoncreatedByIdcreatedAt | invoiceitems |
SalesReturnItem | id (cuid)returnIdproductIdvariantIdquantityunitPrice (Decimal 12,2)amount (Decimal 14,2)reason | return |
StorePaymentConfig | id (cuid)storeId (unique)merchantVPA (default '')merchantName (default Ezvento Store)phonepeEnabled (default true)cashEnabled (default true)cardEnabled (default false)upiQrEnabled (default true)autoSendReceipt (default true) | store |
Restaurant / KOT3
| Model | Key Fields | Relations |
|---|---|---|
RestaurantTable | id (cuid)storeIdtableNumbercapacitystatus (TableStatus, default AVAILABLE) | storekotOrders |
KOT | id (cuid)tableIdstoreIdorderNumberstatus (KOTStatus, default PENDING)customerNamewaiterIdnotescreatedAt | tableitems |
KOTItem | id (cuid)kotIdmenuItemIdquantitystatus (KOTItemStatus, default PENDING)notescreatedAt | kotmenuItem |
POS & Shifts3
| Model | Key Fields | Relations |
|---|---|---|
Shift | id (cuid)storeIdcounterIdlocationIdcashierIdopeningCash (Decimal 14,2)closingCash (Decimal 14,2)expectedCash (Decimal 14,2)variance (Decimal 14,2)openingDenominations (Json)closingDenominations (Json)openedAt (default now)closedAtstatus (ShiftStatus, default OPEN) | storecounterlocationcashiercashDrawerTransactions |
CashDrawerTransaction | id (cuid)shiftIdtype (CashDrawerTxType)amount (Decimal 14,2)notesreferencecreatedAt | shift |
PrinterConfig | id (cuid)tenantIdstoreIdnametype (PrinterType)connectionType (PrinterConnection)ipAddressportpaperWidth (default 80)charactersPerLine (default 48)autoCut (default true)cashDrawer (default false)autoPrint (default false)isDefault (default false) | — |
Stock Transfers2
| Model | Key Fields | Relations |
|---|---|---|
StockTransfer | id (cuid)tenantIdfromStoreIdtoStoreIdfromLocationIdtoLocationIdstatus (StockTransferStatus, default PENDING)notescreatedByIdshippedAtreceivedAtcreatedAt | items |
StockTransferItem | id (cuid)transferIdproductIdvariantIdquantityreceivedQuantity (default 0) | transfer |
Audit & Config2
| Model | Key Fields | Relations |
|---|---|---|
ActivityLog | id (cuid)tenantIduserIdactionmoduleentityTypeentityIdmetadata (Json)ipAddressuserAgentstoreIdscopeType (ScopeType)scopeIdroleAtTime (SystemRole)approvedByIdapprovalIdseverity (LogSeverity, default INFO)oldValues (Json)newValues (Json)hashpreviousHashcreatedAt | user |
EmailLog | id (cuid)tenantIdtotemplatesubjectstatus (default PENDING)resendIderrorcreatedAt | tenant |
Relationships Summary
Enum Values
All 29 Prisma enums with their accepted values. These drive UI dropdowns, API validation, and business logic throughout the application.
| Enum | Values |
|---|---|
TenantPlan | STARTERPROENTERPRISE |
SubscriptionStatus | ACTIVEPAST_DUECANCELLEDTRIALING |
StoreType | ELECTRONICSCLOTHINGGROCERYSUPERMARKETWHOLESALERESTAURANTMULTI_CATEGORY |
LocationType | SHOWROOMWAREHOUSECOLD_STORAGEKITCHENCOUNTERRACK |
ProductType | STANDARDVARIANTBOM |
StockMovementType | OPENING_STOCKPURCHASEPURCHASE_RETURNSALESSALES_RETURNTRANSFER_INTRANSFER_OUTADJUSTMENT_INADJUSTMENT_OUTDAMAGETHEFTEXPIRY |
AdjustmentReason | DAMAGETHEFTEXPIRYFOUNDCORRECTIONSYSTEM_ADJUSTMENTSPOILAGEWASTAGE |
CustomerType | RETAILWHOLESALE |
PurchaseOrderStatus | DRAFTSENTRECEIVEDCANCELLED |
PurchaseStatus | PENDINGPAIDCANCELLED |
InvoiceType | TAX_INVOICERETAIL_INVOICEPROFORMA_INVOICEQUOTATIONCASH_MEMOCREDIT_NOTEDEBIT_NOTERESTAURANT_BILL |
PaymentStatus | PAIDDUEPARTIALOVERDUECANCELLED |
InvoiceStatus | ACTIVECANCELLED |
IRNStatus | PENDINGGENERATEDCANCELLEDFAILED |
BillingType | CASHCREDITCARDUPIMIXED |
PaymentMethod | CASHUPICARDBANK_TRANSFERCREDITMIXED |
PaymentGatewayStatus | PENDINGSUCCESSFAILEDREFUNDEDPARTIALLY_REFUNDED |
TableStatus | AVAILABLEOCCUPIEDRESERVEDBLOCKED |
KOTStatus | PENDINGIN_PROGRESSREADYSERVEDCANCELLED |
KOTItemStatus | PENDINGCOOKINGREADYSERVED |
ShiftStatus | OPENCLOSED |
CashDrawerTxType | SALE_CHANGECASH_REFUNDDENOMINATION_EXCHANGECASH_INCASH_OUT |
PrinterType | RECEIPTKITCHENLABEL |
PrinterConnection | NETWORKUSBBLUETOOTH |
StockTransferStatus | PENDINGIN_TRANSITCOMPLETEDCANCELLED |
ScopeType | ORGREGIONSTORECOUNTERWAREHOUSELOCATION |
LogSeverity | INFONOTICEWARNCRITICAL |
ApprovalStatus | PENDINGAPPROVEDREJECTEDEXPIREDUSED |
SystemRole | ORGANIZATION_OWNERREGIONAL_MANAGERSTORE_MANAGERCASHIERINVENTORY_STAFFWAREHOUSE_MANAGERACCOUNTANTAUDITOR |