initial push
This commit is contained in:
250
prisma/migrations/20260213022602_init/migration.sql
Normal file
250
prisma/migrations/20260213022602_init/migration.sql
Normal file
@@ -0,0 +1,250 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "PriorityLevel" AS ENUM ('LOW', 'MEDIUM', 'HIGH');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "UserRole" AS ENUM ('USER', 'ADMIN');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "ContentPageType" AS ENUM ('FAQ', 'MANUAL');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "OverallScoreMethod" AS ENUM ('EQUAL_ALL_MODULES', 'EQUAL_ANSWERED_MODULES', 'WEIGHTED_ANSWERED_MODULES');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "User" (
|
||||
"id" TEXT NOT NULL,
|
||||
"email" TEXT NOT NULL,
|
||||
"passwordHash" TEXT NOT NULL,
|
||||
"name" TEXT,
|
||||
"role" "UserRole" NOT NULL DEFAULT 'USER',
|
||||
"emailVerifiedAt" TIMESTAMP(3),
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Organization" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"industry" TEXT,
|
||||
"companySize" TEXT,
|
||||
"country" TEXT,
|
||||
"primaryObjective" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Organization_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "DiagnosticModule" (
|
||||
"id" TEXT NOT NULL,
|
||||
"key" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "DiagnosticModule_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Question" (
|
||||
"id" TEXT NOT NULL,
|
||||
"key" TEXT NOT NULL,
|
||||
"moduleId" TEXT NOT NULL,
|
||||
"prompt" TEXT NOT NULL,
|
||||
"helpText" TEXT,
|
||||
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Question_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "AnswerOption" (
|
||||
"id" TEXT NOT NULL,
|
||||
"key" TEXT NOT NULL,
|
||||
"questionId" TEXT NOT NULL,
|
||||
"label" TEXT NOT NULL,
|
||||
"weight" INTEGER NOT NULL,
|
||||
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "AnswerOption_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Response" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"questionId" TEXT NOT NULL,
|
||||
"answerOptionId" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Response_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "AssessmentResult" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"moduleId" TEXT,
|
||||
"overallScore" DOUBLE PRECISION,
|
||||
"moduleScore" DOUBLE PRECISION,
|
||||
"metadata" JSONB,
|
||||
"calculatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "AssessmentResult_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Recommendation" (
|
||||
"id" TEXT NOT NULL,
|
||||
"key" TEXT NOT NULL,
|
||||
"moduleId" TEXT,
|
||||
"title" TEXT NOT NULL,
|
||||
"description" TEXT NOT NULL,
|
||||
"priority" "PriorityLevel" NOT NULL DEFAULT 'MEDIUM',
|
||||
"isTemplate" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Recommendation_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "ContentPage" (
|
||||
"id" TEXT NOT NULL,
|
||||
"type" "ContentPageType" NOT NULL,
|
||||
"slug" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"content" TEXT NOT NULL,
|
||||
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
||||
"isPublished" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "ContentPage_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "ScoringConfig" (
|
||||
"id" TEXT NOT NULL,
|
||||
"key" TEXT NOT NULL,
|
||||
"lowScoreThreshold" INTEGER NOT NULL DEFAULT 70,
|
||||
"overallScoreMethod" "OverallScoreMethod" NOT NULL DEFAULT 'EQUAL_ALL_MODULES',
|
||||
"moduleWeights" JSONB,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "ScoringConfig_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "EmailVerificationToken" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"token" TEXT NOT NULL,
|
||||
"expiresAt" TIMESTAMP(3) NOT NULL,
|
||||
"consumedAt" TIMESTAMP(3),
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "EmailVerificationToken_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Organization_userId_key" ON "Organization"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "DiagnosticModule_key_key" ON "DiagnosticModule"("key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Question_key_key" ON "Question"("key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Question_moduleId_sortOrder_idx" ON "Question"("moduleId", "sortOrder");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "AnswerOption_key_key" ON "AnswerOption"("key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "AnswerOption_questionId_sortOrder_idx" ON "AnswerOption"("questionId", "sortOrder");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Response_userId_idx" ON "Response"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Response_userId_questionId_key" ON "Response"("userId", "questionId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "AssessmentResult_userId_calculatedAt_idx" ON "AssessmentResult"("userId", "calculatedAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "AssessmentResult_moduleId_idx" ON "AssessmentResult"("moduleId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Recommendation_key_key" ON "Recommendation"("key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Recommendation_moduleId_idx" ON "Recommendation"("moduleId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "ContentPage_slug_key" ON "ContentPage"("slug");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ContentPage_type_sortOrder_idx" ON "ContentPage"("type", "sortOrder");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "ScoringConfig_key_key" ON "ScoringConfig"("key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "EmailVerificationToken_token_key" ON "EmailVerificationToken"("token");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "EmailVerificationToken_userId_idx" ON "EmailVerificationToken"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "EmailVerificationToken_expiresAt_idx" ON "EmailVerificationToken"("expiresAt");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Organization" ADD CONSTRAINT "Organization_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Question" ADD CONSTRAINT "Question_moduleId_fkey" FOREIGN KEY ("moduleId") REFERENCES "DiagnosticModule"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "AnswerOption" ADD CONSTRAINT "AnswerOption_questionId_fkey" FOREIGN KEY ("questionId") REFERENCES "Question"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Response" ADD CONSTRAINT "Response_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Response" ADD CONSTRAINT "Response_questionId_fkey" FOREIGN KEY ("questionId") REFERENCES "Question"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Response" ADD CONSTRAINT "Response_answerOptionId_fkey" FOREIGN KEY ("answerOptionId") REFERENCES "AnswerOption"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "AssessmentResult" ADD CONSTRAINT "AssessmentResult_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "AssessmentResult" ADD CONSTRAINT "AssessmentResult_moduleId_fkey" FOREIGN KEY ("moduleId") REFERENCES "DiagnosticModule"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Recommendation" ADD CONSTRAINT "Recommendation_moduleId_fkey" FOREIGN KEY ("moduleId") REFERENCES "DiagnosticModule"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "EmailVerificationToken" ADD CONSTRAINT "EmailVerificationToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
@@ -0,0 +1,50 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "OrganizationDocumentType" AS ENUM ('ACTA_CONSTITUTIVA');
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Organization"
|
||||
ADD COLUMN "rfc" TEXT,
|
||||
ADD COLUMN "legalRepresentative" TEXT,
|
||||
ADD COLUMN "incorporationDate" TEXT,
|
||||
ADD COLUMN "deedNumber" TEXT,
|
||||
ADD COLUMN "notaryName" TEXT,
|
||||
ADD COLUMN "fiscalAddress" TEXT,
|
||||
ADD COLUMN "businessPurpose" TEXT,
|
||||
ADD COLUMN "actaExtractedData" JSONB,
|
||||
ADD COLUMN "actaUploadedAt" TIMESTAMP(3),
|
||||
ADD COLUMN "onboardingCompletedAt" TIMESTAMP(3);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "OrganizationDocument" (
|
||||
"id" TEXT NOT NULL,
|
||||
"organizationId" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"type" "OrganizationDocumentType" NOT NULL,
|
||||
"fileName" TEXT NOT NULL,
|
||||
"storedFileName" TEXT NOT NULL,
|
||||
"filePath" TEXT NOT NULL,
|
||||
"mimeType" TEXT NOT NULL,
|
||||
"sizeBytes" INTEGER NOT NULL,
|
||||
"checksumSha256" TEXT,
|
||||
"extractedData" JSONB,
|
||||
"extractedTextSnippet" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "OrganizationDocument_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "OrganizationDocument_organizationId_type_key" ON "OrganizationDocument"("organizationId", "type");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "OrganizationDocument_userId_type_key" ON "OrganizationDocument"("userId", "type");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "OrganizationDocument_type_idx" ON "OrganizationDocument"("type");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "OrganizationDocument" ADD CONSTRAINT "OrganizationDocument_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "OrganizationDocument" ADD CONSTRAINT "OrganizationDocument_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
@@ -0,0 +1,5 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "Organization"
|
||||
ADD COLUMN "stateOfIncorporation" TEXT,
|
||||
ADD COLUMN "companyType" TEXT,
|
||||
ADD COLUMN "actaLookupDictionary" JSONB;
|
||||
@@ -0,0 +1,12 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "Organization"
|
||||
ADD COLUMN "tradeName" TEXT,
|
||||
ADD COLUMN "operatingState" TEXT,
|
||||
ADD COLUMN "municipality" TEXT,
|
||||
ADD COLUMN "yearsOfOperation" TEXT,
|
||||
ADD COLUMN "annualRevenueRange" TEXT,
|
||||
ADD COLUMN "hasGovernmentContracts" BOOLEAN;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Response"
|
||||
ADD COLUMN "evidence" JSONB;
|
||||
@@ -0,0 +1,42 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "StrategicDiagnosticEvidenceSection" AS ENUM ('TECHNICAL', 'EXPERIENCE', 'ORGANIZATION', 'PUBLIC_PROCUREMENT');
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Organization"
|
||||
ADD COLUMN "strategicDiagnosticData" JSONB,
|
||||
ADD COLUMN "strategicDiagnosticScores" JSONB,
|
||||
ADD COLUMN "strategicDiagnosticCompletedAt" TIMESTAMP(3);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "StrategicDiagnosticEvidenceDocument" (
|
||||
"id" TEXT NOT NULL,
|
||||
"organizationId" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"section" "StrategicDiagnosticEvidenceSection" NOT NULL,
|
||||
"category" TEXT NOT NULL,
|
||||
"fileName" TEXT NOT NULL,
|
||||
"storedFileName" TEXT NOT NULL,
|
||||
"filePath" TEXT NOT NULL,
|
||||
"mimeType" TEXT NOT NULL,
|
||||
"sizeBytes" INTEGER NOT NULL,
|
||||
"checksumSha256" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "StrategicDiagnosticEvidenceDocument_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "StrategicDiagnosticEvidenceDocument_organizationId_section_idx" ON "StrategicDiagnosticEvidenceDocument"("organizationId", "section");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "StrategicDiagnosticEvidenceDocument_userId_section_idx" ON "StrategicDiagnosticEvidenceDocument"("userId", "section");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "StrategicDiagnosticEvidenceDocument_createdAt_idx" ON "StrategicDiagnosticEvidenceDocument"("createdAt");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "StrategicDiagnosticEvidenceDocument" ADD CONSTRAINT "StrategicDiagnosticEvidenceDocument_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "StrategicDiagnosticEvidenceDocument" ADD CONSTRAINT "StrategicDiagnosticEvidenceDocument_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
@@ -0,0 +1,134 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "LicitationSource" AS ENUM ('PNT', 'MUNICIPAL_BACKUP');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "LicitationProcedureType" AS ENUM ('LICITACION_PUBLICA', 'INVITACION_RESTRINGIDA', 'ADJUDICACION_DIRECTA', 'UNKNOWN');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "LicitationCategory" AS ENUM ('GOODS', 'SERVICES', 'WORKS', 'MIXED', 'UNKNOWN');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "SyncRunStatus" AS ENUM ('SUCCESS', 'PARTIAL', 'FAILED');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Municipality" (
|
||||
"id" TEXT NOT NULL,
|
||||
"stateCode" TEXT NOT NULL,
|
||||
"stateName" TEXT NOT NULL,
|
||||
"municipalityCode" TEXT NOT NULL,
|
||||
"municipalityName" TEXT NOT NULL,
|
||||
"pntSubjectId" TEXT,
|
||||
"pntEntityId" TEXT,
|
||||
"pntSectorId" TEXT,
|
||||
"pntEntryUrl" TEXT,
|
||||
"backupUrl" TEXT,
|
||||
"scrapingEnabled" BOOLEAN NOT NULL DEFAULT true,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Municipality_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Licitation" (
|
||||
"id" TEXT NOT NULL,
|
||||
"municipalityId" TEXT NOT NULL,
|
||||
"source" "LicitationSource" NOT NULL,
|
||||
"sourceRecordId" TEXT NOT NULL,
|
||||
"procedureType" "LicitationProcedureType" NOT NULL DEFAULT 'UNKNOWN',
|
||||
"title" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"category" "LicitationCategory" DEFAULT 'UNKNOWN',
|
||||
"publishDate" TIMESTAMP(3),
|
||||
"eventDates" JSONB,
|
||||
"amount" DECIMAL(14,2),
|
||||
"currency" TEXT,
|
||||
"status" TEXT,
|
||||
"supplierAwarded" TEXT,
|
||||
"documents" JSONB,
|
||||
"rawSourceUrl" TEXT,
|
||||
"rawPayload" JSONB NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Licitation_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "SyncRun" (
|
||||
"id" TEXT NOT NULL,
|
||||
"startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"finishedAt" TIMESTAMP(3),
|
||||
"municipalityId" TEXT,
|
||||
"source" "LicitationSource" NOT NULL,
|
||||
"status" "SyncRunStatus" NOT NULL DEFAULT 'SUCCESS',
|
||||
"stats" JSONB,
|
||||
"error" TEXT,
|
||||
|
||||
CONSTRAINT "SyncRun_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "CompanyProfile" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"organizationId" TEXT,
|
||||
"locations" JSONB,
|
||||
"categoriesSupported" JSONB,
|
||||
"keywords" JSONB,
|
||||
"minAmount" DECIMAL(14,2),
|
||||
"maxAmount" DECIMAL(14,2),
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "CompanyProfile_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Municipality_stateCode_municipalityCode_key" ON "Municipality"("stateCode", "municipalityCode");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Municipality_stateCode_municipalityName_idx" ON "Municipality"("stateCode", "municipalityName");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Municipality_isActive_scrapingEnabled_idx" ON "Municipality"("isActive", "scrapingEnabled");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Licitation_municipalityId_source_sourceRecordId_key" ON "Licitation"("municipalityId", "source", "sourceRecordId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Licitation_municipalityId_publishDate_idx" ON "Licitation"("municipalityId", "publishDate");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Licitation_procedureType_category_idx" ON "Licitation"("procedureType", "category");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Licitation_amount_idx" ON "Licitation"("amount");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Licitation_createdAt_idx" ON "Licitation"("createdAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "SyncRun_municipalityId_startedAt_idx" ON "SyncRun"("municipalityId", "startedAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "SyncRun_source_status_startedAt_idx" ON "SyncRun"("source", "status", "startedAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "CompanyProfile_userId_key" ON "CompanyProfile"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "CompanyProfile_organizationId_key" ON "CompanyProfile"("organizationId");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Licitation" ADD CONSTRAINT "Licitation_municipalityId_fkey" FOREIGN KEY ("municipalityId") REFERENCES "Municipality"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "SyncRun" ADD CONSTRAINT "SyncRun_municipalityId_fkey" FOREIGN KEY ("municipalityId") REFERENCES "Municipality"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "CompanyProfile" ADD CONSTRAINT "CompanyProfile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "CompanyProfile" ADD CONSTRAINT "CompanyProfile_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
@@ -0,0 +1,23 @@
|
||||
-- AlterEnum
|
||||
ALTER TYPE "LicitationSource" ADD VALUE IF NOT EXISTS 'MUNICIPAL_OPEN_PORTAL';
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "MunicipalOpenPortalType" AS ENUM ('GENERIC', 'SAN_PEDRO_ASPX');
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Municipality"
|
||||
ADD COLUMN "openPortalUrl" TEXT,
|
||||
ADD COLUMN "openPortalType" "MunicipalOpenPortalType" NOT NULL DEFAULT 'GENERIC',
|
||||
ADD COLUMN "openSyncIntervalDays" INTEGER NOT NULL DEFAULT 7,
|
||||
ADD COLUMN "lastOpenSyncAt" TIMESTAMP(3);
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Licitation"
|
||||
ADD COLUMN "tenderCode" TEXT,
|
||||
ADD COLUMN "isOpen" BOOLEAN NOT NULL DEFAULT true,
|
||||
ADD COLUMN "openingDate" TIMESTAMP(3),
|
||||
ADD COLUMN "closingDate" TIMESTAMP(3),
|
||||
ADD COLUMN "lastSeenAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP;
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Licitation_municipalityId_isOpen_closingDate_idx" ON "Licitation"("municipalityId", "isOpen", "closingDate");
|
||||
@@ -0,0 +1,99 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "WorkshopProgressStatus" AS ENUM ('NOT_STARTED', 'WATCHED', 'EVIDENCE_SUBMITTED', 'APPROVED', 'REJECTED', 'SKIPPED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "WorkshopEvidenceValidationStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED', 'ERROR');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "DevelopmentWorkshop" (
|
||||
"id" TEXT NOT NULL,
|
||||
"key" TEXT NOT NULL,
|
||||
"moduleId" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"summary" TEXT NOT NULL,
|
||||
"videoUrl" TEXT NOT NULL,
|
||||
"durationMinutes" INTEGER NOT NULL DEFAULT 0,
|
||||
"evidenceRequired" TEXT NOT NULL,
|
||||
"learningObjectives" JSONB,
|
||||
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "DevelopmentWorkshop_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "DevelopmentWorkshopProgress" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workshopId" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"status" "WorkshopProgressStatus" NOT NULL DEFAULT 'NOT_STARTED',
|
||||
"watchedAt" TIMESTAMP(3),
|
||||
"skippedAt" TIMESTAMP(3),
|
||||
"completedAt" TIMESTAMP(3),
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "DevelopmentWorkshopProgress_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "DevelopmentWorkshopEvidence" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workshopId" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"validationStatus" "WorkshopEvidenceValidationStatus" NOT NULL DEFAULT 'PENDING',
|
||||
"validationReason" TEXT,
|
||||
"validationConfidence" DOUBLE PRECISION,
|
||||
"validatedAt" TIMESTAMP(3),
|
||||
"fileName" TEXT NOT NULL,
|
||||
"storedFileName" TEXT NOT NULL,
|
||||
"filePath" TEXT NOT NULL,
|
||||
"mimeType" TEXT NOT NULL,
|
||||
"sizeBytes" INTEGER NOT NULL,
|
||||
"checksumSha256" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "DevelopmentWorkshopEvidence_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "DevelopmentWorkshop_key_key" ON "DevelopmentWorkshop"("key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "DevelopmentWorkshop_moduleId_sortOrder_idx" ON "DevelopmentWorkshop"("moduleId", "sortOrder");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "DevelopmentWorkshop_isActive_sortOrder_idx" ON "DevelopmentWorkshop"("isActive", "sortOrder");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "DevelopmentWorkshopProgress_workshopId_userId_key" ON "DevelopmentWorkshopProgress"("workshopId", "userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "DevelopmentWorkshopProgress_userId_status_idx" ON "DevelopmentWorkshopProgress"("userId", "status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "DevelopmentWorkshopProgress_workshopId_status_idx" ON "DevelopmentWorkshopProgress"("workshopId", "status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "DevelopmentWorkshopEvidence_userId_workshopId_createdAt_idx" ON "DevelopmentWorkshopEvidence"("userId", "workshopId", "createdAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "DevelopmentWorkshopEvidence_workshopId_validationStatus_idx" ON "DevelopmentWorkshopEvidence"("workshopId", "validationStatus");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "DevelopmentWorkshop" ADD CONSTRAINT "DevelopmentWorkshop_moduleId_fkey" FOREIGN KEY ("moduleId") REFERENCES "DiagnosticModule"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "DevelopmentWorkshopProgress" ADD CONSTRAINT "DevelopmentWorkshopProgress_workshopId_fkey" FOREIGN KEY ("workshopId") REFERENCES "DevelopmentWorkshop"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "DevelopmentWorkshopProgress" ADD CONSTRAINT "DevelopmentWorkshopProgress_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "DevelopmentWorkshopEvidence" ADD CONSTRAINT "DevelopmentWorkshopEvidence_workshopId_fkey" FOREIGN KEY ("workshopId") REFERENCES "DevelopmentWorkshop"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "DevelopmentWorkshopEvidence" ADD CONSTRAINT "DevelopmentWorkshopEvidence_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
3
prisma/migrations/migration_lock.toml
Normal file
3
prisma/migrations/migration_lock.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
# Please do not edit this file manually
|
||||
# It should be added in your version-control system (e.g., Git)
|
||||
provider = "postgresql"
|
||||
Reference in New Issue
Block a user