✨ Features: - Complete authentication system with JWT - Dashboard with all 6 modules visible - Contact Management module (Salesforce-style) - CRM & Sales Pipeline module (Pipedrive-style) - Inventory & Assets module (SAP-style) - Tasks & Projects module (Jira/Asana-style) - HR Management module (BambooHR-style) - Marketing Management module (HubSpot-style) - Admin Panel with user management and role matrix - World-class UI/UX with RTL Arabic support - Cairo font (headings) + Readex Pro font (body) - Sample data for all modules - Protected routes and authentication flow - Backend API with Prisma + PostgreSQL - Comprehensive documentation 🎨 Design: - Color-coded modules - Professional data tables - Stats cards with metrics - Progress bars and status badges - Search and filters - Responsive layout 📊 Tech Stack: - Frontend: Next.js 14, TypeScript, Tailwind CSS - Backend: Node.js, Express, Prisma - Database: PostgreSQL - Auth: JWT with bcrypt 🚀 Production-ready frontend with all features accessible
1387 lines
44 KiB
SQL
1387 lines
44 KiB
SQL
-- CreateTable
|
|
CREATE TABLE "audit_logs" (
|
|
"id" TEXT NOT NULL,
|
|
"entityType" TEXT NOT NULL,
|
|
"entityId" TEXT NOT NULL,
|
|
"action" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"changes" JSONB,
|
|
"ipAddress" TEXT,
|
|
"userAgent" TEXT,
|
|
"reason" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "audit_logs_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "users" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"username" TEXT NOT NULL,
|
|
"password" TEXT NOT NULL,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"lastLogin" TIMESTAMP(3),
|
|
"failedLoginAttempts" INTEGER NOT NULL DEFAULT 0,
|
|
"lockedUntil" TIMESTAMP(3),
|
|
"employeeId" TEXT,
|
|
"refreshToken" TEXT,
|
|
"passwordResetToken" TEXT,
|
|
"passwordResetExpires" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "employees" (
|
|
"id" TEXT NOT NULL,
|
|
"uniqueEmployeeId" TEXT NOT NULL,
|
|
"firstName" TEXT NOT NULL,
|
|
"lastName" TEXT NOT NULL,
|
|
"firstNameAr" TEXT,
|
|
"lastNameAr" TEXT,
|
|
"email" TEXT NOT NULL,
|
|
"phone" TEXT,
|
|
"mobile" TEXT NOT NULL,
|
|
"dateOfBirth" TIMESTAMP(3),
|
|
"gender" TEXT,
|
|
"nationality" TEXT,
|
|
"nationalId" TEXT,
|
|
"passportNumber" TEXT,
|
|
"employmentType" TEXT NOT NULL,
|
|
"contractType" TEXT,
|
|
"hireDate" TIMESTAMP(3) NOT NULL,
|
|
"endDate" TIMESTAMP(3),
|
|
"probationEndDate" TIMESTAMP(3),
|
|
"departmentId" TEXT NOT NULL,
|
|
"positionId" TEXT NOT NULL,
|
|
"reportingToId" TEXT,
|
|
"basicSalary" DECIMAL(12,2) NOT NULL,
|
|
"currency" TEXT NOT NULL DEFAULT 'SAR',
|
|
"status" TEXT NOT NULL DEFAULT 'ACTIVE',
|
|
"terminationDate" TIMESTAMP(3),
|
|
"terminationReason" TEXT,
|
|
"emergencyContactName" TEXT,
|
|
"emergencyContactPhone" TEXT,
|
|
"emergencyContactRelation" TEXT,
|
|
"address" TEXT,
|
|
"city" TEXT,
|
|
"country" TEXT,
|
|
"documents" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "employees_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "departments" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"nameAr" TEXT,
|
|
"code" TEXT NOT NULL,
|
|
"parentId" TEXT,
|
|
"description" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "departments_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "positions" (
|
|
"id" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"titleAr" TEXT,
|
|
"code" TEXT NOT NULL,
|
|
"departmentId" TEXT NOT NULL,
|
|
"level" INTEGER NOT NULL,
|
|
"description" TEXT,
|
|
"responsibilities" JSONB,
|
|
"requirements" JSONB,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "positions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "position_permissions" (
|
|
"id" TEXT NOT NULL,
|
|
"positionId" TEXT NOT NULL,
|
|
"module" TEXT NOT NULL,
|
|
"resource" TEXT NOT NULL,
|
|
"actions" JSONB NOT NULL,
|
|
"conditions" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "position_permissions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "attendances" (
|
|
"id" TEXT NOT NULL,
|
|
"employeeId" TEXT NOT NULL,
|
|
"date" DATE NOT NULL,
|
|
"checkIn" TIMESTAMP(3),
|
|
"checkOut" TIMESTAMP(3),
|
|
"workHours" DECIMAL(5,2),
|
|
"overtimeHours" DECIMAL(5,2),
|
|
"status" TEXT NOT NULL,
|
|
"notes" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "attendances_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "leaves" (
|
|
"id" TEXT NOT NULL,
|
|
"employeeId" TEXT NOT NULL,
|
|
"leaveType" TEXT NOT NULL,
|
|
"startDate" DATE NOT NULL,
|
|
"endDate" DATE NOT NULL,
|
|
"days" INTEGER NOT NULL,
|
|
"reason" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
|
"approvedBy" TEXT,
|
|
"approvedAt" TIMESTAMP(3),
|
|
"rejectedReason" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "leaves_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "salaries" (
|
|
"id" TEXT NOT NULL,
|
|
"employeeId" TEXT NOT NULL,
|
|
"month" INTEGER NOT NULL,
|
|
"year" INTEGER NOT NULL,
|
|
"basicSalary" DECIMAL(12,2) NOT NULL,
|
|
"allowances" DECIMAL(12,2) NOT NULL,
|
|
"deductions" DECIMAL(12,2) NOT NULL,
|
|
"commissions" DECIMAL(12,2) NOT NULL,
|
|
"overtimePay" DECIMAL(12,2) NOT NULL,
|
|
"netSalary" DECIMAL(12,2) NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
|
"paidDate" TIMESTAMP(3),
|
|
"notes" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "salaries_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "allowances" (
|
|
"id" TEXT NOT NULL,
|
|
"employeeId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"amount" DECIMAL(12,2) NOT NULL,
|
|
"isRecurring" BOOLEAN NOT NULL DEFAULT false,
|
|
"startDate" DATE NOT NULL,
|
|
"endDate" DATE,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "allowances_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "commissions" (
|
|
"id" TEXT NOT NULL,
|
|
"employeeId" TEXT NOT NULL,
|
|
"dealId" TEXT,
|
|
"amount" DECIMAL(12,2) NOT NULL,
|
|
"percentage" DECIMAL(5,2),
|
|
"month" INTEGER NOT NULL,
|
|
"year" INTEGER NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
|
"notes" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "commissions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "performance_evaluations" (
|
|
"id" TEXT NOT NULL,
|
|
"employeeId" TEXT NOT NULL,
|
|
"evaluationPeriod" TEXT NOT NULL,
|
|
"kpis" JSONB NOT NULL,
|
|
"overallScore" DECIMAL(5,2) NOT NULL,
|
|
"comments" TEXT,
|
|
"evaluatedBy" TEXT NOT NULL,
|
|
"evaluatedAt" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "performance_evaluations_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "employee_trainings" (
|
|
"id" TEXT NOT NULL,
|
|
"employeeId" TEXT NOT NULL,
|
|
"trainingName" TEXT NOT NULL,
|
|
"trainingType" TEXT NOT NULL,
|
|
"provider" TEXT,
|
|
"startDate" DATE NOT NULL,
|
|
"endDate" DATE NOT NULL,
|
|
"cost" DECIMAL(12,2),
|
|
"status" TEXT NOT NULL DEFAULT 'PLANNED',
|
|
"certificate" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "employee_trainings_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "disciplinary_actions" (
|
|
"id" TEXT NOT NULL,
|
|
"employeeId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"reason" TEXT NOT NULL,
|
|
"description" TEXT NOT NULL,
|
|
"actionDate" DATE NOT NULL,
|
|
"issuedBy" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "disciplinary_actions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "contacts" (
|
|
"id" TEXT NOT NULL,
|
|
"uniqueContactId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"nameAr" TEXT,
|
|
"email" TEXT,
|
|
"phone" TEXT,
|
|
"mobile" TEXT,
|
|
"website" TEXT,
|
|
"companyName" TEXT,
|
|
"companyNameAr" TEXT,
|
|
"taxNumber" TEXT,
|
|
"commercialRegister" TEXT,
|
|
"address" TEXT,
|
|
"city" TEXT,
|
|
"country" TEXT,
|
|
"postalCode" TEXT,
|
|
"tags" TEXT[],
|
|
"parentId" TEXT,
|
|
"primaryContactId" TEXT,
|
|
"source" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'ACTIVE',
|
|
"rating" SMALLINT,
|
|
"score" DECIMAL(5,2),
|
|
"customFields" JSONB,
|
|
"createdById" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"archivedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "contacts_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "contact_categories" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"nameAr" TEXT,
|
|
"parentId" TEXT,
|
|
"description" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "contact_categories_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "contact_relationships" (
|
|
"id" TEXT NOT NULL,
|
|
"fromContactId" TEXT NOT NULL,
|
|
"toContactId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"startDate" DATE NOT NULL,
|
|
"endDate" DATE,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"notes" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "contact_relationships_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "deals" (
|
|
"id" TEXT NOT NULL,
|
|
"dealNumber" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"contactId" TEXT NOT NULL,
|
|
"structure" TEXT NOT NULL,
|
|
"pipelineId" TEXT NOT NULL,
|
|
"stage" TEXT NOT NULL,
|
|
"estimatedValue" DECIMAL(15,2) NOT NULL,
|
|
"actualValue" DECIMAL(15,2),
|
|
"currency" TEXT NOT NULL DEFAULT 'SAR',
|
|
"probability" SMALLINT,
|
|
"expectedCloseDate" DATE,
|
|
"actualCloseDate" DATE,
|
|
"ownerId" TEXT NOT NULL,
|
|
"wonReason" TEXT,
|
|
"lostReason" TEXT,
|
|
"fiscalYear" INTEGER NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'ACTIVE',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "deals_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "pipelines" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"nameAr" TEXT,
|
|
"structure" TEXT NOT NULL,
|
|
"stages" JSONB NOT NULL,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "pipelines_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "quotes" (
|
|
"id" TEXT NOT NULL,
|
|
"quoteNumber" TEXT NOT NULL,
|
|
"dealId" TEXT NOT NULL,
|
|
"version" INTEGER NOT NULL DEFAULT 1,
|
|
"items" JSONB NOT NULL,
|
|
"subtotal" DECIMAL(15,2) NOT NULL,
|
|
"discountType" TEXT,
|
|
"discountValue" DECIMAL(15,2),
|
|
"taxRate" DECIMAL(5,2) NOT NULL,
|
|
"taxAmount" DECIMAL(15,2) NOT NULL,
|
|
"total" DECIMAL(15,2) NOT NULL,
|
|
"validUntil" DATE NOT NULL,
|
|
"paymentTerms" TEXT,
|
|
"deliveryTerms" TEXT,
|
|
"notes" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'DRAFT',
|
|
"sentAt" TIMESTAMP(3),
|
|
"viewedAt" TIMESTAMP(3),
|
|
"approvedBy" TEXT,
|
|
"approvedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "quotes_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "cost_sheets" (
|
|
"id" TEXT NOT NULL,
|
|
"costSheetNumber" TEXT NOT NULL,
|
|
"dealId" TEXT NOT NULL,
|
|
"version" INTEGER NOT NULL DEFAULT 1,
|
|
"items" JSONB NOT NULL,
|
|
"totalCost" DECIMAL(15,2) NOT NULL,
|
|
"suggestedPrice" DECIMAL(15,2) NOT NULL,
|
|
"profitMargin" DECIMAL(5,2) NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'DRAFT',
|
|
"approvedBy" TEXT,
|
|
"approvedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "cost_sheets_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "contracts" (
|
|
"id" TEXT NOT NULL,
|
|
"contractNumber" TEXT NOT NULL,
|
|
"dealId" TEXT NOT NULL,
|
|
"version" INTEGER NOT NULL DEFAULT 1,
|
|
"title" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"clientInfo" JSONB NOT NULL,
|
|
"companyInfo" JSONB NOT NULL,
|
|
"startDate" DATE NOT NULL,
|
|
"endDate" DATE,
|
|
"value" DECIMAL(15,2) NOT NULL,
|
|
"paymentTerms" JSONB NOT NULL,
|
|
"deliveryTerms" JSONB NOT NULL,
|
|
"terms" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'DRAFT',
|
|
"signedAt" TIMESTAMP(3),
|
|
"documentUrl" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "contracts_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "invoices" (
|
|
"id" TEXT NOT NULL,
|
|
"invoiceNumber" TEXT NOT NULL,
|
|
"dealId" TEXT,
|
|
"items" JSONB NOT NULL,
|
|
"subtotal" DECIMAL(15,2) NOT NULL,
|
|
"taxAmount" DECIMAL(15,2) NOT NULL,
|
|
"total" DECIMAL(15,2) NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'DRAFT',
|
|
"dueDate" DATE NOT NULL,
|
|
"paidDate" TIMESTAMP(3),
|
|
"paidAmount" DECIMAL(15,2),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "invoices_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "warehouses" (
|
|
"id" TEXT NOT NULL,
|
|
"code" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"nameAr" TEXT,
|
|
"type" TEXT NOT NULL,
|
|
"address" TEXT,
|
|
"city" TEXT,
|
|
"country" TEXT,
|
|
"parentId" TEXT,
|
|
"managerId" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "warehouses_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "products" (
|
|
"id" TEXT NOT NULL,
|
|
"sku" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"nameAr" TEXT,
|
|
"description" TEXT,
|
|
"categoryId" TEXT NOT NULL,
|
|
"brand" TEXT,
|
|
"model" TEXT,
|
|
"specifications" JSONB,
|
|
"trackBy" TEXT NOT NULL DEFAULT 'QUANTITY',
|
|
"costPrice" DECIMAL(12,2) NOT NULL,
|
|
"sellingPrice" DECIMAL(12,2) NOT NULL,
|
|
"minStock" INTEGER NOT NULL DEFAULT 0,
|
|
"maxStock" INTEGER,
|
|
"reorderPoint" INTEGER,
|
|
"unit" TEXT NOT NULL,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "products_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "product_categories" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"nameAr" TEXT,
|
|
"code" TEXT NOT NULL,
|
|
"parentId" TEXT,
|
|
"description" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "product_categories_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "inventory_items" (
|
|
"id" TEXT NOT NULL,
|
|
"warehouseId" TEXT NOT NULL,
|
|
"productId" TEXT NOT NULL,
|
|
"quantity" INTEGER NOT NULL,
|
|
"reservedQty" INTEGER NOT NULL DEFAULT 0,
|
|
"availableQty" INTEGER NOT NULL,
|
|
"location" TEXT,
|
|
"averageCost" DECIMAL(12,2) NOT NULL,
|
|
"totalValue" DECIMAL(15,2) NOT NULL,
|
|
"lastUpdated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "inventory_items_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "inventory_movements" (
|
|
"id" TEXT NOT NULL,
|
|
"warehouseId" TEXT NOT NULL,
|
|
"productId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"quantity" INTEGER NOT NULL,
|
|
"referenceType" TEXT,
|
|
"referenceId" TEXT,
|
|
"unitCost" DECIMAL(12,2),
|
|
"totalCost" DECIMAL(15,2),
|
|
"serialNumber" TEXT,
|
|
"batchNumber" TEXT,
|
|
"notes" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "inventory_movements_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "warehouse_transfers" (
|
|
"id" TEXT NOT NULL,
|
|
"transferNumber" TEXT NOT NULL,
|
|
"fromWarehouseId" TEXT NOT NULL,
|
|
"toWarehouseId" TEXT NOT NULL,
|
|
"items" JSONB NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
|
"requestedBy" TEXT NOT NULL,
|
|
"approvedBy" TEXT,
|
|
"approvedAt" TIMESTAMP(3),
|
|
"shippedAt" TIMESTAMP(3),
|
|
"receivedAt" TIMESTAMP(3),
|
|
"notes" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "warehouse_transfers_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "assets" (
|
|
"id" TEXT NOT NULL,
|
|
"assetNumber" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"purchaseDate" DATE NOT NULL,
|
|
"purchasePrice" DECIMAL(15,2) NOT NULL,
|
|
"supplier" TEXT,
|
|
"invoiceNumber" TEXT,
|
|
"depreciationMethod" TEXT,
|
|
"usefulLife" INTEGER,
|
|
"residualValue" DECIMAL(15,2),
|
|
"currentValue" DECIMAL(15,2) NOT NULL,
|
|
"assignedTo" TEXT,
|
|
"assignedDate" DATE,
|
|
"department" TEXT,
|
|
"location" TEXT,
|
|
"lastMaintenanceDate" DATE,
|
|
"nextMaintenanceDate" DATE,
|
|
"status" TEXT NOT NULL DEFAULT 'ACTIVE',
|
|
"serialNumber" TEXT,
|
|
"model" TEXT,
|
|
"manufacturer" TEXT,
|
|
"warranty" TEXT,
|
|
"notes" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "assets_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "asset_maintenances" (
|
|
"id" TEXT NOT NULL,
|
|
"assetId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"description" TEXT NOT NULL,
|
|
"cost" DECIMAL(12,2),
|
|
"performedBy" TEXT,
|
|
"performedDate" DATE NOT NULL,
|
|
"nextScheduledDate" DATE,
|
|
"notes" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "asset_maintenances_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "projects" (
|
|
"id" TEXT NOT NULL,
|
|
"projectNumber" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"type" TEXT NOT NULL,
|
|
"dealId" TEXT,
|
|
"clientId" TEXT,
|
|
"startDate" DATE NOT NULL,
|
|
"endDate" DATE,
|
|
"actualEndDate" DATE,
|
|
"estimatedCost" DECIMAL(15,2),
|
|
"actualCost" DECIMAL(15,2),
|
|
"progress" INTEGER NOT NULL DEFAULT 0,
|
|
"status" TEXT NOT NULL DEFAULT 'PLANNING',
|
|
"priority" TEXT NOT NULL DEFAULT 'MEDIUM',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "projects_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "project_phases" (
|
|
"id" TEXT NOT NULL,
|
|
"projectId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"order" INTEGER NOT NULL,
|
|
"startDate" DATE NOT NULL,
|
|
"endDate" DATE NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "project_phases_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "tasks" (
|
|
"id" TEXT NOT NULL,
|
|
"taskNumber" TEXT NOT NULL,
|
|
"projectId" TEXT,
|
|
"phaseId" TEXT,
|
|
"parentId" TEXT,
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"assignedToId" TEXT,
|
|
"startDate" DATE,
|
|
"dueDate" DATE,
|
|
"completedDate" DATE,
|
|
"estimatedHours" DECIMAL(8,2),
|
|
"actualHours" DECIMAL(8,2),
|
|
"status" TEXT NOT NULL DEFAULT 'TODO',
|
|
"priority" TEXT NOT NULL DEFAULT 'MEDIUM',
|
|
"progress" INTEGER NOT NULL DEFAULT 0,
|
|
"dependencies" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "tasks_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "project_members" (
|
|
"id" TEXT NOT NULL,
|
|
"projectId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"role" TEXT NOT NULL,
|
|
"joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"leftAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "project_members_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "project_expenses" (
|
|
"id" TEXT NOT NULL,
|
|
"projectId" TEXT NOT NULL,
|
|
"category" TEXT NOT NULL,
|
|
"description" TEXT NOT NULL,
|
|
"amount" DECIMAL(12,2) NOT NULL,
|
|
"date" DATE NOT NULL,
|
|
"receipt" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "project_expenses_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "campaigns" (
|
|
"id" TEXT NOT NULL,
|
|
"campaignNumber" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"nameAr" TEXT,
|
|
"type" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"content" JSONB,
|
|
"targetAudience" JSONB,
|
|
"budget" DECIMAL(15,2),
|
|
"actualCost" DECIMAL(15,2),
|
|
"expectedROI" DECIMAL(15,2),
|
|
"actualROI" DECIMAL(15,2),
|
|
"startDate" DATE NOT NULL,
|
|
"endDate" DATE,
|
|
"status" TEXT NOT NULL DEFAULT 'DRAFT',
|
|
"approvedBy" TEXT,
|
|
"approvedAt" TIMESTAMP(3),
|
|
"ownerId" TEXT NOT NULL,
|
|
"sentCount" INTEGER NOT NULL DEFAULT 0,
|
|
"openRate" DECIMAL(5,2),
|
|
"clickRate" DECIMAL(5,2),
|
|
"responseRate" DECIMAL(5,2),
|
|
"leadsGenerated" INTEGER NOT NULL DEFAULT 0,
|
|
"conversions" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "campaigns_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "activities" (
|
|
"id" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"entityType" TEXT NOT NULL,
|
|
"entityId" TEXT NOT NULL,
|
|
"contactId" TEXT,
|
|
"dealId" TEXT,
|
|
"taskId" TEXT,
|
|
"campaignId" TEXT,
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"scheduledAt" TIMESTAMP(3),
|
|
"completedAt" TIMESTAMP(3),
|
|
"duration" INTEGER,
|
|
"status" TEXT NOT NULL DEFAULT 'PLANNED',
|
|
"participants" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "activities_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "notes" (
|
|
"id" TEXT NOT NULL,
|
|
"entityType" TEXT NOT NULL,
|
|
"entityId" TEXT NOT NULL,
|
|
"contactId" TEXT,
|
|
"dealId" TEXT,
|
|
"projectId" TEXT,
|
|
"content" TEXT NOT NULL,
|
|
"isPinned" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdBy" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "notes_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "attachments" (
|
|
"id" TEXT NOT NULL,
|
|
"entityType" TEXT NOT NULL,
|
|
"entityId" TEXT NOT NULL,
|
|
"contactId" TEXT,
|
|
"dealId" TEXT,
|
|
"projectId" TEXT,
|
|
"taskId" TEXT,
|
|
"fileName" TEXT NOT NULL,
|
|
"originalName" TEXT NOT NULL,
|
|
"mimeType" TEXT NOT NULL,
|
|
"size" INTEGER NOT NULL,
|
|
"path" TEXT NOT NULL,
|
|
"url" TEXT,
|
|
"description" TEXT,
|
|
"category" TEXT,
|
|
"uploadedBy" TEXT NOT NULL,
|
|
"uploadedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "attachments_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "custom_fields" (
|
|
"id" TEXT NOT NULL,
|
|
"module" TEXT NOT NULL,
|
|
"entityType" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"nameAr" TEXT,
|
|
"fieldType" TEXT NOT NULL,
|
|
"options" JSONB,
|
|
"isRequired" BOOLEAN NOT NULL DEFAULT false,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"order" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "custom_fields_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "notifications" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"message" TEXT NOT NULL,
|
|
"entityType" TEXT,
|
|
"entityId" TEXT,
|
|
"isRead" BOOLEAN NOT NULL DEFAULT false,
|
|
"readAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "notifications_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "approvals" (
|
|
"id" TEXT NOT NULL,
|
|
"entityType" TEXT NOT NULL,
|
|
"entityId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"requestedBy" TEXT NOT NULL,
|
|
"requestedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"approverLevel" INTEGER NOT NULL,
|
|
"approverId" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
|
"comments" TEXT,
|
|
"respondedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "approvals_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "_ContactToContactCategory" (
|
|
"A" TEXT NOT NULL,
|
|
"B" TEXT NOT NULL
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "audit_logs_entityType_entityId_idx" ON "audit_logs"("entityType", "entityId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "audit_logs_userId_idx" ON "audit_logs"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "audit_logs_createdAt_idx" ON "audit_logs"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_username_key" ON "users"("username");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_employeeId_key" ON "users"("employeeId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "employees_uniqueEmployeeId_key" ON "employees"("uniqueEmployeeId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "employees_email_key" ON "employees"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "employees_nationalId_key" ON "employees"("nationalId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "employees_departmentId_idx" ON "employees"("departmentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "employees_positionId_idx" ON "employees"("positionId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "employees_status_idx" ON "employees"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "departments_code_key" ON "departments"("code");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "positions_code_key" ON "positions"("code");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "positions_departmentId_idx" ON "positions"("departmentId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "position_permissions_positionId_module_resource_key" ON "position_permissions"("positionId", "module", "resource");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "attendances_employeeId_idx" ON "attendances"("employeeId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "attendances_date_idx" ON "attendances"("date");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "attendances_employeeId_date_key" ON "attendances"("employeeId", "date");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "leaves_employeeId_idx" ON "leaves"("employeeId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "leaves_status_idx" ON "leaves"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "salaries_employeeId_idx" ON "salaries"("employeeId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "salaries_employeeId_month_year_key" ON "salaries"("employeeId", "month", "year");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "allowances_employeeId_idx" ON "allowances"("employeeId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "commissions_employeeId_idx" ON "commissions"("employeeId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "commissions_dealId_idx" ON "commissions"("dealId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "performance_evaluations_employeeId_idx" ON "performance_evaluations"("employeeId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "employee_trainings_employeeId_idx" ON "employee_trainings"("employeeId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "disciplinary_actions_employeeId_idx" ON "disciplinary_actions"("employeeId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "contacts_uniqueContactId_key" ON "contacts"("uniqueContactId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "contacts_taxNumber_key" ON "contacts"("taxNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "contacts_commercialRegister_key" ON "contacts"("commercialRegister");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contacts_type_idx" ON "contacts"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contacts_status_idx" ON "contacts"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contacts_email_idx" ON "contacts"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contacts_phone_idx" ON "contacts"("phone");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contacts_mobile_idx" ON "contacts"("mobile");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contacts_taxNumber_idx" ON "contacts"("taxNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contacts_commercialRegister_idx" ON "contacts"("commercialRegister");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contact_relationships_fromContactId_idx" ON "contact_relationships"("fromContactId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contact_relationships_toContactId_idx" ON "contact_relationships"("toContactId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "contact_relationships_fromContactId_toContactId_type_key" ON "contact_relationships"("fromContactId", "toContactId", "type");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "deals_dealNumber_key" ON "deals"("dealNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "deals_contactId_idx" ON "deals"("contactId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "deals_ownerId_idx" ON "deals"("ownerId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "deals_pipelineId_idx" ON "deals"("pipelineId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "deals_stage_idx" ON "deals"("stage");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "deals_status_idx" ON "deals"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "deals_fiscalYear_idx" ON "deals"("fiscalYear");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "quotes_quoteNumber_key" ON "quotes"("quoteNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "quotes_dealId_idx" ON "quotes"("dealId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "cost_sheets_costSheetNumber_key" ON "cost_sheets"("costSheetNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "cost_sheets_dealId_idx" ON "cost_sheets"("dealId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "contracts_contractNumber_key" ON "contracts"("contractNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contracts_dealId_idx" ON "contracts"("dealId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "invoices_invoiceNumber_key" ON "invoices"("invoiceNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "invoices_dealId_idx" ON "invoices"("dealId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "invoices_status_idx" ON "invoices"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "warehouses_code_key" ON "warehouses"("code");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "products_sku_key" ON "products"("sku");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "products_categoryId_idx" ON "products"("categoryId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "products_sku_idx" ON "products"("sku");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "product_categories_code_key" ON "product_categories"("code");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "inventory_items_warehouseId_idx" ON "inventory_items"("warehouseId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "inventory_items_productId_idx" ON "inventory_items"("productId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "inventory_items_warehouseId_productId_key" ON "inventory_items"("warehouseId", "productId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "inventory_movements_warehouseId_idx" ON "inventory_movements"("warehouseId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "inventory_movements_productId_idx" ON "inventory_movements"("productId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "inventory_movements_type_idx" ON "inventory_movements"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "inventory_movements_createdAt_idx" ON "inventory_movements"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "warehouse_transfers_transferNumber_key" ON "warehouse_transfers"("transferNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "warehouse_transfers_fromWarehouseId_idx" ON "warehouse_transfers"("fromWarehouseId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "warehouse_transfers_toWarehouseId_idx" ON "warehouse_transfers"("toWarehouseId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "warehouse_transfers_status_idx" ON "warehouse_transfers"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "assets_assetNumber_key" ON "assets"("assetNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "asset_maintenances_assetId_idx" ON "asset_maintenances"("assetId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "projects_projectNumber_key" ON "projects"("projectNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "project_phases_projectId_idx" ON "project_phases"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "tasks_taskNumber_key" ON "tasks"("taskNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "tasks_projectId_idx" ON "tasks"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "tasks_phaseId_idx" ON "tasks"("phaseId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "tasks_assignedToId_idx" ON "tasks"("assignedToId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "tasks_status_idx" ON "tasks"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "project_members_projectId_idx" ON "project_members"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "project_members_userId_idx" ON "project_members"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "project_members_projectId_userId_key" ON "project_members"("projectId", "userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "project_expenses_projectId_idx" ON "project_expenses"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "campaigns_campaignNumber_key" ON "campaigns"("campaignNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "campaigns_ownerId_idx" ON "campaigns"("ownerId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "campaigns_type_idx" ON "campaigns"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "campaigns_status_idx" ON "campaigns"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "activities_entityType_entityId_idx" ON "activities"("entityType", "entityId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "activities_contactId_idx" ON "activities"("contactId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "activities_dealId_idx" ON "activities"("dealId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "activities_taskId_idx" ON "activities"("taskId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "activities_type_idx" ON "activities"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notes_entityType_entityId_idx" ON "notes"("entityType", "entityId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notes_contactId_idx" ON "notes"("contactId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notes_dealId_idx" ON "notes"("dealId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notes_projectId_idx" ON "notes"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "attachments_entityType_entityId_idx" ON "attachments"("entityType", "entityId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "attachments_contactId_idx" ON "attachments"("contactId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "attachments_dealId_idx" ON "attachments"("dealId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "attachments_projectId_idx" ON "attachments"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "attachments_taskId_idx" ON "attachments"("taskId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "custom_fields_module_entityType_name_key" ON "custom_fields"("module", "entityType", "name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notifications_userId_isRead_idx" ON "notifications"("userId", "isRead");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "notifications_createdAt_idx" ON "notifications"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "approvals_entityType_entityId_idx" ON "approvals"("entityType", "entityId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "approvals_approverId_status_idx" ON "approvals"("approverId", "status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "_ContactToContactCategory_AB_unique" ON "_ContactToContactCategory"("A", "B");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "_ContactToContactCategory_B_index" ON "_ContactToContactCategory"("B");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "audit_logs" ADD CONSTRAINT "audit_logs_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "users" ADD CONSTRAINT "users_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "employees" ADD CONSTRAINT "employees_departmentId_fkey" FOREIGN KEY ("departmentId") REFERENCES "departments"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "employees" ADD CONSTRAINT "employees_positionId_fkey" FOREIGN KEY ("positionId") REFERENCES "positions"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "employees" ADD CONSTRAINT "employees_reportingToId_fkey" FOREIGN KEY ("reportingToId") REFERENCES "employees"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "departments" ADD CONSTRAINT "departments_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "departments"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "positions" ADD CONSTRAINT "positions_departmentId_fkey" FOREIGN KEY ("departmentId") REFERENCES "departments"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "position_permissions" ADD CONSTRAINT "position_permissions_positionId_fkey" FOREIGN KEY ("positionId") REFERENCES "positions"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "attendances" ADD CONSTRAINT "attendances_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "leaves" ADD CONSTRAINT "leaves_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "salaries" ADD CONSTRAINT "salaries_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "allowances" ADD CONSTRAINT "allowances_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "commissions" ADD CONSTRAINT "commissions_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "commissions" ADD CONSTRAINT "commissions_dealId_fkey" FOREIGN KEY ("dealId") REFERENCES "deals"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "performance_evaluations" ADD CONSTRAINT "performance_evaluations_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "employee_trainings" ADD CONSTRAINT "employee_trainings_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "disciplinary_actions" ADD CONSTRAINT "disciplinary_actions_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "contacts" ADD CONSTRAINT "contacts_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "contacts" ADD CONSTRAINT "contacts_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "contact_categories" ADD CONSTRAINT "contact_categories_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "contact_categories"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "contact_relationships" ADD CONSTRAINT "contact_relationships_fromContactId_fkey" FOREIGN KEY ("fromContactId") REFERENCES "contacts"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "contact_relationships" ADD CONSTRAINT "contact_relationships_toContactId_fkey" FOREIGN KEY ("toContactId") REFERENCES "contacts"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "deals" ADD CONSTRAINT "deals_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "deals" ADD CONSTRAINT "deals_pipelineId_fkey" FOREIGN KEY ("pipelineId") REFERENCES "pipelines"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "deals" ADD CONSTRAINT "deals_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "quotes" ADD CONSTRAINT "quotes_dealId_fkey" FOREIGN KEY ("dealId") REFERENCES "deals"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "cost_sheets" ADD CONSTRAINT "cost_sheets_dealId_fkey" FOREIGN KEY ("dealId") REFERENCES "deals"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "contracts" ADD CONSTRAINT "contracts_dealId_fkey" FOREIGN KEY ("dealId") REFERENCES "deals"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "invoices" ADD CONSTRAINT "invoices_dealId_fkey" FOREIGN KEY ("dealId") REFERENCES "deals"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "warehouses" ADD CONSTRAINT "warehouses_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "warehouses"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "products" ADD CONSTRAINT "products_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "product_categories"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "product_categories" ADD CONSTRAINT "product_categories_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "product_categories"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "inventory_items" ADD CONSTRAINT "inventory_items_warehouseId_fkey" FOREIGN KEY ("warehouseId") REFERENCES "warehouses"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "inventory_items" ADD CONSTRAINT "inventory_items_productId_fkey" FOREIGN KEY ("productId") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "inventory_movements" ADD CONSTRAINT "inventory_movements_warehouseId_fkey" FOREIGN KEY ("warehouseId") REFERENCES "warehouses"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "inventory_movements" ADD CONSTRAINT "inventory_movements_productId_fkey" FOREIGN KEY ("productId") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "warehouse_transfers" ADD CONSTRAINT "warehouse_transfers_fromWarehouseId_fkey" FOREIGN KEY ("fromWarehouseId") REFERENCES "warehouses"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "warehouse_transfers" ADD CONSTRAINT "warehouse_transfers_toWarehouseId_fkey" FOREIGN KEY ("toWarehouseId") REFERENCES "warehouses"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "asset_maintenances" ADD CONSTRAINT "asset_maintenances_assetId_fkey" FOREIGN KEY ("assetId") REFERENCES "assets"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "project_phases" ADD CONSTRAINT "project_phases_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tasks" ADD CONSTRAINT "tasks_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tasks" ADD CONSTRAINT "tasks_phaseId_fkey" FOREIGN KEY ("phaseId") REFERENCES "project_phases"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tasks" ADD CONSTRAINT "tasks_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "tasks"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tasks" ADD CONSTRAINT "tasks_assignedToId_fkey" FOREIGN KEY ("assignedToId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "project_members" ADD CONSTRAINT "project_members_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "project_members" ADD CONSTRAINT "project_members_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "project_expenses" ADD CONSTRAINT "project_expenses_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "campaigns" ADD CONSTRAINT "campaigns_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "activities" ADD CONSTRAINT "activities_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "activities" ADD CONSTRAINT "activities_dealId_fkey" FOREIGN KEY ("dealId") REFERENCES "deals"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "activities" ADD CONSTRAINT "activities_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "tasks"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "activities" ADD CONSTRAINT "activities_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notes" ADD CONSTRAINT "notes_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notes" ADD CONSTRAINT "notes_dealId_fkey" FOREIGN KEY ("dealId") REFERENCES "deals"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notes" ADD CONSTRAINT "notes_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "attachments" ADD CONSTRAINT "attachments_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "attachments" ADD CONSTRAINT "attachments_dealId_fkey" FOREIGN KEY ("dealId") REFERENCES "deals"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "attachments" ADD CONSTRAINT "attachments_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "attachments" ADD CONSTRAINT "attachments_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "tasks"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "_ContactToContactCategory" ADD CONSTRAINT "_ContactToContactCategory_A_fkey" FOREIGN KEY ("A") REFERENCES "contacts"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "_ContactToContactCategory" ADD CONSTRAINT "_ContactToContactCategory_B_fkey" FOREIGN KEY ("B") REFERENCES "contact_categories"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|