procbay-schema 1.0.166 → 1.0.169
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/package.json +1 -1
- package/prisma/migrations/20260515094455_created_approval_management_table_for_approval_flow/migration.sql +55 -0
- package/prisma/schema.prisma +106 -103
- package/src/create-prisma-client.js +66 -12
- package/src/generated/prisma/client.bundle.mjs +9 -1
- package/src/generated/prisma/enums.ts +5 -1
- package/src/generated/prisma/internal/class.ts +1 -1
- package/src/prisma/query_engine_bg.js +2 -0
- package/src/prisma/query_engine_bg.wasm +0 -0
- package/src/prisma/runtime/wasm-compiler-edge.js +85 -0
- package/src/prisma/runtime/wasm-engine-edge.js +38 -0
- package/src/prisma/wasm-edge-light-loader.mjs +5 -0
- package/src/prisma/wasm-worker-loader.mjs +5 -0
|
@@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = {
|
|
|
20
20
|
"clientVersion": "7.8.0",
|
|
21
21
|
"engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a",
|
|
22
22
|
"activeProvider": "postgresql",
|
|
23
|
-
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n moduleFormat = \"esm\"\n generatedFileExtension = \"ts\"\n importFileExtension = \"ts\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n//---------------------------------- SERIAL NUMBER CONFIGURATION MODEL START ------------------------------------------------\nmodel SerialNumberConfiguration {\n id Int @id @default(autoincrement())\n module String? @unique\n alias String?\n initial_number Int?\n current_number Int?\n created_at DateTime? @default(now())\n\n @@index([module])\n @@map(\"serial_number_configurations\")\n}\n\n//---------------------------------- SERIALNUMBERCONFIGURATION MODEL END ------------------------------------------------\n\n//---------------------------------- USER MODEL START ------------------------------------------------\n\nenum StatusEnum {\n Active\n InActive\n Blocked\n Suspended\n PENDING_FOR_APPROVAL\n REJECTED_FOR_APPROVAL\n}\n\nenum EnvironmentEnum {\n PRODUCTION\n SANDBOX\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n unique_id String? @unique\n name String?\n first_name String?\n middle_name String?\n last_name String?\n email_id String? @unique\n password String?\n country_code String?\n mobile_number String? @unique\n status StatusEnum @default(InActive)\n reject_reason String?\n is_email_verified Boolean @default(false)\n is_mobile_verified Boolean @default(false)\n profile_picture String?\n invitation_status Boolean @default(false)\n reset_token String?\n reset_token_expiry DateTime? @db.Timestamptz(6)\n access_token_expiry String?\n token_version Int? @default(0) // This will be used to invalidate old refresh tokens\n is_logged_in Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n user_environment EnvironmentEnum @default(PRODUCTION)\n contract_role String?\n user_roles UserRole[]\n user_department_entities UserDepartmentEntity[]\n approval_hierarchy ApprovalHierarchy[]\n approval_journey ApprovalJourney[]\n approval_journey_original ApprovalJourney[] @relation(\"OriginalApprover\")\n approval_level_escalation ApprovalLevelEscalation[]\n approval_delegations_as_approver ApprovalDelegation[] @relation(\"DelegatingApprover\")\n approval_delegations_as_delegate ApprovalDelegation[] @relation(\"DelegateUser\")\n approval_delegation_delegates ApprovalDelegationDelegate[] @relation(\"DelegationDelegate\")\n ticket_replies TicketReply[] @relation(\"user_reply\")\n ticket_assignment_by TicketAssignment[] @relation(\"user_assigned_by\")\n ticket_assignment_to TicketAssignment[] @relation(\"user_assigned_to\")\n ticket_assignment_by_user TicketHistory[] @relation(\"user_assigned_by\")\n ticket_assignment_to_user TicketHistory[] @relation(\"user_assigned_to\")\n admin_alerts AdminAlert[]\n purchase_intake PurchaseIntake[]\n approval_level_user ApprovalLevelUser[]\n approval_level_escalation_user ApprovalLevelEscalationUser[]\n purchase_intake_deleted_by PurchaseIntake[] @relation(\"purchase_intake_deleted_by\")\n template Template[]\n event Event[]\n form_master FormMaster[]\n dynamic_form DynamicForm[]\n purchase_order PurchaseOrder[]\n purchase_order_activity_log PurchaseOrderActivityLog[]\n user_socket_tokens UserVendorSocketTokens[]\n activity_logs ActivityLog[]\n contact_us ContactUs[]\n upload_logs UploadLog[]\n export_logs ExportLog[]\n department_head Department[] @relation(\"department_head\")\n budget_manager Department[] @relation(\"budget_manager\")\n vendor_reference VendorReference[]\n catalogue_cart CatalogueCart[]\n send_back_approvers SendBack[] @relation(\"send_back_approver\")\n send_back_requestors SendBack[] @relation(\"send_back_requestor\")\n user_login_activities UserLoginActivity[]\n event_rfi_form_logs EventRfiFormLog[]\n conversations_as_admin Conversation[] @relation(\"ConversationAdminUser\")\n conversation_participants ConversationParticipant[] @relation(\"ConversationParticipantUser\")\n messages_sent Message[] @relation(\"MessageSenderUser\")\n message_recipients MessageRecipient[] @relation(\"MessageRecipientUser\")\n blanket_po BlanketPurchaseOrder[]\n purchase_intake_initiated_by PurchaseIntake[] @relation(\"purchase_intake_initiated_by\")\n approval_management ApprovalManagement[]\n\n @@map(\"users\")\n}\n\n//---------------------------------- USER MODEL END ------------------------------------------------\n\n//---------------------------------- ROLE MODEL START ------------------------------------------------\nmodel Role {\n id Int @id @default(autoincrement())\n role_name String?\n slug String @unique\n description String?\n is_active Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n user_roles UserRole[]\n role_permission RolePermission[]\n approval_hierarchy ApprovalHierarchy[]\n\n @@map(\"roles\")\n}\n\n//---------------------------------- ROLE MODEL END ------------------------------------------------\n\n//---------------------------------- USER ROLE MODEL START ------------------------------------------------\nmodel UserRole {\n id Int @id @default(autoincrement())\n user_id Int\n role_id Int\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n user User @relation(fields: [user_id], references: [id], onDelete: Cascade)\n role Role @relation(fields: [role_id], references: [id], onDelete: Cascade)\n\n @@map(\"user_roles\")\n}\n\n//---------------------------------- USER ROLE MODEL END ------------------------------------------------\n\n//---------------------------------- PERMISSION MODEL START ------------------------------------------------\nmodel Permission {\n id Int @id @default(autoincrement())\n permissions_name String?\n slug String @unique\n description String?\n model String?\n is_active Boolean @default(false)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n role_permission RolePermission[]\n\n @@map(\"permissions\")\n}\n\n//---------------------------------- PERMISSION MODEL END ------------------------------------------------\n\n//---------------------------------- ROLE PERMISSION MODEL START ------------------------------------------------\nmodel RolePermission {\n id Int @id @default(autoincrement())\n permission_id Int\n role_id Int\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n permission Permission @relation(fields: [permission_id], references: [id], onDelete: Cascade)\n role Role @relation(fields: [role_id], references: [id], onDelete: Cascade)\n\n @@map(\"role_permissions\")\n}\n\n//---------------------------------- ROLE PERMISSION MODEL END ------------------------------------------------\n\n//---------------------------------- DEPARTMENT MODEL START ------------------------------------------------\nmodel Department {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n department_code String? @unique\n department_name String?\n department_slug String? @unique\n department_head Int?\n department_head_user User? @relation(\"department_head\", fields: [department_head], references: [id])\n budget_manager Int?\n budget_manager_user User? @relation(\"budget_manager\", fields: [budget_manager], references: [id])\n description String?\n is_active Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n // user_department UserDepartment[]\n department_budget DepartmentBudget[]\n business_entity_departments BusinessEntityDepartment[]\n\n @@map(\"departments\")\n}\n\n//---------------------------------- DEPARTMENT MODEL END ------------------------------------------------\n\n//---------------------------------- USER DEPARTMENT MODEL START ------------------------------------------------\nmodel UserDepartmentEntity {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n bussiness_entity_department_id Int?\n bussiness_entity_department BusinessEntityDepartment? @relation(fields: [bussiness_entity_department_id], references: [id], onDelete: Cascade)\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id])\n is_primary Boolean? @default(false)\n is_deleted Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([user_id, bussiness_entity_department_id])\n @@map(\"user_department_entities\")\n}\n\n//---------------------------------- USER DEPARTMENT MODEL END ------------------------------------------------\n\n//---------------------------------- BUSINESS ENTITY DEPARTMENT MODEL START ------------------------------------------------\n// Many-to-many join table: one Department can belong to many BusinessEntities,\n// one BusinessEntity can have many Departments.\nmodel BusinessEntityDepartment {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id])\n department_id Int?\n department Department? @relation(fields: [department_id], references: [id])\n is_active Boolean? @default(true)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n userDepartmentEntities UserDepartmentEntity[]\n\n @@unique([business_entity_id, department_id])\n @@map(\"business_entity_departments\")\n}\n\n//---------------------------------- BUSINESS ENTITY DEPARTMENT MODEL END ------------------------------------------------\n\n//---------------------------------- INDUSTRY MODEL START ----------------------------------\nmodel Industry {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String? @unique\n slug String?\n is_active Boolean @default(true)\n description String?\n created_by Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n categories Category[]\n\n @@map(\"industries\")\n}\n\n//---------------------------------- INDUSTRY MODEL END ----------------------------------\n\n//---------------------------------- CATEGORY MODEL START ----------------------------------\nmodel Category {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n industry_id Int?\n industry Industry? @relation(fields: [industry_id], references: [id])\n name String? @unique\n slug String?\n is_active Boolean @default(true)\n parent_id Int @default(0)\n description String?\n image_url String?\n created_by Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n attributes Attribute[]\n category_uom UomCategory[]\n category_budget CategoryBudget[]\n item_category Item[] @relation(\"ItemCategory\")\n item_sub_category Item[] @relation(\"ItemSubCategory\")\n boq_event_items_as_category BoqEventItem[] @relation(\"CategoryBoqEventItemAsCategory\")\n boq_event_items_as_sub_category BoqEventItem[] @relation(\"SubCategoryBoqEventItemAsSubCategory\")\n\n @@map(\"categories\")\n}\n\n//---------------------------------- CATEGORY MODEL END ----------------------------------\n\n//---------------------------------- ATTRIBUTE MODEL START ----------------------------------\nmodel Attribute {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n category_id Int?\n category Category? @relation(fields: [category_id], references: [id])\n attribute_name String?\n is_required Boolean? @default(false)\n is_active Boolean? @default(true)\n slug String?\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n attribute_values AttributeValue[]\n item_attributes ItemAttribute[]\n\n @@unique([category_id, attribute_name])\n @@map(\"attributes\")\n}\n\n//---------------------------------- ATTRIBUTE MODEL END ----------------------------------\n\n//---------------------------------- ATTRIBUTEVALUE MODEL START ----------------------------------\nmodel AttributeValue {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n attribute_id Int?\n attribute Attribute? @relation(fields: [attribute_id], references: [id])\n attribute_value_name String?\n is_active Boolean @default(true)\n slug String?\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n item_attribute_values ItemAttributeValue[]\n\n @@unique([attribute_id, attribute_value_name])\n @@map(\"attribute_values\")\n}\n\n//---------------------------------- ATTRIBUTEVALUE MODEL END ----------------------------------\n\n//---------------------------------- ITEM MODEL START ----------------------------------\nmodel Item {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n is_parent Boolean @default(false)\n parent_id Int? @default(0)\n category_id Int?\n category Category? @relation(\"ItemCategory\", fields: [category_id], references: [id])\n sub_category_id Int?\n sub_category Category? @relation(\"ItemSubCategory\", fields: [sub_category_id], references: [id])\n uomId Int?\n uom Uom? @relation(fields: [uomId], references: [id])\n item_code String? @unique @db.VarChar(500)\n item_name String? @db.VarChar(500)\n item_handler String? @db.VarChar(1000)\n slug String? @unique @db.VarChar(1000)\n description String? @db.VarChar(1000)\n terms_and_conditions String[] @db.VarChar(1000)\n keywords String[] @db.VarChar(1000)\n tags Json? @db.JsonB\n cost_price Decimal? @default(0.00) @db.Decimal(10, 2)\n selling_price Decimal? @default(0.00) @db.Decimal(10, 2)\n profit Decimal? @default(0.00) @db.Decimal(10, 2)\n margin Decimal? @default(0.00) @db.Decimal(10, 2)\n title String? @db.VarChar(500)\n continue_selling_when_out_of_stock Boolean? @default(false)\n physical_product Boolean? @default(false)\n variant_attributes Json? @db.JsonB // {\"color\": \"red\", \"size\": \"large\", \"material\": \"cotton\"}\n variant_display_name String? @db.VarChar(500) // \"Red Large Cotton\" - auto-generated or custom\n available_qty Int? @default(0)\n inventory_reason String? @db.VarChar(500)\n reserved_quantity Int? @default(0)\n stock_in_hand Int? @default(0)\n reorder_level Int? @default(0) // NEW: When to reorder\n max_stock_level Int? // NEW: Maximum stock level\n sku String? @unique @db.VarChar(500)\n is_taxable Boolean? @default(false)\n bar_code String? @unique @db.VarChar(500) // Made unique\n physical_item Boolean? @default(false)\n track_quantity Boolean? @default(false)\n weight Decimal? @default(0.00) @db.Decimal(10, 2)\n dimensions Json? @db.JsonB // {\"length\": 10, \"width\": 5, \"height\": 2, \"unit\": \"cm\"}\n shipping_weight Decimal? @db.Decimal(10, 2) // Different from product weight\n media Json? @db.JsonB\n specifications Json? @db.JsonB\n template_suffix String?\n seo_page_title String?\n seo_meta_keyword String?\n seo_meta_description String?\n step_completed Int? @default(0)\n is_published Boolean? @default(false)\n published_at DateTime? @db.Timestamptz(6)\n published_by Int?\n is_active Boolean @default(true)\n is_featured Boolean @default(false) // NEW: For featured products\n is_default_variant Boolean @default(false) // NEW: Default variant for parent\n sort_order Int @default(0) // NEW: For ordering variants\n min_order_qty Int @default(1) // Minimum order quantity\n max_order_qty Int? // Maximum order quantity\n is_bulk_pricing_enabled Boolean @default(false) // For bulk pricing\n bulk_pricing_tiers Json? @db.JsonB // [{\"qty\": 10, \"price\": 20}, {\"qty\": 50, \"price\": 18}]\n created_by Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n purchase_intake_items PurchaseIntakeItem[]\n item_attributes ItemAttribute[]\n item_attribute_values ItemAttributeValue[]\n item_documents ItemDocument[]\n event_items EventItems[]\n purchase_order_items PurchaseOrderItem[]\n requested_catalogue_items RequestedCatalogueDetails[] @relation(\"ParentItemRequests\")\n requested_catalogue_variants RequestedCatalogueDetails[] @relation(\"VariantItemRequests\")\n catalogue_items Catalogue[] @relation(\"ParentItemCatalogue\")\n catalogue_variants Catalogue[] @relation(\"VariantItemCatalogue\")\n catalogue_vendor_items CatalogueVendor[] @relation(\"ParentItemCatalogueVendor\")\n catalogue_vendor_variants CatalogueVendor[] @relation(\"VariantItemCatalogueVendor\")\n catalogue_cart_items CatalogueCart[] @relation(\"ParentItemCatalogueCart\")\n catalogue_cart_variants CatalogueCart[] @relation(\"VariantItemCatalogueCart\")\n blanket_po_items BlanketPurchaseOrderItem[]\n\n @@index([parent_id, is_active, is_deleted]) // For variant queries\n @@index([is_parent, is_published, is_active]) // For parent product queries\n @@index([available_qty]) // For stock queries\n @@index([reorder_level, available_qty]) // For low stock alerts\n @@index([category_id, is_published, is_active]) // For category browsing\n @@index([created_at]) // For recent products\n @@index([selling_price]) // For price filtering\n @@map(\"item\")\n}\n\n//---------------------------------- ITEM MODEL END ----------------------------------\n\n//---------------------------------- PURCHASEINTAKES MODEL START ----------------------------------\n\n// Enum for priority levels\nenum PurchaseIntakePriorityEnum {\n Urgent\n High\n Medium\n Low\n}\n\n// Enum for status levels\nenum PurchaseIntakeStatusEnum {\n APPROVED\n IN_PROGRESS\n PENDING\n REJECTED\n COMPLETED\n CANCELLED\n AUTO_APPROVED\n AUTO_REJECTED\n SEND_BACK\n EXPIRED\n}\n\nenum PurchaseRequestStatusEnum {\n Open\n InProgress\n OnHold\n Partial\n Closed\n Cancelled\n Completed\n Rejected\n Expired\n}\n\nenum PurchaseIntakeTypeEnum {\n PURCHASE_INTAKE\n FAST_CATALOGUE\n BLANKET_PURCHASE_ORDER\n}\n\nmodel PurchaseIntake {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n pi_number String? @unique\n pr_number String? @unique\n requestor_id Int?\n user User? @relation(fields: [requestor_id], references: [id], onDelete: Cascade)\n type PurchaseIntakeTypeEnum @default(PURCHASE_INTAKE)\n department String?\n request_date DateTime? @default(now()) @db.Timestamptz(6)\n items_or_services_description String?\n priority PurchaseIntakePriorityEnum\n estimated_budget Float?\n status PurchaseIntakeStatusEnum @default(PENDING)\n pr_status PurchaseRequestStatusEnum @default(Open)\n reject_reason String?\n pr_reject_reason String?\n attachments Json?\n if_yes_attach_quotations Json?\n others Json?\n send_back_count Int? @default(0)\n is_active Boolean @default(true)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n delete_reason String?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n deleted_by_user User? @relation(\"purchase_intake_deleted_by\", fields: [deleted_by], references: [id])\n initiated_by Int?\n initiated_by_user User? @relation(\"purchase_intake_initiated_by\", fields: [initiated_by], references: [id])\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id])\n purchase_intake_item PurchaseIntakeItem[]\n events Event[]\n event_items EventItems[]\n purchase_order_items PurchaseOrderItem[]\n send_backs SendBack[]\n blanket_po_items BlanketPurchaseOrderItem[]\n\n @@map(\"purchase_intakes\")\n}\n\n//---------------------------------- PURCHASEINTAKES MODEL END ----------------------------------\n\n//---------------------------------- PURCHASEINTAKESITEMS MODEL START ----------------------------------\n\nenum PurchaseIntakeItemEnum {\n Open\n InProgress\n OnHold\n Partial\n Closed\n Cancelled\n Completed\n Rejected\n Expired\n}\n\nenum SendBackIntakeStatusEnum {\n PENDING\n ACCEPTED\n COUNTERED\n REJECTED\n}\n\nenum SendBackApproverStatusEnum {\n PENDING\n ACCEPTED\n COUNTERED\n REJECTED\n SEND_BACK\n}\n\nmodel PurchaseIntakeItem {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n purchase_intakes_id Int?\n purchase_intake PurchaseIntake? @relation(fields: [purchase_intakes_id], references: [id], onDelete: Cascade)\n item_id Int?\n items Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n quantity Int?\n initial_quantity Int?\n open_quantity Int?\n closed_quantity Int? @default(0)\n unit_of_measurement String?\n price Decimal? @default(0.00) @db.Decimal(10, 2)\n location_id Int?\n location Location? @relation(fields: [location_id], references: [id], onDelete: Cascade)\n status PurchaseIntakeItemEnum @default(Open)\n send_back_intake_status SendBackIntakeStatusEnum @default(PENDING)\n send_back_approver_status SendBackApproverStatusEnum @default(PENDING)\n suggested_quantity Int?\n counter_quantity Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"purchase_intakes_items\")\n}\n\n//---------------------------------- PURCHASEINTAKESITEMS MODEL END ----------------------------------\n\n//---------------------------------- SEND BACK MODEL END ---------------------------------------\n\nmodel SendBack {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n purchase_intake_id Int?\n purchase_intake PurchaseIntake? @relation(fields: [purchase_intake_id], references: [id], onDelete: Cascade)\n item_json Json? @db.JsonB\n send_back_reason String?\n send_back_approver_id Int?\n send_back_approver User? @relation(\"send_back_approver\", fields: [send_back_approver_id], references: [id], onDelete: Cascade)\n send_back_requestor_id Int?\n send_back_requestor User? @relation(\"send_back_requestor\", fields: [send_back_requestor_id], references: [id], onDelete: Cascade)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"send_backs\")\n}\n\n//---------------------------------- SEND BACK MODEL END ---------------------------------------\n\n//---------------------------------- EMAILTEMPLATE MODEL END ------------------------------------------------\nmodel EmailTemplate {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n template_name String?\n template_slug String? @unique @db.VarChar(100)\n subject String?\n html_content String?\n macro String?\n module_name String?\n is_active Boolean? @default(true)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"email_templates\")\n}\n\n//---------------------------------- EMAILTEMPLATE MODEL END ------------------------------------------------\n\n//---------------------------------- SMTP MODEL START ------------------------------------------------\nmodel SmtpConfig {\n id Int @id @default(autoincrement())\n smtp_server String @unique\n port Int?\n username String?\n password String?\n from_email String?\n encryption String?\n test_email String?\n is_active Boolean @default(false)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"smtp_config\")\n}\n\n//---------------------------------- SMTP MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL HIERARCHY MODEL START ------------------------------------------------\nenum InitiatorTypeEnum {\n Role\n User\n}\n\nmodel ApprovalHierarchy {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String?\n slug String? @unique\n module String?\n task String?\n initiator_type InitiatorTypeEnum\n roleId Int?\n role Role? @relation(fields: [roleId], references: [id], onDelete: Cascade)\n userId Int?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: SetNull)\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n approval_condition ApprovalCondition[]\n approval_level ApprovalLevel[]\n approval_journey ApprovalJourney[]\n approval_delegations ApprovalDelegation[] // Delegations filtered by this hierarchy\n\n @@map(\"approval_hierarchy\")\n}\n\n//---------------------------------- APPROVAL HIERARCHY MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL CONDITION MODEL START ------------------------------------------------\n\nenum ConditionTypeEnum {\n Price\n Escalation\n}\n\nmodel ApprovalCondition {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approval_hierarchy_id Int?\n approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: Cascade)\n conditions ConditionTypeEnum\n price_from Float?\n price_to Float?\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n approval_level ApprovalLevel[]\n approval_delegations ApprovalDelegation[] // Delegations filtered by this condition\n\n @@map(\"approval_conditions\")\n}\n\n//---------------------------------- APPROVAL CONDITION MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL LEVEL MODEL START ------------------------------------------------\n\nmodel ApprovalLevel {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approval_hierarchy_id Int?\n approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: Cascade)\n approval_condition_id Int?\n approval_condition ApprovalCondition? @relation(fields: [approval_condition_id], references: [id], onDelete: Cascade)\n level String?\n valid_till_hours Int?\n valid_till_minutes Int?\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n approval_level_escalation ApprovalLevelEscalation[]\n approval_level_users ApprovalLevelUser[]\n\n @@map(\"approval_levels\")\n}\n\n//---------------------------------- APPROVAL LEVEL MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL LEVEL USER MODEL START ------------------------------------------------\n\nmodel ApprovalLevelUser {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approval_level_id Int?\n approval_level ApprovalLevel? @relation(fields: [approval_level_id], references: [id], onDelete: Cascade)\n approver_id Int?\n user User? @relation(fields: [approver_id], references: [id], onDelete: Cascade)\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([approval_level_id, approver_id])\n @@map(\"approval_level_users\")\n}\n\n//---------------------------------- APPROVAL LEVEL USER MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL LEVEL ESCALATIONS MODEL START ------------------------------------------------\n\nmodel ApprovalLevelEscalation {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approval_level_id Int?\n approval_level ApprovalLevel? @relation(fields: [approval_level_id], references: [id], onDelete: Cascade)\n escalation_approver_id Int?\n user User? @relation(fields: [escalation_approver_id], references: [id], onDelete: Cascade)\n valid_till_hours Int?\n valid_till_minutes Int?\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n approval_level_escalation_users ApprovalLevelEscalationUser[]\n\n @@map(\"approval_level_escalations\")\n}\n\n//---------------------------------- APPROVAL LEVEL ESCALATIONS MODEL END ------------------------------------------------\n\n// --------------------------------- APPROVAL LEVEL ESCALATIONS USERS MODEL START ------------------------------------------------\n\nmodel ApprovalLevelEscalationUser {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approval_level_escalation_id Int?\n approval_level_escalation ApprovalLevelEscalation? @relation(fields: [approval_level_escalation_id], references: [id], onDelete: Cascade)\n approver_id Int?\n user User? @relation(fields: [approver_id], references: [id], onDelete: Cascade)\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([approval_level_escalation_id, approver_id])\n @@map(\"approval_level_escalation_users\")\n}\n\n//---------------------------------- APPROVAL LEVEL ESCALATIONS MODEL END ------------------------------------------------\n\n//---------------------------------- UOM MODEL START ------------------------------------------------\n\nmodel Uom {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n uom_code String? @unique @db.VarChar(25)\n description String? @db.VarChar(300)\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n items Item[]\n\n uom_category UomCategory[]\n\n @@map(\"uoms\")\n}\n\n//---------------------------------- UOM MODEL END ------------------------------------------------\n\n//---------------------------------- UOM CATEGORY MODEL START ------------------------------------------------\n\nmodel UomCategory {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n Category Category? @relation(fields: [categoryId], references: [id], onDelete: Cascade)\n categoryId Int?\n Uom Uom? @relation(fields: [uomId], references: [id], onDelete: Cascade)\n uomId Int?\n created_by Int?\n\n @@map(\"uom_categories\")\n}\n\n//---------------------------------- UOM CATEGORY MODEL START ------------------------------------------------\n\n//---------------------------------- PRODUCT ATTRIBUTE MODEL START ------------------------------------------------\nmodel ItemAttribute {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)\n attribute_id Int?\n attribute Attribute? @relation(fields: [attribute_id], references: [id])\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n\n item_attribute_values ItemAttributeValue[]\n\n @@unique([item_id, attribute_id])\n @@index([item_id])\n @@map(\"item_attributes\")\n}\n\n//---------------------------------- PRODUCT ATTRIBUTE MODEL END ------------------------------------------------\n\n//---------------------------------- PRODUCT ATTRIBUTE VALUE MODEL START ------------------------------------------------\nmodel ItemAttributeValue {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)\n item_attribute_id Int?\n item_attribute ItemAttribute? @relation(fields: [item_attribute_id], references: [id], onDelete: Cascade)\n attribute_value_id Int?\n attribute_value AttributeValue? @relation(fields: [attribute_value_id], references: [id])\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n\n @@unique([item_id, item_attribute_id, attribute_value_id])\n @@index([item_id])\n @@map(\"item_attribute_values\")\n}\n\n//---------------------------------- PRODUCT ATTRIBUTE VALUE MODEL START ------------------------------------------------\n\n//---------------------------------- ITEM DOCUMENTS MODEL START ------------------------------------------------\n\nmodel ItemDocument {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)\n original_document String?\n optimized_image String?\n thumbnail_image String?\n original_name String?\n original_extension String?\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n\n @@map(\"item_documents\")\n}\n\n//---------------------------------- ITEM IMAGES MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL JOURNEY MODEL START ------------------------------------------------\n\nenum ApprovalJourneyStatusEnum {\n Pending\n Approved\n AutoApproved\n Rejected\n AutoRejected\n Escalated\n NA\n Cancelled\n SendBack\n}\n\nmodel ApprovalJourney {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n parent_id String?\n journy_type String?\n approval_hierarchy_id Int?\n approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: Cascade)\n approvar_id Int?\n user User? @relation(fields: [approvar_id], references: [id], onDelete: Cascade)\n original_approver_id Int? // Original approver when delegation is active\n original_approver User? @relation(\"OriginalApprover\", fields: [original_approver_id], references: [id], onDelete: SetNull)\n delegation_id Int? // Reference to active delegation\n delegation ApprovalDelegation? @relation(fields: [delegation_id], references: [id], onDelete: SetNull)\n level String?\n status ApprovalJourneyStatusEnum @default(Pending)\n reject_reason String?\n journey_task String?\n is_approver_turn Boolean @default(false)\n duration String? // Duration in hours and minutes (e.g. \"2h 30m\")\n valid_to DateTime? @db.Timestamptz(6) // Explicitly use timestamptz\n valid_till DateTime? @db.Timestamptz(6) // Explicitly use timestamptz\n batch_id String?\n is_deleted Boolean @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"approval_journey\")\n}\n\n//---------------------------------- APPROVAL JOURNEY MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL DELEGATION MODEL START ------------------------------------------------\nenum ApprovalDelegationStatusEnum {\n PENDING\n ACTIVE\n COMPLETED\n CANCELLED\n}\n\nmodel ApprovalDelegation {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approver_id Int? // Original approver who is delegating\n approver User? @relation(\"DelegatingApprover\", fields: [approver_id], references: [id], onDelete: Cascade)\n delegate_id Int? // DEPRECATED: Use delegation_delegates instead. Kept for backward compatibility\n delegate User? @relation(\"DelegateUser\", fields: [delegate_id], references: [id], onDelete: Cascade)\n journy_type String? // Optional: Filter by module type (e.g., \"purchase-intake\", \"contract\")\n journey_task String? // Optional: Filter by task (e.g., \"contract-creation-approval\")\n approval_hierarchy_id Int? // Optional: Filter by specific hierarchy\n approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: SetNull)\n approval_condition_id Int? // Optional: Filter by specific condition within hierarchy (includes price range) - Most granular\n approval_condition ApprovalCondition? @relation(fields: [approval_condition_id], references: [id], onDelete: SetNull)\n start_date DateTime @db.Timestamptz(6) // When delegation becomes active\n end_date DateTime @db.Timestamptz(6) // When delegation expires\n status ApprovalDelegationStatusEnum @default(PENDING)\n reason String? // Reason for delegation (e.g., \"On leave\", \"Out of office\")\n is_active Boolean @default(true) // Can be manually deactivated\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n approval_journey ApprovalJourney[] // All approval journeys using this delegation\n delegation_delegates ApprovalDelegationDelegate[] // Multiple delegates for this delegation\n\n @@index([approver_id, is_active, is_deleted])\n @@index([approver_id, journy_type, journey_task, is_active, is_deleted])\n @@index([approver_id, approval_hierarchy_id, approval_condition_id, is_active, is_deleted])\n @@index([approver_id, approval_hierarchy_id, is_active, is_deleted])\n @@index([delegate_id, is_active, is_deleted])\n @@index([start_date, end_date])\n @@map(\"approval_delegations\")\n}\n\nmodel ApprovalDelegationDelegate {\n id Int @id @default(autoincrement())\n delegation_id Int\n delegation ApprovalDelegation @relation(fields: [delegation_id], references: [id], onDelete: Cascade)\n delegate_id Int // User who will receive the delegated tasks\n delegate User @relation(\"DelegationDelegate\", fields: [delegate_id], references: [id], onDelete: Cascade)\n is_deleted Boolean @default(false)\n is_active Boolean @default(true)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([delegation_id, delegate_id])\n @@index([delegation_id])\n @@index([delegate_id])\n @@map(\"approval_delegation_delegates\")\n}\n\n//---------------------------------- APPROVAL DELEGATION MODEL END ------------------------------------------------\n\n//---------------------------------- TEMPLATE MODEL START ------------------------------------------------\n\nmodel Template {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n template_code String? @unique\n template_name String? @unique\n template_type Json?\n currency_id Int?\n currency Currency? @relation(fields: [currency_id], references: [id], onDelete: Cascade)\n fields TemplateField[]\n is_active Boolean? @default(false)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n event Event[]\n template_strategies TemplateStrategies[]\n\n @@map(\"templates\")\n}\n\n//---------------------------------- TEMPLATE MODEL END ------------------------------------------------\n\n//---------------------------------- TEMPLATE STRATEGIES MODEL START ------------------------------------------------\nmodel TemplateStrategies {\n id Int @id @default(autoincrement())\n template_id Int\n strategy_id Int\n template Template @relation(fields: [template_id], references: [id], onDelete: Cascade)\n strategy Strategies @relation(fields: [strategy_id], references: [id], onDelete: Cascade)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n\n @@unique([template_id, strategy_id])\n @@map(\"template_strategies\")\n}\n\n//---------------------------------- TEMPLATE STRATEGIES MODEL END ------------------------------------------------\n\n//---------------------------------- TEMPLATE FIELD MODEL START ------------------------------------------------\n\nenum FieldType {\n TEXT\n NUMBER\n FORMULA\n DATE\n TIME\n DATETIME\n PERCENTAGE\n MEDIA\n CURRENCY\n CURRENCY_FORMULA\n VALUE_FORMULA\n}\n\nenum FieldRole {\n BUYER\n VENDOR\n AUTO_CALCULATED\n}\n\nenum FieldPlacement {\n GLOBAL\n LOCAL\n}\n\nmodel TemplateField {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n template_id Int\n template Template @relation(fields: [template_id], references: [id])\n field_name String?\n field_slug String?\n field_type FieldType?\n field_role FieldRole?\n field_placement FieldPlacement?\n field_formula String? // Optional formula for formula-driven fields\n is_mandatory Boolean? @default(false)\n buyer_only Boolean? @default(false)\n position Int?\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"template_fields\")\n}\n\n//---------------------------------- TEMPLATE FIELD MODEL END ------------------------------------------------\n\n//---------------------------------- FAQ CATEGORY MODEL START ------------------------------------------------\n\nmodel FaqCategory {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n category_name String? @unique @db.VarChar(255)\n slug String? @unique @db.VarChar(255)\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n faqs Faq[]\n\n @@map(\"faq_categories\")\n}\n\n//---------------------------------- FAQ CATEGORY MODEL END ------------------------------------------------\n\n//---------------------------------- FAQ MODEL START ------------------------------------------------\n\nenum FaqType {\n ADMIN\n BUYER\n VENDOR\n}\n\nmodel Faq {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n faq_type FaqType?\n faq_category_id Int?\n faq_category FaqCategory? @relation(fields: [faq_category_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n question String? @db.Text()\n answer String? @db.Text()\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([faq_category_id, question, faq_type]) // Composite unique constraint\n @@map(\"faqs\")\n}\n\n//---------------------------------- FAQ MODEL END ------------------------------------------------\n\n//---------------------------------- EVENT START END ------------------------------------------------\n\nenum EventStatus {\n Draft\n Live\n Closed\n Upcoming\n Cancelled\n}\n\nenum EventType {\n RFQ\n RFI\n RFP\n RAUC\n FAUC\n BOQ\n}\n\nenum EventPhase {\n Upcoming\n Invitation\n PreBids\n Bidding\n Evaluation\n ClosingSoon\n Closed\n PartialClosed\n Expired\n}\n\nmodel Event {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n code String? @unique\n template_id Int?\n template Template? @relation(fields: [template_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n type EventType?\n name String?\n start_date DateTime? @db.Timestamptz(6) // Explicitly use timestamptz\n end_date DateTime? @db.Timestamptz(6) // Explicitly use timestamptz\n duration String?\n attachments Json?\n terms_conditions String?\n step_completed Int?\n status EventStatus? @default(Draft)\n event_phase EventPhase?\n purchase_intake_id Int?\n purchase_intake PurchaseIntake? @relation(fields: [purchase_intake_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n reason String?\n is_published Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n deleted_by Int?\n event_items EventItems[]\n boq_event_items BoqEventItem[]\n event_vendors EventVendors[]\n event_configurations EventConfigurations[]\n event_strategies EventStrategies[]\n bids Bid[]\n bid_logs BidLog[]\n quotations Quotation[]\n quotation_logs QuotationLog[]\n event_rfi_form EventRfiForm[]\n event_rfi_form_logs EventRfiFormLog[]\n purchase_order PurchaseOrder[]\n event_criteria EventCriteria[]\n conversations Conversation[]\n blanket_po BlanketPurchaseOrder[]\n\n @@map(\"events\")\n}\n\n//---------------------------------- EVENT MODEL END ------------------------------------------------\n\n//---------------------------------- EVENT ITEMS MODEL START ------------------------------------------------\n\nmodel EventItems {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n purchase_intake_id Int?\n purchase_intake PurchaseIntake? @relation(fields: [purchase_intake_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n dynamic_fields Json?\n is_active Boolean? @default(true)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n bids Bid[]\n bid_logs BidLog[]\n quotations Quotation[]\n quotation_logs QuotationLog[]\n\n @@map(\"event_items\")\n}\n\n//---------------------------------- EVENT ITEMS MODEL END ------------------------------------------------\n\n//---------------------------------- BOQ EVENT ITEMS MODEL START ------------------------------------------------\n/// BOQ lines for events without item-master linkage (free-text / JSON fields), parallel to Sourcebay-style event items.\nmodel BoqEventItem {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n category_id Int?\n category Category? @relation(\"CategoryBoqEventItemAsCategory\", fields: [category_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n sub_category_id Int?\n sub_category Category? @relation(\"SubCategoryBoqEventItemAsSubCategory\", fields: [sub_category_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n part_name String?\n description String? @db.Text\n part_no String?\n quantity Decimal? @db.Decimal(18, 4)\n uom String?\n dynamic_fields Json?\n version Int @default(1)\n parent_version_id Int?\n parent_version BoqEventItem? @relation(\"BoqEventItemVersionRelation\", fields: [parent_version_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n sort_order Int @default(0)\n is_active Boolean? @default(true)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n bids Bid[]\n bid_logs BidLog[]\n quotations Quotation[]\n quotation_logs QuotationLog[]\n purchase_order_items PurchaseOrderItem[]\n boq_event_items BoqEventItem[] @relation(\"BoqEventItemVersionRelation\")\n\n @@index([event_id])\n @@map(\"boq_event_items\")\n}\n\n//---------------------------------- BOQ EVENT ITEMS MODEL END ------------------------------------------------\n\n//---------------------------------- VENDOR EVENTS MODEL START ------------------------------------------------\n\nenum EventVendorStatus {\n Pending\n Approved\n Rejected\n}\n\nenum EventVendorBidStatus {\n INVITED\n VIEWED\n DRAFT\n BIDSUBMITTED\n SUBMITTED\n ENDED\n NORESPONSE\n EVALUATION\n WON\n NOTAWARDED\n CANCELLED\n EXPIRED\n ACCEPTED\n REJECTED\n LASTBIDREJECTED\n BLOCKED\n}\n\nmodel EventVendors {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n /// Global vendor primary key in procbay_vendor_db.procbay_schema.vendors (cross-database; see view procbay_schema.event_vendor_with_vendor).\n vendor_id Int?\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n is_active Boolean? @default(true)\n is_email_sent Boolean? @default(false)\n is_restricted Boolean? @default(false)\n status EventVendorStatus @default(Pending)\n reason String?\n is_wishlisted Boolean? @default(false)\n event_vendor_bid_status EventVendorBidStatus? @default(INVITED)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n bids Bid[]\n bid_logs BidLog[]\n quotations Quotation[]\n quotation_logs QuotationLog[]\n event_rfi_form_logs EventRfiFormLog[]\n purchase_order PurchaseOrder[]\n event_vendor_criteria EventVendorCriteria[]\n blanket_po BlanketPurchaseOrder[]\n\n @@index([event_id, vendor_id])\n @@index([status])\n @@map(\"event_vendors\")\n}\n\n//---------------------------------- VENDOR EVENTS MODEL END ------------------------------------------------\n\n//---------------------------------- EVENTS CONFIGURATIONS MODEL START ------------------------------------------------\n\nmodel EventConfigurations {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n rule_name String?\n rule_value Json?\n rule_slug String?\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"event_configurations\")\n}\n\n//---------------------------------- EVENTS CONFIGURATIONS MODEL END ------------------------------------------------\n\n//---------------------------------- EVENTS STRATEGIES MODEL START ------------------------------------------------\n\nmodel EventStrategies {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n strategy_id Int?\n strategy Strategies? @relation(fields: [strategy_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"event_strategies\")\n}\n\n//---------------------------------- EVENTS STRATEGIES MODEL END ------------------------------------------------\n\n//---------------------------------- STRATEGIES MODEL START ------------------------------------------------\n\nmodel Strategies {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String? @unique\n slug String? @unique\n description String?\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n event_strategies EventStrategies[]\n template_strategies TemplateStrategies[]\n\n @@map(\"strategies\")\n}\n\n//---------------------------------- STRATEGIES MODEL END ------------------------------------------------\n\n/////////////////////////////////// START CMS SCHEMA //////////////////////////////\n\nenum userTypeEnum {\n ADMIN\n VENDOR\n}\n\nmodel Cms {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n title String?\n content String?\n type userTypeEnum\n slug String?\n images Json? @db.JsonB\n is_active Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([slug, type])\n @@map(\"cms\")\n}\n\n/////////////////////////////////// END CMS SCHEMA //////////////////////////////\n\n//---------------------------------- CURRENCY MODEL START ------------------------------------------------\n\nmodel Currency {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String? @unique\n code String? @unique\n symbol String?\n is_active Boolean? @default(true)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n template Template[]\n\n @@map(\"currencies\")\n}\n\n//---------------------------------- CURRENCY MODEL END ------------------------------------------------\n\n//---------------------------------- SUPPORT TICKETS MODEL START ------------------------------------------------\n\nenum TicketStatusEnum {\n OPEN\n IN_PROGRESS\n RESOLVED\n CLOSED\n REOPEN\n}\n\nenum TicketPriorityEnum {\n LOW\n MEDIUM\n HIGH\n CRITICAL\n}\n\nenum TicketContactMethodEnum {\n EMAIL\n PHONE\n CHAT\n}\n\nmodel SupportTicket {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n ticket_code String? @unique\n vendor_id Int?\n subject String?\n category_id Int?\n category SupportCategory? @relation(fields: [category_id], references: [id], onDelete: Cascade)\n priority TicketPriorityEnum @default(MEDIUM)\n description String?\n attachments Json?\n status TicketStatusEnum @default(OPEN)\n prefered_contact_method TicketContactMethodEnum\n is_active Boolean? @default(true)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n assigned_tickets TicketAssignment[]\n ticket_history TicketHistory[]\n ticket_replies TicketReply[]\n\n @@map(\"support_tickets\")\n}\n\nmodel TicketAssignment {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n ticket_id Int?\n support_ticket SupportTicket? @relation(fields: [ticket_id], references: [id], onDelete: Cascade)\n assigned_by Int?\n assigned_by_user User? @relation(\"user_assigned_by\", fields: [assigned_by], references: [id], onDelete: Cascade)\n assigned_to Int?\n assigned_to_user User? @relation(\"user_assigned_to\", fields: [assigned_to], references: [id], onDelete: Cascade)\n assigned_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"ticket_assignments\")\n}\n\nmodel TicketHistory {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n ticket_id Int?\n support_ticket SupportTicket? @relation(fields: [ticket_id], references: [id], onDelete: Cascade)\n assigned_to Int?\n assigned_to_user User? @relation(\"user_assigned_to\", fields: [assigned_to], references: [id], onDelete: Cascade)\n assigned_by Int?\n assigned_by_user User? @relation(\"user_assigned_by\", fields: [assigned_by], references: [id], onDelete: Cascade)\n status TicketStatusEnum\n updated_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"ticket_history\")\n}\n\nmodel TicketReply {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n ticket_id Int?\n support_ticket SupportTicket? @relation(fields: [ticket_id], references: [id], onDelete: Cascade)\n user_id Int? // User who replied\n user User? @relation(\"user_reply\", fields: [user_id], references: [id], onDelete: Cascade)\n vendor_id Int? // Vendor who replied\n message String?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"ticket_replies\")\n}\n\n//---------------------------------- SUPPORT TICKETS MODEL END ------------------------------------------------\n//---------------------------------- SUPPORT CATEGORY MODEL START ------------------------------------------------\n\nmodel SupportCategory {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String? @unique\n parent_id Int? @default(0)\n description String?\n image_url String?\n is_active Boolean? @default(false)\n slug String?\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n tickets SupportTicket[]\n\n @@map(\"support_categories\")\n}\n\n//---------------------------------- SUPPORT CATEGORY MODEL END ------------------------------------------------\n\n//------------------------------------- ADMIN ALERTS MODEL START ------------------------------------------\n\nenum AlertTypeEnum {\n PURCHASE_INTAKE\n PURCHASE_REQUEST\n PURCHASE_ORDER\n APPROVAL\n QUOTATION\n RFI\n RFP\n AUCTION\n VENDOR_KYC\n GENERAL\n CONTRACT\n CONTRACT_CLAUSE\n CONTRACT_TEMPLATE\n UPLOAD\n EXPORT\n}\n\nmodel AdminAlert {\n id Int @id @default(autoincrement())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n alert_type AlertTypeEnum?\n title String?\n message String?\n redirect_url String?\n is_read Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n meta_data Json? @db.JsonB\n\n @@map(\"admin_alerts\")\n}\n\n//------------------------------------- ADMIN ALERTS MODEL END --------------------------------------------\n\n//-------------------------------------CUSTOMER NOTIFICATION MODEL START --------------------------------------------\n\nenum MediumEnum {\n EMAIL\n SMS\n}\n\nmodel CustomerNotification {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n template_name String? @db.VarChar(255)\n remark String?\n event String? @db.VarChar(255)\n medium MediumEnum?\n is_recurring Boolean @default(false)\n title String?\n trigger_message String?\n template_slug String?\n attachments String[] @default([])\n files Json[] @db.JsonB\n is_active Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"customer_notifications\")\n}\n\n//-------------------------------------CUSTOMER NOTIFICATION MODEL End --------------------------------------------\n\n//-------------------------------------BID MODEL START --------------------------------------------\n\n// Bid Status\nenum BidStatus {\n NOT_HIGHEST_BIDDER\n HIGHEST_BIDDER\n LOWEST_BIDDER\n NOT_LOWEST_BIDDER\n CANCELLED\n REJECTED\n ACCEPTED\n LAST_REJECTED\n COMPLETE_REJECTED\n}\n\nmodel Bid {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_item_id Int?\n event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)\n boq_event_item_id Int?\n boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)\n event_type EventType?\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n bid_log_id Int? // Reference to BidLog for detailed bid history\n bid_log BidLog? @relation(fields: [bid_log_id], references: [id], onDelete: Cascade)\n bid_amount Float?\n version Int @default(0) // For optimistic locking\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([event_id, event_item_id])\n @@index([event_id, boq_event_item_id])\n @@map(\"bids\")\n}\n\n//-------------------------------------BID MODEL END --------------------------------------------\n\n//-------------------------------------BID LOG MODEL START --------------------------------------------\n\nmodel BidLog {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_item_id Int?\n event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)\n boq_event_item_id Int?\n boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)\n event_type EventType?\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n bid_amount Float?\n bid_status BidStatus @default(NOT_HIGHEST_BIDDER)\n bidding_rank Int?\n weightage_score Float?\n is_cancelled Boolean @default(false)\n auto_cancel Boolean @default(false)\n cancel_reason String?\n is_winner Boolean @default(false)\n is_auto_bid Boolean @default(false)\n is_placed_by_admin Boolean @default(false)\n placed_by_id Int?\n reason String?\n bid_json Json? // Flexible structure for bid details\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n has_active_counter Boolean @default(false)\n counter_offer CounterOffer[]\n bid Bid[]\n\n @@index([event_id, event_item_id, created_at])\n @@index([event_id, boq_event_item_id, created_at])\n @@map(\"bid_logs\")\n}\n\n//------------------------------------- BID LOG MODEL END --------------------------------------------\n//------------------------------------- QUOTATION MODEL END --------------------------------------------\n\n// Quotation Status\nenum QuotationStatus {\n SUBMITTED\n UNDER_REVIEW\n ACCEPTED\n REJECTED\n REVISED\n LAST_REJECTED\n COMPLETE_REJECTED\n}\n\nmodel Quotation {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_item_id Int?\n event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)\n boq_event_item_id Int?\n boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)\n event_type EventType? // Should be RFQ, RFI, or RFP\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n quotation_log_id Int? // Reference to QuotationLog for detailed history\n quotation_log QuotationLog? @relation(fields: [quotation_log_id], references: [id], onDelete: Cascade)\n quote_amount Float?\n technical_details Json? // Flexible structure for specifications\n delivery_timeline String?\n warranty_terms String?\n payment_terms String?\n validity_period Int? // Days the quotation remains valid\n quotation_status QuotationStatus @default(SUBMITTED)\n quotation_rank Int?\n current_revision Int @default(1)\n version Int @default(0) // For optimistic locking\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([event_id, event_item_id])\n @@index([event_id, boq_event_item_id])\n @@map(\"quotations\")\n}\n\n//------------------------------------- QUOTATION MODEL END --------------------------------------------\n//------------------------------------- QUOTATION LOG MODEL END --------------------------------------------\nmodel QuotationLog {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_item_id Int?\n event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)\n boq_event_item_id Int?\n boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)\n event_type EventType?\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n quote_amount Float?\n technical_details Json?\n delivery_timeline String?\n warranty_terms String?\n payment_terms String?\n quotation_status QuotationStatus @default(SUBMITTED)\n quotation_rank Int?\n revision_number Int @default(1)\n review_comments String? // Admin feedback\n reviewed_by Int?\n quote_json Json? // Flexible structure for quotation details\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @default(now()) @db.Timestamptz(6)\n updated_by Int?\n has_active_counter Boolean @default(false)\n counter_offer CounterOffer[]\n quotation Quotation[]\n\n @@index([event_id, event_item_id])\n @@index([event_id, boq_event_item_id])\n @@map(\"quotation_logs\")\n}\n\n//------------------------------------- QUOTATION LOG MODEL END --------------------------------------------\n\n//------------------------------------ Form Master Models Start ------------------------------------\nmodel FormMaster {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n module_name String?\n module_slug String? @unique\n is_active Boolean? @default(true)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n dynamic_form DynamicForm[]\n\n @@map(\"form_masters\")\n}\n\n//------------------------------------ Form Master Models End ------------------------------------\n\n//------------------------------------ Dynamic Form Models Start ------------------------------------\nmodel DynamicForm {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n module_id Int?\n module FormMaster? @relation(fields: [module_id], references: [id], onDelete: Cascade)\n form_name String?\n form_slug String?\n description String?\n fields Json?\n form_order Int?\n is_active Boolean? @default(true)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([module_id, form_slug])\n @@map(\"dynamic_forms\")\n}\n\n//------------------------------------ Form Builder Models End ------------------------------------\n\n//------------------------------------ Modules Model Start ----------------------------\n\nmodel Module {\n id Int @id @default(autoincrement()) // Primary Key\n uuid String? @unique @default(uuid())\n tenant_config_id Int?\n tenant_config TenantConfiguration? @relation(fields: [tenant_config_id], references: [id])\n name String?\n slug String? @unique\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int? // Optional field if no constraints are specified\n sub_modules SubModule[]\n\n @@map(\"modules\")\n}\n\n//------------------------------------ Modules Model End ----------------------------\n\n//------------------------------------ Tenant Configuration Model Start ----------------------------\n\nmodel TenantConfiguration {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n tenant_id Int?\n tenant_name String?\n database_name String?\n tenant_subdomain String?\n currency String?\n currency_symbol String?\n industry String?\n timezone String?\n status String?\n email String?\n logo String?\n allowed_modules Module[]\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n\n @@map(\"tenant_configurations\")\n}\n\n//------------------------------------ Tenant Configuration Model End ------------------------------\n\n//------------------------------------- USER LOGIN ACTIVITY MODEL START --------------------------------------------\n\nenum LoginActivityUserType {\n ADMIN\n VENDOR\n}\n\nmodel UserLoginActivity {\n id Int @id @default(autoincrement())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n user_type LoginActivityUserType?\n ip_address String?\n user_agent String?\n browser String?\n device String?\n platform String?\n login_timestamp DateTime @default(now()) @db.Timestamptz(6)\n logout_timestamp DateTime? @db.Timestamptz(6)\n status String?\n session_id String?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"user_login_activities\")\n}\n\n//------------------------------------- USER LOGIN ACTIVITY MODEL END --------------------------------------------\n//------------------------------------- REGION MODEL START --------------------------------------------\n\nmodel Region {\n id Int @id @default(autoincrement())\n name String? @unique\n translations Json?\n wikiDataId String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n countries Country[]\n subregions Subregion[]\n\n @@map(\"regions\")\n}\n\n//------------------------------------- REGION MODEL END --------------------------------------------\n//------------------------------------- SUB REGION MODEL START --------------------------------------------\n\nmodel Subregion {\n id Int @id @default(autoincrement())\n name String? @unique\n translations Json?\n wikiDataId String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n region Region? @relation(fields: [region_id], references: [id])\n region_id Int?\n countries Country[]\n\n @@index([region_id])\n @@map(\"subregions\")\n}\n\n//------------------------------------- SUB REGION MODEL END --------------------------------------------\n//------------------------------------- COUNTRY MODEL START --------------------------------------------\n\nmodel Country {\n id Int @id @default(autoincrement())\n name String?\n iso3 String? @unique @db.Char(3)\n iso2 String? @unique @db.Char(2)\n numeric_code String? @db.Char(3)\n phonecode String?\n capital String?\n currency String?\n currency_name String?\n currency_symbol String?\n tld String?\n native String?\n region String?\n subregion String?\n nationality String?\n latitude Decimal? @db.Decimal(10, 8)\n longitude Decimal? @db.Decimal(11, 8)\n emoji String?\n emojiU String?\n timezones Json?\n translations Json?\n wikiDataId String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n region_relation Region? @relation(fields: [region_id], references: [id])\n region_id Int?\n subregion_relation Subregion? @relation(fields: [subregion_id], references: [id])\n subregion_id Int?\n\n states State[]\n cities City[]\n locations Location[]\n\n @@index([region_id])\n @@index([subregion_id])\n @@map(\"countries\")\n}\n\n//------------------------------------- COUNTRY MODEL END --------------------------------------------\n//------------------------------------- STATE MODEL START --------------------------------------------\n\nmodel State {\n id Int @id @default(autoincrement())\n name String?\n state_code String?\n type String?\n latitude Decimal? @db.Decimal(10, 8)\n longitude Decimal? @db.Decimal(11, 8)\n wikiDataId String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n country Country? @relation(fields: [country_id], references: [id])\n country_id Int?\n cities City[]\n locations Location[]\n\n @@unique([name, country_id, state_code], name: \"name_country_id_state_code\")\n @@index([country_id])\n @@map(\"states\")\n}\n\n//------------------------------------- STATE MODEL END --------------------------------------------\n//------------------------------------- CITY MODEL START --------------------------------------------\n\nmodel City {\n id Int @id @default(autoincrement())\n name String?\n latitude Decimal? @db.Decimal(10, 8)\n longitude Decimal? @db.Decimal(11, 8)\n wikiDataId String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n state State? @relation(fields: [state_id], references: [id])\n state_id Int?\n country Country? @relation(fields: [country_id], references: [id])\n country_id Int?\n locations Location[]\n\n @@unique([name, country_id, state_id], name: \"name_country_id_state_id\")\n @@index([state_id])\n @@index([country_id])\n @@map(\"cities\")\n}\n\n//------------------------------------- CITY MODEL END --------------------------------------------\n//------------------------------------- LOCATION MODEL START --------------------------------------------\n\nmodel Location {\n id Int @id @default(autoincrement())\n name String?\n address String?\n zipcode String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n country Country? @relation(fields: [country_id], references: [id])\n country_id Int?\n state State? @relation(fields: [state_id], references: [id])\n state_id Int?\n city City? @relation(fields: [city_id], references: [id])\n city_id Int?\n purchase_intake_item PurchaseIntakeItem[]\n blanket_po_release BlanketPurchaseOrderRelease[]\n business_entity_locations BusinessEntityLocation[]\n\n @@index([country_id])\n @@index([state_id])\n @@index([city_id])\n @@map(\"locations\")\n}\n\n//------------------------------------- LOCATION MODEL END --------------------------------------------\n\n//------------------------------------ Sub Module Model Start ----------------------------\nmodel SubModule {\n id Int @id @default(autoincrement())\n name String\n slug String @unique\n module_id Int?\n created_by Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n module Module? @relation(fields: [module_id], references: [id], onDelete: Cascade)\n\n @@map(\"sub_modules\")\n}\n\n//------------------------------------ Sub Module Model END ----------------------------\n\n//------------------------------------ COUNTER OFFER MODEL START ------------------------------------\n\nenum CounterOfferStatus {\n PENDING\n ACCEPTED\n REJECTED\n COUNTERED\n AUTO_REJECTED\n}\n\nmodel CounterOffer {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n bid_log_id Int?\n bid_log BidLog? @relation(fields: [bid_log_id], references: [id])\n quotation_log_id Int?\n quotation_log QuotationLog? @relation(fields: [quotation_log_id], references: [id])\n counter_amount Float\n counter_message String?\n technical_details Json? // For quotations - specific changes requested\n delivery_timeline String? // For quotations\n payment_terms String? // For quotations\n warranty_terms String? // For quotations\n is_viewed Boolean @default(false)\n status CounterOfferStatus? @default(PENDING)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int // Admin/buyer who created the counter offer\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([bid_log_id])\n @@index([quotation_log_id])\n @@map(\"counter_offers\")\n}\n\n//------------------------------------ COUNTER OFFER MODEL END ------------------------------------\n\n//------------------------------------ PURCHASE ORDER MODEL START ------------------------------------\n\nenum PurchaseOrderStatus {\n PENDING\n REQUESTED\n REJECTED\n COMPLETED\n REVOKED\n EXPIRED\n PENDING_DELIVERY\n PARTIALLY_DELIVERED\n DELIVERED\n}\n\nenum PurchaseOrderTypeEnum {\n PURCHASE_INTAKE\n FAST_CATALOGUE\n BLANKET_PURCHASE_ORDER\n}\n\nenum DeliveryStatus {\n PENDING_DELIVERY\n PARTIALLY_DELIVERED\n DELIVERED\n}\n\nmodel PurchaseOrder {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n purchase_order_no String? @unique\n purchase_order_date DateTime? @default(now()) @db.Timestamptz(6)\n total_amount Decimal? @default(0.00) @db.Decimal(10, 2)\n po_type PurchaseOrderTypeEnum? @default(PURCHASE_INTAKE)\n status PurchaseOrderStatus? @default(PENDING)\n delivery_status DeliveryStatus? @default(PENDING_DELIVERY)\n attachments Json?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n purchase_order_activity_log PurchaseOrderActivityLog[]\n purchase_order_items PurchaseOrderItem[]\n blanket_po BlanketPurchaseOrder? @relation(fields: [blanket_po_id], references: [id])\n blanket_po_id Int?\n blanket_po_releases BlanketPurchaseOrderRelease[]\n grn GRN[]\n invoices Invoice[]\n\n @@index([event_id])\n @@index([event_vendor_id])\n @@index([status])\n @@map(\"purchase_orders\")\n}\n\n//------------------------------------ PURCHASE ORDER MODEL END --------------------------------------\n\n//------------------------------------ PURCHASE ORDER ITEMS MODEL START ------------------------------------\n\nmodel PurchaseOrderItem {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n purchase_order_id Int?\n purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)\n purchase_request_id Int?\n purchase_request PurchaseIntake? @relation(fields: [purchase_request_id], references: [id], onDelete: Cascade)\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n boq_event_item_id Int?\n boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n vendor_id Int?\n amount Decimal? @default(0.00) @db.Decimal(10, 2)\n quantity Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n grn_items GRNItem[]\n invoice_items InvoiceItem[]\n\n @@index([purchase_order_id])\n @@index([purchase_request_id])\n @@index([item_id])\n @@index([boq_event_item_id])\n @@map(\"purchase_order_items\")\n}\n\n//------------------------------------ PURCHASE ORDER ITEMS MODEL END --------------------------------------\n\n//------------------------------------ PURCHASE ORDER ACTIVITY MODEL START --------------------------------------\n\nenum POActivityType {\n CREATED\n REQUESTED\n UPLOADED\n SENT_TO_VENDOR\n COMPLETED\n CANCELLED\n OTHER\n}\n\nmodel PurchaseOrderActivityLog {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n purchase_order_id Int?\n purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)\n user_id Int? // Could be buyer or vendor\n user User? @relation(fields: [user_id], references: [id], onDelete: SetNull)\n vendor_id Int?\n activity_type POActivityType? @default(CREATED)\n remarks String? // Optional free text for custom remarks\n metadata Json? // Any additional details (file info, etc.)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@index([purchase_order_id])\n @@index([user_id])\n @@index([vendor_id])\n @@map(\"purchase_order_activity_logs\")\n}\n\n//------------------------------------ PURCHASE ORDER ACTIVITY MODEL END --------------------------------------\n\n//------------------------------------- USER VENDOR SOCKET TOKENS MODEL START --------------------------------------------\n\nmodel UserVendorSocketTokens {\n id Int @id @default(autoincrement())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n socket_id String?\n status Boolean? @default(true)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"user_vendor_socket_tokens\")\n}\n\n//------------------------------------- USER VENDOR SOCKET TOKENS MODEL END --------------------------------------------\n\n//------------------------------------- EVENT ACTIVITY LOG MODEL START --------------------------------------------\n\nmodel ActivityLog {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n module_name String? // e.g., \"PurchaseIntake\", \"VendorManagement\"\n module_id Int? // ID of the module instance (e.g., PurchaseIntake ID)\n activity_type String? // e.g., \"created\", \"updated\", \"deleted\"\n description String?\n metadata Json? // Additional details about the activity\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@index([user_id])\n @@index([vendor_id])\n @@map(\"activity_logs\")\n}\n\n//------------------------------------- EVENT ACTIVITY LOG MODEL END --------------------------------------------\n\n//------------------------------------- CONTATC US MODEL END --------------------------------------------\n\nmodel ContactUs {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n full_name String?\n email String?\n mobile_code String?\n mobile String?\n description String?\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n is_reply Boolean? @default(false)\n reply_at DateTime @default(now()) @db.Timestamptz(6)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n\n @@map(\"contact_us\")\n}\n\n//------------------------------------- CONTACT US MODEL END --------------------------------------------\n\n//------------------------------------- UPLOAD MODEL START --------------------------------------------\n\nenum UploadStatus {\n PENDING\n PROCESSING\n COMPLETED\n FAILED\n}\n\nenum UploadModuleEnum {\n ITEM_LIBRARY\n CATEGORY_MASTER\n SUB_CATEGORY_MASTER\n UOM_MASTER\n ATTRIBUTE_MASTER\n}\n\nmodel UploadLog {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n user_id Int\n user User @relation(fields: [user_id], references: [id])\n module UploadModuleEnum?\n file_name String?\n file_size Int?\n status UploadStatus @default(PENDING)\n total_records Int?\n success_count Int?\n failure_count Int?\n error_file_path String?\n started_at DateTime @default(now())\n completed_at DateTime?\n errors Json?\n\n @@map(\"upload_logs\")\n}\n\n//------------------------------------- UPLOAD MODEL END --------------------------------------------\n\n//------------------------------------- USER EVENT CONFIGURATION MODEL END --------------------------------------------\n\nmodel UserEventConfiguration {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String?\n slug String? @unique\n description String?\n is_active Boolean @default(false)\n is_editable Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n\n @@map(\"user_event_configurations\")\n}\n\n//------------------------------------- USER EVENT CONFIGURATION MODEL END --------------------------------------------\n\n//------------------------------------- EXPORT MODEL START ------------------------------------------------------------\n\nenum ExportStatus {\n PENDING\n PROCESSING\n COMPLETED\n FAILED\n}\n\nenum ExportModuleEnum {\n ITEM_LIBRARY\n CATEGORY_MASTER\n SUB_CATEGORY_MASTER\n UOM_MASTER\n ATTRIBUTE_MASTER\n}\n\nmodel ExportLog {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n user_id Int\n user User @relation(fields: [user_id], references: [id])\n module UploadModuleEnum?\n file_name String?\n file_size Int?\n file_path String?\n download_url String?\n error_message String?\n total_records Int?\n processed_records Int? @default(0)\n filters Json?\n status UploadStatus @default(PENDING)\n created_at DateTime @default(now())\n started_at DateTime?\n completed_at DateTime?\n expires_at DateTime? @default(dbgenerated(\"(NOW() + '7 days'::interval)\"))\n\n @@map(\"export_logs\")\n}\n\n//------------------------------------- UPLOAD MODEL END ---------------------------------------------------\n\n//------------------------------------- FISCAL YEAR MODEL START --------------------------------------------\n\nmodel FiscalYear {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String? @unique // e.g., \"FY 2025-26\"\n start_date DateTime?\n end_date DateTime?\n is_active Boolean @default(false) // Only one active year at a time\n is_default Boolean @default(false) // Mark default for new records\n created_at DateTime @default(now())\n created_by Int?\n updated_at DateTime @updatedAt\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime?\n deleted_by Int?\n\n @@index([start_date, end_date])\n @@map(\"fiscal_years\")\n}\n\n//------------------------------------- FISCAL YEAR MODEL END --------------------------------------------\n\n//------------------------------------- BUDGET MODEL START -----------------------------------------------\nenum BudgetStatus {\n WARNING\n HEALTHY\n CRITICAL\n}\n\nmodel Budget {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n code String? @unique // Unique code for the budget\n company_name String?\n fiscal_year String?\n currency String? @default(\"INR\")\n initial_total_annual_budget Decimal? @db.Decimal(15, 2)\n total_annual_budget Decimal? @db.Decimal(15, 2)\n description String?\n status BudgetStatus @default(HEALTHY)\n created_by Int?\n created_at DateTime @default(now())\n updated_by Int?\n updated_at DateTime @updatedAt\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n // Relations\n department_budgets DepartmentBudget[]\n supporting_documents SupportingDocument[]\n\n @@unique([code, fiscal_year], name: \"unique_budget_code_fiscal_year\")\n @@map(\"budgets\")\n}\n\n//------------------------------------- BUDGET MODEL END ---------------------------------------------------------\n\n//------------------------------------- DEPARTMENT BUDGET MODEL START --------------------------------------------\nmodel DepartmentBudget {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n code String? @unique // Unique code for the department budget\n budget_id Int?\n department_id Int?\n initial_allocated_budget Decimal? @db.Decimal(15, 2)\n allocated_budget Decimal? @db.Decimal(15, 2)\n remaining_budget Decimal? @default(0) @db.Decimal(15, 2)\n fiscal_year String? // e.g., \"FY 2025-26\"\n notes String?\n description String?\n created_by Int?\n created_at DateTime @default(now())\n updated_by Int?\n updated_at DateTime @updatedAt\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n\n // Relations\n budget Budget? @relation(fields: [budget_id], references: [id], onDelete: Cascade)\n department Department? @relation(fields: [department_id], references: [id], onDelete: Cascade)\n category_budgets CategoryBudget[]\n supporting_documents SupportingDocument[]\n\n @@unique([budget_id, department_id])\n @@map(\"department_budgets\")\n}\n\n//------------------------------------- DEPARTMENT BUDGET MODEL END --------------------------------------------\n\n//------------------------------------- CATEGORY BUDGET MODEL START --------------------------------------------\nmodel CategoryBudget {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n department_budget_id Int?\n category_id Int?\n initial_allocated_budget Decimal? @db.Decimal(15, 2)\n allocated_budget Decimal @db.Decimal(15, 2)\n remaining_budget Decimal @default(0) @db.Decimal(15, 2)\n fiscal_year String? // e.g., \"FY 2025-26\"\n notes String?\n description String?\n total_held_amount Decimal @default(0) @db.Decimal(15, 2) // Running total of all PENDING holds\n crated_by Int?\n created_at DateTime @default(now())\n updated_by Int?\n updated_at DateTime @updatedAt\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n\n // Relations\n department_budget DepartmentBudget? @relation(fields: [department_budget_id], references: [id], onDelete: Cascade)\n category Category? @relation(fields: [category_id], references: [id], onDelete: Cascade)\n expenses Expense[]\n supporting_documents SupportingDocument[]\n budget_holds BudgetHold[] // New relation\n\n @@unique([department_budget_id, category_id])\n @@map(\"category_budgets\")\n}\n\n//------------------------------------- CATEGORY BUDGET MODEL END --------------------------------------------------\n\nenum BudgetHoldStatus {\n PENDING\n RELEASED\n REJECTED\n PARTIAL\n}\n\nmodel BudgetHold {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n category_budget_id Int?\n hold_amount Decimal? @default(0) @db.Decimal(15, 2)\n consumed_amount Decimal? @default(0) @db.Decimal(15, 2)\n status BudgetHoldStatus @default(PENDING)\n reference_type String? // e.g., \"PURCHASE_INTAKE\", \"FAST_CATALOGUE\", \"BLANKET_PURCHASE_ORDER\"\n reference_id Int? // The ID of the source record that triggered this hold\n reason String? // Why the hold was created\n held_at DateTime @default(now()) // When the hold was placed\n resolved_at DateTime? // When it was approved / rejected / released / cancelled\n created_by Int?\n created_at DateTime @default(now())\n updated_by Int?\n updated_at DateTime @updatedAt\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n\n // Relations\n category_budget CategoryBudget? @relation(fields: [category_budget_id], references: [id], onDelete: Cascade)\n\n @@map(\"budget_holds\")\n}\n\n//------------------------------------- SUPPORTING DOCUMENT MODEL START --------------------------------------------\n\nmodel SupportingDocument {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n budget_id Int?\n department_budget_id Int?\n category_budget_id Int?\n file_name String?\n original_name String?\n file_path String?\n file_size Int?\n mime_type String?\n created_by Int?\n created_at DateTime @default(now())\n updated_by Int?\n updated_at DateTime @updatedAt\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n\n // Relations\n budget Budget? @relation(fields: [budget_id], references: [id], onDelete: Cascade)\n department_budget DepartmentBudget? @relation(fields: [department_budget_id], references: [id], onDelete: Cascade)\n category_budget CategoryBudget? @relation(fields: [category_budget_id], references: [id], onDelete: Cascade)\n\n @@map(\"supporting_documents\")\n}\n\n//------------------------------------- SUPPORTING DOCUMENT MODEL END --------------------------------------------\n\n//------------------------------------- EXPENSE MODEL START ------------------------------------------------------\n\n// For tracking actual expenses against budgets\nmodel Expense {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n category_budget_id Int?\n amount Decimal @db.Decimal(15, 2)\n description String?\n expense_date DateTime?\n receipt_number String?\n vendor_name String?\n notes String?\n created_at DateTime @default(now())\n updated_at DateTime @updatedAt\n\n // Relations\n category_budget CategoryBudget? @relation(fields: [category_budget_id], references: [id], onDelete: Cascade)\n\n @@map(\"expenses\")\n}\n\n//------------------------------------- EXPENSE MODEL END -----------------------------------------------------\n\n//------------------------------------- VENDOR REFERENCE MODEL START ------------------------------------------\n\nmodel VendorReference {\n id Int @id @default(autoincrement())\n global_vendor_id Int? // reference id from global vendor\n tenant_vendor_code String? // reference id from tenant vendor\n invited_by Int? // who invited the vendor to the tenant\n user User? @relation(fields: [invited_by], references: [id], onDelete: Cascade)\n invited_on DateTime?\n meta_data Json? // Additional metadata about the vendor\n is_deleted Boolean @default(false)\n created_at DateTime @default(now())\n created_by Int?\n updated_at DateTime @updatedAt\n updated_by Int?\n deleted_at DateTime?\n deleted_by Int?\n\n @@map(\"vendor_references\")\n}\n\n//------------------------------------- VENDOR REFERENCE MODEL END ----------------------------------------------\n\n//------------------------------------- FAST CATALOGUE MODEL START ----------------------------------------------\n\nenum RequestedCatalogueStatusEnum {\n ACTIVE\n COMPLETED\n}\n\nenum RequestedCatalogueSubmissionStatusEnum {\n PENDING\n PARTIAL\n COMPLETED\n APPROVED\n}\n\nmodel RequestedCatalogue {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n code String? @unique // Unique code for the catalogue\n request_status RequestedCatalogueStatusEnum? @default(ACTIVE)\n submission_status RequestedCatalogueSubmissionStatusEnum? @default(PENDING)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n requested_catalogue_details RequestedCatalogueDetails[]\n\n @@map(\"requested_catalogues\")\n}\n\n//------------------------------------- FAST CATALOGUE MODEL END ------------------------------------------------------\n\n//------------------------------------- FAST CATALOGUE DETAILS MODEL START ----------------------------------------------\n\nenum RequestedCatalogueDetailsStatusEnum {\n REQUESTED\n QUOTED\n REJECTED\n AUTO_REJECTED\n MARK_FOR_LATER\n ACCEPTED\n DECLINED\n}\n\nmodel RequestedCatalogueDetails {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n req_catalogue_id Int?\n req_catalogue RequestedCatalogue? @relation(fields: [req_catalogue_id], references: [id], onDelete: Cascade)\n item_id Int?\n parent_item Item? @relation(\"ParentItemRequests\", fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n variant_id Int?\n variant Item? @relation(\"VariantItemRequests\", fields: [variant_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n vendor_id Int?\n status RequestedCatalogueDetailsStatusEnum? @default(REQUESTED)\n stock Int?\n unit_price Decimal? @db.Decimal(15, 2)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([req_catalogue_id])\n @@index([item_id])\n @@index([variant_id])\n @@map(\"requested_catalogue_details\")\n}\n\n//------------------------------------- FAST CATALOGUE DETAILS MODEL END --------------------------------------------------\n\n//---------------------------------- CATALOGUE MODEL START ---------------------------------------\n\nenum CatalogueStatusEnum {\n ACTIVE\n INACTIVE\n}\n\nmodel Catalogue {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n req_catalogue_id Int?\n item_id Int?\n parent_item Item? @relation(\"ParentItemCatalogue\", fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n variant_id Int?\n variant Item? @relation(\"VariantItemCatalogue\", fields: [variant_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n status CatalogueStatusEnum @default(ACTIVE)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n catalogue_vendors CatalogueVendor[]\n\n @@index([req_catalogue_id])\n @@index([item_id])\n @@index([variant_id])\n @@map(\"catalogue\")\n}\n\n//---------------------------------- CATALOGUE MODEL END ---------------------------------------\n\n//---------------------------------- CATALOGUE VENDOR MODEL START ---------------------------------------\n\nenum CatalogueVendorStatusEnum {\n ACTIVE\n INACTIVE\n}\n\nmodel CatalogueVendor {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n catalogue_id Int?\n catalogue Catalogue? @relation(fields: [catalogue_id], references: [id], onDelete: Cascade)\n item_id Int?\n parent_item Item? @relation(\"ParentItemCatalogueVendor\", fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n variant_id Int?\n variant Item? @relation(\"VariantItemCatalogueVendor\", fields: [variant_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n vendor_id Int?\n stock Int?\n price Decimal? @db.Decimal(15, 2)\n status CatalogueVendorStatusEnum @default(ACTIVE)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([catalogue_id])\n @@index([vendor_id])\n @@map(\"catalogue_vendor\")\n}\n\n//---------------------------------- CATALOGUE VENDOR MODEL END ---------------------------------------\n//---------------------------------- CATALOGUE CART MODEL START ---------------------------------------\n\nenum CatalogueCartTypeEnum {\n BLANKET_PURCHASE_ORDER\n FAST_CATALOGUE\n OTHER\n}\n\nmodel CatalogueCart {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n item_id Int?\n item Item? @relation(\"ParentItemCatalogueCart\", fields: [item_id], references: [id], onDelete: Cascade)\n variant_id Int?\n variant Item? @relation(\"VariantItemCatalogueCart\", fields: [variant_id], references: [id], onDelete: Cascade)\n quantity Int?\n catalogue_cart_type CatalogueCartTypeEnum? @default(FAST_CATALOGUE)\n price Decimal? @db.Decimal(15, 2)\n total_price Decimal? @db.Decimal(15, 2)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([user_id])\n @@index([item_id])\n @@index([variant_id])\n @@index([vendor_id])\n @@map(\"catalogue_cart\")\n}\n\n//---------------------------------- CATALOGUE CART MODEL END ---------------------------------------\n\n//---------------------------------- RFI FORM TEMPLATE MODEL START ---------------------------------------\nmodel EventRfiForm {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int? @unique\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n form_data Json? @db.JsonB\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n event_rfi_form_logs EventRfiFormLog[]\n\n @@index([event_id])\n @@map(\"event_rfi_forms\")\n}\n\n//---------------------------------- RFI FORM TEMPLATE MODEL END ---------------------------------------\n\n//---------------------------------- RFI SUBMISSION LOG MODEL START ---------------------------------------\nenum EventRfiFormStatus {\n PENDING\n SUBMITTED\n APPROVED\n REJECTED\n DRAFT\n}\n\nmodel EventRfiFormLog {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n rfi_form_id Int?\n rfi_form EventRfiForm? @relation(fields: [rfi_form_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n rfi_form_response Json? @db.JsonB\n status EventRfiFormStatus @default(DRAFT)\n reviewed_at DateTime? @db.Timestamptz(6)\n reviewed_by Int?\n user User? @relation(fields: [reviewed_by], references: [id], onDelete: Cascade)\n comments String?\n rating Int?\n version Int @default(1)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([event_id, event_vendor_id])\n @@index([event_id, status])\n @@index([event_vendor_id])\n @@map(\"event_rfi_form_logs\")\n}\n\n//---------------------------------- RFI SUBMISSION LOG MODEL END ---------------------------------------\n\n//---------------------------------- EVENT CRITERIA MODEL START ------------------------------------------------\n\nmodel EventCriteria {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n criteria_name String? // e.g., \"Price\", \"Quality\", \"Delivery\", \"Technical Specs\", etc.\n criteria_slug String? // Slug for easy identification, e.g., \"price\", \"quality\", \"delivery\"\n weightage Decimal @db.Decimal(5, 2) // Percentage (0-100), e.g., 40, 30, 30\n is_price_criteria Boolean @default(false) // True for Price (auto-calculated from lowest bid/quotation)\n min_score Int? @default(0) // Minimum score value (default: 0)\n max_score Int? @default(5) // Maximum score value (default: 5)\n description String? // Optional description/instructions for evaluators\n display_order Int? @default(0) // Order to display criteria in UI\n is_active Boolean @default(true)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n // Relations\n event_vendor_criteria EventVendorCriteria[]\n\n @@index([event_id])\n @@index([criteria_slug])\n @@index([is_price_criteria])\n @@map(\"event_criteria\")\n}\n\n//---------------------------------- EVENT CRITERIA MODEL END ------------------------------------------------\n\n//---------------------------------- EVENT VENDOR CRITERIA MODEL START ------------------------------------------------\nmodel EventVendorCriteria {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n event_criteria_id Int?\n event_criteria EventCriteria? @relation(fields: [event_criteria_id], references: [id], onDelete: Cascade)\n // Raw values\n raw_score Decimal? @db.Decimal(10, 2) // For manual criteria: user input (0-5)\n raw_price Decimal? @db.Decimal(15, 2) // For price criteria: actual bid/quotation amount\n // Calculated values\n normalized_score Decimal? @db.Decimal(10, 4) // Normalized score (0-5 scale)\n weighted_contribution Decimal? @db.Decimal(10, 4) // normalized_score × (weightage/100)\n // Metadata\n notes String? // Optional notes/justification for the score\n scored_at DateTime? @db.Timestamptz(6)\n scored_by Int? // User who assigned the score\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([event_vendor_id, event_criteria_id], name: \"unique_vendor_criteria\")\n @@index([event_id])\n @@index([event_vendor_id])\n @@index([event_criteria_id])\n @@map(\"event_vendor_criteria\")\n}\n\n//---------------------------------- EVENT VENDOR CRITERIA MODEL END ------------------------------------------------\n\n//---------------------------------- CHAT CONVERSATION MODEL START ------------------------------------------------\n// \n// CHAT SYSTEM DESIGN:\n// 1. ONE_ON_ONE: Direct chat between Admin and Vendor (one-to-one)\n// 2. EVENT_GROUP: Admin creates event conversation, can message all vendors or specific vendors\n// - Vendors cannot see each other's messages (privacy maintained via MessageRecipient)\n// - Admin can send broadcast (ALL_PARTICIPANTS) or targeted (SPECIFIC_RECIPIENTS) messages\n//\n// MESSAGE FLOW:\n// - Sender info stored in Message model (sender_user_id or sender_vendor_id)\n// - Receiver info stored in MessageRecipient model (recipient_user_id or recipient_vendor_id)\n// - Each vendor only sees messages where they are recipients\n// - For EVENT_GROUP broadcasts, create MessageRecipient entries for each vendor\n//\n\nenum ConversationType {\n ONE_ON_ONE // User/Admin to Vendor direct chat (one-to-one)\n EVENT_GROUP // Event group chat - Admin can message all or specific vendors\n}\n\nenum ConversationStatus {\n ACTIVE\n ARCHIVED\n DELETED\n}\n\nmodel Conversation {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n type ConversationType @default(ONE_ON_ONE)\n event_id Int? // For EVENT_GROUP type - links to Event\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n admin_user_id Int? // Admin/User who created/manages the conversation\n admin_user User? @relation(\"ConversationAdminUser\", fields: [admin_user_id], references: [id], onDelete: Cascade)\n vendor_id Int? // For ONE_ON_ONE type - the vendor in conversation (not used for EVENT_GROUP)\n title String? // Optional title for group chats\n status ConversationStatus @default(ACTIVE)\n last_message_at DateTime? @db.Timestamptz(6)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n // Relations\n messages Message[]\n conversation_participants ConversationParticipant[]\n\n // Unique constraint: For ONE_ON_ONE - one conversation per admin-vendor pair\n // For EVENT_GROUP - vendor_id is NULL, so multiple conversations per admin-event are allowed\n @@unique([admin_user_id, vendor_id, event_id], name: \"unique_one_on_one_conversation\")\n @@index([admin_user_id])\n @@index([vendor_id])\n @@index([event_id])\n @@index([type])\n @@index([status])\n @@map(\"conversations\")\n}\n\n//---------------------------------- CHAT CONVERSATION MODEL END ------------------------------------------------\n\n//---------------------------------- CONVERSATION PARTICIPANT MODEL START ------------------------------------------------\n\nmodel ConversationParticipant {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n conversation_id Int\n conversation Conversation @relation(fields: [conversation_id], references: [id], onDelete: Cascade)\n\n // Participant Information\n user_id Int? // Participant: Admin/User ID (for admin participants)\n user User? @relation(\"ConversationParticipantUser\", fields: [user_id], references: [id], onDelete: Cascade)\n vendor_id Int? // Participant: Vendor ID (for vendor participants)\n is_admin Boolean @default(false) // True if user participant is admin\n\n // Participation Tracking\n joined_at DateTime @default(now()) @db.Timestamptz(6)\n left_at DateTime? @db.Timestamptz(6)\n last_read_at DateTime? @db.Timestamptz(6)\n is_active Boolean @default(true)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n\n @@unique([conversation_id, user_id, vendor_id], name: \"unique_participant\")\n @@index([conversation_id])\n @@index([user_id])\n @@index([vendor_id])\n @@map(\"conversation_participants\")\n}\n\n//---------------------------------- CONVERSATION PARTICIPANT MODEL END ------------------------------------------------\n\n//---------------------------------- MESSAGE MODEL START ------------------------------------------------\n\nenum MessageType {\n TEXT\n FILE\n SYSTEM\n}\n\nenum MessageSenderType {\n USER // Admin/User sender\n VENDOR // Vendor sender\n}\n\nenum MessageBroadcastType {\n ALL_PARTICIPANTS // Sent to all participants in EVENT_GROUP conversation\n SPECIFIC_RECIPIENTS // Sent to specific recipients (handled via MessageRecipient)\n}\n\nmodel Message {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n conversation_id Int\n conversation Conversation @relation(fields: [conversation_id], references: [id], onDelete: Cascade)\n\n // Sender Information (clear naming)\n sender_type MessageSenderType // USER (Admin) or VENDOR\n sender_user_id Int? // Sender: Admin/User ID (if sender_type is USER)\n sender_user User? @relation(\"MessageSenderUser\", fields: [sender_user_id], references: [id], onDelete: SetNull)\n sender_vendor_id Int? // Sender: Vendor ID (if sender_type is VENDOR)\n\n // Broadcast Type (for EVENT_GROUP conversations)\n broadcast_type MessageBroadcastType @default(SPECIFIC_RECIPIENTS) // ALL_PARTICIPANTS or SPECIFIC_RECIPIENTS\n\n // Message Content\n message_type MessageType @default(TEXT)\n content String? // Text content\n file Json? // For multiple files\n is_edited Boolean @default(false)\n edited_at DateTime? @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n\n // Reply functionality - allows users to reply to their own or other messages\n reply_to_message_id Int? // ID of the message being replied to (self-referential)\n reply_to_message Message? @relation(\"MessageReplies\", fields: [reply_to_message_id], references: [id], onDelete: SetNull)\n replies Message[] @relation(\"MessageReplies\") // Messages that reply to this message\n\n // Relations\n recipients MessageRecipient[] // Receivers are stored here (vendors cannot see each other's messages)\n\n @@index([conversation_id])\n @@index([sender_user_id])\n @@index([sender_vendor_id])\n @@index([sender_type])\n @@index([broadcast_type])\n @@index([created_at])\n @@index([reply_to_message_id])\n @@map(\"messages\")\n}\n\n//---------------------------------- MESSAGE MODEL END ------------------------------------------------\n\n//---------------------------------- MESSAGE RECIPIENT MODEL START ------------------------------------------------\n\nenum MessageRecipientType {\n USER // Admin/User recipient\n VENDOR // Vendor recipient\n}\n\nenum MessageReadStatus {\n SENT\n DELIVERED\n READ\n}\n\nmodel MessageRecipient {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n message_id Int\n message Message @relation(fields: [message_id], references: [id], onDelete: Cascade)\n\n // Receiver Information (clear naming)\n recipient_type MessageRecipientType // USER (Admin) or VENDOR\n recipient_user_id Int? // Receiver: Admin/User ID (if recipient_type is USER)\n recipient_user User? @relation(\"MessageRecipientUser\", fields: [recipient_user_id], references: [id], onDelete: Cascade)\n recipient_vendor_id Int? // Receiver: Vendor ID (if recipient_type is VENDOR)\n\n // Read Status Tracking\n read_status MessageReadStatus @default(SENT)\n read_at DateTime? @db.Timestamptz(6)\n delivered_at DateTime? @db.Timestamptz(6)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@unique([message_id, recipient_user_id, recipient_vendor_id], name: \"unique_message_recipient\")\n @@index([message_id])\n @@index([recipient_user_id])\n @@index([recipient_vendor_id])\n @@index([recipient_type])\n @@index([read_status])\n @@map(\"message_recipients\")\n}\n\n//---------------------------------- MESSAGE RECIPIENT MODEL END ------------------------------------------------\n\n//------------------------------------ BLANKET PURCHASE ORDER MODEL START ------------------------------------\n\nenum BlanketPurchaseOrderStatus {\n PENDING\n ACTIVE\n EXPIRED\n COMPLETED\n REJECTED\n}\n\nenum ReleaseFrequency {\n DAILY\n WEEKLY\n MONTHLY\n QUARTERLY\n CUSTOM\n}\n\nenum SplitMethod {\n EQUAL_SPLIT\n CUSTOM_SPLIT\n}\n\nmodel BlanketPurchaseOrder {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n bpo_number String? @unique\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n bpo_date DateTime @default(now()) @db.Timestamptz(6)\n start_date DateTime? @db.Timestamptz(6)\n end_date DateTime? @db.Timestamptz(6)\n total_bpo_value Decimal @default(0.00) @db.Decimal(15, 2)\n fulfilled_quantity Int @default(0)\n total_quantity Int @default(0)\n status BlanketPurchaseOrderStatus @default(PENDING)\n attachments Json? @db.JsonB\n terms_conditions String?\n notes String?\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n blanket_po_items BlanketPurchaseOrderItem[]\n blanket_po_releases BlanketPurchaseOrderRelease[]\n generated_purchase_orders PurchaseOrder[]\n\n @@index([vendor_id])\n @@index([event_id])\n @@index([event_vendor_id])\n @@index([status])\n @@index([bpo_date])\n @@index([start_date, end_date])\n @@map(\"blanket_purchase_orders\")\n}\n\n//------------------------------------ BLANKET PURCHASE ORDER MODEL END ------------------------------------\n\n//------------------------------------ BLANKET PURCHASE ORDER ITEM MODEL START ------------------------------------\n\nmodel BlanketPurchaseOrderItem {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n blanket_po_id Int\n blanket_po BlanketPurchaseOrder @relation(fields: [blanket_po_id], references: [id], onDelete: Cascade)\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)\n total_quantity Int\n fulfilled_quantity Int @default(0)\n unit_price Decimal? @db.Decimal(15, 2)\n total_amount Decimal? @db.Decimal(15, 2)\n release_frequency ReleaseFrequency?\n split_method SplitMethod?\n purchase_request_id Int?\n purchase_request PurchaseIntake? @relation(fields: [purchase_request_id], references: [id], onDelete: Cascade)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n blanket_po_releases BlanketPurchaseOrderRelease[]\n\n @@index([blanket_po_id])\n @@index([item_id])\n @@map(\"blanket_purchase_order_items\")\n}\n\n//------------------------------------ BLANKET PURCHASE ORDER ITEM MODEL END ------------------------------------\n\n//------------------------------------ BLANKET PURCHASE ORDER RELEASE MODEL START ------------------------------------\n\nenum BlanketPurchaseOrderReleaseStatus {\n PLANNED\n COMPLETED\n REJECTED\n PARTIAL\n EXPIRED\n}\n\nmodel BlanketPurchaseOrderRelease {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n blanket_po_id Int\n blanket_po BlanketPurchaseOrder? @relation(fields: [blanket_po_id], references: [id])\n blanket_po_item_id Int\n blanket_po_item BlanketPurchaseOrderItem @relation(fields: [blanket_po_item_id], references: [id], onDelete: Cascade)\n release_number Int\n release_date DateTime @db.Timestamptz(6)\n release_quantity Int\n fulfilled_quantity Int @default(0)\n release_value Decimal @db.Decimal(15, 2)\n delivery_location_id Int?\n delivery_location Location? @relation(fields: [delivery_location_id], references: [id])\n purchase_order_id Int?\n purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)\n delivery_date DateTime? @db.Timestamptz(6)\n status BlanketPurchaseOrderReleaseStatus @default(PLANNED)\n notes String?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([blanket_po_id])\n @@index([blanket_po_item_id])\n @@index([status])\n @@index([release_date])\n @@index([delivery_date])\n @@map(\"blanket_purchase_order_releases\")\n}\n\n//------------------------------------ BLANKET PURCHASE ORDER RELEASE MODEL END ------------------------------------\n\n//------------------------------------ GRN MODEL START ------------------------------------\n\nenum GRNStatus {\n PENDING\n PARTIAL\n COMPLETED\n REJECTED\n}\n\nenum InspectionStatus {\n PENDING\n PARTIAL\n COMPLETED\n REJECTED\n}\n\nmodel GRN {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n\n // GRN details\n grn_number String? @unique\n purchase_order_id Int?\n purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)\n dispatch_date_time DateTime? @db.Timestamptz(6)\n expected_arrival_date DateTime? @db.Timestamptz(6)\n received_date_time DateTime? @db.Timestamptz(6)\n received_by String?\n remarks String?\n start_point String?\n end_point String?\n transporter_name String?\n transport_vehicle_registration_number String?\n transport_vehicle_type String?\n challan_number String?\n driver_name String?\n country_code String?\n driver_contact_number String?\n e_way_bill_number String?\n tracking_link String?\n delivery_challan_documents Json? @db.JsonB\n grn_status GRNStatus @default(PENDING)\n delivery_challan_number String?\n\n // inspection details\n inspection_date_time DateTime? @db.Timestamptz(6)\n inspection_code String? @unique\n warehouse String?\n inspector_name String?\n inspection_status InspectionStatus @default(PENDING)\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n grn_items GRNItem[]\n invoices Invoice[]\n}\n\n//------------------------------------ GRN MODEL END ------------------------------------\n\n//------------------------------------ GRN ITEM MODEL START ------------------------------------\n\nenum GRNItemStatus {\n PENDING\n PARTIAL\n REJECTED\n COMPLETED\n}\n\nmodel GRNItem {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n grn_id Int?\n grn GRN? @relation(fields: [grn_id], references: [id], onDelete: Cascade)\n purchase_order_item_id Int?\n purchase_order_item PurchaseOrderItem? @relation(fields: [purchase_order_item_id], references: [id], onDelete: Cascade)\n dispatch_quantity Int @default(0)\n received_quantity Int @default(0)\n accepted_quantity Int @default(0)\n remarks String?\n inspection_remarks String?\n inspection_attachments Json? @db.JsonB\n status GRNItemStatus @default(PENDING)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n}\n\n//------------------------------------ GRN ITEM MODEL END ------------------------------------\n\n// ------------------------------------ Business Entity MODEL START ------------------------------------\n\nenum BusinessEntityType {\n INDIVIDUAL\n COMPANY\n PARENT_COMPANY\n SUBSIDIARY_COMPANY\n BRANCH_COMPANY\n}\n\nmodel BusinessEntity {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n business_code String? @unique\n business_name String?\n business_email String?\n business_country_code String?\n business_phone String?\n business_website String?\n business_logo String?\n business_description String?\n business_type BusinessEntityType? @default(INDIVIDUAL)\n is_active Boolean? @default(true)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n business_entity_departments BusinessEntityDepartment[]\n business_entity_locations BusinessEntityLocation[]\n user_department_entities UserDepartmentEntity[]\n purchase_intakes PurchaseIntake[]\n events Event[]\n purchase_orders PurchaseOrder[]\n event_rfi_forms EventRfiForm[]\n grns GRN[]\n invoices Invoice[]\n blanket_purchase_orders BlanketPurchaseOrder[]\n approval_hierarchies ApprovalHierarchy[]\n\n @@map(\"business_entities\")\n}\n\n// Many-to-many join table: one BusinessEntity can have multiple Locations,\n// one Location can belong to multiple BusinessEntities.\nmodel BusinessEntityLocation {\n id Int @id @default(autoincrement())\n business_entity_id Int\n location_id Int\n is_primary Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n business_entity BusinessEntity @relation(fields: [business_entity_id], references: [id])\n location Location @relation(fields: [location_id], references: [id])\n\n @@unique([business_entity_id, location_id])\n @@map(\"business_entity_locations\")\n}\n\n// ------------------------------------ Business Entity MODEL END ------------------------------------\n\n// ------------------------------------ INVOICE (BILLS) MODEL START ------------------------------------\n\nenum InvoiceStatus {\n PENDING\n SEND_BACK\n RESUBMITTED\n APPROVED\n PAID\n CANCELLED\n}\n\nenum InvoiceMatchingStatus {\n MATCHED\n MISMATCHED\n}\n\nmodel Invoice {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n invoice_number String? @unique\n purchase_order_id Int?\n purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)\n grn_id Int?\n grn GRN? @relation(fields: [grn_id], references: [id])\n vendor_id Int?\n invoice_date DateTime? @db.Timestamptz(6)\n invoice_due_date DateTime? @db.Timestamptz(6)\n delivery_note_number String?\n quantity_fulfilled Int? @default(0)\n total_po_releases Int? @default(0)\n billing_address String?\n status InvoiceStatus @default(PENDING)\n matching_status InvoiceMatchingStatus @default(MISMATCHED)\n invoice_documents Json? @db.JsonB\n notes String?\n business_entity_id Int?\n terms_and_conditions String?\n e_way_bill_number String?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n invoice_items InvoiceItem[]\n\n @@index([purchase_order_id])\n @@index([grn_id])\n @@index([vendor_id])\n @@index([status])\n @@index([matching_status])\n @@map(\"invoices\")\n}\n\n// ------------------------------------ INVOICE (BILLS) MODEL END ------------------------------------\n\n// ------------------------------------ INVOICE ITEM MODEL START ------------------------------------\n\nmodel InvoiceItem {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n invoice_id Int?\n invoice Invoice? @relation(fields: [invoice_id], references: [id], onDelete: Cascade)\n purchase_order_item_id Int?\n purchase_order_item PurchaseOrderItem? @relation(fields: [purchase_order_item_id], references: [id])\n ordered_quantity Int? @default(0)\n invoice_quantity Int? @default(0)\n uom String?\n unit_amount Decimal @default(0) @db.Decimal(15, 2)\n total_amount Decimal @default(0) @db.Decimal(15, 2)\n po_quantity Int? @default(0)\n grn_quantity Int? @default(0)\n quality_quantity Int? @default(0)\n matching_status InvoiceMatchingStatus @default(MISMATCHED)\n resolution_action String?\n resolution_remarks String?\n resolved_at DateTime? @db.Timestamptz(6)\n resolved_by Int?\n\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([invoice_id])\n @@index([purchase_order_item_id])\n @@index([matching_status])\n @@map(\"invoice_items\")\n}\n\n// ------------------------------------ INVOICE ITEM MODEL END ------------------------------------\n\n// ------------------------------------ APPROVAL MANAGEMENT MODEL START --------------------------------\n\nenum ApprovalManagementStatusEnum {\n PENDING\n APPROVED\n REJECTED\n}\n\nmodel ApprovalManagement {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n journy_type String? // module e.g. user-management, event-management\n journey_task String? // task e.g. user-updation-approval, event-bid-award-approval\n parent_id String? // parent entity uuid (user, event, PI, etc.)\n user_id Int? // optional when subject is a user\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n proposed_payload Json?\n previous_snapshot Json?\n estimated_budget Decimal? @db.Decimal(18, 2)\n batch_id String?\n request_status ApprovalManagementStatusEnum @default(PENDING)\n reject_reason String?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n\n @@index([parent_id])\n @@index([journy_type, journey_task])\n @@index([batch_id])\n @@index([request_status])\n @@map(\"approval_management\")\n}\n\n// ------------------------------------ APPROVAL MANAGEMENT MODEL END ----------------------------------\n",
|
|
23
|
+
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n moduleFormat = \"esm\"\n generatedFileExtension = \"ts\"\n importFileExtension = \"ts\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n//---------------------------------- SERIAL NUMBER CONFIGURATION MODEL START ------------------------------------------------\nmodel SerialNumberConfiguration {\n id Int @id @default(autoincrement())\n module String? @unique\n alias String?\n initial_number Int?\n current_number Int?\n created_at DateTime? @default(now())\n\n @@index([module])\n @@map(\"serial_number_configurations\")\n}\n\n//---------------------------------- SERIALNUMBERCONFIGURATION MODEL END ------------------------------------------------\n\n//---------------------------------- USER MODEL START ------------------------------------------------\n\nenum StatusEnum {\n Active\n InActive\n Blocked\n Suspended\n PENDING_FOR_APPROVAL\n REJECTED_FOR_APPROVAL\n}\n\nenum EnvironmentEnum {\n PRODUCTION\n SANDBOX\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n unique_id String? @unique\n name String?\n first_name String?\n middle_name String?\n last_name String?\n email_id String? @unique\n password String?\n country_code String?\n mobile_number String? @unique\n status StatusEnum @default(InActive)\n reject_reason String?\n is_email_verified Boolean @default(false)\n is_mobile_verified Boolean @default(false)\n profile_picture String?\n invitation_status Boolean @default(false)\n reset_token String?\n reset_token_expiry DateTime? @db.Timestamptz(6)\n access_token_expiry String?\n token_version Int? @default(0) // This will be used to invalidate old refresh tokens\n is_logged_in Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n user_environment EnvironmentEnum @default(PRODUCTION)\n contract_role String?\n user_roles UserRole[]\n user_department_entities UserDepartmentEntity[]\n approval_hierarchy ApprovalHierarchy[]\n approval_journey ApprovalJourney[]\n approval_journey_original ApprovalJourney[] @relation(\"OriginalApprover\")\n approval_level_escalation ApprovalLevelEscalation[]\n approval_delegations_as_approver ApprovalDelegation[] @relation(\"DelegatingApprover\")\n approval_delegations_as_delegate ApprovalDelegation[] @relation(\"DelegateUser\")\n approval_delegation_delegates ApprovalDelegationDelegate[] @relation(\"DelegationDelegate\")\n ticket_replies TicketReply[] @relation(\"user_reply\")\n ticket_assignment_by TicketAssignment[] @relation(\"user_assigned_by\")\n ticket_assignment_to TicketAssignment[] @relation(\"user_assigned_to\")\n ticket_assignment_by_user TicketHistory[] @relation(\"user_assigned_by\")\n ticket_assignment_to_user TicketHistory[] @relation(\"user_assigned_to\")\n admin_alerts AdminAlert[]\n purchase_intake PurchaseIntake[]\n approval_level_user ApprovalLevelUser[]\n approval_level_escalation_user ApprovalLevelEscalationUser[]\n purchase_intake_deleted_by PurchaseIntake[] @relation(\"purchase_intake_deleted_by\")\n template Template[]\n event Event[]\n form_master FormMaster[]\n dynamic_form DynamicForm[]\n purchase_order PurchaseOrder[]\n purchase_order_activity_log PurchaseOrderActivityLog[]\n user_socket_tokens UserVendorSocketTokens[]\n activity_logs ActivityLog[]\n contact_us ContactUs[]\n upload_logs UploadLog[]\n export_logs ExportLog[]\n department_head Department[] @relation(\"department_head\")\n budget_manager Department[] @relation(\"budget_manager\")\n vendor_reference VendorReference[]\n catalogue_cart CatalogueCart[]\n send_back_approvers SendBack[] @relation(\"send_back_approver\")\n send_back_requestors SendBack[] @relation(\"send_back_requestor\")\n user_login_activities UserLoginActivity[]\n event_rfi_form_logs EventRfiFormLog[]\n conversations_as_admin Conversation[] @relation(\"ConversationAdminUser\")\n conversation_participants ConversationParticipant[] @relation(\"ConversationParticipantUser\")\n messages_sent Message[] @relation(\"MessageSenderUser\")\n message_recipients MessageRecipient[] @relation(\"MessageRecipientUser\")\n blanket_po BlanketPurchaseOrder[]\n purchase_intake_initiated_by PurchaseIntake[] @relation(\"purchase_intake_initiated_by\")\n approval_management ApprovalManagement[]\n\n @@map(\"users\")\n}\n\n//---------------------------------- USER MODEL END ------------------------------------------------\n\n//---------------------------------- ROLE MODEL START ------------------------------------------------\nmodel Role {\n id Int @id @default(autoincrement())\n role_name String?\n slug String @unique\n description String?\n is_active Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n user_roles UserRole[]\n role_permission RolePermission[]\n approval_hierarchy ApprovalHierarchy[]\n\n @@map(\"roles\")\n}\n\n//---------------------------------- ROLE MODEL END ------------------------------------------------\n\n//---------------------------------- USER ROLE MODEL START ------------------------------------------------\nmodel UserRole {\n id Int @id @default(autoincrement())\n user_id Int\n role_id Int\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n user User @relation(fields: [user_id], references: [id], onDelete: Cascade)\n role Role @relation(fields: [role_id], references: [id], onDelete: Cascade)\n\n @@map(\"user_roles\")\n}\n\n//---------------------------------- USER ROLE MODEL END ------------------------------------------------\n\n//---------------------------------- PERMISSION MODEL START ------------------------------------------------\nmodel Permission {\n id Int @id @default(autoincrement())\n permissions_name String?\n slug String @unique\n description String?\n model String?\n is_active Boolean @default(false)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n role_permission RolePermission[]\n\n @@map(\"permissions\")\n}\n\n//---------------------------------- PERMISSION MODEL END ------------------------------------------------\n\n//---------------------------------- ROLE PERMISSION MODEL START ------------------------------------------------\nmodel RolePermission {\n id Int @id @default(autoincrement())\n permission_id Int\n role_id Int\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n permission Permission @relation(fields: [permission_id], references: [id], onDelete: Cascade)\n role Role @relation(fields: [role_id], references: [id], onDelete: Cascade)\n\n @@map(\"role_permissions\")\n}\n\n//---------------------------------- ROLE PERMISSION MODEL END ------------------------------------------------\n\n//---------------------------------- DEPARTMENT MODEL START ------------------------------------------------\nmodel Department {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n department_code String? @unique\n department_name String?\n department_slug String? @unique\n department_head Int?\n department_head_user User? @relation(\"department_head\", fields: [department_head], references: [id])\n budget_manager Int?\n budget_manager_user User? @relation(\"budget_manager\", fields: [budget_manager], references: [id])\n description String?\n is_active Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n // user_department UserDepartment[]\n department_budget DepartmentBudget[]\n business_entity_departments BusinessEntityDepartment[]\n\n @@map(\"departments\")\n}\n\n//---------------------------------- DEPARTMENT MODEL END ------------------------------------------------\n\n//---------------------------------- USER DEPARTMENT MODEL START ------------------------------------------------\nmodel UserDepartmentEntity {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n bussiness_entity_department_id Int?\n bussiness_entity_department BusinessEntityDepartment? @relation(fields: [bussiness_entity_department_id], references: [id], onDelete: Cascade)\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id])\n is_primary Boolean? @default(false)\n is_deleted Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([user_id, bussiness_entity_department_id])\n @@map(\"user_department_entities\")\n}\n\n//---------------------------------- USER DEPARTMENT MODEL END ------------------------------------------------\n\n//---------------------------------- BUSINESS ENTITY DEPARTMENT MODEL START ------------------------------------------------\n// Many-to-many join table: one Department can belong to many BusinessEntities,\n// one BusinessEntity can have many Departments.\nmodel BusinessEntityDepartment {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id])\n department_id Int?\n department Department? @relation(fields: [department_id], references: [id])\n is_active Boolean? @default(true)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n userDepartmentEntities UserDepartmentEntity[]\n\n @@unique([business_entity_id, department_id])\n @@map(\"business_entity_departments\")\n}\n\n//---------------------------------- BUSINESS ENTITY DEPARTMENT MODEL END ------------------------------------------------\n\n//---------------------------------- INDUSTRY MODEL START ----------------------------------\nmodel Industry {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String? @unique\n slug String?\n is_active Boolean @default(true)\n description String?\n created_by Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n categories Category[]\n\n @@map(\"industries\")\n}\n\n//---------------------------------- INDUSTRY MODEL END ----------------------------------\n\n//---------------------------------- CATEGORY MODEL START ----------------------------------\nmodel Category {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n industry_id Int?\n industry Industry? @relation(fields: [industry_id], references: [id])\n name String? @unique\n slug String?\n is_active Boolean @default(true)\n parent_id Int @default(0)\n description String?\n image_url String?\n created_by Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n attributes Attribute[]\n category_uom UomCategory[]\n category_budget CategoryBudget[]\n item_category Item[] @relation(\"ItemCategory\")\n item_sub_category Item[] @relation(\"ItemSubCategory\")\n boq_event_items_as_category BoqEventItem[] @relation(\"CategoryBoqEventItemAsCategory\")\n boq_event_items_as_sub_category BoqEventItem[] @relation(\"SubCategoryBoqEventItemAsSubCategory\")\n\n @@map(\"categories\")\n}\n\n//---------------------------------- CATEGORY MODEL END ----------------------------------\n\n//---------------------------------- ATTRIBUTE MODEL START ----------------------------------\nmodel Attribute {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n category_id Int?\n category Category? @relation(fields: [category_id], references: [id])\n attribute_name String?\n is_required Boolean? @default(false)\n is_active Boolean? @default(true)\n slug String?\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n attribute_values AttributeValue[]\n item_attributes ItemAttribute[]\n\n @@unique([category_id, attribute_name])\n @@map(\"attributes\")\n}\n\n//---------------------------------- ATTRIBUTE MODEL END ----------------------------------\n\n//---------------------------------- ATTRIBUTEVALUE MODEL START ----------------------------------\nmodel AttributeValue {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n attribute_id Int?\n attribute Attribute? @relation(fields: [attribute_id], references: [id])\n attribute_value_name String?\n is_active Boolean @default(true)\n slug String?\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n item_attribute_values ItemAttributeValue[]\n\n @@unique([attribute_id, attribute_value_name])\n @@map(\"attribute_values\")\n}\n\n//---------------------------------- ATTRIBUTEVALUE MODEL END ----------------------------------\n\n//---------------------------------- ITEM MODEL START ----------------------------------\nmodel Item {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n is_parent Boolean @default(false)\n parent_id Int? @default(0)\n category_id Int?\n category Category? @relation(\"ItemCategory\", fields: [category_id], references: [id])\n sub_category_id Int?\n sub_category Category? @relation(\"ItemSubCategory\", fields: [sub_category_id], references: [id])\n uomId Int?\n uom Uom? @relation(fields: [uomId], references: [id])\n item_code String? @unique @db.VarChar(500)\n item_name String? @db.VarChar(500)\n item_handler String? @db.VarChar(1000)\n slug String? @unique @db.VarChar(1000)\n description String? @db.VarChar(1000)\n terms_and_conditions String[] @db.VarChar(1000)\n keywords String[] @db.VarChar(1000)\n tags Json? @db.JsonB\n cost_price Decimal? @default(0.00) @db.Decimal(10, 2)\n selling_price Decimal? @default(0.00) @db.Decimal(10, 2)\n profit Decimal? @default(0.00) @db.Decimal(10, 2)\n margin Decimal? @default(0.00) @db.Decimal(10, 2)\n title String? @db.VarChar(500)\n continue_selling_when_out_of_stock Boolean? @default(false)\n physical_product Boolean? @default(false)\n variant_attributes Json? @db.JsonB // {\"color\": \"red\", \"size\": \"large\", \"material\": \"cotton\"}\n variant_display_name String? @db.VarChar(500) // \"Red Large Cotton\" - auto-generated or custom\n available_qty Int? @default(0)\n inventory_reason String? @db.VarChar(500)\n reserved_quantity Int? @default(0)\n stock_in_hand Int? @default(0)\n reorder_level Int? @default(0) // NEW: When to reorder\n max_stock_level Int? // NEW: Maximum stock level\n sku String? @unique @db.VarChar(500)\n is_taxable Boolean? @default(false)\n bar_code String? @unique @db.VarChar(500) // Made unique\n physical_item Boolean? @default(false)\n track_quantity Boolean? @default(false)\n weight Decimal? @default(0.00) @db.Decimal(10, 2)\n dimensions Json? @db.JsonB // {\"length\": 10, \"width\": 5, \"height\": 2, \"unit\": \"cm\"}\n shipping_weight Decimal? @db.Decimal(10, 2) // Different from product weight\n media Json? @db.JsonB\n specifications Json? @db.JsonB\n template_suffix String?\n seo_page_title String?\n seo_meta_keyword String?\n seo_meta_description String?\n step_completed Int? @default(0)\n is_published Boolean? @default(false)\n published_at DateTime? @db.Timestamptz(6)\n published_by Int?\n is_active Boolean @default(true)\n is_featured Boolean @default(false) // NEW: For featured products\n is_default_variant Boolean @default(false) // NEW: Default variant for parent\n sort_order Int @default(0) // NEW: For ordering variants\n min_order_qty Int @default(1) // Minimum order quantity\n max_order_qty Int? // Maximum order quantity\n is_bulk_pricing_enabled Boolean @default(false) // For bulk pricing\n bulk_pricing_tiers Json? @db.JsonB // [{\"qty\": 10, \"price\": 20}, {\"qty\": 50, \"price\": 18}]\n created_by Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n purchase_intake_items PurchaseIntakeItem[]\n item_attributes ItemAttribute[]\n item_attribute_values ItemAttributeValue[]\n item_documents ItemDocument[]\n event_items EventItems[]\n purchase_order_items PurchaseOrderItem[]\n requested_catalogue_items RequestedCatalogueDetails[] @relation(\"ParentItemRequests\")\n requested_catalogue_variants RequestedCatalogueDetails[] @relation(\"VariantItemRequests\")\n catalogue_items Catalogue[] @relation(\"ParentItemCatalogue\")\n catalogue_variants Catalogue[] @relation(\"VariantItemCatalogue\")\n catalogue_vendor_items CatalogueVendor[] @relation(\"ParentItemCatalogueVendor\")\n catalogue_vendor_variants CatalogueVendor[] @relation(\"VariantItemCatalogueVendor\")\n catalogue_cart_items CatalogueCart[] @relation(\"ParentItemCatalogueCart\")\n catalogue_cart_variants CatalogueCart[] @relation(\"VariantItemCatalogueCart\")\n blanket_po_items BlanketPurchaseOrderItem[]\n\n @@index([parent_id, is_active, is_deleted]) // For variant queries\n @@index([is_parent, is_published, is_active]) // For parent product queries\n @@index([available_qty]) // For stock queries\n @@index([reorder_level, available_qty]) // For low stock alerts\n @@index([category_id, is_published, is_active]) // For category browsing\n @@index([created_at]) // For recent products\n @@index([selling_price]) // For price filtering\n @@map(\"item\")\n}\n\n//---------------------------------- ITEM MODEL END ----------------------------------\n\n//---------------------------------- PURCHASEINTAKES MODEL START ----------------------------------\n\n// Enum for priority levels\nenum PurchaseIntakePriorityEnum {\n Urgent\n High\n Medium\n Low\n}\n\n// Enum for status levels\nenum PurchaseIntakeStatusEnum {\n APPROVED\n IN_PROGRESS\n PENDING\n REJECTED\n COMPLETED\n CANCELLED\n AUTO_APPROVED\n AUTO_REJECTED\n SEND_BACK\n EXPIRED\n}\n\nenum PurchaseRequestStatusEnum {\n Open\n InProgress\n OnHold\n Partial\n Closed\n Cancelled\n Completed\n Rejected\n Expired\n}\n\nenum PurchaseIntakeTypeEnum {\n PURCHASE_INTAKE\n FAST_CATALOGUE\n BLANKET_PURCHASE_ORDER\n}\n\nmodel PurchaseIntake {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n pi_number String? @unique\n pr_number String? @unique\n requestor_id Int?\n user User? @relation(fields: [requestor_id], references: [id], onDelete: Cascade)\n type PurchaseIntakeTypeEnum @default(PURCHASE_INTAKE)\n department String?\n request_date DateTime? @default(now()) @db.Timestamptz(6)\n items_or_services_description String?\n priority PurchaseIntakePriorityEnum\n estimated_budget Float?\n status PurchaseIntakeStatusEnum @default(PENDING)\n pr_status PurchaseRequestStatusEnum @default(Open)\n reject_reason String?\n pr_reject_reason String?\n attachments Json?\n if_yes_attach_quotations Json?\n others Json?\n send_back_count Int? @default(0)\n is_active Boolean @default(true)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n delete_reason String?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n deleted_by_user User? @relation(\"purchase_intake_deleted_by\", fields: [deleted_by], references: [id])\n initiated_by Int?\n initiated_by_user User? @relation(\"purchase_intake_initiated_by\", fields: [initiated_by], references: [id])\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id])\n purchase_intake_item PurchaseIntakeItem[]\n events Event[]\n event_items EventItems[]\n purchase_order_items PurchaseOrderItem[]\n send_backs SendBack[]\n blanket_po_items BlanketPurchaseOrderItem[]\n\n @@map(\"purchase_intakes\")\n}\n\n//---------------------------------- PURCHASEINTAKES MODEL END ----------------------------------\n\n//---------------------------------- PURCHASEINTAKESITEMS MODEL START ----------------------------------\n\nenum PurchaseIntakeItemEnum {\n Open\n InProgress\n OnHold\n Partial\n Closed\n Cancelled\n Completed\n Rejected\n Expired\n}\n\nenum SendBackIntakeStatusEnum {\n PENDING\n ACCEPTED\n COUNTERED\n REJECTED\n}\n\nenum SendBackApproverStatusEnum {\n PENDING\n ACCEPTED\n COUNTERED\n REJECTED\n SEND_BACK\n}\n\nmodel PurchaseIntakeItem {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n purchase_intakes_id Int?\n purchase_intake PurchaseIntake? @relation(fields: [purchase_intakes_id], references: [id], onDelete: Cascade)\n item_id Int?\n items Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n quantity Int?\n initial_quantity Int?\n open_quantity Int?\n closed_quantity Int? @default(0)\n unit_of_measurement String?\n price Decimal? @default(0.00) @db.Decimal(10, 2)\n location_id Int?\n location Location? @relation(fields: [location_id], references: [id], onDelete: Cascade)\n status PurchaseIntakeItemEnum @default(Open)\n send_back_intake_status SendBackIntakeStatusEnum @default(PENDING)\n send_back_approver_status SendBackApproverStatusEnum @default(PENDING)\n suggested_quantity Int?\n counter_quantity Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"purchase_intakes_items\")\n}\n\n//---------------------------------- PURCHASEINTAKESITEMS MODEL END ----------------------------------\n\n//---------------------------------- SEND BACK MODEL END ---------------------------------------\n\nmodel SendBack {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n purchase_intake_id Int?\n purchase_intake PurchaseIntake? @relation(fields: [purchase_intake_id], references: [id], onDelete: Cascade)\n item_json Json? @db.JsonB\n send_back_reason String?\n send_back_approver_id Int?\n send_back_approver User? @relation(\"send_back_approver\", fields: [send_back_approver_id], references: [id], onDelete: Cascade)\n send_back_requestor_id Int?\n send_back_requestor User? @relation(\"send_back_requestor\", fields: [send_back_requestor_id], references: [id], onDelete: Cascade)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"send_backs\")\n}\n\n//---------------------------------- SEND BACK MODEL END ---------------------------------------\n\n//---------------------------------- EMAILTEMPLATE MODEL END ------------------------------------------------\nmodel EmailTemplate {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n template_name String?\n template_slug String? @unique @db.VarChar(100)\n subject String?\n html_content String?\n macro String?\n module_name String?\n is_active Boolean? @default(true)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"email_templates\")\n}\n\n//---------------------------------- EMAILTEMPLATE MODEL END ------------------------------------------------\n\n//---------------------------------- SMTP MODEL START ------------------------------------------------\nmodel SmtpConfig {\n id Int @id @default(autoincrement())\n smtp_server String @unique\n port Int?\n username String?\n password String?\n from_email String?\n encryption String?\n test_email String?\n is_active Boolean @default(false)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"smtp_config\")\n}\n\n//---------------------------------- SMTP MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL HIERARCHY MODEL START ------------------------------------------------\nenum InitiatorTypeEnum {\n Role\n User\n}\n\nmodel ApprovalHierarchy {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String?\n slug String? @unique\n module String?\n task String?\n initiator_type InitiatorTypeEnum\n roleId Int?\n role Role? @relation(fields: [roleId], references: [id], onDelete: Cascade)\n userId Int?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: SetNull)\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n approval_condition ApprovalCondition[]\n approval_level ApprovalLevel[]\n approval_journey ApprovalJourney[]\n approval_delegations ApprovalDelegation[] // Delegations filtered by this hierarchy\n\n @@map(\"approval_hierarchy\")\n}\n\n//---------------------------------- APPROVAL HIERARCHY MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL CONDITION MODEL START ------------------------------------------------\n\nenum ConditionTypeEnum {\n Price\n Escalation\n}\n\nmodel ApprovalCondition {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approval_hierarchy_id Int?\n approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: Cascade)\n conditions ConditionTypeEnum\n price_from Float?\n price_to Float?\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n approval_level ApprovalLevel[]\n approval_delegations ApprovalDelegation[] // Delegations filtered by this condition\n\n @@map(\"approval_conditions\")\n}\n\n//---------------------------------- APPROVAL CONDITION MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL LEVEL MODEL START ------------------------------------------------\n\nmodel ApprovalLevel {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approval_hierarchy_id Int?\n approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: Cascade)\n approval_condition_id Int?\n approval_condition ApprovalCondition? @relation(fields: [approval_condition_id], references: [id], onDelete: Cascade)\n level String?\n valid_till_hours Int?\n valid_till_minutes Int?\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n approval_level_escalation ApprovalLevelEscalation[]\n approval_level_users ApprovalLevelUser[]\n\n @@map(\"approval_levels\")\n}\n\n//---------------------------------- APPROVAL LEVEL MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL LEVEL USER MODEL START ------------------------------------------------\n\nmodel ApprovalLevelUser {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approval_level_id Int?\n approval_level ApprovalLevel? @relation(fields: [approval_level_id], references: [id], onDelete: Cascade)\n approver_id Int?\n user User? @relation(fields: [approver_id], references: [id], onDelete: Cascade)\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([approval_level_id, approver_id])\n @@map(\"approval_level_users\")\n}\n\n//---------------------------------- APPROVAL LEVEL USER MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL LEVEL ESCALATIONS MODEL START ------------------------------------------------\n\nmodel ApprovalLevelEscalation {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approval_level_id Int?\n approval_level ApprovalLevel? @relation(fields: [approval_level_id], references: [id], onDelete: Cascade)\n escalation_approver_id Int?\n user User? @relation(fields: [escalation_approver_id], references: [id], onDelete: Cascade)\n valid_till_hours Int?\n valid_till_minutes Int?\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n approval_level_escalation_users ApprovalLevelEscalationUser[]\n\n @@map(\"approval_level_escalations\")\n}\n\n//---------------------------------- APPROVAL LEVEL ESCALATIONS MODEL END ------------------------------------------------\n\n// --------------------------------- APPROVAL LEVEL ESCALATIONS USERS MODEL START ------------------------------------------------\n\nmodel ApprovalLevelEscalationUser {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approval_level_escalation_id Int?\n approval_level_escalation ApprovalLevelEscalation? @relation(fields: [approval_level_escalation_id], references: [id], onDelete: Cascade)\n approver_id Int?\n user User? @relation(fields: [approver_id], references: [id], onDelete: Cascade)\n is_active Boolean @default(true)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([approval_level_escalation_id, approver_id])\n @@map(\"approval_level_escalation_users\")\n}\n\n//---------------------------------- APPROVAL LEVEL ESCALATIONS MODEL END ------------------------------------------------\n\n//---------------------------------- UOM MODEL START ------------------------------------------------\n\nmodel Uom {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n uom_code String? @unique @db.VarChar(25)\n description String? @db.VarChar(300)\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n items Item[]\n\n uom_category UomCategory[]\n\n @@map(\"uoms\")\n}\n\n//---------------------------------- UOM MODEL END ------------------------------------------------\n\n//---------------------------------- UOM CATEGORY MODEL START ------------------------------------------------\n\nmodel UomCategory {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n Category Category? @relation(fields: [categoryId], references: [id], onDelete: Cascade)\n categoryId Int?\n Uom Uom? @relation(fields: [uomId], references: [id], onDelete: Cascade)\n uomId Int?\n created_by Int?\n\n @@map(\"uom_categories\")\n}\n\n//---------------------------------- UOM CATEGORY MODEL START ------------------------------------------------\n\n//---------------------------------- PRODUCT ATTRIBUTE MODEL START ------------------------------------------------\nmodel ItemAttribute {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)\n attribute_id Int?\n attribute Attribute? @relation(fields: [attribute_id], references: [id])\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n\n item_attribute_values ItemAttributeValue[]\n\n @@unique([item_id, attribute_id])\n @@index([item_id])\n @@map(\"item_attributes\")\n}\n\n//---------------------------------- PRODUCT ATTRIBUTE MODEL END ------------------------------------------------\n\n//---------------------------------- PRODUCT ATTRIBUTE VALUE MODEL START ------------------------------------------------\nmodel ItemAttributeValue {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)\n item_attribute_id Int?\n item_attribute ItemAttribute? @relation(fields: [item_attribute_id], references: [id], onDelete: Cascade)\n attribute_value_id Int?\n attribute_value AttributeValue? @relation(fields: [attribute_value_id], references: [id])\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n\n @@unique([item_id, item_attribute_id, attribute_value_id])\n @@index([item_id])\n @@map(\"item_attribute_values\")\n}\n\n//---------------------------------- PRODUCT ATTRIBUTE VALUE MODEL START ------------------------------------------------\n\n//---------------------------------- ITEM DOCUMENTS MODEL START ------------------------------------------------\n\nmodel ItemDocument {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)\n original_document String?\n optimized_image String?\n thumbnail_image String?\n original_name String?\n original_extension String?\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n\n @@map(\"item_documents\")\n}\n\n//---------------------------------- ITEM IMAGES MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL JOURNEY MODEL START ------------------------------------------------\n\nenum ApprovalJourneyStatusEnum {\n Pending\n Approved\n AutoApproved\n Rejected\n AutoRejected\n Escalated\n NA\n Cancelled\n SendBack\n}\n\nmodel ApprovalJourney {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n parent_id String?\n journy_type String?\n approval_hierarchy_id Int?\n approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: Cascade)\n approvar_id Int?\n user User? @relation(fields: [approvar_id], references: [id], onDelete: Cascade)\n original_approver_id Int? // Original approver when delegation is active\n original_approver User? @relation(\"OriginalApprover\", fields: [original_approver_id], references: [id], onDelete: SetNull)\n delegation_id Int? // Reference to active delegation\n delegation ApprovalDelegation? @relation(fields: [delegation_id], references: [id], onDelete: SetNull)\n level String?\n status ApprovalJourneyStatusEnum @default(Pending)\n reject_reason String?\n journey_task String?\n is_approver_turn Boolean @default(false)\n duration String? // Duration in hours and minutes (e.g. \"2h 30m\")\n valid_to DateTime? @db.Timestamptz(6) // Explicitly use timestamptz\n valid_till DateTime? @db.Timestamptz(6) // Explicitly use timestamptz\n batch_id String?\n is_deleted Boolean @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"approval_journey\")\n}\n\n//---------------------------------- APPROVAL JOURNEY MODEL END ------------------------------------------------\n\n//---------------------------------- APPROVAL DELEGATION MODEL START ------------------------------------------------\nenum ApprovalDelegationStatusEnum {\n PENDING\n ACTIVE\n COMPLETED\n CANCELLED\n}\n\nmodel ApprovalDelegation {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n approver_id Int? // Original approver who is delegating\n approver User? @relation(\"DelegatingApprover\", fields: [approver_id], references: [id], onDelete: Cascade)\n delegate_id Int? // DEPRECATED: Use delegation_delegates instead. Kept for backward compatibility\n delegate User? @relation(\"DelegateUser\", fields: [delegate_id], references: [id], onDelete: Cascade)\n journy_type String? // Optional: Filter by module type (e.g., \"purchase-intake\", \"contract\")\n journey_task String? // Optional: Filter by task (e.g., \"contract-creation-approval\")\n approval_hierarchy_id Int? // Optional: Filter by specific hierarchy\n approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: SetNull)\n approval_condition_id Int? // Optional: Filter by specific condition within hierarchy (includes price range) - Most granular\n approval_condition ApprovalCondition? @relation(fields: [approval_condition_id], references: [id], onDelete: SetNull)\n start_date DateTime @db.Timestamptz(6) // When delegation becomes active\n end_date DateTime @db.Timestamptz(6) // When delegation expires\n status ApprovalDelegationStatusEnum @default(PENDING)\n reason String? // Reason for delegation (e.g., \"On leave\", \"Out of office\")\n is_active Boolean @default(true) // Can be manually deactivated\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n approval_journey ApprovalJourney[] // All approval journeys using this delegation\n delegation_delegates ApprovalDelegationDelegate[] // Multiple delegates for this delegation\n\n @@index([approver_id, is_active, is_deleted])\n @@index([approver_id, journy_type, journey_task, is_active, is_deleted])\n @@index([approver_id, approval_hierarchy_id, approval_condition_id, is_active, is_deleted])\n @@index([approver_id, approval_hierarchy_id, is_active, is_deleted])\n @@index([delegate_id, is_active, is_deleted])\n @@index([start_date, end_date])\n @@map(\"approval_delegations\")\n}\n\nmodel ApprovalDelegationDelegate {\n id Int @id @default(autoincrement())\n delegation_id Int\n delegation ApprovalDelegation @relation(fields: [delegation_id], references: [id], onDelete: Cascade)\n delegate_id Int // User who will receive the delegated tasks\n delegate User @relation(\"DelegationDelegate\", fields: [delegate_id], references: [id], onDelete: Cascade)\n is_deleted Boolean @default(false)\n is_active Boolean @default(true)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([delegation_id, delegate_id])\n @@index([delegation_id])\n @@index([delegate_id])\n @@map(\"approval_delegation_delegates\")\n}\n\n//---------------------------------- APPROVAL DELEGATION MODEL END ------------------------------------------------\n\n//---------------------------------- TEMPLATE MODEL START ------------------------------------------------\n\nmodel Template {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n template_code String? @unique\n template_name String? @unique\n template_type Json?\n currency_id Int?\n currency Currency? @relation(fields: [currency_id], references: [id], onDelete: Cascade)\n fields TemplateField[]\n is_active Boolean? @default(false)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n event Event[]\n template_strategies TemplateStrategies[]\n\n @@map(\"templates\")\n}\n\n//---------------------------------- TEMPLATE MODEL END ------------------------------------------------\n\n//---------------------------------- TEMPLATE STRATEGIES MODEL START ------------------------------------------------\nmodel TemplateStrategies {\n id Int @id @default(autoincrement())\n template_id Int\n strategy_id Int\n template Template @relation(fields: [template_id], references: [id], onDelete: Cascade)\n strategy Strategies @relation(fields: [strategy_id], references: [id], onDelete: Cascade)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n\n @@unique([template_id, strategy_id])\n @@map(\"template_strategies\")\n}\n\n//---------------------------------- TEMPLATE STRATEGIES MODEL END ------------------------------------------------\n\n//---------------------------------- TEMPLATE FIELD MODEL START ------------------------------------------------\n\nenum FieldType {\n TEXT\n NUMBER\n FORMULA\n DATE\n TIME\n DATETIME\n PERCENTAGE\n MEDIA\n CURRENCY\n CURRENCY_FORMULA\n VALUE_FORMULA\n}\n\nenum FieldRole {\n BUYER\n VENDOR\n AUTO_CALCULATED\n}\n\nenum FieldPlacement {\n GLOBAL\n LOCAL\n}\n\nmodel TemplateField {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n template_id Int\n template Template @relation(fields: [template_id], references: [id])\n field_name String?\n field_slug String?\n field_type FieldType?\n field_role FieldRole?\n field_placement FieldPlacement?\n field_formula String? // Optional formula for formula-driven fields\n is_mandatory Boolean? @default(false)\n buyer_only Boolean? @default(false)\n position Int?\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"template_fields\")\n}\n\n//---------------------------------- TEMPLATE FIELD MODEL END ------------------------------------------------\n\n//---------------------------------- FAQ CATEGORY MODEL START ------------------------------------------------\n\nmodel FaqCategory {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n category_name String? @unique @db.VarChar(255)\n slug String? @unique @db.VarChar(255)\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n faqs Faq[]\n\n @@map(\"faq_categories\")\n}\n\n//---------------------------------- FAQ CATEGORY MODEL END ------------------------------------------------\n\n//---------------------------------- FAQ MODEL START ------------------------------------------------\n\nenum FaqType {\n ADMIN\n BUYER\n VENDOR\n}\n\nmodel Faq {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n faq_type FaqType?\n faq_category_id Int?\n faq_category FaqCategory? @relation(fields: [faq_category_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n question String? @db.Text()\n answer String? @db.Text()\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([faq_category_id, question, faq_type]) // Composite unique constraint\n @@map(\"faqs\")\n}\n\n//---------------------------------- FAQ MODEL END ------------------------------------------------\n\n//---------------------------------- EVENT START END ------------------------------------------------\n\nenum EventStatus {\n Draft\n Live\n Closed\n Upcoming\n Cancelled\n}\n\nenum EventType {\n RFQ\n RFI\n RFP\n RAUC\n FAUC\n BOQ\n}\n\nenum EventPhase {\n Upcoming\n Invitation\n PreBids\n Bidding\n Evaluation\n ClosingSoon\n Closed\n PartialClosed\n Expired\n}\n\nmodel Event {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n code String? @unique\n template_id Int?\n template Template? @relation(fields: [template_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n type EventType?\n name String?\n start_date DateTime? @db.Timestamptz(6) // Explicitly use timestamptz\n end_date DateTime? @db.Timestamptz(6) // Explicitly use timestamptz\n duration String?\n attachments Json?\n terms_conditions String?\n step_completed Int?\n status EventStatus? @default(Draft)\n event_phase EventPhase?\n purchase_intake_id Int?\n purchase_intake PurchaseIntake? @relation(fields: [purchase_intake_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n reason String?\n is_published Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n deleted_by Int?\n event_items EventItems[]\n boq_event_items BoqEventItem[]\n event_vendors EventVendors[]\n event_configurations EventConfigurations[]\n event_strategies EventStrategies[]\n bids Bid[]\n bid_logs BidLog[]\n quotations Quotation[]\n quotation_logs QuotationLog[]\n event_rfi_form EventRfiForm[]\n event_rfi_form_logs EventRfiFormLog[]\n purchase_order PurchaseOrder[]\n event_criteria EventCriteria[]\n conversations Conversation[]\n blanket_po BlanketPurchaseOrder[]\n\n @@map(\"events\")\n}\n\n//---------------------------------- EVENT MODEL END ------------------------------------------------\n\n//---------------------------------- EVENT ITEMS MODEL START ------------------------------------------------\n\nmodel EventItems {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n purchase_intake_id Int?\n purchase_intake PurchaseIntake? @relation(fields: [purchase_intake_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n dynamic_fields Json?\n is_active Boolean? @default(true)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n bids Bid[]\n bid_logs BidLog[]\n quotations Quotation[]\n quotation_logs QuotationLog[]\n\n @@map(\"event_items\")\n}\n\n//---------------------------------- EVENT ITEMS MODEL END ------------------------------------------------\n\n//---------------------------------- BOQ EVENT ITEMS MODEL START ------------------------------------------------\n/// BOQ lines for events without item-master linkage (free-text / JSON fields), parallel to Sourcebay-style event items.\nmodel BoqEventItem {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n category_id Int?\n category Category? @relation(\"CategoryBoqEventItemAsCategory\", fields: [category_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n sub_category_id Int?\n sub_category Category? @relation(\"SubCategoryBoqEventItemAsSubCategory\", fields: [sub_category_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n part_name String?\n description String? @db.Text\n part_no String?\n quantity Decimal? @db.Decimal(18, 4)\n uom String?\n dynamic_fields Json?\n version Int @default(1)\n parent_version_id Int?\n parent_version BoqEventItem? @relation(\"BoqEventItemVersionRelation\", fields: [parent_version_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n sort_order Int @default(0)\n is_active Boolean? @default(true)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n bids Bid[]\n bid_logs BidLog[]\n quotations Quotation[]\n quotation_logs QuotationLog[]\n purchase_order_items PurchaseOrderItem[]\n boq_event_items BoqEventItem[] @relation(\"BoqEventItemVersionRelation\")\n\n @@index([event_id])\n @@map(\"boq_event_items\")\n}\n\n//---------------------------------- BOQ EVENT ITEMS MODEL END ------------------------------------------------\n\n//---------------------------------- VENDOR EVENTS MODEL START ------------------------------------------------\n\nenum EventVendorStatus {\n Pending\n Approved\n Rejected\n}\n\nenum EventVendorBidStatus {\n INVITED\n VIEWED\n DRAFT\n BIDSUBMITTED\n SUBMITTED\n ENDED\n NORESPONSE\n EVALUATION\n WON\n NOTAWARDED\n CANCELLED\n EXPIRED\n ACCEPTED\n REJECTED\n LASTBIDREJECTED\n BLOCKED\n}\n\nmodel EventVendors {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n /// Global vendor primary key in procbay_vendor_db.procbay_schema.vendors (cross-database; see view procbay_schema.event_vendor_with_vendor).\n vendor_id Int?\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n is_active Boolean? @default(true)\n is_email_sent Boolean? @default(false)\n is_restricted Boolean? @default(false)\n status EventVendorStatus @default(Pending)\n reason String?\n is_wishlisted Boolean? @default(false)\n event_vendor_bid_status EventVendorBidStatus? @default(INVITED)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n bids Bid[]\n bid_logs BidLog[]\n quotations Quotation[]\n quotation_logs QuotationLog[]\n event_rfi_form_logs EventRfiFormLog[]\n purchase_order PurchaseOrder[]\n event_vendor_criteria EventVendorCriteria[]\n blanket_po BlanketPurchaseOrder[]\n\n @@index([event_id, vendor_id])\n @@index([status])\n @@map(\"event_vendors\")\n}\n\n//---------------------------------- VENDOR EVENTS MODEL END ------------------------------------------------\n\n//---------------------------------- EVENTS CONFIGURATIONS MODEL START ------------------------------------------------\n\nmodel EventConfigurations {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n rule_name String?\n rule_value Json?\n rule_slug String?\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"event_configurations\")\n}\n\n//---------------------------------- EVENTS CONFIGURATIONS MODEL END ------------------------------------------------\n\n//---------------------------------- EVENTS STRATEGIES MODEL START ------------------------------------------------\n\nmodel EventStrategies {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n strategy_id Int?\n strategy Strategies? @relation(fields: [strategy_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"event_strategies\")\n}\n\n//---------------------------------- EVENTS STRATEGIES MODEL END ------------------------------------------------\n\n//---------------------------------- STRATEGIES MODEL START ------------------------------------------------\n\nmodel Strategies {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String? @unique\n slug String? @unique\n description String?\n is_active Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n event_strategies EventStrategies[]\n template_strategies TemplateStrategies[]\n\n @@map(\"strategies\")\n}\n\n//---------------------------------- STRATEGIES MODEL END ------------------------------------------------\n\n/////////////////////////////////// START CMS SCHEMA //////////////////////////////\n\nenum userTypeEnum {\n ADMIN\n VENDOR\n}\n\nmodel Cms {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n title String?\n content String?\n type userTypeEnum\n slug String?\n images Json? @db.JsonB\n is_active Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([slug, type])\n @@map(\"cms\")\n}\n\n/////////////////////////////////// END CMS SCHEMA //////////////////////////////\n\n//---------------------------------- CURRENCY MODEL START ------------------------------------------------\n\nmodel Currency {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String? @unique\n code String? @unique\n symbol String?\n is_active Boolean? @default(true)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n template Template[]\n\n @@map(\"currencies\")\n}\n\n//---------------------------------- CURRENCY MODEL END ------------------------------------------------\n\n//---------------------------------- SUPPORT TICKETS MODEL START ------------------------------------------------\n\nenum TicketStatusEnum {\n OPEN\n IN_PROGRESS\n RESOLVED\n CLOSED\n REOPEN\n}\n\nenum TicketPriorityEnum {\n LOW\n MEDIUM\n HIGH\n CRITICAL\n}\n\nenum TicketContactMethodEnum {\n EMAIL\n PHONE\n CHAT\n}\n\nmodel SupportTicket {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n ticket_code String? @unique\n vendor_id Int?\n subject String?\n category_id Int?\n category SupportCategory? @relation(fields: [category_id], references: [id], onDelete: Cascade)\n priority TicketPriorityEnum @default(MEDIUM)\n description String?\n attachments Json?\n status TicketStatusEnum @default(OPEN)\n prefered_contact_method TicketContactMethodEnum\n is_active Boolean? @default(true)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n assigned_tickets TicketAssignment[]\n ticket_history TicketHistory[]\n ticket_replies TicketReply[]\n\n @@map(\"support_tickets\")\n}\n\nmodel TicketAssignment {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n ticket_id Int?\n support_ticket SupportTicket? @relation(fields: [ticket_id], references: [id], onDelete: Cascade)\n assigned_by Int?\n assigned_by_user User? @relation(\"user_assigned_by\", fields: [assigned_by], references: [id], onDelete: Cascade)\n assigned_to Int?\n assigned_to_user User? @relation(\"user_assigned_to\", fields: [assigned_to], references: [id], onDelete: Cascade)\n assigned_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"ticket_assignments\")\n}\n\nmodel TicketHistory {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n ticket_id Int?\n support_ticket SupportTicket? @relation(fields: [ticket_id], references: [id], onDelete: Cascade)\n assigned_to Int?\n assigned_to_user User? @relation(\"user_assigned_to\", fields: [assigned_to], references: [id], onDelete: Cascade)\n assigned_by Int?\n assigned_by_user User? @relation(\"user_assigned_by\", fields: [assigned_by], references: [id], onDelete: Cascade)\n status TicketStatusEnum\n updated_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"ticket_history\")\n}\n\nmodel TicketReply {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n ticket_id Int?\n support_ticket SupportTicket? @relation(fields: [ticket_id], references: [id], onDelete: Cascade)\n user_id Int? // User who replied\n user User? @relation(\"user_reply\", fields: [user_id], references: [id], onDelete: Cascade)\n vendor_id Int? // Vendor who replied\n message String?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"ticket_replies\")\n}\n\n//---------------------------------- SUPPORT TICKETS MODEL END ------------------------------------------------\n//---------------------------------- SUPPORT CATEGORY MODEL START ------------------------------------------------\n\nmodel SupportCategory {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String? @unique\n parent_id Int? @default(0)\n description String?\n image_url String?\n is_active Boolean? @default(false)\n slug String?\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n tickets SupportTicket[]\n\n @@map(\"support_categories\")\n}\n\n//---------------------------------- SUPPORT CATEGORY MODEL END ------------------------------------------------\n\n//------------------------------------- ADMIN ALERTS MODEL START ------------------------------------------\n\nenum AlertTypeEnum {\n PURCHASE_INTAKE\n PURCHASE_REQUEST\n PURCHASE_ORDER\n APPROVAL\n QUOTATION\n RFI\n RFP\n AUCTION\n VENDOR_KYC\n GENERAL\n CONTRACT\n CONTRACT_CLAUSE\n CONTRACT_TEMPLATE\n UPLOAD\n EXPORT\n}\n\nmodel AdminAlert {\n id Int @id @default(autoincrement())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n alert_type AlertTypeEnum?\n title String?\n message String?\n redirect_url String?\n is_read Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n meta_data Json? @db.JsonB\n\n @@map(\"admin_alerts\")\n}\n\n//------------------------------------- ADMIN ALERTS MODEL END --------------------------------------------\n\n//-------------------------------------CUSTOMER NOTIFICATION MODEL START --------------------------------------------\n\nenum MediumEnum {\n EMAIL\n SMS\n}\n\nmodel CustomerNotification {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n template_name String? @db.VarChar(255)\n remark String?\n event String? @db.VarChar(255)\n medium MediumEnum?\n is_recurring Boolean @default(false)\n title String?\n trigger_message String?\n template_slug String?\n attachments String[] @default([])\n files Json[] @db.JsonB\n is_active Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@map(\"customer_notifications\")\n}\n\n//-------------------------------------CUSTOMER NOTIFICATION MODEL End --------------------------------------------\n\n//-------------------------------------BID MODEL START --------------------------------------------\n\n// Bid Status\nenum BidStatus {\n NOT_HIGHEST_BIDDER\n HIGHEST_BIDDER\n LOWEST_BIDDER\n NOT_LOWEST_BIDDER\n CANCELLED\n REJECTED\n ACCEPTED\n LAST_REJECTED\n COMPLETE_REJECTED\n}\n\nmodel Bid {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_item_id Int?\n event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)\n boq_event_item_id Int?\n boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)\n event_type EventType?\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n bid_log_id Int? // Reference to BidLog for detailed bid history\n bid_log BidLog? @relation(fields: [bid_log_id], references: [id], onDelete: Cascade)\n bid_amount Float?\n version Int @default(0) // For optimistic locking\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([event_id, event_item_id])\n @@index([event_id, boq_event_item_id])\n @@map(\"bids\")\n}\n\n//-------------------------------------BID MODEL END --------------------------------------------\n\n//-------------------------------------BID LOG MODEL START --------------------------------------------\n\nmodel BidLog {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_item_id Int?\n event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)\n boq_event_item_id Int?\n boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)\n event_type EventType?\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n bid_amount Float?\n bid_status BidStatus @default(NOT_HIGHEST_BIDDER)\n bidding_rank Int?\n weightage_score Float?\n is_cancelled Boolean @default(false)\n auto_cancel Boolean @default(false)\n cancel_reason String?\n is_winner Boolean @default(false)\n is_auto_bid Boolean @default(false)\n is_placed_by_admin Boolean @default(false)\n placed_by_id Int?\n reason String?\n bid_json Json? // Flexible structure for bid details\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n has_active_counter Boolean @default(false)\n counter_offer CounterOffer[]\n bid Bid[]\n\n @@index([event_id, event_item_id, created_at])\n @@index([event_id, boq_event_item_id, created_at])\n @@map(\"bid_logs\")\n}\n\n//------------------------------------- BID LOG MODEL END --------------------------------------------\n//------------------------------------- QUOTATION MODEL END --------------------------------------------\n\n// Quotation Status\nenum QuotationStatus {\n SUBMITTED\n UNDER_REVIEW\n ACCEPTED\n REJECTED\n REVISED\n LAST_REJECTED\n COMPLETE_REJECTED\n}\n\nmodel Quotation {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_item_id Int?\n event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)\n boq_event_item_id Int?\n boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)\n event_type EventType? // Should be RFQ, RFI, or RFP\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n quotation_log_id Int? // Reference to QuotationLog for detailed history\n quotation_log QuotationLog? @relation(fields: [quotation_log_id], references: [id], onDelete: Cascade)\n quote_amount Float?\n technical_details Json? // Flexible structure for specifications\n delivery_timeline String?\n warranty_terms String?\n payment_terms String?\n validity_period Int? // Days the quotation remains valid\n quotation_status QuotationStatus @default(SUBMITTED)\n quotation_rank Int?\n current_revision Int @default(1)\n version Int @default(0) // For optimistic locking\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([event_id, event_item_id])\n @@index([event_id, boq_event_item_id])\n @@map(\"quotations\")\n}\n\n//------------------------------------- QUOTATION MODEL END --------------------------------------------\n//------------------------------------- QUOTATION LOG MODEL END --------------------------------------------\nmodel QuotationLog {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_item_id Int?\n event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)\n boq_event_item_id Int?\n boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)\n event_type EventType?\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n quote_amount Float?\n technical_details Json?\n delivery_timeline String?\n warranty_terms String?\n payment_terms String?\n quotation_status QuotationStatus @default(SUBMITTED)\n quotation_rank Int?\n revision_number Int @default(1)\n review_comments String? // Admin feedback\n reviewed_by Int?\n quote_json Json? // Flexible structure for quotation details\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @default(now()) @db.Timestamptz(6)\n updated_by Int?\n has_active_counter Boolean @default(false)\n counter_offer CounterOffer[]\n quotation Quotation[]\n\n @@index([event_id, event_item_id])\n @@index([event_id, boq_event_item_id])\n @@map(\"quotation_logs\")\n}\n\n//------------------------------------- QUOTATION LOG MODEL END --------------------------------------------\n\n//------------------------------------ Form Master Models Start ------------------------------------\nmodel FormMaster {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n module_name String?\n module_slug String? @unique\n is_active Boolean? @default(true)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n dynamic_form DynamicForm[]\n\n @@map(\"form_masters\")\n}\n\n//------------------------------------ Form Master Models End ------------------------------------\n\n//------------------------------------ Dynamic Form Models Start ------------------------------------\nmodel DynamicForm {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n module_id Int?\n module FormMaster? @relation(fields: [module_id], references: [id], onDelete: Cascade)\n form_name String?\n form_slug String?\n description String?\n fields Json?\n form_order Int?\n is_active Boolean? @default(true)\n is_deleted Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([module_id, form_slug])\n @@map(\"dynamic_forms\")\n}\n\n//------------------------------------ Form Builder Models End ------------------------------------\n\n//------------------------------------ Modules Model Start ----------------------------\n\nmodel Module {\n id Int @id @default(autoincrement()) // Primary Key\n uuid String? @unique @default(uuid())\n tenant_config_id Int?\n tenant_config TenantConfiguration? @relation(fields: [tenant_config_id], references: [id])\n name String?\n slug String? @unique\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int? // Optional field if no constraints are specified\n sub_modules SubModule[]\n\n @@map(\"modules\")\n}\n\n//------------------------------------ Modules Model End ----------------------------\n\n//------------------------------------ Tenant Configuration Model Start ----------------------------\n\nmodel TenantConfiguration {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n tenant_id Int?\n tenant_name String?\n database_name String?\n tenant_subdomain String?\n currency String?\n currency_symbol String?\n industry String?\n timezone String?\n status String?\n email String?\n logo String?\n allowed_modules Module[]\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n\n @@map(\"tenant_configurations\")\n}\n\n//------------------------------------ Tenant Configuration Model End ------------------------------\n\n//------------------------------------- USER LOGIN ACTIVITY MODEL START --------------------------------------------\n\nenum LoginActivityUserType {\n ADMIN\n VENDOR\n}\n\nmodel UserLoginActivity {\n id Int @id @default(autoincrement())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n user_type LoginActivityUserType?\n ip_address String?\n user_agent String?\n browser String?\n device String?\n platform String?\n login_timestamp DateTime @default(now()) @db.Timestamptz(6)\n logout_timestamp DateTime? @db.Timestamptz(6)\n status String?\n session_id String?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"user_login_activities\")\n}\n\n//------------------------------------- USER LOGIN ACTIVITY MODEL END --------------------------------------------\n//------------------------------------- REGION MODEL START --------------------------------------------\n\nmodel Region {\n id Int @id @default(autoincrement())\n name String? @unique\n translations Json?\n wikiDataId String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n countries Country[]\n subregions Subregion[]\n\n @@map(\"regions\")\n}\n\n//------------------------------------- REGION MODEL END --------------------------------------------\n//------------------------------------- SUB REGION MODEL START --------------------------------------------\n\nmodel Subregion {\n id Int @id @default(autoincrement())\n name String? @unique\n translations Json?\n wikiDataId String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n region Region? @relation(fields: [region_id], references: [id])\n region_id Int?\n countries Country[]\n\n @@index([region_id])\n @@map(\"subregions\")\n}\n\n//------------------------------------- SUB REGION MODEL END --------------------------------------------\n//------------------------------------- COUNTRY MODEL START --------------------------------------------\n\nmodel Country {\n id Int @id @default(autoincrement())\n name String?\n iso3 String? @unique @db.Char(3)\n iso2 String? @unique @db.Char(2)\n numeric_code String? @db.Char(3)\n phonecode String?\n capital String?\n currency String?\n currency_name String?\n currency_symbol String?\n tld String?\n native String?\n region String?\n subregion String?\n nationality String?\n latitude Decimal? @db.Decimal(10, 8)\n longitude Decimal? @db.Decimal(11, 8)\n emoji String?\n emojiU String?\n timezones Json?\n translations Json?\n wikiDataId String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n region_relation Region? @relation(fields: [region_id], references: [id])\n region_id Int?\n subregion_relation Subregion? @relation(fields: [subregion_id], references: [id])\n subregion_id Int?\n\n states State[]\n cities City[]\n locations Location[]\n\n @@index([region_id])\n @@index([subregion_id])\n @@map(\"countries\")\n}\n\n//------------------------------------- COUNTRY MODEL END --------------------------------------------\n//------------------------------------- STATE MODEL START --------------------------------------------\n\nmodel State {\n id Int @id @default(autoincrement())\n name String?\n state_code String?\n type String?\n latitude Decimal? @db.Decimal(10, 8)\n longitude Decimal? @db.Decimal(11, 8)\n wikiDataId String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n country Country? @relation(fields: [country_id], references: [id])\n country_id Int?\n cities City[]\n locations Location[]\n\n @@unique([name, country_id, state_code], name: \"name_country_id_state_code\")\n @@index([country_id])\n @@map(\"states\")\n}\n\n//------------------------------------- STATE MODEL END --------------------------------------------\n//------------------------------------- CITY MODEL START --------------------------------------------\n\nmodel City {\n id Int @id @default(autoincrement())\n name String?\n latitude Decimal? @db.Decimal(10, 8)\n longitude Decimal? @db.Decimal(11, 8)\n wikiDataId String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n state State? @relation(fields: [state_id], references: [id])\n state_id Int?\n country Country? @relation(fields: [country_id], references: [id])\n country_id Int?\n locations Location[]\n\n @@unique([name, country_id, state_id], name: \"name_country_id_state_id\")\n @@index([state_id])\n @@index([country_id])\n @@map(\"cities\")\n}\n\n//------------------------------------- CITY MODEL END --------------------------------------------\n//------------------------------------- LOCATION MODEL START --------------------------------------------\n\nmodel Location {\n id Int @id @default(autoincrement())\n name String?\n address String?\n zipcode String?\n status Boolean? @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n country Country? @relation(fields: [country_id], references: [id])\n country_id Int?\n state State? @relation(fields: [state_id], references: [id])\n state_id Int?\n city City? @relation(fields: [city_id], references: [id])\n city_id Int?\n purchase_intake_item PurchaseIntakeItem[]\n blanket_po_release BlanketPurchaseOrderRelease[]\n business_entity_locations BusinessEntityLocation[]\n\n @@index([country_id])\n @@index([state_id])\n @@index([city_id])\n @@map(\"locations\")\n}\n\n//------------------------------------- LOCATION MODEL END --------------------------------------------\n\n//------------------------------------ Sub Module Model Start ----------------------------\nmodel SubModule {\n id Int @id @default(autoincrement())\n name String\n slug String @unique\n module_id Int?\n created_by Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n module Module? @relation(fields: [module_id], references: [id], onDelete: Cascade)\n\n @@map(\"sub_modules\")\n}\n\n//------------------------------------ Sub Module Model END ----------------------------\n\n//------------------------------------ COUNTER OFFER MODEL START ------------------------------------\n\nenum CounterOfferStatus {\n PENDING\n ACCEPTED\n REJECTED\n COUNTERED\n AUTO_REJECTED\n}\n\nmodel CounterOffer {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n bid_log_id Int?\n bid_log BidLog? @relation(fields: [bid_log_id], references: [id])\n quotation_log_id Int?\n quotation_log QuotationLog? @relation(fields: [quotation_log_id], references: [id])\n counter_amount Float\n counter_message String?\n technical_details Json? // For quotations - specific changes requested\n delivery_timeline String? // For quotations\n payment_terms String? // For quotations\n warranty_terms String? // For quotations\n is_viewed Boolean @default(false)\n status CounterOfferStatus? @default(PENDING)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int // Admin/buyer who created the counter offer\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([bid_log_id])\n @@index([quotation_log_id])\n @@map(\"counter_offers\")\n}\n\n//------------------------------------ COUNTER OFFER MODEL END ------------------------------------\n\n//------------------------------------ PURCHASE ORDER MODEL START ------------------------------------\n\nenum PurchaseOrderStatus {\n PENDING\n REQUESTED\n REJECTED\n COMPLETED\n REVOKED\n EXPIRED\n PENDING_DELIVERY\n PARTIALLY_DELIVERED\n DELIVERED\n}\n\nenum PurchaseOrderTypeEnum {\n PURCHASE_INTAKE\n FAST_CATALOGUE\n BLANKET_PURCHASE_ORDER\n}\n\nenum DeliveryStatus {\n PENDING_DELIVERY\n PARTIALLY_DELIVERED\n DELIVERED\n}\n\nmodel PurchaseOrder {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n purchase_order_no String? @unique\n purchase_order_date DateTime? @default(now()) @db.Timestamptz(6)\n total_amount Decimal? @default(0.00) @db.Decimal(10, 2)\n po_type PurchaseOrderTypeEnum? @default(PURCHASE_INTAKE)\n status PurchaseOrderStatus? @default(PENDING)\n delivery_status DeliveryStatus? @default(PENDING_DELIVERY)\n attachments Json?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n purchase_order_activity_log PurchaseOrderActivityLog[]\n purchase_order_items PurchaseOrderItem[]\n blanket_po BlanketPurchaseOrder? @relation(fields: [blanket_po_id], references: [id])\n blanket_po_id Int?\n blanket_po_releases BlanketPurchaseOrderRelease[]\n grn GRN[]\n invoices Invoice[]\n\n @@index([event_id])\n @@index([event_vendor_id])\n @@index([status])\n @@map(\"purchase_orders\")\n}\n\n//------------------------------------ PURCHASE ORDER MODEL END --------------------------------------\n\n//------------------------------------ PURCHASE ORDER ITEMS MODEL START ------------------------------------\n\nmodel PurchaseOrderItem {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n purchase_order_id Int?\n purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)\n purchase_request_id Int?\n purchase_request PurchaseIntake? @relation(fields: [purchase_request_id], references: [id], onDelete: Cascade)\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n boq_event_item_id Int?\n boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n vendor_id Int?\n amount Decimal? @default(0.00) @db.Decimal(10, 2)\n quantity Int?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n grn_items GRNItem[]\n invoice_items InvoiceItem[]\n\n @@index([purchase_order_id])\n @@index([purchase_request_id])\n @@index([item_id])\n @@index([boq_event_item_id])\n @@map(\"purchase_order_items\")\n}\n\n//------------------------------------ PURCHASE ORDER ITEMS MODEL END --------------------------------------\n\n//------------------------------------ PURCHASE ORDER ACTIVITY MODEL START --------------------------------------\n\nenum POActivityType {\n CREATED\n REQUESTED\n UPLOADED\n SENT_TO_VENDOR\n COMPLETED\n CANCELLED\n OTHER\n}\n\nmodel PurchaseOrderActivityLog {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n purchase_order_id Int?\n purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)\n user_id Int? // Could be buyer or vendor\n user User? @relation(fields: [user_id], references: [id], onDelete: SetNull)\n vendor_id Int?\n activity_type POActivityType? @default(CREATED)\n remarks String? // Optional free text for custom remarks\n metadata Json? // Any additional details (file info, etc.)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@index([purchase_order_id])\n @@index([user_id])\n @@index([vendor_id])\n @@map(\"purchase_order_activity_logs\")\n}\n\n//------------------------------------ PURCHASE ORDER ACTIVITY MODEL END --------------------------------------\n\n//------------------------------------- USER VENDOR SOCKET TOKENS MODEL START --------------------------------------------\n\nmodel UserVendorSocketTokens {\n id Int @id @default(autoincrement())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n socket_id String?\n status Boolean? @default(true)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@map(\"user_vendor_socket_tokens\")\n}\n\n//------------------------------------- USER VENDOR SOCKET TOKENS MODEL END --------------------------------------------\n\n//------------------------------------- EVENT ACTIVITY LOG MODEL START --------------------------------------------\n\nmodel ActivityLog {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n module_name String? // e.g., \"PurchaseIntake\", \"VendorManagement\"\n module_id Int? // ID of the module instance (e.g., PurchaseIntake ID)\n activity_type String? // e.g., \"created\", \"updated\", \"deleted\"\n description String?\n metadata Json? // Additional details about the activity\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@index([user_id])\n @@index([vendor_id])\n @@map(\"activity_logs\")\n}\n\n//------------------------------------- EVENT ACTIVITY LOG MODEL END --------------------------------------------\n\n//------------------------------------- CONTATC US MODEL END --------------------------------------------\n\nmodel ContactUs {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n full_name String?\n email String?\n mobile_code String?\n mobile String?\n description String?\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n is_reply Boolean? @default(false)\n reply_at DateTime @default(now()) @db.Timestamptz(6)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n\n @@map(\"contact_us\")\n}\n\n//------------------------------------- CONTACT US MODEL END --------------------------------------------\n\n//------------------------------------- UPLOAD MODEL START --------------------------------------------\n\nenum UploadStatus {\n PENDING\n PROCESSING\n COMPLETED\n FAILED\n}\n\nenum UploadModuleEnum {\n ITEM_LIBRARY\n CATEGORY_MASTER\n SUB_CATEGORY_MASTER\n UOM_MASTER\n ATTRIBUTE_MASTER\n}\n\nmodel UploadLog {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n user_id Int\n user User @relation(fields: [user_id], references: [id])\n module UploadModuleEnum?\n file_name String?\n file_size Int?\n status UploadStatus @default(PENDING)\n total_records Int?\n success_count Int?\n failure_count Int?\n error_file_path String?\n started_at DateTime @default(now())\n completed_at DateTime?\n errors Json?\n\n @@map(\"upload_logs\")\n}\n\n//------------------------------------- UPLOAD MODEL END --------------------------------------------\n\n//------------------------------------- USER EVENT CONFIGURATION MODEL END --------------------------------------------\n\nmodel UserEventConfiguration {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String?\n slug String? @unique\n description String?\n is_active Boolean @default(false)\n is_editable Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n\n @@map(\"user_event_configurations\")\n}\n\n//------------------------------------- USER EVENT CONFIGURATION MODEL END --------------------------------------------\n\n//------------------------------------- EXPORT MODEL START ------------------------------------------------------------\n\nenum ExportStatus {\n PENDING\n PROCESSING\n COMPLETED\n FAILED\n}\n\nenum ExportModuleEnum {\n ITEM_LIBRARY\n CATEGORY_MASTER\n SUB_CATEGORY_MASTER\n UOM_MASTER\n ATTRIBUTE_MASTER\n}\n\nmodel ExportLog {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n user_id Int\n user User @relation(fields: [user_id], references: [id])\n module UploadModuleEnum?\n file_name String?\n file_size Int?\n file_path String?\n download_url String?\n error_message String?\n total_records Int?\n processed_records Int? @default(0)\n filters Json?\n status UploadStatus @default(PENDING)\n created_at DateTime @default(now())\n started_at DateTime?\n completed_at DateTime?\n expires_at DateTime? @default(dbgenerated(\"(NOW() + '7 days'::interval)\"))\n\n @@map(\"export_logs\")\n}\n\n//------------------------------------- UPLOAD MODEL END ---------------------------------------------------\n\n//------------------------------------- FISCAL YEAR MODEL START --------------------------------------------\n\nmodel FiscalYear {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n name String? @unique // e.g., \"FY 2025-26\"\n start_date DateTime?\n end_date DateTime?\n is_active Boolean @default(false) // Only one active year at a time\n is_default Boolean @default(false) // Mark default for new records\n created_at DateTime @default(now())\n created_by Int?\n updated_at DateTime @updatedAt\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime?\n deleted_by Int?\n\n @@index([start_date, end_date])\n @@map(\"fiscal_years\")\n}\n\n//------------------------------------- FISCAL YEAR MODEL END --------------------------------------------\n\n//------------------------------------- BUDGET MODEL START -----------------------------------------------\nenum BudgetStatus {\n WARNING\n HEALTHY\n CRITICAL\n}\n\nmodel Budget {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n code String? @unique // Unique code for the budget\n company_name String?\n fiscal_year String?\n currency String? @default(\"INR\")\n initial_total_annual_budget Decimal? @db.Decimal(15, 2)\n total_annual_budget Decimal? @db.Decimal(15, 2)\n description String?\n status BudgetStatus @default(HEALTHY)\n created_by Int?\n created_at DateTime @default(now())\n updated_by Int?\n updated_at DateTime @updatedAt\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n // Relations\n department_budgets DepartmentBudget[]\n supporting_documents SupportingDocument[]\n\n @@unique([code, fiscal_year], name: \"unique_budget_code_fiscal_year\")\n @@map(\"budgets\")\n}\n\n//------------------------------------- BUDGET MODEL END ---------------------------------------------------------\n\n//------------------------------------- DEPARTMENT BUDGET MODEL START --------------------------------------------\nmodel DepartmentBudget {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n code String? @unique // Unique code for the department budget\n budget_id Int?\n department_id Int?\n initial_allocated_budget Decimal? @db.Decimal(15, 2)\n allocated_budget Decimal? @db.Decimal(15, 2)\n remaining_budget Decimal? @default(0) @db.Decimal(15, 2)\n fiscal_year String? // e.g., \"FY 2025-26\"\n notes String?\n description String?\n created_by Int?\n created_at DateTime @default(now())\n updated_by Int?\n updated_at DateTime @updatedAt\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n\n // Relations\n budget Budget? @relation(fields: [budget_id], references: [id], onDelete: Cascade)\n department Department? @relation(fields: [department_id], references: [id], onDelete: Cascade)\n category_budgets CategoryBudget[]\n supporting_documents SupportingDocument[]\n\n @@unique([budget_id, department_id])\n @@map(\"department_budgets\")\n}\n\n//------------------------------------- DEPARTMENT BUDGET MODEL END --------------------------------------------\n\n//------------------------------------- CATEGORY BUDGET MODEL START --------------------------------------------\nmodel CategoryBudget {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n department_budget_id Int?\n category_id Int?\n initial_allocated_budget Decimal? @db.Decimal(15, 2)\n allocated_budget Decimal @db.Decimal(15, 2)\n remaining_budget Decimal @default(0) @db.Decimal(15, 2)\n fiscal_year String? // e.g., \"FY 2025-26\"\n notes String?\n description String?\n total_held_amount Decimal @default(0) @db.Decimal(15, 2) // Running total of all PENDING holds\n crated_by Int?\n created_at DateTime @default(now())\n updated_by Int?\n updated_at DateTime @updatedAt\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n\n // Relations\n department_budget DepartmentBudget? @relation(fields: [department_budget_id], references: [id], onDelete: Cascade)\n category Category? @relation(fields: [category_id], references: [id], onDelete: Cascade)\n expenses Expense[]\n supporting_documents SupportingDocument[]\n budget_holds BudgetHold[] // New relation\n\n @@unique([department_budget_id, category_id])\n @@map(\"category_budgets\")\n}\n\n//------------------------------------- CATEGORY BUDGET MODEL END --------------------------------------------------\n\nenum BudgetHoldStatus {\n PENDING\n RELEASED\n REJECTED\n PARTIAL\n}\n\nmodel BudgetHold {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n category_budget_id Int?\n hold_amount Decimal? @default(0) @db.Decimal(15, 2)\n consumed_amount Decimal? @default(0) @db.Decimal(15, 2)\n status BudgetHoldStatus @default(PENDING)\n reference_type String? // e.g., \"PURCHASE_INTAKE\", \"FAST_CATALOGUE\", \"BLANKET_PURCHASE_ORDER\"\n reference_id Int? // The ID of the source record that triggered this hold\n reason String? // Why the hold was created\n held_at DateTime @default(now()) // When the hold was placed\n resolved_at DateTime? // When it was approved / rejected / released / cancelled\n created_by Int?\n created_at DateTime @default(now())\n updated_by Int?\n updated_at DateTime @updatedAt\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n\n // Relations\n category_budget CategoryBudget? @relation(fields: [category_budget_id], references: [id], onDelete: Cascade)\n\n @@map(\"budget_holds\")\n}\n\n//------------------------------------- SUPPORTING DOCUMENT MODEL START --------------------------------------------\n\nmodel SupportingDocument {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n budget_id Int?\n department_budget_id Int?\n category_budget_id Int?\n file_name String?\n original_name String?\n file_path String?\n file_size Int?\n mime_type String?\n created_by Int?\n created_at DateTime @default(now())\n updated_by Int?\n updated_at DateTime @updatedAt\n is_deleted Boolean @default(false)\n deleted_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n\n // Relations\n budget Budget? @relation(fields: [budget_id], references: [id], onDelete: Cascade)\n department_budget DepartmentBudget? @relation(fields: [department_budget_id], references: [id], onDelete: Cascade)\n category_budget CategoryBudget? @relation(fields: [category_budget_id], references: [id], onDelete: Cascade)\n\n @@map(\"supporting_documents\")\n}\n\n//------------------------------------- SUPPORTING DOCUMENT MODEL END --------------------------------------------\n\n//------------------------------------- EXPENSE MODEL START ------------------------------------------------------\n\n// For tracking actual expenses against budgets\nmodel Expense {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n category_budget_id Int?\n amount Decimal @db.Decimal(15, 2)\n description String?\n expense_date DateTime?\n receipt_number String?\n vendor_name String?\n notes String?\n created_at DateTime @default(now())\n updated_at DateTime @updatedAt\n\n // Relations\n category_budget CategoryBudget? @relation(fields: [category_budget_id], references: [id], onDelete: Cascade)\n\n @@map(\"expenses\")\n}\n\n//------------------------------------- EXPENSE MODEL END -----------------------------------------------------\n\n//------------------------------------- VENDOR REFERENCE MODEL START ------------------------------------------\n\nmodel VendorReference {\n id Int @id @default(autoincrement())\n global_vendor_id Int? // reference id from global vendor\n tenant_vendor_code String? // reference id from tenant vendor\n invited_by Int? // who invited the vendor to the tenant\n user User? @relation(fields: [invited_by], references: [id], onDelete: Cascade)\n invited_on DateTime?\n meta_data Json? // Additional metadata about the vendor\n is_deleted Boolean @default(false)\n created_at DateTime @default(now())\n created_by Int?\n updated_at DateTime @updatedAt\n updated_by Int?\n deleted_at DateTime?\n deleted_by Int?\n\n @@map(\"vendor_references\")\n}\n\n//------------------------------------- VENDOR REFERENCE MODEL END ----------------------------------------------\n\n//------------------------------------- FAST CATALOGUE MODEL START ----------------------------------------------\n\nenum RequestedCatalogueStatusEnum {\n ACTIVE\n COMPLETED\n}\n\nenum RequestedCatalogueSubmissionStatusEnum {\n PENDING\n PARTIAL\n COMPLETED\n APPROVED\n}\n\nmodel RequestedCatalogue {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n code String? @unique // Unique code for the catalogue\n request_status RequestedCatalogueStatusEnum? @default(ACTIVE)\n submission_status RequestedCatalogueSubmissionStatusEnum? @default(PENDING)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n requested_catalogue_details RequestedCatalogueDetails[]\n\n @@map(\"requested_catalogues\")\n}\n\n//------------------------------------- FAST CATALOGUE MODEL END ------------------------------------------------------\n\n//------------------------------------- FAST CATALOGUE DETAILS MODEL START ----------------------------------------------\n\nenum RequestedCatalogueDetailsStatusEnum {\n REQUESTED\n QUOTED\n REJECTED\n AUTO_REJECTED\n MARK_FOR_LATER\n ACCEPTED\n DECLINED\n}\n\nmodel RequestedCatalogueDetails {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n req_catalogue_id Int?\n req_catalogue RequestedCatalogue? @relation(fields: [req_catalogue_id], references: [id], onDelete: Cascade)\n item_id Int?\n parent_item Item? @relation(\"ParentItemRequests\", fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n variant_id Int?\n variant Item? @relation(\"VariantItemRequests\", fields: [variant_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n vendor_id Int?\n status RequestedCatalogueDetailsStatusEnum? @default(REQUESTED)\n stock Int?\n unit_price Decimal? @db.Decimal(15, 2)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([req_catalogue_id])\n @@index([item_id])\n @@index([variant_id])\n @@map(\"requested_catalogue_details\")\n}\n\n//------------------------------------- FAST CATALOGUE DETAILS MODEL END --------------------------------------------------\n\n//---------------------------------- CATALOGUE MODEL START ---------------------------------------\n\nenum CatalogueStatusEnum {\n ACTIVE\n INACTIVE\n}\n\nmodel Catalogue {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n req_catalogue_id Int?\n item_id Int?\n parent_item Item? @relation(\"ParentItemCatalogue\", fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n variant_id Int?\n variant Item? @relation(\"VariantItemCatalogue\", fields: [variant_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n status CatalogueStatusEnum @default(ACTIVE)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n catalogue_vendors CatalogueVendor[]\n\n @@index([req_catalogue_id])\n @@index([item_id])\n @@index([variant_id])\n @@map(\"catalogue\")\n}\n\n//---------------------------------- CATALOGUE MODEL END ---------------------------------------\n\n//---------------------------------- CATALOGUE VENDOR MODEL START ---------------------------------------\n\nenum CatalogueVendorStatusEnum {\n ACTIVE\n INACTIVE\n BLOCKED\n SUSPENDED\n PENDING_FOR_APPROVAL\n REJECTED_FOR_APPROVAL\n}\n\nmodel CatalogueVendor {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n catalogue_id Int?\n catalogue Catalogue? @relation(fields: [catalogue_id], references: [id], onDelete: Cascade)\n item_id Int?\n parent_item Item? @relation(\"ParentItemCatalogueVendor\", fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n variant_id Int?\n variant Item? @relation(\"VariantItemCatalogueVendor\", fields: [variant_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n vendor_id Int?\n stock Int?\n price Decimal? @db.Decimal(15, 2)\n status CatalogueVendorStatusEnum @default(ACTIVE)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([catalogue_id])\n @@index([vendor_id])\n @@map(\"catalogue_vendor\")\n}\n\n//---------------------------------- CATALOGUE VENDOR MODEL END ---------------------------------------\n//---------------------------------- CATALOGUE CART MODEL START ---------------------------------------\n\nenum CatalogueCartTypeEnum {\n BLANKET_PURCHASE_ORDER\n FAST_CATALOGUE\n OTHER\n}\n\nmodel CatalogueCart {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n user_id Int?\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n item_id Int?\n item Item? @relation(\"ParentItemCatalogueCart\", fields: [item_id], references: [id], onDelete: Cascade)\n variant_id Int?\n variant Item? @relation(\"VariantItemCatalogueCart\", fields: [variant_id], references: [id], onDelete: Cascade)\n quantity Int?\n catalogue_cart_type CatalogueCartTypeEnum? @default(FAST_CATALOGUE)\n price Decimal? @db.Decimal(15, 2)\n total_price Decimal? @db.Decimal(15, 2)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([user_id])\n @@index([item_id])\n @@index([variant_id])\n @@index([vendor_id])\n @@map(\"catalogue_cart\")\n}\n\n//---------------------------------- CATALOGUE CART MODEL END ---------------------------------------\n\n//---------------------------------- RFI FORM TEMPLATE MODEL START ---------------------------------------\nmodel EventRfiForm {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int? @unique\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n form_data Json? @db.JsonB\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n is_deleted Boolean @default(false)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n event_rfi_form_logs EventRfiFormLog[]\n\n @@index([event_id])\n @@map(\"event_rfi_forms\")\n}\n\n//---------------------------------- RFI FORM TEMPLATE MODEL END ---------------------------------------\n\n//---------------------------------- RFI SUBMISSION LOG MODEL START ---------------------------------------\nenum EventRfiFormStatus {\n PENDING\n SUBMITTED\n APPROVED\n REJECTED\n DRAFT\n}\n\nmodel EventRfiFormLog {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n rfi_form_id Int?\n rfi_form EventRfiForm? @relation(fields: [rfi_form_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n rfi_form_response Json? @db.JsonB\n status EventRfiFormStatus @default(DRAFT)\n reviewed_at DateTime? @db.Timestamptz(6)\n reviewed_by Int?\n user User? @relation(fields: [reviewed_by], references: [id], onDelete: Cascade)\n comments String?\n rating Int?\n version Int @default(1)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([event_id, event_vendor_id])\n @@index([event_id, status])\n @@index([event_vendor_id])\n @@map(\"event_rfi_form_logs\")\n}\n\n//---------------------------------- RFI SUBMISSION LOG MODEL END ---------------------------------------\n\n//---------------------------------- EVENT CRITERIA MODEL START ------------------------------------------------\n\nmodel EventCriteria {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n criteria_name String? // e.g., \"Price\", \"Quality\", \"Delivery\", \"Technical Specs\", etc.\n criteria_slug String? // Slug for easy identification, e.g., \"price\", \"quality\", \"delivery\"\n weightage Decimal @db.Decimal(5, 2) // Percentage (0-100), e.g., 40, 30, 30\n is_price_criteria Boolean @default(false) // True for Price (auto-calculated from lowest bid/quotation)\n min_score Int? @default(0) // Minimum score value (default: 0)\n max_score Int? @default(5) // Maximum score value (default: 5)\n description String? // Optional description/instructions for evaluators\n display_order Int? @default(0) // Order to display criteria in UI\n is_active Boolean @default(true)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n // Relations\n event_vendor_criteria EventVendorCriteria[]\n\n @@index([event_id])\n @@index([criteria_slug])\n @@index([is_price_criteria])\n @@map(\"event_criteria\")\n}\n\n//---------------------------------- EVENT CRITERIA MODEL END ------------------------------------------------\n\n//---------------------------------- EVENT VENDOR CRITERIA MODEL START ------------------------------------------------\nmodel EventVendorCriteria {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n event_id Int?\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n event_criteria_id Int?\n event_criteria EventCriteria? @relation(fields: [event_criteria_id], references: [id], onDelete: Cascade)\n // Raw values\n raw_score Decimal? @db.Decimal(10, 2) // For manual criteria: user input (0-5)\n raw_price Decimal? @db.Decimal(15, 2) // For price criteria: actual bid/quotation amount\n // Calculated values\n normalized_score Decimal? @db.Decimal(10, 4) // Normalized score (0-5 scale)\n weighted_contribution Decimal? @db.Decimal(10, 4) // normalized_score × (weightage/100)\n // Metadata\n notes String? // Optional notes/justification for the score\n scored_at DateTime? @db.Timestamptz(6)\n scored_by Int? // User who assigned the score\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@unique([event_vendor_id, event_criteria_id], name: \"unique_vendor_criteria\")\n @@index([event_id])\n @@index([event_vendor_id])\n @@index([event_criteria_id])\n @@map(\"event_vendor_criteria\")\n}\n\n//---------------------------------- EVENT VENDOR CRITERIA MODEL END ------------------------------------------------\n\n//---------------------------------- CHAT CONVERSATION MODEL START ------------------------------------------------\n// \n// CHAT SYSTEM DESIGN:\n// 1. ONE_ON_ONE: Direct chat between Admin and Vendor (one-to-one)\n// 2. EVENT_GROUP: Admin creates event conversation, can message all vendors or specific vendors\n// - Vendors cannot see each other's messages (privacy maintained via MessageRecipient)\n// - Admin can send broadcast (ALL_PARTICIPANTS) or targeted (SPECIFIC_RECIPIENTS) messages\n//\n// MESSAGE FLOW:\n// - Sender info stored in Message model (sender_user_id or sender_vendor_id)\n// - Receiver info stored in MessageRecipient model (recipient_user_id or recipient_vendor_id)\n// - Each vendor only sees messages where they are recipients\n// - For EVENT_GROUP broadcasts, create MessageRecipient entries for each vendor\n//\n\nenum ConversationType {\n ONE_ON_ONE // User/Admin to Vendor direct chat (one-to-one)\n EVENT_GROUP // Event group chat - Admin can message all or specific vendors\n}\n\nenum ConversationStatus {\n ACTIVE\n ARCHIVED\n DELETED\n}\n\nmodel Conversation {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n type ConversationType @default(ONE_ON_ONE)\n event_id Int? // For EVENT_GROUP type - links to Event\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n admin_user_id Int? // Admin/User who created/manages the conversation\n admin_user User? @relation(\"ConversationAdminUser\", fields: [admin_user_id], references: [id], onDelete: Cascade)\n vendor_id Int? // For ONE_ON_ONE type - the vendor in conversation (not used for EVENT_GROUP)\n title String? // Optional title for group chats\n status ConversationStatus @default(ACTIVE)\n last_message_at DateTime? @db.Timestamptz(6)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n // Relations\n messages Message[]\n conversation_participants ConversationParticipant[]\n\n // Unique constraint: For ONE_ON_ONE - one conversation per admin-vendor pair\n // For EVENT_GROUP - vendor_id is NULL, so multiple conversations per admin-event are allowed\n @@unique([admin_user_id, vendor_id, event_id], name: \"unique_one_on_one_conversation\")\n @@index([admin_user_id])\n @@index([vendor_id])\n @@index([event_id])\n @@index([type])\n @@index([status])\n @@map(\"conversations\")\n}\n\n//---------------------------------- CHAT CONVERSATION MODEL END ------------------------------------------------\n\n//---------------------------------- CONVERSATION PARTICIPANT MODEL START ------------------------------------------------\n\nmodel ConversationParticipant {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n conversation_id Int\n conversation Conversation @relation(fields: [conversation_id], references: [id], onDelete: Cascade)\n\n // Participant Information\n user_id Int? // Participant: Admin/User ID (for admin participants)\n user User? @relation(\"ConversationParticipantUser\", fields: [user_id], references: [id], onDelete: Cascade)\n vendor_id Int? // Participant: Vendor ID (for vendor participants)\n is_admin Boolean @default(false) // True if user participant is admin\n\n // Participation Tracking\n joined_at DateTime @default(now()) @db.Timestamptz(6)\n left_at DateTime? @db.Timestamptz(6)\n last_read_at DateTime? @db.Timestamptz(6)\n is_active Boolean @default(true)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n\n @@unique([conversation_id, user_id, vendor_id], name: \"unique_participant\")\n @@index([conversation_id])\n @@index([user_id])\n @@index([vendor_id])\n @@map(\"conversation_participants\")\n}\n\n//---------------------------------- CONVERSATION PARTICIPANT MODEL END ------------------------------------------------\n\n//---------------------------------- MESSAGE MODEL START ------------------------------------------------\n\nenum MessageType {\n TEXT\n FILE\n SYSTEM\n}\n\nenum MessageSenderType {\n USER // Admin/User sender\n VENDOR // Vendor sender\n}\n\nenum MessageBroadcastType {\n ALL_PARTICIPANTS // Sent to all participants in EVENT_GROUP conversation\n SPECIFIC_RECIPIENTS // Sent to specific recipients (handled via MessageRecipient)\n}\n\nmodel Message {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n conversation_id Int\n conversation Conversation @relation(fields: [conversation_id], references: [id], onDelete: Cascade)\n\n // Sender Information (clear naming)\n sender_type MessageSenderType // USER (Admin) or VENDOR\n sender_user_id Int? // Sender: Admin/User ID (if sender_type is USER)\n sender_user User? @relation(\"MessageSenderUser\", fields: [sender_user_id], references: [id], onDelete: SetNull)\n sender_vendor_id Int? // Sender: Vendor ID (if sender_type is VENDOR)\n\n // Broadcast Type (for EVENT_GROUP conversations)\n broadcast_type MessageBroadcastType @default(SPECIFIC_RECIPIENTS) // ALL_PARTICIPANTS or SPECIFIC_RECIPIENTS\n\n // Message Content\n message_type MessageType @default(TEXT)\n content String? // Text content\n file Json? // For multiple files\n is_edited Boolean @default(false)\n edited_at DateTime? @db.Timestamptz(6)\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n\n // Reply functionality - allows users to reply to their own or other messages\n reply_to_message_id Int? // ID of the message being replied to (self-referential)\n reply_to_message Message? @relation(\"MessageReplies\", fields: [reply_to_message_id], references: [id], onDelete: SetNull)\n replies Message[] @relation(\"MessageReplies\") // Messages that reply to this message\n\n // Relations\n recipients MessageRecipient[] // Receivers are stored here (vendors cannot see each other's messages)\n\n @@index([conversation_id])\n @@index([sender_user_id])\n @@index([sender_vendor_id])\n @@index([sender_type])\n @@index([broadcast_type])\n @@index([created_at])\n @@index([reply_to_message_id])\n @@map(\"messages\")\n}\n\n//---------------------------------- MESSAGE MODEL END ------------------------------------------------\n\n//---------------------------------- MESSAGE RECIPIENT MODEL START ------------------------------------------------\n\nenum MessageRecipientType {\n USER // Admin/User recipient\n VENDOR // Vendor recipient\n}\n\nenum MessageReadStatus {\n SENT\n DELIVERED\n READ\n}\n\nmodel MessageRecipient {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n message_id Int\n message Message @relation(fields: [message_id], references: [id], onDelete: Cascade)\n\n // Receiver Information (clear naming)\n recipient_type MessageRecipientType // USER (Admin) or VENDOR\n recipient_user_id Int? // Receiver: Admin/User ID (if recipient_type is USER)\n recipient_user User? @relation(\"MessageRecipientUser\", fields: [recipient_user_id], references: [id], onDelete: Cascade)\n recipient_vendor_id Int? // Receiver: Vendor ID (if recipient_type is VENDOR)\n\n // Read Status Tracking\n read_status MessageReadStatus @default(SENT)\n read_at DateTime? @db.Timestamptz(6)\n delivered_at DateTime? @db.Timestamptz(6)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n\n @@unique([message_id, recipient_user_id, recipient_vendor_id], name: \"unique_message_recipient\")\n @@index([message_id])\n @@index([recipient_user_id])\n @@index([recipient_vendor_id])\n @@index([recipient_type])\n @@index([read_status])\n @@map(\"message_recipients\")\n}\n\n//---------------------------------- MESSAGE RECIPIENT MODEL END ------------------------------------------------\n\n//------------------------------------ BLANKET PURCHASE ORDER MODEL START ------------------------------------\n\nenum BlanketPurchaseOrderStatus {\n PENDING\n ACTIVE\n EXPIRED\n COMPLETED\n REJECTED\n}\n\nenum ReleaseFrequency {\n DAILY\n WEEKLY\n MONTHLY\n QUARTERLY\n CUSTOM\n}\n\nenum SplitMethod {\n EQUAL_SPLIT\n CUSTOM_SPLIT\n}\n\nmodel BlanketPurchaseOrder {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n bpo_number String? @unique\n event_id Int?\n event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)\n event_vendor_id Int?\n event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)\n vendor_id Int?\n bpo_date DateTime @default(now()) @db.Timestamptz(6)\n start_date DateTime? @db.Timestamptz(6)\n end_date DateTime? @db.Timestamptz(6)\n total_bpo_value Decimal @default(0.00) @db.Decimal(15, 2)\n fulfilled_quantity Int @default(0)\n total_quantity Int @default(0)\n status BlanketPurchaseOrderStatus @default(PENDING)\n attachments Json? @db.JsonB\n terms_conditions String?\n notes String?\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n blanket_po_items BlanketPurchaseOrderItem[]\n blanket_po_releases BlanketPurchaseOrderRelease[]\n generated_purchase_orders PurchaseOrder[]\n\n @@index([vendor_id])\n @@index([event_id])\n @@index([event_vendor_id])\n @@index([status])\n @@index([bpo_date])\n @@index([start_date, end_date])\n @@map(\"blanket_purchase_orders\")\n}\n\n//------------------------------------ BLANKET PURCHASE ORDER MODEL END ------------------------------------\n\n//------------------------------------ BLANKET PURCHASE ORDER ITEM MODEL START ------------------------------------\n\nmodel BlanketPurchaseOrderItem {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n blanket_po_id Int\n blanket_po BlanketPurchaseOrder @relation(fields: [blanket_po_id], references: [id], onDelete: Cascade)\n item_id Int?\n item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)\n total_quantity Int\n fulfilled_quantity Int @default(0)\n unit_price Decimal? @db.Decimal(15, 2)\n total_amount Decimal? @db.Decimal(15, 2)\n release_frequency ReleaseFrequency?\n split_method SplitMethod?\n purchase_request_id Int?\n purchase_request PurchaseIntake? @relation(fields: [purchase_request_id], references: [id], onDelete: Cascade)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n blanket_po_releases BlanketPurchaseOrderRelease[]\n\n @@index([blanket_po_id])\n @@index([item_id])\n @@map(\"blanket_purchase_order_items\")\n}\n\n//------------------------------------ BLANKET PURCHASE ORDER ITEM MODEL END ------------------------------------\n\n//------------------------------------ BLANKET PURCHASE ORDER RELEASE MODEL START ------------------------------------\n\nenum BlanketPurchaseOrderReleaseStatus {\n PLANNED\n COMPLETED\n REJECTED\n PARTIAL\n EXPIRED\n}\n\nmodel BlanketPurchaseOrderRelease {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n blanket_po_id Int\n blanket_po BlanketPurchaseOrder? @relation(fields: [blanket_po_id], references: [id])\n blanket_po_item_id Int\n blanket_po_item BlanketPurchaseOrderItem @relation(fields: [blanket_po_item_id], references: [id], onDelete: Cascade)\n release_number Int\n release_date DateTime @db.Timestamptz(6)\n release_quantity Int\n fulfilled_quantity Int @default(0)\n release_value Decimal @db.Decimal(15, 2)\n delivery_location_id Int?\n delivery_location Location? @relation(fields: [delivery_location_id], references: [id])\n purchase_order_id Int?\n purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)\n delivery_date DateTime? @db.Timestamptz(6)\n status BlanketPurchaseOrderReleaseStatus @default(PLANNED)\n notes String?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([blanket_po_id])\n @@index([blanket_po_item_id])\n @@index([status])\n @@index([release_date])\n @@index([delivery_date])\n @@map(\"blanket_purchase_order_releases\")\n}\n\n//------------------------------------ BLANKET PURCHASE ORDER RELEASE MODEL END ------------------------------------\n\n//------------------------------------ GRN MODEL START ------------------------------------\n\nenum GRNStatus {\n PENDING\n PARTIAL\n COMPLETED\n REJECTED\n}\n\nenum InspectionStatus {\n PENDING\n PARTIAL\n COMPLETED\n REJECTED\n}\n\nmodel GRN {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n\n // GRN details\n grn_number String? @unique\n purchase_order_id Int?\n purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)\n dispatch_date_time DateTime? @db.Timestamptz(6)\n expected_arrival_date DateTime? @db.Timestamptz(6)\n received_date_time DateTime? @db.Timestamptz(6)\n received_by String?\n remarks String?\n start_point String?\n end_point String?\n transporter_name String?\n transport_vehicle_registration_number String?\n transport_vehicle_type String?\n challan_number String?\n driver_name String?\n country_code String?\n driver_contact_number String?\n e_way_bill_number String?\n tracking_link String?\n delivery_challan_documents Json? @db.JsonB\n grn_status GRNStatus @default(PENDING)\n delivery_challan_number String?\n\n // inspection details\n inspection_date_time DateTime? @db.Timestamptz(6)\n inspection_code String? @unique\n warehouse String?\n inspector_name String?\n inspection_status InspectionStatus @default(PENDING)\n business_entity_id Int?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n grn_items GRNItem[]\n invoices Invoice[]\n}\n\n//------------------------------------ GRN MODEL END ------------------------------------\n\n//------------------------------------ GRN ITEM MODEL START ------------------------------------\n\nenum GRNItemStatus {\n PENDING\n PARTIAL\n REJECTED\n COMPLETED\n}\n\nmodel GRNItem {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n grn_id Int?\n grn GRN? @relation(fields: [grn_id], references: [id], onDelete: Cascade)\n purchase_order_item_id Int?\n purchase_order_item PurchaseOrderItem? @relation(fields: [purchase_order_item_id], references: [id], onDelete: Cascade)\n dispatch_quantity Int @default(0)\n received_quantity Int @default(0)\n accepted_quantity Int @default(0)\n remarks String?\n inspection_remarks String?\n inspection_attachments Json? @db.JsonB\n status GRNItemStatus @default(PENDING)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n}\n\n//------------------------------------ GRN ITEM MODEL END ------------------------------------\n\n// ------------------------------------ Business Entity MODEL START ------------------------------------\n\nenum BusinessEntityType {\n INDIVIDUAL\n COMPANY\n PARENT_COMPANY\n SUBSIDIARY_COMPANY\n BRANCH_COMPANY\n}\n\nmodel BusinessEntity {\n id Int @id @default(autoincrement())\n uuid String? @unique @default(uuid())\n business_code String? @unique\n business_name String?\n business_email String?\n business_country_code String?\n business_phone String?\n business_website String?\n business_logo String?\n business_description String?\n business_type BusinessEntityType? @default(INDIVIDUAL)\n is_active Boolean? @default(true)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime? @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean? @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n business_entity_departments BusinessEntityDepartment[]\n business_entity_locations BusinessEntityLocation[]\n user_department_entities UserDepartmentEntity[]\n purchase_intakes PurchaseIntake[]\n events Event[]\n purchase_orders PurchaseOrder[]\n event_rfi_forms EventRfiForm[]\n grns GRN[]\n invoices Invoice[]\n blanket_purchase_orders BlanketPurchaseOrder[]\n approval_hierarchies ApprovalHierarchy[]\n\n @@map(\"business_entities\")\n}\n\n// Many-to-many join table: one BusinessEntity can have multiple Locations,\n// one Location can belong to multiple BusinessEntities.\nmodel BusinessEntityLocation {\n id Int @id @default(autoincrement())\n business_entity_id Int\n location_id Int\n is_primary Boolean? @default(false)\n created_at DateTime? @default(now()) @db.Timestamptz(6)\n created_by Int?\n business_entity BusinessEntity @relation(fields: [business_entity_id], references: [id])\n location Location @relation(fields: [location_id], references: [id])\n\n @@unique([business_entity_id, location_id])\n @@map(\"business_entity_locations\")\n}\n\n// ------------------------------------ Business Entity MODEL END ------------------------------------\n\n// ------------------------------------ INVOICE (BILLS) MODEL START ------------------------------------\n\nenum InvoiceStatus {\n PENDING\n SEND_BACK\n RESUBMITTED\n APPROVED\n PAID\n CANCELLED\n}\n\nenum InvoiceMatchingStatus {\n MATCHED\n MISMATCHED\n}\n\nmodel Invoice {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n invoice_number String? @unique\n purchase_order_id Int?\n purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)\n grn_id Int?\n grn GRN? @relation(fields: [grn_id], references: [id])\n vendor_id Int?\n invoice_date DateTime? @db.Timestamptz(6)\n invoice_due_date DateTime? @db.Timestamptz(6)\n delivery_note_number String?\n quantity_fulfilled Int? @default(0)\n total_po_releases Int? @default(0)\n billing_address String?\n status InvoiceStatus @default(PENDING)\n matching_status InvoiceMatchingStatus @default(MISMATCHED)\n invoice_documents Json? @db.JsonB\n notes String?\n business_entity_id Int?\n terms_and_conditions String?\n e_way_bill_number String?\n business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n invoice_items InvoiceItem[]\n\n @@index([purchase_order_id])\n @@index([grn_id])\n @@index([vendor_id])\n @@index([status])\n @@index([matching_status])\n @@map(\"invoices\")\n}\n\n// ------------------------------------ INVOICE (BILLS) MODEL END ------------------------------------\n\n// ------------------------------------ INVOICE ITEM MODEL START ------------------------------------\n\nmodel InvoiceItem {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n invoice_id Int?\n invoice Invoice? @relation(fields: [invoice_id], references: [id], onDelete: Cascade)\n purchase_order_item_id Int?\n purchase_order_item PurchaseOrderItem? @relation(fields: [purchase_order_item_id], references: [id])\n ordered_quantity Int? @default(0)\n invoice_quantity Int? @default(0)\n uom String?\n unit_amount Decimal @default(0) @db.Decimal(15, 2)\n total_amount Decimal @default(0) @db.Decimal(15, 2)\n po_quantity Int? @default(0)\n grn_quantity Int? @default(0)\n quality_quantity Int? @default(0)\n matching_status InvoiceMatchingStatus @default(MISMATCHED)\n resolution_action String?\n resolution_remarks String?\n resolved_at DateTime? @db.Timestamptz(6)\n resolved_by Int?\n\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n updated_at DateTime @updatedAt @db.Timestamptz(6)\n updated_by Int?\n is_deleted Boolean @default(false)\n deleted_at DateTime? @db.Timestamptz(6)\n deleted_by Int?\n\n @@index([invoice_id])\n @@index([purchase_order_item_id])\n @@index([matching_status])\n @@map(\"invoice_items\")\n}\n\n// ------------------------------------ INVOICE ITEM MODEL END ------------------------------------\n\n// ------------------------------------ APPROVAL MANAGEMENT MODEL START --------------------------------\n\nenum ApprovalManagementStatusEnum {\n PENDING\n APPROVED\n REJECTED\n}\n\nmodel ApprovalManagement {\n id Int @id @default(autoincrement())\n uuid String @unique @default(uuid())\n journy_type String? // module e.g. user-management, event-management\n journey_task String? // task e.g. user-updation-approval, event-bid-award-approval\n parent_id String? // parent entity uuid (user, event, PI, etc.)\n user_id Int? // optional when subject is a user\n user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)\n proposed_payload Json?\n previous_snapshot Json?\n estimated_budget Decimal? @db.Decimal(18, 2)\n batch_id String?\n request_status ApprovalManagementStatusEnum @default(PENDING)\n reject_reason String?\n created_at DateTime @default(now()) @db.Timestamptz(6)\n created_by Int?\n\n @@index([parent_id])\n @@index([journy_type, journey_task])\n @@index([batch_id])\n @@index([request_status])\n @@map(\"approval_management\")\n}\n\n// ------------------------------------ APPROVAL MANAGEMENT MODEL END ----------------------------------\n",
|
|
24
24
|
"runtimeDataModel": {
|
|
25
25
|
"models": {},
|
|
26
26
|
"enums": {},
|