diff --git a/backend/docker-entrypoint.sh b/backend/docker-entrypoint.sh index a3882fd3..471113bf 100755 --- a/backend/docker-entrypoint.sh +++ b/backend/docker-entrypoint.sh @@ -1,6 +1,10 @@ #!/bin/sh -# Beim Container-Start: Schema in DB pushen (idempotent) + (optional) seed. -# RUN_SEED=true beim ersten Start setzen, danach wieder auf false. +# Container-Start: +# 1) Auf DB warten +# 2) Auto-Baseline für bestehende DBs (db-push-Ära ohne _prisma_migrations) +# 3) `prisma migrate deploy` (idempotent, datenerhaltend) +# 4) Auto-Seed bei leerer User-Tabelle (oder RUN_SEED=true) +# Neue Schema-Änderung anlegen (lokal, im Dev): npm run schema:sync set -e # DATABASE_URL aus DB_*-Komponenten bauen, falls nicht explizit gesetzt. @@ -21,10 +25,16 @@ if [ -z "$DATABASE_URL" ] && [ -n "$DB_USER" ] && [ -n "$DB_PASSWORD" ] && [ -n fi echo "[entrypoint] Warte auf Datenbank…" -# Prisma versucht selbst Connect; einfacher Retry-Loop um Race-Bedingungen -# beim parallelen Container-Start abzufangen. +# Erst auf DB-Verfügbarkeit warten via einfachem Connect-Check. +# Wir nutzen Prisma's interne Engine, kein extra mysql-client nötig. TRIES=30 -until npx prisma db push --skip-generate --accept-data-loss 2>/dev/null; do +until node -e " + const { PrismaClient } = require('@prisma/client'); + const p = new PrismaClient(); + p.\$queryRaw\`SELECT 1\` + .then(() => p.\$disconnect().then(() => process.exit(0))) + .catch(() => process.exit(1)); +" 2>/dev/null; do TRIES=$((TRIES - 1)) if [ "$TRIES" -le 0 ]; then echo "[entrypoint] DB nicht erreichbar – Abbruch" @@ -33,7 +43,51 @@ until npx prisma db push --skip-generate --accept-data-loss 2>/dev/null; do echo "[entrypoint] DB noch nicht bereit – retry in 2s ($TRIES Versuche übrig)" sleep 2 done -echo "[entrypoint] DB-Schema synced" +echo "[entrypoint] DB erreichbar" + +# Auto-Baseline: Wenn die DB Anwendungs-Tabellen enthält (z.B. User), aber noch +# keine _prisma_migrations-Tabelle, dann ist es eine "alte" DB, die früher mit +# `prisma db push` synced wurde. Wir markieren 0_init als bereits angewendet, +# damit `migrate deploy` nicht versucht, alle Tabellen nochmal anzulegen. +NEEDS_BASELINE=$(node -e " + const { PrismaClient } = require('@prisma/client'); + const p = new PrismaClient(); + (async () => { + try { + const dbName = process.env.DB_NAME; + const tables = await p.\$queryRawUnsafe( + \`SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?\`, + dbName + ); + const names = tables.map(t => t.TABLE_NAME); + const hasMigrations = names.includes('_prisma_migrations'); + const hasUserTable = names.includes('User'); + // Existing DB (User da) ohne Migrations-Tracking => Baseline nötig + if (hasUserTable && !hasMigrations) process.stdout.write('yes'); + else process.stdout.write('no'); + } catch (e) { + process.stdout.write('no'); + } finally { + await p.\$disconnect(); + } + })(); +" 2>/dev/null) + +if [ "$NEEDS_BASELINE" = "yes" ]; then + echo "[entrypoint] Bestehende DB ohne Migrations-Tracking erkannt – markiere 0_init als angewendet (Baseline)" + npx prisma migrate resolve --applied 0_init || echo "[entrypoint] Baseline fehlgeschlagen – fahre trotzdem fort" +fi + +# Migrations anwenden (idempotent: bereits angewendete werden übersprungen). +# Im Gegensatz zu `db push` löscht `migrate deploy` keine Daten — Schema- +# Änderungen werden über versionierte Migrations-Files unter prisma/migrations/ +# eingespielt. Neue Migration anlegen mit: npm run schema:sync (lokal, dev). +echo "[entrypoint] Wende Migrations an…" +if ! npx prisma migrate deploy; then + echo "[entrypoint] migrate deploy fehlgeschlagen – Abbruch" + exit 1 +fi +echo "[entrypoint] DB-Schema aktuell" # Auto-Seed: wenn die User-Tabelle leer ist (= Erstinstallation), automatisch seeden. # RUN_SEED=true erzwingt Seed auch bei nicht-leerer DB (z.B. nach Reset). diff --git a/backend/package.json b/backend/package.json index db1b01e0..4bbc021a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -12,6 +12,7 @@ "start": "node dist/index.js", "db:migrate": "prisma migrate dev", "db:push": "prisma db push", + "schema:sync": "prisma migrate dev --name auto_$(date +%Y%m%d_%H%M%S)", "db:seed": "tsx prisma/seed.ts", "db:studio": "prisma studio", "db:backup": "tsx prisma/backup-data.ts", diff --git a/backend/prisma/migrations/0_init/migration.sql b/backend/prisma/migrations/0_init/migration.sql new file mode 100644 index 00000000..d83ad00c --- /dev/null +++ b/backend/prisma/migrations/0_init/migration.sql @@ -0,0 +1,989 @@ +-- CreateTable +CREATE TABLE `PdfTemplate` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(191) NOT NULL, + `description` VARCHAR(191) NULL, + `providerName` VARCHAR(191) NULL, + `templatePath` VARCHAR(191) NOT NULL, + `originalName` VARCHAR(191) NOT NULL, + `fieldMapping` LONGTEXT NOT NULL, + `phoneFieldPrefix` VARCHAR(191) NULL, + `maxPhoneFields` INTEGER NULL DEFAULT 8, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `PdfTemplate_name_key`(`name`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `EmailLog` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `fromAddress` VARCHAR(191) NOT NULL, + `toAddress` VARCHAR(191) NOT NULL, + `subject` VARCHAR(191) NOT NULL, + `context` VARCHAR(191) NOT NULL, + `customerId` INTEGER NULL, + `triggeredBy` VARCHAR(191) NULL, + `smtpServer` VARCHAR(191) NOT NULL, + `smtpPort` INTEGER NOT NULL, + `smtpEncryption` VARCHAR(191) NOT NULL, + `smtpUser` VARCHAR(191) NOT NULL, + `success` BOOLEAN NOT NULL, + `messageId` VARCHAR(191) NULL, + `errorMessage` TEXT NULL, + `smtpResponse` TEXT NULL, + `sentAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + INDEX `EmailLog_sentAt_idx`(`sentAt`), + INDEX `EmailLog_customerId_idx`(`customerId`), + INDEX `EmailLog_success_idx`(`success`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `AppSetting` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `key` VARCHAR(191) NOT NULL, + `value` TEXT NOT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `AppSetting_key_key`(`key`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `User` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `email` VARCHAR(191) NOT NULL, + `password` VARCHAR(191) NOT NULL, + `firstName` VARCHAR(191) NOT NULL, + `lastName` VARCHAR(191) NOT NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `tokenInvalidatedAt` DATETIME(3) NULL, + `passwordResetToken` VARCHAR(191) NULL, + `passwordResetExpiresAt` DATETIME(3) NULL, + `whatsappNumber` VARCHAR(191) NULL, + `telegramUsername` VARCHAR(191) NULL, + `signalNumber` VARCHAR(191) NULL, + `customerId` INTEGER NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `User_email_key`(`email`), + UNIQUE INDEX `User_passwordResetToken_key`(`passwordResetToken`), + UNIQUE INDEX `User_customerId_key`(`customerId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Role` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(191) NOT NULL, + `description` VARCHAR(191) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `Role_name_key`(`name`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Permission` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `resource` VARCHAR(191) NOT NULL, + `action` VARCHAR(191) NOT NULL, + + UNIQUE INDEX `Permission_resource_action_key`(`resource`, `action`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `RolePermission` ( + `roleId` INTEGER NOT NULL, + `permissionId` INTEGER NOT NULL, + + PRIMARY KEY (`roleId`, `permissionId`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `UserRole` ( + `userId` INTEGER NOT NULL, + `roleId` INTEGER NOT NULL, + + PRIMARY KEY (`userId`, `roleId`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Customer` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerNumber` VARCHAR(191) NOT NULL, + `type` ENUM('PRIVATE', 'BUSINESS') NOT NULL DEFAULT 'PRIVATE', + `salutation` VARCHAR(191) NULL, + `firstName` VARCHAR(191) NOT NULL, + `lastName` VARCHAR(191) NOT NULL, + `companyName` VARCHAR(191) NULL, + `foundingDate` DATETIME(3) NULL, + `birthDate` DATETIME(3) NULL, + `birthPlace` VARCHAR(191) NULL, + `email` VARCHAR(191) NULL, + `phone` VARCHAR(191) NULL, + `mobile` VARCHAR(191) NULL, + `taxNumber` VARCHAR(191) NULL, + `businessRegistrationPath` VARCHAR(191) NULL, + `commercialRegisterPath` VARCHAR(191) NULL, + `commercialRegisterNumber` VARCHAR(191) NULL, + `privacyPolicyPath` VARCHAR(191) NULL, + `consentHash` VARCHAR(191) NULL, + `notes` TEXT NULL, + `portalEnabled` BOOLEAN NOT NULL DEFAULT false, + `portalEmail` VARCHAR(191) NULL, + `portalPasswordHash` VARCHAR(191) NULL, + `portalPasswordEncrypted` VARCHAR(191) NULL, + `portalLastLogin` DATETIME(3) NULL, + `portalPasswordResetToken` VARCHAR(191) NULL, + `portalPasswordResetExpiresAt` DATETIME(3) NULL, + `portalTokenInvalidatedAt` DATETIME(3) NULL, + `lastBirthdayGreetingYear` INTEGER NULL, + `useInformalAddress` BOOLEAN NOT NULL DEFAULT false, + `autoBirthdayGreeting` BOOLEAN NOT NULL DEFAULT false, + `autoBirthdayChannel` VARCHAR(191) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `Customer_customerNumber_key`(`customerNumber`), + UNIQUE INDEX `Customer_consentHash_key`(`consentHash`), + UNIQUE INDEX `Customer_portalEmail_key`(`portalEmail`), + UNIQUE INDEX `Customer_portalPasswordResetToken_key`(`portalPasswordResetToken`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CustomerRepresentative` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `representativeId` INTEGER NOT NULL, + `notes` VARCHAR(191) NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `CustomerRepresentative_customerId_representativeId_key`(`customerId`, `representativeId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `RepresentativeAuthorization` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `representativeId` INTEGER NOT NULL, + `isGranted` BOOLEAN NOT NULL DEFAULT false, + `grantedAt` DATETIME(3) NULL, + `withdrawnAt` DATETIME(3) NULL, + `source` VARCHAR(191) NULL, + `documentPath` VARCHAR(191) NULL, + `notes` TEXT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `RepresentativeAuthorization_customerId_representativeId_key`(`customerId`, `representativeId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Address` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `type` ENUM('DELIVERY_RESIDENCE', 'BILLING') NOT NULL DEFAULT 'DELIVERY_RESIDENCE', + `street` VARCHAR(191) NOT NULL, + `houseNumber` VARCHAR(191) NOT NULL, + `postalCode` VARCHAR(191) NOT NULL, + `city` VARCHAR(191) NOT NULL, + `country` VARCHAR(191) NOT NULL DEFAULT 'Deutschland', + `isDefault` BOOLEAN NOT NULL DEFAULT false, + `ownerCompany` VARCHAR(191) NULL, + `ownerFirstName` VARCHAR(191) NULL, + `ownerLastName` VARCHAR(191) NULL, + `ownerStreet` VARCHAR(191) NULL, + `ownerHouseNumber` VARCHAR(191) NULL, + `ownerPostalCode` VARCHAR(191) NULL, + `ownerCity` VARCHAR(191) NULL, + `ownerPhone` VARCHAR(191) NULL, + `ownerMobile` VARCHAR(191) NULL, + `ownerEmail` VARCHAR(191) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `BankCard` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `accountHolder` VARCHAR(191) NOT NULL, + `iban` VARCHAR(191) NOT NULL, + `bic` VARCHAR(191) NULL, + `bankName` VARCHAR(191) NULL, + `expiryDate` DATETIME(3) NULL, + `documentPath` VARCHAR(191) NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `IdentityDocument` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `type` ENUM('ID_CARD', 'PASSPORT', 'DRIVERS_LICENSE', 'OTHER') NOT NULL DEFAULT 'ID_CARD', + `documentNumber` VARCHAR(191) NOT NULL, + `issuingAuthority` VARCHAR(191) NULL, + `issueDate` DATETIME(3) NULL, + `expiryDate` DATETIME(3) NULL, + `documentPath` VARCHAR(191) NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `licenseClasses` VARCHAR(191) NULL, + `licenseIssueDate` DATETIME(3) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `EmailProviderConfig` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(191) NOT NULL, + `type` ENUM('PLESK', 'CPANEL', 'DIRECTADMIN') NOT NULL, + `apiUrl` VARCHAR(191) NOT NULL, + `apiKey` VARCHAR(191) NULL, + `username` VARCHAR(191) NULL, + `passwordEncrypted` VARCHAR(191) NULL, + `domain` VARCHAR(191) NOT NULL, + `defaultForwardEmail` VARCHAR(191) NULL, + `imapServer` VARCHAR(191) NULL, + `imapPort` INTEGER NULL DEFAULT 993, + `smtpServer` VARCHAR(191) NULL, + `smtpPort` INTEGER NULL DEFAULT 465, + `imapEncryption` ENUM('SSL', 'STARTTLS', 'NONE') NOT NULL DEFAULT 'SSL', + `smtpEncryption` ENUM('SSL', 'STARTTLS', 'NONE') NOT NULL DEFAULT 'SSL', + `allowSelfSignedCerts` BOOLEAN NOT NULL DEFAULT false, + `systemEmailAddress` VARCHAR(191) NULL, + `systemEmailPasswordEncrypted` VARCHAR(191) NULL, + `customerEmailLabel` VARCHAR(191) NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `isDefault` BOOLEAN NOT NULL DEFAULT false, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `EmailProviderConfig_name_key`(`name`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `StressfreiEmail` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `email` VARCHAR(191) NOT NULL, + `platform` VARCHAR(191) NULL, + `notes` TEXT NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `isProvisioned` BOOLEAN NOT NULL DEFAULT false, + `provisionedAt` DATETIME(3) NULL, + `provisionError` TEXT NULL, + `hasMailbox` BOOLEAN NOT NULL DEFAULT false, + `emailPasswordEncrypted` VARCHAR(191) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CachedEmail` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `stressfreiEmailId` INTEGER NOT NULL, + `folder` ENUM('INBOX', 'SENT') NOT NULL DEFAULT 'INBOX', + `messageId` VARCHAR(191) NOT NULL, + `uid` INTEGER NOT NULL, + `subject` VARCHAR(191) NULL, + `fromAddress` VARCHAR(191) NOT NULL, + `fromName` VARCHAR(191) NULL, + `toAddresses` TEXT NOT NULL, + `ccAddresses` TEXT NULL, + `receivedAt` DATETIME(3) NOT NULL, + `textBody` LONGTEXT NULL, + `htmlBody` LONGTEXT NULL, + `hasAttachments` BOOLEAN NOT NULL DEFAULT false, + `attachmentNames` TEXT NULL, + `contractId` INTEGER NULL, + `assignedAt` DATETIME(3) NULL, + `assignedBy` INTEGER NULL, + `isAutoAssigned` BOOLEAN NOT NULL DEFAULT false, + `isRead` BOOLEAN NOT NULL DEFAULT false, + `isStarred` BOOLEAN NOT NULL DEFAULT false, + `isDeleted` BOOLEAN NOT NULL DEFAULT false, + `deletedAt` DATETIME(3) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + INDEX `CachedEmail_contractId_idx`(`contractId`), + INDEX `CachedEmail_stressfreiEmailId_folder_receivedAt_idx`(`stressfreiEmailId`, `folder`, `receivedAt`), + INDEX `CachedEmail_stressfreiEmailId_isDeleted_idx`(`stressfreiEmailId`, `isDeleted`), + UNIQUE INDEX `CachedEmail_stressfreiEmailId_messageId_folder_key`(`stressfreiEmailId`, `messageId`, `folder`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Meter` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `meterNumber` VARCHAR(191) NOT NULL, + `type` ENUM('ELECTRICITY', 'GAS') NOT NULL, + `tariffModel` ENUM('SINGLE', 'DUAL') NOT NULL DEFAULT 'SINGLE', + `location` VARCHAR(191) NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `MeterReading` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `meterId` INTEGER NOT NULL, + `readingDate` DATETIME(3) NOT NULL, + `value` DOUBLE NOT NULL, + `valueNt` DOUBLE NULL, + `unit` VARCHAR(191) NOT NULL DEFAULT 'kWh', + `notes` VARCHAR(191) NULL, + `reportedBy` VARCHAR(191) NULL, + `status` ENUM('RECORDED', 'REPORTED', 'TRANSFERRED') NOT NULL DEFAULT 'RECORDED', + `transferredAt` DATETIME(3) NULL, + `transferredBy` VARCHAR(191) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `SalesPlatform` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(191) NOT NULL, + `contactInfo` TEXT NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `SalesPlatform_name_key`(`name`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CancellationPeriod` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(191) NOT NULL, + `description` VARCHAR(191) NOT NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `CancellationPeriod_code_key`(`code`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ContractDuration` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(191) NOT NULL, + `description` VARCHAR(191) NOT NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `ContractDuration_code_key`(`code`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Provider` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(191) NOT NULL, + `portalUrl` VARCHAR(191) NULL, + `usernameFieldName` VARCHAR(191) NULL, + `passwordFieldName` VARCHAR(191) NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `Provider_name_key`(`name`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Tariff` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `providerId` INTEGER NOT NULL, + `name` VARCHAR(191) NOT NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `Tariff_providerId_name_key`(`providerId`, `name`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ContractCategory` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(191) NOT NULL, + `name` VARCHAR(191) NOT NULL, + `icon` VARCHAR(191) NULL, + `color` VARCHAR(191) NULL, + `sortOrder` INTEGER NOT NULL DEFAULT 0, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `ContractCategory_code_key`(`code`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Contract` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `contractNumber` VARCHAR(191) NOT NULL, + `customerId` INTEGER NOT NULL, + `type` ENUM('ELECTRICITY', 'GAS', 'DSL', 'CABLE', 'FIBER', 'MOBILE', 'TV', 'CAR_INSURANCE') NOT NULL, + `status` ENUM('DRAFT', 'PENDING', 'ACTIVE', 'CANCELLED', 'EXPIRED', 'DEACTIVATED') NOT NULL DEFAULT 'DRAFT', + `contractCategoryId` INTEGER NULL, + `addressId` INTEGER NULL, + `billingAddressId` INTEGER NULL, + `bankCardId` INTEGER NULL, + `identityDocumentId` INTEGER NULL, + `salesPlatformId` INTEGER NULL, + `cancellationPeriodId` INTEGER NULL, + `contractDurationId` INTEGER NULL, + `previousContractId` INTEGER NULL, + `previousProviderId` INTEGER NULL, + `previousCustomerNumber` VARCHAR(191) NULL, + `previousContractNumber` VARCHAR(191) NULL, + `providerId` INTEGER NULL, + `tariffId` INTEGER NULL, + `providerName` VARCHAR(191) NULL, + `tariffName` VARCHAR(191) NULL, + `customerNumberAtProvider` VARCHAR(191) NULL, + `contractNumberAtProvider` VARCHAR(191) NULL, + `priceFirst12Months` VARCHAR(191) NULL, + `priceFrom13Months` VARCHAR(191) NULL, + `priceAfter24Months` VARCHAR(191) NULL, + `startDate` DATETIME(3) NULL, + `endDate` DATETIME(3) NULL, + `commission` DOUBLE NULL, + `cancellationLetterPath` VARCHAR(191) NULL, + `cancellationConfirmationPath` VARCHAR(191) NULL, + `cancellationLetterOptionsPath` VARCHAR(191) NULL, + `cancellationConfirmationOptionsPath` VARCHAR(191) NULL, + `cancellationConfirmationDate` DATETIME(3) NULL, + `cancellationConfirmationOptionsDate` DATETIME(3) NULL, + `wasSpecialCancellation` BOOLEAN NOT NULL DEFAULT false, + `portalUsername` VARCHAR(191) NULL, + `portalPasswordEncrypted` VARCHAR(191) NULL, + `stressfreiEmailId` INTEGER NULL, + `nextReviewDate` DATETIME(3) NULL, + `notes` TEXT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `Contract_contractNumber_key`(`contractNumber`), + UNIQUE INDEX `Contract_previousContractId_key`(`previousContractId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ContractDocument` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `contractId` INTEGER NOT NULL, + `documentType` VARCHAR(191) NOT NULL, + `documentPath` VARCHAR(191) NOT NULL, + `originalName` VARCHAR(191) NOT NULL, + `notes` TEXT NULL, + `uploadedBy` VARCHAR(191) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + INDEX `ContractDocument_contractId_idx`(`contractId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ContractHistoryEntry` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `contractId` INTEGER NOT NULL, + `title` VARCHAR(191) NOT NULL, + `description` TEXT NULL, + `isAutomatic` BOOLEAN NOT NULL DEFAULT false, + `createdBy` VARCHAR(191) NOT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ContractTask` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `contractId` INTEGER NOT NULL, + `title` VARCHAR(191) NOT NULL, + `description` TEXT NULL, + `status` ENUM('OPEN', 'COMPLETED') NOT NULL DEFAULT 'OPEN', + `visibleInPortal` BOOLEAN NOT NULL DEFAULT false, + `createdBy` VARCHAR(191) NULL, + `completedAt` DATETIME(3) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ContractTaskSubtask` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `taskId` INTEGER NOT NULL, + `title` VARCHAR(191) NOT NULL, + `status` ENUM('OPEN', 'COMPLETED') NOT NULL DEFAULT 'OPEN', + `createdBy` VARCHAR(191) NULL, + `completedAt` DATETIME(3) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `EnergyContractDetails` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `contractId` INTEGER NOT NULL, + `meterId` INTEGER NULL, + `maloId` VARCHAR(191) NULL, + `annualConsumption` DOUBLE NULL, + `annualConsumptionKwh` DOUBLE NULL, + `basePrice` DOUBLE NULL, + `unitPrice` DOUBLE NULL, + `unitPriceNt` DOUBLE NULL, + `bonus` DOUBLE NULL, + `previousProviderName` VARCHAR(191) NULL, + `previousCustomerNumber` VARCHAR(191) NULL, + + UNIQUE INDEX `EnergyContractDetails_contractId_key`(`contractId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ContractMeter` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `energyContractDetailsId` INTEGER NOT NULL, + `meterId` INTEGER NOT NULL, + `position` INTEGER NOT NULL DEFAULT 0, + `installedAt` DATETIME(3) NULL, + `removedAt` DATETIME(3) NULL, + `finalReading` DOUBLE NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + INDEX `ContractMeter_energyContractDetailsId_idx`(`energyContractDetailsId`), + UNIQUE INDEX `ContractMeter_energyContractDetailsId_meterId_key`(`energyContractDetailsId`, `meterId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Invoice` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `energyContractDetailsId` INTEGER NULL, + `contractId` INTEGER NULL, + `invoiceDate` DATETIME(3) NOT NULL, + `invoiceType` ENUM('INTERIM', 'FINAL', 'NOT_AVAILABLE') NOT NULL, + `documentPath` VARCHAR(191) NULL, + `notes` VARCHAR(191) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + INDEX `Invoice_energyContractDetailsId_idx`(`energyContractDetailsId`), + INDEX `Invoice_contractId_idx`(`contractId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `InternetContractDetails` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `contractId` INTEGER NOT NULL, + `downloadSpeed` INTEGER NULL, + `uploadSpeed` INTEGER NULL, + `routerModel` VARCHAR(191) NULL, + `routerSerialNumber` VARCHAR(191) NULL, + `installationDate` DATETIME(3) NULL, + `internetUsername` VARCHAR(191) NULL, + `internetPasswordEncrypted` VARCHAR(191) NULL, + `propertyType` VARCHAR(191) NULL, + `propertyLocation` VARCHAR(191) NULL, + `connectionLocation` VARCHAR(191) NULL, + `homeId` VARCHAR(191) NULL, + `activationCode` VARCHAR(191) NULL, + + UNIQUE INDEX `InternetContractDetails_contractId_key`(`contractId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `PhoneNumber` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `internetContractDetailsId` INTEGER NOT NULL, + `phoneNumber` VARCHAR(191) NOT NULL, + `isMain` BOOLEAN NOT NULL DEFAULT false, + `sipUsername` VARCHAR(191) NULL, + `sipPasswordEncrypted` VARCHAR(191) NULL, + `sipServer` VARCHAR(191) NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `MobileContractDetails` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `contractId` INTEGER NOT NULL, + `requiresMultisim` BOOLEAN NOT NULL DEFAULT false, + `dataVolume` DOUBLE NULL, + `includedMinutes` INTEGER NULL, + `includedSMS` INTEGER NULL, + `deviceModel` VARCHAR(191) NULL, + `deviceImei` VARCHAR(191) NULL, + `phoneNumber` VARCHAR(191) NULL, + `simCardNumber` VARCHAR(191) NULL, + + UNIQUE INDEX `MobileContractDetails_contractId_key`(`contractId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `SimCard` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `mobileDetailsId` INTEGER NOT NULL, + `phoneNumber` VARCHAR(191) NULL, + `simCardNumber` VARCHAR(191) NULL, + `pin` VARCHAR(191) NULL, + `puk` VARCHAR(191) NULL, + `isMultisim` BOOLEAN NOT NULL DEFAULT false, + `isMain` BOOLEAN NOT NULL DEFAULT false, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `TvContractDetails` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `contractId` INTEGER NOT NULL, + `receiverModel` VARCHAR(191) NULL, + `smartcardNumber` VARCHAR(191) NULL, + `package` VARCHAR(191) NULL, + + UNIQUE INDEX `TvContractDetails_contractId_key`(`contractId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CarInsuranceDetails` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `contractId` INTEGER NOT NULL, + `licensePlate` VARCHAR(191) NULL, + `hsn` VARCHAR(191) NULL, + `tsn` VARCHAR(191) NULL, + `vin` VARCHAR(191) NULL, + `vehicleType` VARCHAR(191) NULL, + `firstRegistration` DATETIME(3) NULL, + `noClaimsClass` VARCHAR(191) NULL, + `insuranceType` ENUM('LIABILITY', 'PARTIAL', 'FULL') NOT NULL DEFAULT 'LIABILITY', + `deductiblePartial` DOUBLE NULL, + `deductibleFull` DOUBLE NULL, + `policyNumber` VARCHAR(191) NULL, + `previousInsurer` VARCHAR(191) NULL, + + UNIQUE INDEX `CarInsuranceDetails_contractId_key`(`contractId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `AuditLog` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `userId` INTEGER NULL, + `userEmail` VARCHAR(191) NOT NULL, + `userRole` TEXT NULL, + `customerId` INTEGER NULL, + `isCustomerPortal` BOOLEAN NOT NULL DEFAULT false, + `action` ENUM('CREATE', 'READ', 'UPDATE', 'DELETE', 'EXPORT', 'ANONYMIZE', 'LOGIN', 'LOGOUT', 'LOGIN_FAILED') NOT NULL, + `sensitivity` ENUM('LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NOT NULL DEFAULT 'MEDIUM', + `resourceType` VARCHAR(191) NOT NULL, + `resourceId` VARCHAR(191) NULL, + `resourceLabel` VARCHAR(191) NULL, + `endpoint` VARCHAR(191) NOT NULL, + `httpMethod` VARCHAR(191) NOT NULL, + `ipAddress` VARCHAR(191) NOT NULL, + `userAgent` TEXT NULL, + `changesBefore` LONGTEXT NULL, + `changesAfter` LONGTEXT NULL, + `changesEncrypted` BOOLEAN NOT NULL DEFAULT false, + `dataSubjectId` INTEGER NULL, + `legalBasis` VARCHAR(191) NULL, + `success` BOOLEAN NOT NULL DEFAULT true, + `errorMessage` TEXT NULL, + `durationMs` INTEGER NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `hash` VARCHAR(191) NULL, + `previousHash` VARCHAR(191) NULL, + + INDEX `AuditLog_userId_idx`(`userId`), + INDEX `AuditLog_customerId_idx`(`customerId`), + INDEX `AuditLog_resourceType_resourceId_idx`(`resourceType`, `resourceId`), + INDEX `AuditLog_dataSubjectId_idx`(`dataSubjectId`), + INDEX `AuditLog_action_idx`(`action`), + INDEX `AuditLog_createdAt_idx`(`createdAt`), + INDEX `AuditLog_sensitivity_idx`(`sensitivity`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CustomerConsent` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `consentType` ENUM('DATA_PROCESSING', 'MARKETING_EMAIL', 'MARKETING_PHONE', 'DATA_SHARING_PARTNER') NOT NULL, + `status` ENUM('GRANTED', 'WITHDRAWN', 'PENDING') NOT NULL DEFAULT 'PENDING', + `grantedAt` DATETIME(3) NULL, + `withdrawnAt` DATETIME(3) NULL, + `source` VARCHAR(191) NULL, + `documentPath` VARCHAR(191) NULL, + `version` VARCHAR(191) NULL, + `ipAddress` VARCHAR(191) NULL, + `createdBy` VARCHAR(191) NOT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + INDEX `CustomerConsent_customerId_idx`(`customerId`), + INDEX `CustomerConsent_consentType_idx`(`consentType`), + INDEX `CustomerConsent_status_idx`(`status`), + UNIQUE INDEX `CustomerConsent_customerId_consentType_key`(`customerId`, `consentType`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `DataDeletionRequest` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `status` ENUM('PENDING', 'IN_PROGRESS', 'COMPLETED', 'PARTIALLY_COMPLETED', 'REJECTED') NOT NULL DEFAULT 'PENDING', + `requestedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `requestSource` VARCHAR(191) NOT NULL, + `requestedBy` VARCHAR(191) NOT NULL, + `processedAt` DATETIME(3) NULL, + `processedBy` VARCHAR(191) NULL, + `deletedData` LONGTEXT NULL, + `retainedData` LONGTEXT NULL, + `retentionReason` TEXT NULL, + `proofDocument` VARCHAR(191) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + INDEX `DataDeletionRequest_customerId_idx`(`customerId`), + INDEX `DataDeletionRequest_status_idx`(`status`), + INDEX `DataDeletionRequest_requestedAt_idx`(`requestedAt`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `AuditRetentionPolicy` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `resourceType` VARCHAR(191) NOT NULL, + `sensitivity` ENUM('LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NULL, + `retentionDays` INTEGER NOT NULL, + `description` VARCHAR(191) NULL, + `legalBasis` VARCHAR(191) NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `AuditRetentionPolicy_resourceType_sensitivity_key`(`resourceType`, `sensitivity`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `SecurityEvent` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `type` ENUM('LOGIN_FAILED', 'LOGIN_SUCCESS', 'RATE_LIMIT_HIT', 'ACCESS_DENIED', 'SSRF_BLOCKED', 'PASSWORD_RESET_REQUEST', 'PASSWORD_RESET_CONFIRM', 'LOGOUT', 'TOKEN_REJECTED', 'PERMISSION_CHANGED', 'SUSPICIOUS') NOT NULL, + `severity` ENUM('INFO', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NOT NULL, + `message` TEXT NOT NULL, + `ipAddress` VARCHAR(191) NULL, + `userId` INTEGER NULL, + `customerId` INTEGER NULL, + `userEmail` VARCHAR(191) NULL, + `endpoint` VARCHAR(191) NULL, + `details` JSON NULL, + `alerted` BOOLEAN NOT NULL DEFAULT false, + `alertedAt` DATETIME(3) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + INDEX `SecurityEvent_type_createdAt_idx`(`type`, `createdAt`), + INDEX `SecurityEvent_severity_createdAt_idx`(`severity`, `createdAt`), + INDEX `SecurityEvent_ipAddress_createdAt_idx`(`ipAddress`, `createdAt`), + INDEX `SecurityEvent_alerted_severity_idx`(`alerted`, `severity`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `User` ADD CONSTRAINT `User_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `RolePermission` ADD CONSTRAINT `RolePermission_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `Role`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `RolePermission` ADD CONSTRAINT `RolePermission_permissionId_fkey` FOREIGN KEY (`permissionId`) REFERENCES `Permission`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `UserRole` ADD CONSTRAINT `UserRole_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `UserRole` ADD CONSTRAINT `UserRole_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `Role`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CustomerRepresentative` ADD CONSTRAINT `CustomerRepresentative_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CustomerRepresentative` ADD CONSTRAINT `CustomerRepresentative_representativeId_fkey` FOREIGN KEY (`representativeId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `RepresentativeAuthorization` ADD CONSTRAINT `RepresentativeAuthorization_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `RepresentativeAuthorization` ADD CONSTRAINT `RepresentativeAuthorization_representativeId_fkey` FOREIGN KEY (`representativeId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Address` ADD CONSTRAINT `Address_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `BankCard` ADD CONSTRAINT `BankCard_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `IdentityDocument` ADD CONSTRAINT `IdentityDocument_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `StressfreiEmail` ADD CONSTRAINT `StressfreiEmail_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CachedEmail` ADD CONSTRAINT `CachedEmail_stressfreiEmailId_fkey` FOREIGN KEY (`stressfreiEmailId`) REFERENCES `StressfreiEmail`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CachedEmail` ADD CONSTRAINT `CachedEmail_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Meter` ADD CONSTRAINT `Meter_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `MeterReading` ADD CONSTRAINT `MeterReading_meterId_fkey` FOREIGN KEY (`meterId`) REFERENCES `Meter`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Tariff` ADD CONSTRAINT `Tariff_providerId_fkey` FOREIGN KEY (`providerId`) REFERENCES `Provider`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_contractCategoryId_fkey` FOREIGN KEY (`contractCategoryId`) REFERENCES `ContractCategory`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_addressId_fkey` FOREIGN KEY (`addressId`) REFERENCES `Address`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_billingAddressId_fkey` FOREIGN KEY (`billingAddressId`) REFERENCES `Address`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_bankCardId_fkey` FOREIGN KEY (`bankCardId`) REFERENCES `BankCard`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_identityDocumentId_fkey` FOREIGN KEY (`identityDocumentId`) REFERENCES `IdentityDocument`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_salesPlatformId_fkey` FOREIGN KEY (`salesPlatformId`) REFERENCES `SalesPlatform`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_cancellationPeriodId_fkey` FOREIGN KEY (`cancellationPeriodId`) REFERENCES `CancellationPeriod`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_contractDurationId_fkey` FOREIGN KEY (`contractDurationId`) REFERENCES `ContractDuration`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_previousContractId_fkey` FOREIGN KEY (`previousContractId`) REFERENCES `Contract`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_previousProviderId_fkey` FOREIGN KEY (`previousProviderId`) REFERENCES `Provider`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_providerId_fkey` FOREIGN KEY (`providerId`) REFERENCES `Provider`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_tariffId_fkey` FOREIGN KEY (`tariffId`) REFERENCES `Tariff`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_stressfreiEmailId_fkey` FOREIGN KEY (`stressfreiEmailId`) REFERENCES `StressfreiEmail`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ContractDocument` ADD CONSTRAINT `ContractDocument_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ContractHistoryEntry` ADD CONSTRAINT `ContractHistoryEntry_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ContractTask` ADD CONSTRAINT `ContractTask_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ContractTaskSubtask` ADD CONSTRAINT `ContractTaskSubtask_taskId_fkey` FOREIGN KEY (`taskId`) REFERENCES `ContractTask`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `EnergyContractDetails` ADD CONSTRAINT `EnergyContractDetails_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `EnergyContractDetails` ADD CONSTRAINT `EnergyContractDetails_meterId_fkey` FOREIGN KEY (`meterId`) REFERENCES `Meter`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ContractMeter` ADD CONSTRAINT `ContractMeter_energyContractDetailsId_fkey` FOREIGN KEY (`energyContractDetailsId`) REFERENCES `EnergyContractDetails`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ContractMeter` ADD CONSTRAINT `ContractMeter_meterId_fkey` FOREIGN KEY (`meterId`) REFERENCES `Meter`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Invoice` ADD CONSTRAINT `Invoice_energyContractDetailsId_fkey` FOREIGN KEY (`energyContractDetailsId`) REFERENCES `EnergyContractDetails`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Invoice` ADD CONSTRAINT `Invoice_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `InternetContractDetails` ADD CONSTRAINT `InternetContractDetails_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `PhoneNumber` ADD CONSTRAINT `PhoneNumber_internetContractDetailsId_fkey` FOREIGN KEY (`internetContractDetailsId`) REFERENCES `InternetContractDetails`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `MobileContractDetails` ADD CONSTRAINT `MobileContractDetails_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `SimCard` ADD CONSTRAINT `SimCard_mobileDetailsId_fkey` FOREIGN KEY (`mobileDetailsId`) REFERENCES `MobileContractDetails`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `TvContractDetails` ADD CONSTRAINT `TvContractDetails_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CarInsuranceDetails` ADD CONSTRAINT `CarInsuranceDetails_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CustomerConsent` ADD CONSTRAINT `CustomerConsent_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + diff --git a/backend/prisma/migrations/20260120162147_init/migration.sql b/backend/prisma/migrations/20260120162147_init/migration.sql deleted file mode 100644 index 44396e16..00000000 --- a/backend/prisma/migrations/20260120162147_init/migration.sql +++ /dev/null @@ -1,354 +0,0 @@ --- CreateTable -CREATE TABLE `User` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `email` VARCHAR(191) NOT NULL, - `password` VARCHAR(191) NOT NULL, - `firstName` VARCHAR(191) NOT NULL, - `lastName` VARCHAR(191) NOT NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `customerId` INTEGER NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `User_email_key`(`email`), - UNIQUE INDEX `User_customerId_key`(`customerId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Role` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `name` VARCHAR(191) NOT NULL, - `description` VARCHAR(191) NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `Role_name_key`(`name`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Permission` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `resource` VARCHAR(191) NOT NULL, - `action` VARCHAR(191) NOT NULL, - - UNIQUE INDEX `Permission_resource_action_key`(`resource`, `action`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `RolePermission` ( - `roleId` INTEGER NOT NULL, - `permissionId` INTEGER NOT NULL, - - PRIMARY KEY (`roleId`, `permissionId`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `UserRole` ( - `userId` INTEGER NOT NULL, - `roleId` INTEGER NOT NULL, - - PRIMARY KEY (`userId`, `roleId`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Customer` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `customerNumber` VARCHAR(191) NOT NULL, - `type` ENUM('PRIVATE', 'BUSINESS') NOT NULL DEFAULT 'PRIVATE', - `salutation` VARCHAR(191) NULL, - `firstName` VARCHAR(191) NOT NULL, - `lastName` VARCHAR(191) NOT NULL, - `companyName` VARCHAR(191) NULL, - `email` VARCHAR(191) NULL, - `phone` VARCHAR(191) NULL, - `mobile` VARCHAR(191) NULL, - `taxNumber` VARCHAR(191) NULL, - `businessRegistration` TEXT NULL, - `commercialRegister` VARCHAR(191) NULL, - `notes` TEXT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `Customer_customerNumber_key`(`customerNumber`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Address` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `customerId` INTEGER NOT NULL, - `type` ENUM('DELIVERY_RESIDENCE', 'BILLING') NOT NULL DEFAULT 'DELIVERY_RESIDENCE', - `street` VARCHAR(191) NOT NULL, - `houseNumber` VARCHAR(191) NOT NULL, - `postalCode` VARCHAR(191) NOT NULL, - `city` VARCHAR(191) NOT NULL, - `country` VARCHAR(191) NOT NULL DEFAULT 'Deutschland', - `isDefault` BOOLEAN NOT NULL DEFAULT false, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `BankCard` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `customerId` INTEGER NOT NULL, - `accountHolder` VARCHAR(191) NOT NULL, - `iban` VARCHAR(191) NOT NULL, - `bic` VARCHAR(191) NULL, - `bankName` VARCHAR(191) NULL, - `expiryDate` DATETIME(3) NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `IdentityDocument` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `customerId` INTEGER NOT NULL, - `type` ENUM('ID_CARD', 'PASSPORT', 'DRIVERS_LICENSE', 'OTHER') NOT NULL DEFAULT 'ID_CARD', - `documentNumber` VARCHAR(191) NOT NULL, - `issuingAuthority` VARCHAR(191) NULL, - `issueDate` DATETIME(3) NULL, - `expiryDate` DATETIME(3) NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Meter` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `customerId` INTEGER NOT NULL, - `meterNumber` VARCHAR(191) NOT NULL, - `type` ENUM('ELECTRICITY', 'GAS') NOT NULL, - `location` VARCHAR(191) NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `MeterReading` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `meterId` INTEGER NOT NULL, - `readingDate` DATETIME(3) NOT NULL, - `value` DOUBLE NOT NULL, - `unit` VARCHAR(191) NOT NULL DEFAULT 'kWh', - `notes` VARCHAR(191) NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `SalesPlatform` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `name` VARCHAR(191) NOT NULL, - `contactInfo` TEXT NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `SalesPlatform_name_key`(`name`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Contract` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `contractNumber` VARCHAR(191) NOT NULL, - `customerId` INTEGER NOT NULL, - `type` ENUM('ELECTRICITY', 'GAS', 'DSL', 'FIBER', 'MOBILE', 'TV', 'CAR_INSURANCE') NOT NULL, - `status` ENUM('DRAFT', 'PENDING', 'ACTIVE', 'CANCELLED', 'EXPIRED') NOT NULL DEFAULT 'DRAFT', - `addressId` INTEGER NULL, - `bankCardId` INTEGER NULL, - `identityDocumentId` INTEGER NULL, - `salesPlatformId` INTEGER NULL, - `previousContractId` INTEGER NULL, - `providerName` VARCHAR(191) NULL, - `tariffName` VARCHAR(191) NULL, - `customerNumberAtProvider` VARCHAR(191) NULL, - `startDate` DATETIME(3) NULL, - `endDate` DATETIME(3) NULL, - `cancellationPeriod` INTEGER NULL, - `commission` DOUBLE NULL, - `portalUsername` VARCHAR(191) NULL, - `portalPasswordEncrypted` VARCHAR(191) NULL, - `notes` TEXT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `Contract_contractNumber_key`(`contractNumber`), - UNIQUE INDEX `Contract_previousContractId_key`(`previousContractId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `EnergyContractDetails` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `contractId` INTEGER NOT NULL, - `meterId` INTEGER NULL, - `annualConsumption` DOUBLE NULL, - `basePrice` DOUBLE NULL, - `unitPrice` DOUBLE NULL, - `bonus` DOUBLE NULL, - `previousProviderName` VARCHAR(191) NULL, - `previousCustomerNumber` VARCHAR(191) NULL, - - UNIQUE INDEX `EnergyContractDetails_contractId_key`(`contractId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `InternetContractDetails` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `contractId` INTEGER NOT NULL, - `downloadSpeed` INTEGER NULL, - `uploadSpeed` INTEGER NULL, - `routerModel` VARCHAR(191) NULL, - `routerSerialNumber` VARCHAR(191) NULL, - `installationDate` DATETIME(3) NULL, - - UNIQUE INDEX `InternetContractDetails_contractId_key`(`contractId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `PhoneNumber` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `internetContractDetailsId` INTEGER NOT NULL, - `phoneNumber` VARCHAR(191) NOT NULL, - `isMain` BOOLEAN NOT NULL DEFAULT false, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `MobileContractDetails` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `contractId` INTEGER NOT NULL, - `phoneNumber` VARCHAR(191) NULL, - `simCardNumber` VARCHAR(191) NULL, - `dataVolume` DOUBLE NULL, - `includedMinutes` INTEGER NULL, - `includedSMS` INTEGER NULL, - `deviceModel` VARCHAR(191) NULL, - `deviceImei` VARCHAR(191) NULL, - - UNIQUE INDEX `MobileContractDetails_contractId_key`(`contractId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `TvContractDetails` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `contractId` INTEGER NOT NULL, - `receiverModel` VARCHAR(191) NULL, - `smartcardNumber` VARCHAR(191) NULL, - `package` VARCHAR(191) NULL, - - UNIQUE INDEX `TvContractDetails_contractId_key`(`contractId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `CarInsuranceDetails` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `contractId` INTEGER NOT NULL, - `licensePlate` VARCHAR(191) NULL, - `hsn` VARCHAR(191) NULL, - `tsn` VARCHAR(191) NULL, - `vin` VARCHAR(191) NULL, - `vehicleType` VARCHAR(191) NULL, - `firstRegistration` DATETIME(3) NULL, - `noClaimsClass` VARCHAR(191) NULL, - `insuranceType` ENUM('LIABILITY', 'PARTIAL', 'FULL') NOT NULL DEFAULT 'LIABILITY', - `deductiblePartial` DOUBLE NULL, - `deductibleFull` DOUBLE NULL, - `policyNumber` VARCHAR(191) NULL, - `previousInsurer` VARCHAR(191) NULL, - - UNIQUE INDEX `CarInsuranceDetails_contractId_key`(`contractId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `User` ADD CONSTRAINT `User_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `RolePermission` ADD CONSTRAINT `RolePermission_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `Role`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `RolePermission` ADD CONSTRAINT `RolePermission_permissionId_fkey` FOREIGN KEY (`permissionId`) REFERENCES `Permission`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `UserRole` ADD CONSTRAINT `UserRole_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `UserRole` ADD CONSTRAINT `UserRole_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `Role`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Address` ADD CONSTRAINT `Address_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `BankCard` ADD CONSTRAINT `BankCard_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `IdentityDocument` ADD CONSTRAINT `IdentityDocument_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Meter` ADD CONSTRAINT `Meter_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `MeterReading` ADD CONSTRAINT `MeterReading_meterId_fkey` FOREIGN KEY (`meterId`) REFERENCES `Meter`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_addressId_fkey` FOREIGN KEY (`addressId`) REFERENCES `Address`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_bankCardId_fkey` FOREIGN KEY (`bankCardId`) REFERENCES `BankCard`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_identityDocumentId_fkey` FOREIGN KEY (`identityDocumentId`) REFERENCES `IdentityDocument`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_salesPlatformId_fkey` FOREIGN KEY (`salesPlatformId`) REFERENCES `SalesPlatform`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_previousContractId_fkey` FOREIGN KEY (`previousContractId`) REFERENCES `Contract`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `EnergyContractDetails` ADD CONSTRAINT `EnergyContractDetails_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `EnergyContractDetails` ADD CONSTRAINT `EnergyContractDetails_meterId_fkey` FOREIGN KEY (`meterId`) REFERENCES `Meter`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `InternetContractDetails` ADD CONSTRAINT `InternetContractDetails_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `PhoneNumber` ADD CONSTRAINT `PhoneNumber_internetContractDetailsId_fkey` FOREIGN KEY (`internetContractDetailsId`) REFERENCES `InternetContractDetails`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `MobileContractDetails` ADD CONSTRAINT `MobileContractDetails_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `TvContractDetails` ADD CONSTRAINT `TvContractDetails_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `CarInsuranceDetails` ADD CONSTRAINT `CarInsuranceDetails_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260120165550_add_document_path/migration.sql b/backend/prisma/migrations/20260120165550_add_document_path/migration.sql deleted file mode 100644 index bc39744d..00000000 --- a/backend/prisma/migrations/20260120165550_add_document_path/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE `BankCard` ADD COLUMN `documentPath` VARCHAR(191) NULL; - --- AlterTable -ALTER TABLE `IdentityDocument` ADD COLUMN `documentPath` VARCHAR(191) NULL; diff --git a/backend/prisma/migrations/20260120174530_add_customer_birthdate/migration.sql b/backend/prisma/migrations/20260120174530_add_customer_birthdate/migration.sql deleted file mode 100644 index ff14bd58..00000000 --- a/backend/prisma/migrations/20260120174530_add_customer_birthdate/migration.sql +++ /dev/null @@ -1,3 +0,0 @@ --- AlterTable -ALTER TABLE `Customer` ADD COLUMN `birthDate` DATETIME(3) NULL, - ADD COLUMN `birthPlace` VARCHAR(191) NULL; diff --git a/backend/prisma/migrations/20260120182703_add_license_fields/migration.sql b/backend/prisma/migrations/20260120182703_add_license_fields/migration.sql deleted file mode 100644 index 24fdad8c..00000000 --- a/backend/prisma/migrations/20260120182703_add_license_fields/migration.sql +++ /dev/null @@ -1,3 +0,0 @@ --- AlterTable -ALTER TABLE `IdentityDocument` ADD COLUMN `licenseClasses` VARCHAR(191) NULL, - ADD COLUMN `licenseIssueDate` DATETIME(3) NULL; diff --git a/backend/prisma/migrations/20260120223350_add_company_document/migration.sql b/backend/prisma/migrations/20260120223350_add_company_document/migration.sql deleted file mode 100644 index d46422e8..00000000 --- a/backend/prisma/migrations/20260120223350_add_company_document/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `businessRegistration` on the `Customer` table. All the data in the column will be lost. - - You are about to drop the column `commercialRegister` on the `Customer` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE `Customer` DROP COLUMN `businessRegistration`, - DROP COLUMN `commercialRegister`, - ADD COLUMN `businessRegistrationPath` VARCHAR(191) NULL, - ADD COLUMN `commercialRegisterNumber` VARCHAR(191) NULL, - ADD COLUMN `commercialRegisterPath` VARCHAR(191) NULL, - ADD COLUMN `foundingDate` DATETIME(3) NULL; diff --git a/backend/prisma/migrations/20260120230109_add_privacy_policy_price_fields_cancellation_periods/migration.sql b/backend/prisma/migrations/20260120230109_add_privacy_policy_price_fields_cancellation_periods/migration.sql deleted file mode 100644 index 4743e480..00000000 --- a/backend/prisma/migrations/20260120230109_add_privacy_policy_price_fields_cancellation_periods/migration.sql +++ /dev/null @@ -1,31 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `cancellationPeriod` on the `Contract` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE `Contract` DROP COLUMN `cancellationPeriod`, - ADD COLUMN `cancellationPeriodId` INTEGER NULL, - ADD COLUMN `priceAfter24Months` VARCHAR(191) NULL, - ADD COLUMN `priceFirst12Months` VARCHAR(191) NULL, - ADD COLUMN `priceFrom13Months` VARCHAR(191) NULL; - --- AlterTable -ALTER TABLE `Customer` ADD COLUMN `privacyPolicyPath` VARCHAR(191) NULL; - --- CreateTable -CREATE TABLE `CancellationPeriod` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `code` VARCHAR(191) NOT NULL, - `description` VARCHAR(191) NOT NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `CancellationPeriod_code_key`(`code`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_cancellationPeriodId_fkey` FOREIGN KEY (`cancellationPeriodId`) REFERENCES `CancellationPeriod`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260120231330_add_contract_duration/migration.sql b/backend/prisma/migrations/20260120231330_add_contract_duration/migration.sql deleted file mode 100644 index e82cc615..00000000 --- a/backend/prisma/migrations/20260120231330_add_contract_duration/migration.sql +++ /dev/null @@ -1,18 +0,0 @@ --- AlterTable -ALTER TABLE `Contract` ADD COLUMN `contractDurationId` INTEGER NULL; - --- CreateTable -CREATE TABLE `ContractDuration` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `code` VARCHAR(191) NOT NULL, - `description` VARCHAR(191) NOT NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `ContractDuration_code_key`(`code`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_contractDurationId_fkey` FOREIGN KEY (`contractDurationId`) REFERENCES `ContractDuration`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260121000502_add_cancellation_documents_and_fields/migration.sql b/backend/prisma/migrations/20260121000502_add_cancellation_documents_and_fields/migration.sql deleted file mode 100644 index cab597c3..00000000 --- a/backend/prisma/migrations/20260121000502_add_cancellation_documents_and_fields/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ --- AlterTable -ALTER TABLE `Contract` ADD COLUMN `cancellationConfirmationDate` DATETIME(3) NULL, - ADD COLUMN `cancellationConfirmationOptionsDate` DATETIME(3) NULL, - ADD COLUMN `cancellationConfirmationOptionsPath` VARCHAR(191) NULL, - ADD COLUMN `cancellationConfirmationPath` VARCHAR(191) NULL, - ADD COLUMN `cancellationLetterOptionsPath` VARCHAR(191) NULL, - ADD COLUMN `cancellationLetterPath` VARCHAR(191) NULL, - ADD COLUMN `wasSpecialCancellation` BOOLEAN NOT NULL DEFAULT false; diff --git a/backend/prisma/migrations/20260121082734_add_provider_tariff/migration.sql b/backend/prisma/migrations/20260121082734_add_provider_tariff/migration.sql deleted file mode 100644 index 70ae530c..00000000 --- a/backend/prisma/migrations/20260121082734_add_provider_tariff/migration.sql +++ /dev/null @@ -1,40 +0,0 @@ --- AlterTable -ALTER TABLE `Contract` ADD COLUMN `providerId` INTEGER NULL, - ADD COLUMN `tariffId` INTEGER NULL; - --- CreateTable -CREATE TABLE `Provider` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `name` VARCHAR(191) NOT NULL, - `portalUrl` VARCHAR(191) NULL, - `usernameFieldName` VARCHAR(191) NULL, - `passwordFieldName` VARCHAR(191) NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `Provider_name_key`(`name`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Tariff` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `providerId` INTEGER NOT NULL, - `name` VARCHAR(191) NOT NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `Tariff_providerId_name_key`(`providerId`, `name`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `Tariff` ADD CONSTRAINT `Tariff_providerId_fkey` FOREIGN KEY (`providerId`) REFERENCES `Provider`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_providerId_fkey` FOREIGN KEY (`providerId`) REFERENCES `Provider`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_tariffId_fkey` FOREIGN KEY (`tariffId`) REFERENCES `Tariff`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260123080428_add_simcards/migration.sql b/backend/prisma/migrations/20260123080428_add_simcards/migration.sql deleted file mode 100644 index 023c07c4..00000000 --- a/backend/prisma/migrations/20260123080428_add_simcards/migration.sql +++ /dev/null @@ -1,21 +0,0 @@ --- AlterTable -ALTER TABLE `MobileContractDetails` ADD COLUMN `requiresMultisim` BOOLEAN NOT NULL DEFAULT false; - --- CreateTable -CREATE TABLE `SimCard` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `mobileDetailsId` INTEGER NOT NULL, - `phoneNumber` VARCHAR(191) NULL, - `simCardNumber` VARCHAR(191) NULL, - `pin` VARCHAR(191) NULL, - `puk` VARCHAR(191) NULL, - `isMultisim` BOOLEAN NOT NULL DEFAULT false, - `isMain` BOOLEAN NOT NULL DEFAULT false, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `SimCard` ADD CONSTRAINT `SimCard_mobileDetailsId_fkey` FOREIGN KEY (`mobileDetailsId`) REFERENCES `MobileContractDetails`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260123104730_add_contract_categories/migration.sql b/backend/prisma/migrations/20260123104730_add_contract_categories/migration.sql deleted file mode 100644 index c7fcd7ab..00000000 --- a/backend/prisma/migrations/20260123104730_add_contract_categories/migration.sql +++ /dev/null @@ -1,21 +0,0 @@ --- AlterTable -ALTER TABLE `Contract` ADD COLUMN `contractCategoryId` INTEGER NULL; - --- CreateTable -CREATE TABLE `ContractCategory` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `code` VARCHAR(191) NOT NULL, - `name` VARCHAR(191) NOT NULL, - `icon` VARCHAR(191) NULL, - `color` VARCHAR(191) NULL, - `sortOrder` INTEGER NOT NULL DEFAULT 0, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `ContractCategory_code_key`(`code`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_contractCategoryId_fkey` FOREIGN KEY (`contractCategoryId`) REFERENCES `ContractCategory`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260123110457_extend_internet_details/migration.sql b/backend/prisma/migrations/20260123110457_extend_internet_details/migration.sql deleted file mode 100644 index bec4b654..00000000 --- a/backend/prisma/migrations/20260123110457_extend_internet_details/migration.sql +++ /dev/null @@ -1,13 +0,0 @@ --- AlterTable -ALTER TABLE `Contract` MODIFY `type` ENUM('ELECTRICITY', 'GAS', 'DSL', 'CABLE', 'FIBER', 'MOBILE', 'TV', 'CAR_INSURANCE') NOT NULL; - --- AlterTable -ALTER TABLE `InternetContractDetails` ADD COLUMN `activationCode` VARCHAR(191) NULL, - ADD COLUMN `homeId` VARCHAR(191) NULL, - ADD COLUMN `internetPasswordEncrypted` VARCHAR(191) NULL, - ADD COLUMN `internetUsername` VARCHAR(191) NULL; - --- AlterTable -ALTER TABLE `PhoneNumber` ADD COLUMN `sipPasswordEncrypted` VARCHAR(191) NULL, - ADD COLUMN `sipServer` VARCHAR(191) NULL, - ADD COLUMN `sipUsername` VARCHAR(191) NULL; diff --git a/backend/prisma/migrations/20260130231219_add_email_trash_fields/migration.sql b/backend/prisma/migrations/20260130231219_add_email_trash_fields/migration.sql deleted file mode 100644 index 0ee61b34..00000000 --- a/backend/prisma/migrations/20260130231219_add_email_trash_fields/migration.sql +++ /dev/null @@ -1,180 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[portalEmail]` on the table `Customer` will be added. If there are existing duplicate values, this will fail. - -*/ --- AlterTable -ALTER TABLE `Contract` ADD COLUMN `stressfreiEmailId` INTEGER NULL, - MODIFY `status` ENUM('DRAFT', 'PENDING', 'ACTIVE', 'CANCELLED', 'EXPIRED', 'DEACTIVATED') NOT NULL DEFAULT 'DRAFT'; - --- AlterTable -ALTER TABLE `Customer` ADD COLUMN `portalEmail` VARCHAR(191) NULL, - ADD COLUMN `portalEnabled` BOOLEAN NOT NULL DEFAULT false, - ADD COLUMN `portalLastLogin` DATETIME(3) NULL, - ADD COLUMN `portalPasswordEncrypted` VARCHAR(191) NULL, - ADD COLUMN `portalPasswordHash` VARCHAR(191) NULL; - --- CreateTable -CREATE TABLE `AppSetting` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `key` VARCHAR(191) NOT NULL, - `value` TEXT NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `AppSetting_key_key`(`key`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `CustomerRepresentative` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `customerId` INTEGER NOT NULL, - `representativeId` INTEGER NOT NULL, - `notes` VARCHAR(191) NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `CustomerRepresentative_customerId_representativeId_key`(`customerId`, `representativeId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `EmailProviderConfig` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `name` VARCHAR(191) NOT NULL, - `type` ENUM('PLESK', 'CPANEL', 'DIRECTADMIN') NOT NULL, - `apiUrl` VARCHAR(191) NOT NULL, - `apiKey` VARCHAR(191) NULL, - `username` VARCHAR(191) NULL, - `passwordEncrypted` VARCHAR(191) NULL, - `domain` VARCHAR(191) NOT NULL, - `defaultForwardEmail` VARCHAR(191) NULL, - `imapServer` VARCHAR(191) NULL, - `imapPort` INTEGER NULL DEFAULT 993, - `smtpServer` VARCHAR(191) NULL, - `smtpPort` INTEGER NULL DEFAULT 465, - `imapEncryption` ENUM('SSL', 'STARTTLS', 'NONE') NOT NULL DEFAULT 'SSL', - `smtpEncryption` ENUM('SSL', 'STARTTLS', 'NONE') NOT NULL DEFAULT 'SSL', - `allowSelfSignedCerts` BOOLEAN NOT NULL DEFAULT false, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `isDefault` BOOLEAN NOT NULL DEFAULT false, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `EmailProviderConfig_name_key`(`name`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `StressfreiEmail` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `customerId` INTEGER NOT NULL, - `email` VARCHAR(191) NOT NULL, - `platform` VARCHAR(191) NULL, - `notes` TEXT NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `isProvisioned` BOOLEAN NOT NULL DEFAULT false, - `provisionedAt` DATETIME(3) NULL, - `provisionError` TEXT NULL, - `hasMailbox` BOOLEAN NOT NULL DEFAULT false, - `emailPasswordEncrypted` VARCHAR(191) NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `CachedEmail` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `stressfreiEmailId` INTEGER NOT NULL, - `folder` ENUM('INBOX', 'SENT') NOT NULL DEFAULT 'INBOX', - `messageId` VARCHAR(191) NOT NULL, - `uid` INTEGER NOT NULL, - `subject` VARCHAR(191) NULL, - `fromAddress` VARCHAR(191) NOT NULL, - `fromName` VARCHAR(191) NULL, - `toAddresses` TEXT NOT NULL, - `ccAddresses` TEXT NULL, - `receivedAt` DATETIME(3) NOT NULL, - `textBody` LONGTEXT NULL, - `htmlBody` LONGTEXT NULL, - `hasAttachments` BOOLEAN NOT NULL DEFAULT false, - `attachmentNames` TEXT NULL, - `contractId` INTEGER NULL, - `assignedAt` DATETIME(3) NULL, - `assignedBy` INTEGER NULL, - `isAutoAssigned` BOOLEAN NOT NULL DEFAULT false, - `isRead` BOOLEAN NOT NULL DEFAULT false, - `isStarred` BOOLEAN NOT NULL DEFAULT false, - `isDeleted` BOOLEAN NOT NULL DEFAULT false, - `deletedAt` DATETIME(3) NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - INDEX `CachedEmail_contractId_idx`(`contractId`), - INDEX `CachedEmail_stressfreiEmailId_folder_receivedAt_idx`(`stressfreiEmailId`, `folder`, `receivedAt`), - INDEX `CachedEmail_stressfreiEmailId_isDeleted_idx`(`stressfreiEmailId`, `isDeleted`), - UNIQUE INDEX `CachedEmail_stressfreiEmailId_messageId_folder_key`(`stressfreiEmailId`, `messageId`, `folder`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `ContractTask` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `contractId` INTEGER NOT NULL, - `title` VARCHAR(191) NOT NULL, - `description` TEXT NULL, - `status` ENUM('OPEN', 'COMPLETED') NOT NULL DEFAULT 'OPEN', - `visibleInPortal` BOOLEAN NOT NULL DEFAULT false, - `createdBy` VARCHAR(191) NULL, - `completedAt` DATETIME(3) NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `ContractTaskSubtask` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `taskId` INTEGER NOT NULL, - `title` VARCHAR(191) NOT NULL, - `status` ENUM('OPEN', 'COMPLETED') NOT NULL DEFAULT 'OPEN', - `createdBy` VARCHAR(191) NULL, - `completedAt` DATETIME(3) NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateIndex -CREATE UNIQUE INDEX `Customer_portalEmail_key` ON `Customer`(`portalEmail`); - --- AddForeignKey -ALTER TABLE `CustomerRepresentative` ADD CONSTRAINT `CustomerRepresentative_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `CustomerRepresentative` ADD CONSTRAINT `CustomerRepresentative_representativeId_fkey` FOREIGN KEY (`representativeId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `StressfreiEmail` ADD CONSTRAINT `StressfreiEmail_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `CachedEmail` ADD CONSTRAINT `CachedEmail_stressfreiEmailId_fkey` FOREIGN KEY (`stressfreiEmailId`) REFERENCES `StressfreiEmail`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `CachedEmail` ADD CONSTRAINT `CachedEmail_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_stressfreiEmailId_fkey` FOREIGN KEY (`stressfreiEmailId`) REFERENCES `StressfreiEmail`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `ContractTask` ADD CONSTRAINT `ContractTask_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `ContractTaskSubtask` ADD CONSTRAINT `ContractTaskSubtask_taskId_fkey` FOREIGN KEY (`taskId`) REFERENCES `ContractTask`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260130233909_add_token_invalidation/migration.sql b/backend/prisma/migrations/20260130233909_add_token_invalidation/migration.sql deleted file mode 100644 index 064972fb..00000000 --- a/backend/prisma/migrations/20260130233909_add_token_invalidation/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE `User` ADD COLUMN `tokenInvalidatedAt` DATETIME(3) NULL; diff --git a/backend/prisma/migrations/20260204074019_add_billing_address/migration.sql b/backend/prisma/migrations/20260204074019_add_billing_address/migration.sql deleted file mode 100644 index 7cfdd714..00000000 --- a/backend/prisma/migrations/20260204074019_add_billing_address/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE `Contract` ADD COLUMN `billingAddressId` INTEGER NULL; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_billingAddressId_fkey` FOREIGN KEY (`billingAddressId`) REFERENCES `Address`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260205190935_add_annual_consumption_kwh/migration.sql b/backend/prisma/migrations/20260205190935_add_annual_consumption_kwh/migration.sql deleted file mode 100644 index 0f9d03b9..00000000 --- a/backend/prisma/migrations/20260205190935_add_annual_consumption_kwh/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE `EnergyContractDetails` ADD COLUMN `annualConsumptionKwh` DOUBLE NULL; diff --git a/backend/prisma/migrations/20260205192000_add_malo_id/migration.sql b/backend/prisma/migrations/20260205192000_add_malo_id/migration.sql deleted file mode 100644 index ba8533c9..00000000 --- a/backend/prisma/migrations/20260205192000_add_malo_id/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE `EnergyContractDetails` ADD COLUMN `maloId` VARCHAR(191) NULL; diff --git a/backend/prisma/migrations/20260207220248_add_invoice_model/migration.sql b/backend/prisma/migrations/20260207220248_add_invoice_model/migration.sql deleted file mode 100644 index fe25d0f0..00000000 --- a/backend/prisma/migrations/20260207220248_add_invoice_model/migration.sql +++ /dev/null @@ -1,17 +0,0 @@ --- CreateTable -CREATE TABLE `Invoice` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `energyContractDetailsId` INTEGER NOT NULL, - `invoiceDate` DATETIME(3) NOT NULL, - `invoiceType` ENUM('INTERIM', 'FINAL', 'NOT_AVAILABLE') NOT NULL, - `documentPath` VARCHAR(191) NULL, - `notes` VARCHAR(191) NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - INDEX `Invoice_energyContractDetailsId_idx`(`energyContractDetailsId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `Invoice` ADD CONSTRAINT `Invoice_energyContractDetailsId_fkey` FOREIGN KEY (`energyContractDetailsId`) REFERENCES `EnergyContractDetails`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260208081918_add_next_review_date/migration.sql b/backend/prisma/migrations/20260208081918_add_next_review_date/migration.sql deleted file mode 100644 index cf6798c0..00000000 --- a/backend/prisma/migrations/20260208081918_add_next_review_date/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE `Contract` ADD COLUMN `nextReviewDate` DATETIME(3) NULL; diff --git a/backend/prisma/migrations/20260208130924_add_contract_number_at_provider/migration.sql b/backend/prisma/migrations/20260208130924_add_contract_number_at_provider/migration.sql deleted file mode 100644 index 6f059cd8..00000000 --- a/backend/prisma/migrations/20260208130924_add_contract_number_at_provider/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE `Contract` ADD COLUMN `contractNumberAtProvider` VARCHAR(191) NULL; diff --git a/backend/prisma/migrations/20260208132553_add_previous_provider_fields/migration.sql b/backend/prisma/migrations/20260208132553_add_previous_provider_fields/migration.sql deleted file mode 100644 index e23255bf..00000000 --- a/backend/prisma/migrations/20260208132553_add_previous_provider_fields/migration.sql +++ /dev/null @@ -1,7 +0,0 @@ --- AlterTable -ALTER TABLE `Contract` ADD COLUMN `previousContractNumber` VARCHAR(191) NULL, - ADD COLUMN `previousCustomerNumber` VARCHAR(191) NULL, - ADD COLUMN `previousProviderId` INTEGER NULL; - --- AddForeignKey -ALTER TABLE `Contract` ADD CONSTRAINT `Contract_previousProviderId_fkey` FOREIGN KEY (`previousProviderId`) REFERENCES `Provider`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260208174811_add_contract_history/migration.sql b/backend/prisma/migrations/20260208174811_add_contract_history/migration.sql deleted file mode 100644 index 6b6c3a94..00000000 --- a/backend/prisma/migrations/20260208174811_add_contract_history/migration.sql +++ /dev/null @@ -1,15 +0,0 @@ --- CreateTable -CREATE TABLE `ContractHistoryEntry` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `contractId` INTEGER NOT NULL, - `title` VARCHAR(191) NOT NULL, - `description` TEXT NULL, - `isAutomatic` BOOLEAN NOT NULL DEFAULT false, - `createdBy` VARCHAR(191) NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `ContractHistoryEntry` ADD CONSTRAINT `ContractHistoryEntry_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260208232823_add_gdpr_audit_logging/migration.sql b/backend/prisma/migrations/20260208232823_add_gdpr_audit_logging/migration.sql deleted file mode 100644 index 7ab3daec..00000000 --- a/backend/prisma/migrations/20260208232823_add_gdpr_audit_logging/migration.sql +++ /dev/null @@ -1,103 +0,0 @@ --- CreateTable -CREATE TABLE `AuditLog` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `userId` INTEGER NULL, - `userEmail` VARCHAR(191) NOT NULL, - `userRole` VARCHAR(191) NULL, - `customerId` INTEGER NULL, - `isCustomerPortal` BOOLEAN NOT NULL DEFAULT false, - `action` ENUM('CREATE', 'READ', 'UPDATE', 'DELETE', 'EXPORT', 'ANONYMIZE', 'LOGIN', 'LOGOUT', 'LOGIN_FAILED') NOT NULL, - `sensitivity` ENUM('LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NOT NULL DEFAULT 'MEDIUM', - `resourceType` VARCHAR(191) NOT NULL, - `resourceId` VARCHAR(191) NULL, - `resourceLabel` VARCHAR(191) NULL, - `endpoint` VARCHAR(191) NOT NULL, - `httpMethod` VARCHAR(191) NOT NULL, - `ipAddress` VARCHAR(191) NOT NULL, - `userAgent` TEXT NULL, - `changesBefore` LONGTEXT NULL, - `changesAfter` LONGTEXT NULL, - `changesEncrypted` BOOLEAN NOT NULL DEFAULT false, - `dataSubjectId` INTEGER NULL, - `legalBasis` VARCHAR(191) NULL, - `success` BOOLEAN NOT NULL DEFAULT true, - `errorMessage` TEXT NULL, - `durationMs` INTEGER NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `hash` VARCHAR(191) NULL, - `previousHash` VARCHAR(191) NULL, - - INDEX `AuditLog_userId_idx`(`userId`), - INDEX `AuditLog_customerId_idx`(`customerId`), - INDEX `AuditLog_resourceType_resourceId_idx`(`resourceType`, `resourceId`), - INDEX `AuditLog_dataSubjectId_idx`(`dataSubjectId`), - INDEX `AuditLog_action_idx`(`action`), - INDEX `AuditLog_createdAt_idx`(`createdAt`), - INDEX `AuditLog_sensitivity_idx`(`sensitivity`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `CustomerConsent` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `customerId` INTEGER NOT NULL, - `consentType` ENUM('DATA_PROCESSING', 'MARKETING_EMAIL', 'MARKETING_PHONE', 'DATA_SHARING_PARTNER') NOT NULL, - `status` ENUM('GRANTED', 'WITHDRAWN', 'PENDING') NOT NULL DEFAULT 'PENDING', - `grantedAt` DATETIME(3) NULL, - `withdrawnAt` DATETIME(3) NULL, - `source` VARCHAR(191) NULL, - `documentPath` VARCHAR(191) NULL, - `version` VARCHAR(191) NULL, - `ipAddress` VARCHAR(191) NULL, - `createdBy` VARCHAR(191) NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - INDEX `CustomerConsent_customerId_idx`(`customerId`), - INDEX `CustomerConsent_consentType_idx`(`consentType`), - INDEX `CustomerConsent_status_idx`(`status`), - UNIQUE INDEX `CustomerConsent_customerId_consentType_key`(`customerId`, `consentType`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `DataDeletionRequest` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `customerId` INTEGER NOT NULL, - `status` ENUM('PENDING', 'IN_PROGRESS', 'COMPLETED', 'PARTIALLY_COMPLETED', 'REJECTED') NOT NULL DEFAULT 'PENDING', - `requestedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `requestSource` VARCHAR(191) NOT NULL, - `requestedBy` VARCHAR(191) NOT NULL, - `processedAt` DATETIME(3) NULL, - `processedBy` VARCHAR(191) NULL, - `deletedData` LONGTEXT NULL, - `retainedData` LONGTEXT NULL, - `retentionReason` TEXT NULL, - `proofDocument` VARCHAR(191) NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - INDEX `DataDeletionRequest_customerId_idx`(`customerId`), - INDEX `DataDeletionRequest_status_idx`(`status`), - INDEX `DataDeletionRequest_requestedAt_idx`(`requestedAt`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `AuditRetentionPolicy` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `resourceType` VARCHAR(191) NOT NULL, - `sensitivity` ENUM('LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NULL, - `retentionDays` INTEGER NOT NULL, - `description` VARCHAR(191) NULL, - `legalBasis` VARCHAR(191) NULL, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `AuditRetentionPolicy_resourceType_sensitivity_key`(`resourceType`, `sensitivity`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `CustomerConsent` ADD CONSTRAINT `CustomerConsent_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260216_add_consent_hash_and_user_messaging/migration.sql b/backend/prisma/migrations/20260216_add_consent_hash_and_user_messaging/migration.sql deleted file mode 100644 index 22ce299b..00000000 --- a/backend/prisma/migrations/20260216_add_consent_hash_and_user_messaging/migration.sql +++ /dev/null @@ -1,10 +0,0 @@ --- AlterTable -ALTER TABLE `Customer` ADD COLUMN `consentHash` VARCHAR(191) NULL; - --- AlterTable -ALTER TABLE `User` ADD COLUMN `whatsappNumber` VARCHAR(191) NULL, - ADD COLUMN `telegramUsername` VARCHAR(191) NULL, - ADD COLUMN `signalNumber` VARCHAR(191) NULL; - --- CreateIndex -CREATE UNIQUE INDEX `Customer_consentHash_key` ON `Customer`(`consentHash`); diff --git a/backend/prisma/migrations/migration_lock.toml b/backend/prisma/migrations/migration_lock.toml index e5a788a7..9bee74de 100644 --- a/backend/prisma/migrations/migration_lock.toml +++ b/backend/prisma/migrations/migration_lock.toml @@ -1,3 +1,3 @@ # Please do not edit this file manually # It should be added in your version-control system (i.e. Git) -provider = "mysql" \ No newline at end of file +provider = "mysql" diff --git a/docs/todo.md b/docs/todo.md index b9626fe5..d221d076 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -97,6 +97,22 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung ## ✅ Erledigt +- [x] **🗃️ Prisma-Migrations-System (statt `db push`)** + - Initial-Migration `0_init` aus aktuellem Schema generiert + (`prisma migrate diff --from-empty --to-schema-datamodel`). + - 24 alte gedriftete Migrations gelöscht – frischer Start. + - `migration_lock.toml` für MySQL hinzugefügt. + - Container-Entrypoint umgebaut: + - Auto-Baseline-Detection: bestehende DB ohne `_prisma_migrations` → + `migrate resolve --applied 0_init` läuft automatisch. + - Statt `db push --accept-data-loss` jetzt `migrate deploy` (idempotent, + datenerhaltend, keine stillen DROPs mehr). + - Neuer npm-Script `schema:sync` (lokal/Dev): legt automatisch eine + versionierte Migration mit Zeitstempel-Namen an + (`prisma migrate dev --name auto_$(date +%Y%m%d_%H%M%S)`). + - Workflow ab jetzt: schema.prisma ändern → `npm run schema:sync` → + Migration committen → Push → Container-Restart wendet sie automatisch an. + - [x] **🔄 Automatische Vertrags-Status-Übergänge** - Nightly-Cron (02:00 + Catch-up 60s nach Start): alle Verträge mit `status=ACTIVE` und `endDate < heute` → `EXPIRED` (mit Audit-Log).