Kassenbuch, Mitgliedsbeitraege, Rechnungen an Dritte, Kassenpruefung und die Auswertungen fuer die Jahreshauptversammlung. Die drei Festlegungen aus Phase-9.md sitzen in der Datenbank, nicht im Router: eine festgeschriebene Buchung ist unveraenderbar, ein geprueftes Jahr nimmt kein Datum mehr an, und gerechnet wird mit Prisma.Decimal. Korrigiert wird ueber eine Gegenbuchung mit Verweis - beide Buchungen bleiben stehen, damit im Kassenbuch zu sehen ist, dass etwas berichtigt wurde. Neun Modelle, drei Trigger, zwoelf CHECKs, sechs Router, fuenf Ansichten. Dazu der Bankimport fuer CAMT.053 und MT940 ohne Fremdbibliothek, der Kategorievorschlag aus dem eigenen Buchungsbestand und die Bruecke von Phase 8: aus einem gegengezeichneten Beleg wird eine Buchung, das Foto haengt danach an ihr. Nebenbei behoben: die Rechnungsnummer war ein Wettlauf, und eine Organisation liess sich nicht mehr loeschen, sobald sie eine festgeschriebene Buchung hatte - der Trigger kannte den Aufbewahrungsschalter nicht. 562 Unit-Tests und 239 E2E-Tests gruen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
114 lines
3.4 KiB
JSON
114 lines
3.4 KiB
JSON
{
|
|
"name": "florian",
|
|
"version": "0.10.0",
|
|
"private": true,
|
|
"description": "FLORIAN — Feuerwehr-Verwaltungsplattform",
|
|
"engines": {
|
|
"node": ">=22"
|
|
},
|
|
"scripts": {
|
|
"dev": "next dev -p 3100",
|
|
"build": "next build",
|
|
"start": "next start -p 3100",
|
|
"worker": "tsx --conditions=react-server src/worker/index.ts",
|
|
"worker:dev": "tsx watch --conditions=react-server src/worker/index.ts",
|
|
"lint": "eslint .",
|
|
"lint:fix": "eslint . --fix",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:e2e": "playwright test",
|
|
"db:generate": "prisma generate",
|
|
"db:migrate": "prisma migrate deploy",
|
|
"db:migrate:dev": "prisma migrate dev",
|
|
"db:push": "prisma db push",
|
|
"db:seed": "tsx prisma/seed.ts",
|
|
"db:test-reset": "tsx scripts/testdaten.ts",
|
|
"db:studio": "prisma studio",
|
|
"screenshots": "tsx scripts/screenshots.ts",
|
|
"icons": "tsx scripts/icons.ts",
|
|
"vapid": "tsx scripts/vapid.ts"
|
|
},
|
|
"dependencies": {
|
|
"@prisma/client": "^6.16.2",
|
|
"@radix-ui/react-avatar": "^1.1.10",
|
|
"@radix-ui/react-checkbox": "^1.3.11",
|
|
"@radix-ui/react-dialog": "^1.1.23",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
"@radix-ui/react-label": "^2.1.7",
|
|
"@radix-ui/react-popover": "^1.1.23",
|
|
"@radix-ui/react-select": "^2.3.7",
|
|
"@radix-ui/react-separator": "^1.1.7",
|
|
"@radix-ui/react-slot": "^1.2.3",
|
|
"@radix-ui/react-tabs": "^1.1.21",
|
|
"@radix-ui/react-tooltip": "^1.2.16",
|
|
"@tanstack/react-query": "^5.90.2",
|
|
"@tanstack/react-table": "^9.2.4",
|
|
"@trpc/client": "^11.6.0",
|
|
"@trpc/react-query": "^11.6.0",
|
|
"@trpc/server": "^11.6.0",
|
|
"@zxing/browser": "^0.2.1",
|
|
"@zxing/library": "^0.23.0",
|
|
"bcryptjs": "^3.0.2",
|
|
"bullmq": "^5.61.0",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"date-fns": "^4.1.0",
|
|
"date-fns-tz": "^3.2.0",
|
|
"dexie": "^4.4.5",
|
|
"exceljs": "^4.4.0",
|
|
"ioredis": "^5.8.1",
|
|
"lucide-react": "^0.544.0",
|
|
"maplibre-gl": "^6.7.0",
|
|
"minio": "^8.0.6",
|
|
"next": "^15.5.4",
|
|
"next-auth": "^5.0.0-beta.29",
|
|
"next-themes": "^0.4.6",
|
|
"nodemailer": "^8.0.11",
|
|
"papaparse": "^5.7.0",
|
|
"qrcode": "^1.5.4",
|
|
"react": "^19.1.1",
|
|
"react-dom": "^19.1.1",
|
|
"server-only": "^0.0.1",
|
|
"superjson": "^2.2.6",
|
|
"tailwind-merge": "^3.3.1",
|
|
"web-push": "^3.6.7",
|
|
"zod": "^3.25.76"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.55.1",
|
|
"@tailwindcss/postcss": "^4.1.13",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/react": "^16.3.0",
|
|
"@types/node": "^22.18.6",
|
|
"@types/nodemailer": "^8.0.1",
|
|
"@types/papaparse": "^5.5.2",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/react": "^19.1.13",
|
|
"@types/react-dom": "^19.1.9",
|
|
"@types/web-push": "^3.6.4",
|
|
"@vitejs/plugin-react": "^5.0.3",
|
|
"dotenv": "^17.4.2",
|
|
"esbuild": "^0.25.10",
|
|
"eslint": "^9.36.0",
|
|
"eslint-config-next": "^15.5.4",
|
|
"fake-indexeddb": "^6.2.5",
|
|
"jsdom": "^27.0.0",
|
|
"prisma": "^6.16.2",
|
|
"tailwindcss": "^4.1.13",
|
|
"tsx": "^4.20.6",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "^5.9.2",
|
|
"vite-tsconfig-paths": "^5.1.4",
|
|
"vitest": "^3.2.4"
|
|
},
|
|
"allowScripts": {
|
|
"prisma": true,
|
|
"@prisma/client": true,
|
|
"@prisma/engines": true,
|
|
"esbuild": true,
|
|
"unrs-resolver": true,
|
|
"msgpackr-extract": true
|
|
}
|
|
}
|