Refactor financial transaction handling: Consolidate Einnahmen and Ausgaben into Buchung model, update routes and UI components, and add new migration scripts for database schema changes.

This commit is contained in:
hwinkel
2026-03-24 21:06:07 +01:00
parent d582c748a2
commit 1ec15600b5
18 changed files with 928 additions and 358 deletions
@@ -0,0 +1,17 @@
-- Add source linking fields to Buchung model
ALTER TABLE `buchungen` ADD COLUMN `betriebseinnahmeId` VARCHAR(191) NULL;
ALTER TABLE `buchungen` ADD COLUMN `betriebsausgabeId` VARCHAR(191) NULL;
ALTER TABLE `buchungen` ADD COLUMN `linkedBuchungId` VARCHAR(191) NULL;
-- Add unique constraints for 1:1 relations
ALTER TABLE `buchungen` ADD UNIQUE INDEX `buchungen_betriebseinnahmeId_key`(`betriebseinnahmeId`);
ALTER TABLE `buchungen` ADD UNIQUE INDEX `buchungen_betriebsausgabeId_key`(`betriebsausgabeId`);
-- Add foreign key constraints
ALTER TABLE `buchungen` ADD CONSTRAINT `buchungen_betriebseinnahmeId_fkey` FOREIGN KEY (`betriebseinnahmeId`) REFERENCES `betriebseinnahmen`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE `buchungen` ADD CONSTRAINT `buchungen_betriebsausgabeId_fkey` FOREIGN KEY (`betriebsausgabeId`) REFERENCES `betriebsausgaben`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE `buchungen` ADD CONSTRAINT `buchungen_linkedBuchungId_fkey` FOREIGN KEY (`linkedBuchungId`) REFERENCES `buchungen`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- Add indexes for linked fields
ALTER TABLE `buchungen` ADD INDEX `buchungen_betriebsausgabeId_idx`(`betriebsausgabeId`);
ALTER TABLE `buchungen` ADD INDEX `buchungen_linkedBuchungId_idx`(`linkedBuchungId`);
@@ -0,0 +1,9 @@
-- Add buchungId field to invoices table
ALTER TABLE `invoices` ADD COLUMN `buchungId` VARCHAR(191) NULL;
-- Create unique index for the foreign key
ALTER TABLE `invoices` ADD UNIQUE INDEX `invoices_buchungId_key`(`buchungId`);
-- Add foreign key constraint
ALTER TABLE `invoices` ADD CONSTRAINT `invoices_buchungId_fkey`
FOREIGN KEY (`buchungId`) REFERENCES `buchungen`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
@@ -0,0 +1,41 @@
-- CreateTable for BuchungKategorie
CREATE TABLE `buchung_kategorien` (
`id` VARCHAR(191) NOT NULL,
`companyId` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`typ` VARCHAR(191) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `buchung_kategorien_companyId_idx`(`companyId`),
UNIQUE INDEX `buchung_kategorien_companyId_name_typ_key`(`companyId`, `name`, `typ`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey for BuchungKategorie
ALTER TABLE `buchung_kategorien` ADD CONSTRAINT `buchung_kategorien_companyId_fkey` FOREIGN KEY (`companyId`) REFERENCES `companies`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AlterTable `buchungen` - add new columns
ALTER TABLE `buchungen` ADD COLUMN `kategorie` VARCHAR(191) NULL;
ALTER TABLE `buchungen` ADD COLUMN `steuersatz` INT NULL;
ALTER TABLE `buchungen` ADD COLUMN `zahlungsart` ENUM('KASSE', 'BANK') NULL;
ALTER TABLE `buchungen` ADD COLUMN `isBusinessRecord` BOOLEAN NOT NULL DEFAULT false;
-- Add index for isBusinessRecord
ALTER TABLE `buchungen` ADD INDEX `buchungen_isBusinessRecord_idx`(`isBusinessRecord`);
-- Migrate existing data from betriebseinnahmen/betriebsausgaben to Buchung
-- This is handled by the post-migration script
-- AlterTable `betriebseinnahmen` - change kategorie from Enum to String
ALTER TABLE `betriebseinnahmen` MODIFY `kategorie` VARCHAR(191) NOT NULL;
ALTER TABLE `betriebseinnahmen` MODIFY `steuersatz` INT NOT NULL DEFAULT 0;
-- AlterTable `betriebsausgaben` - change kategorie from Enum to String
ALTER TABLE `betriebsausgaben` MODIFY `kategorie` VARCHAR(191) NOT NULL;
ALTER TABLE `betriebsausgaben` MODIFY `steuersatz` INT NOT NULL DEFAULT 0;
-- Drop old foreign key constraints from buchungen (if they exist from previous migration)
-- These will be re-added if needed, but for now we're consolidating
-- Note: The enum columns EinnahmeKategorie and AusgabeKategorie are automatically
-- dropped by Prisma when they're no longer referenced in the schema.
@@ -0,0 +1,61 @@
-- Migration: Drop legacy betriebseinnahmen and betriebsausgaben tables
-- This consolidates all transaction data into the buchungen table
-- STEP 1: Copy existing betriebseinnahmen into buchungen
-- Only copy those that don't already have a linked Buchung (via betriebseinnahmeId)
INSERT INTO `buchungen` (id, companyId, date, account, type, amount, description,
kategorie, steuersatz, zahlungsart, isBusinessRecord, createdAt, updatedAt)
SELECT
CONCAT('migr-ein-', e.id),
e.companyId,
e.datum,
e.zahlungsart,
'EINLAGE',
e.betrag,
e.beschreibung,
e.kategorie,
e.steuersatz,
e.zahlungsart,
true,
e.createdAt,
e.updatedAt
FROM `betriebseinnahmen` e
WHERE NOT EXISTS (
SELECT 1 FROM `buchungen` b WHERE b.betriebseinnahmeId = e.id
);
-- STEP 2: Copy existing betriebsausgaben into buchungen
INSERT INTO `buchungen` (id, companyId, date, account, type, amount, description,
kategorie, steuersatz, zahlungsart, isBusinessRecord, createdAt, updatedAt)
SELECT
CONCAT('migr-aus-', a.id),
a.companyId,
a.datum,
a.zahlungsart,
'ENTNAHME',
a.betrag,
a.beschreibung,
a.kategorie,
a.steuersatz,
a.zahlungsart,
true,
a.createdAt,
a.updatedAt
FROM `betriebsausgaben` a
WHERE NOT EXISTS (
SELECT 1 FROM `buchungen` b WHERE b.betriebsausgabeId = a.id
);
-- STEP 3: Remove FK constraints before dropping columns/tables
ALTER TABLE `buchungen` DROP FOREIGN KEY `buchungen_betriebseinnahmeId_fkey`;
ALTER TABLE `buchungen` DROP FOREIGN KEY `buchungen_betriebsausgabeId_fkey`;
-- STEP 4: Remove old linking columns from buchungen
ALTER TABLE `buchungen` DROP INDEX `buchungen_betriebseinnahmeId_key`;
ALTER TABLE `buchungen` DROP INDEX `buchungen_betriebsausgabeId_key`;
ALTER TABLE `buchungen` DROP COLUMN `betriebseinnahmeId`;
ALTER TABLE `buchungen` DROP COLUMN `betriebsausgabeId`;
-- STEP 5: Drop old tables
DROP TABLE `betriebsausgaben`;
DROP TABLE `betriebseinnahmen`;