Merge branch 'main' of ssh://gitea.meghsakha.com:22222/Benjamin_Boenisch/breakpilot-core
# Conflicts: # .gitignore
This commit is contained in:
@@ -25,6 +25,7 @@ voice-service/bqas/** | owner=pipeline | reason=RAG Quality Assessment, produkti
|
||||
# Seed/Helper Scripts (keine Service-Logik)
|
||||
scripts/seed-demo-and-screenshot.py | owner=infra | reason=Einmaliges Seed-Script, kein Service-Code | review=permanent
|
||||
pitch-deck/scripts/import-finanzplan.py | owner=pitch-deck | reason=583 LOC, einmaliges Excel-Import-Script (9 Sheet-Importer), hardcodierte Row/Col-Mappings fuer eine Finanzplan-.xlsm-Datei, keine wiederverwendbare Logik | review=2027-01
|
||||
pitch-deck/scripts/export-finanzplan-excel.ts | owner=pitch-deck | reason=1254 LOC, Excel-Export-Script — analog zu import-finanzplan.py: 9 Sheets, ~80% Cell-Formatting/Styling-Boilerplate, keine wiederverwendbare Logik | review=2027-01
|
||||
|
||||
# PDF Templates (reine statische HTML/CSS Strings, keine Logik)
|
||||
backend-core/services/pdf_templates.py | owner=all | reason=519 LOC, rein statische Jinja2-HTML-Templates + CSS, keine Logik | review=2026-07
|
||||
|
||||
@@ -63,3 +63,6 @@ consent-service/server
|
||||
coverage/
|
||||
*.coverage
|
||||
controls_backup_*.dump
|
||||
|
||||
# Allow Finanzplan exports (generated by pitch-deck/scripts/export-finanzplan.sh)
|
||||
!pitch-deck/exports/*.xlsx
|
||||
|
||||
Generated
+2948
File diff suppressed because it is too large
Load Diff
@@ -10,7 +10,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"lucide-react": "^0.468.0",
|
||||
"next": "^15.1.0",
|
||||
"next": "^15.5.16",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"reactflow": "^11.11.4",
|
||||
|
||||
Generated
+40
-40
@@ -10,7 +10,7 @@
|
||||
"dependencies": {
|
||||
"framer-motion": "^11.15.0",
|
||||
"lucide-react": "^0.468.0",
|
||||
"next": "^15.1.0",
|
||||
"next": "^15.5.16",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1"
|
||||
},
|
||||
@@ -552,15 +552,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/env": {
|
||||
"version": "15.5.12",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.12.tgz",
|
||||
"integrity": "sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.16.tgz",
|
||||
"integrity": "sha512-9QMKolCl+JnJtaRAQSXy4RQrhgfe8W7/G1+Hl3QSB/HZY7zQMzTwPDdTRwwio8BS96ps1MHpHhbS8qxoNV3JIQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@next/swc-darwin-arm64": {
|
||||
"version": "15.5.12",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.12.tgz",
|
||||
"integrity": "sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.16.tgz",
|
||||
"integrity": "sha512-wzdER4JZj+31vNkhaZ1Ght3IsNI8DMwj7VqadfIOqJB5sh8FiOqNSopYADQn6mgEPomzDd/DHqBcfo2fmVMYtg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -574,9 +574,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-darwin-x64": {
|
||||
"version": "15.5.12",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.12.tgz",
|
||||
"integrity": "sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.16.tgz",
|
||||
"integrity": "sha512-PPTo+cvcanxkuDEuDyZGk28ntmu0WjfkxqlG7hw9Mhsiribs4x1C6h2Culn0cJKqsne1gFjjZRK3ax7WYlSxgg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -590,9 +590,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-arm64-gnu": {
|
||||
"version": "15.5.12",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.12.tgz",
|
||||
"integrity": "sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.16.tgz",
|
||||
"integrity": "sha512-Jl0IL9P7S8uNl5oI1TqrQmfmLp7OqjWM58000pVnUVIsHrvPP6m9QDW/uNWYUbmd+8IYvc6MTeZKICstBMBpew==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -606,9 +606,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-arm64-musl": {
|
||||
"version": "15.5.12",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.12.tgz",
|
||||
"integrity": "sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.16.tgz",
|
||||
"integrity": "sha512-Zf0BIqv/o5uOWfyRkzgGhyV2Tky7HLt0bG+w7XWdaU1JpyX0tltM3TrSfa/Y9c597SJG4CzN47+u2InhgZZ4vg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -622,9 +622,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-x64-gnu": {
|
||||
"version": "15.5.12",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.12.tgz",
|
||||
"integrity": "sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.16.tgz",
|
||||
"integrity": "sha512-HCDDU1TRLeUDV180QQTWrs5Oa4lIcI7XH9nF0UVUVmYLN/boZ6LqyFtm3814gc1fv+lOVyKaw5B6bVC9BpXTSQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -638,9 +638,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-x64-musl": {
|
||||
"version": "15.5.12",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.12.tgz",
|
||||
"integrity": "sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.16.tgz",
|
||||
"integrity": "sha512-kvXUY1dn5wxKuMkXxQRUbPjEnKxW1PR9uKOm0zpIpj3574+cFfaePhYFmBVtrOuwt+w34OdDzNaJr5Iixf+HBQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -654,9 +654,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-win32-arm64-msvc": {
|
||||
"version": "15.5.12",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.12.tgz",
|
||||
"integrity": "sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.16.tgz",
|
||||
"integrity": "sha512-zpOQuF+eyENMXRjglp2hZCIrUjTdO37suEBnDn1mX4PXSuetXZDMLpjKOh4dYSw3SiDTnOoOUwBl5i5Elr6nnQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -670,9 +670,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-win32-x64-msvc": {
|
||||
"version": "15.5.12",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.12.tgz",
|
||||
"integrity": "sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.16.tgz",
|
||||
"integrity": "sha512-LnwKYpiSmIzXlTq76hMeeIzZoDcFwu848p6H+QBkGFJIbZphgzNUPdHruJcHM/bFnaFeco0l1Frie5I27VKglA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1272,12 +1272,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/next": {
|
||||
"version": "15.5.12",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-15.5.12.tgz",
|
||||
"integrity": "sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-15.5.16.tgz",
|
||||
"integrity": "sha512-aZExBk/V6JCu3NCFc90twdj9L/M3y0+ukeQwUAZbOiqRhAX+h2oMEa0NZFhcpj6HYRYjVS3V2/3xvyOpNnmw7A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@next/env": "15.5.12",
|
||||
"@next/env": "15.5.16",
|
||||
"@swc/helpers": "0.5.15",
|
||||
"caniuse-lite": "^1.0.30001579",
|
||||
"postcss": "8.4.31",
|
||||
@@ -1290,14 +1290,14 @@
|
||||
"node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@next/swc-darwin-arm64": "15.5.12",
|
||||
"@next/swc-darwin-x64": "15.5.12",
|
||||
"@next/swc-linux-arm64-gnu": "15.5.12",
|
||||
"@next/swc-linux-arm64-musl": "15.5.12",
|
||||
"@next/swc-linux-x64-gnu": "15.5.12",
|
||||
"@next/swc-linux-x64-musl": "15.5.12",
|
||||
"@next/swc-win32-arm64-msvc": "15.5.12",
|
||||
"@next/swc-win32-x64-msvc": "15.5.12",
|
||||
"@next/swc-darwin-arm64": "15.5.16",
|
||||
"@next/swc-darwin-x64": "15.5.16",
|
||||
"@next/swc-linux-arm64-gnu": "15.5.16",
|
||||
"@next/swc-linux-arm64-musl": "15.5.16",
|
||||
"@next/swc-linux-x64-gnu": "15.5.16",
|
||||
"@next/swc-linux-x64-musl": "15.5.16",
|
||||
"@next/swc-win32-arm64-msvc": "15.5.16",
|
||||
"@next/swc-win32-x64-msvc": "15.5.16",
|
||||
"sharp": "^0.34.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"dependencies": {
|
||||
"framer-motion": "^11.15.0",
|
||||
"lucide-react": "^0.468.0",
|
||||
"next": "^15.1.0",
|
||||
"next": "^15.5.16",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1"
|
||||
},
|
||||
|
||||
Generated
+40
-40
@@ -10,7 +10,7 @@
|
||||
"dependencies": {
|
||||
"framer-motion": "^11.15.0",
|
||||
"lucide-react": "^0.468.0",
|
||||
"next": "^15.1.0",
|
||||
"next": "^15.5.16",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1"
|
||||
},
|
||||
@@ -692,9 +692,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/env": {
|
||||
"version": "15.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.18.tgz",
|
||||
"integrity": "sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.16.tgz",
|
||||
"integrity": "sha512-9QMKolCl+JnJtaRAQSXy4RQrhgfe8W7/G1+Hl3QSB/HZY7zQMzTwPDdTRwwio8BS96ps1MHpHhbS8qxoNV3JIQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@next/eslint-plugin-next": {
|
||||
@@ -708,9 +708,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-darwin-arm64": {
|
||||
"version": "15.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.18.tgz",
|
||||
"integrity": "sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.16.tgz",
|
||||
"integrity": "sha512-wzdER4JZj+31vNkhaZ1Ght3IsNI8DMwj7VqadfIOqJB5sh8FiOqNSopYADQn6mgEPomzDd/DHqBcfo2fmVMYtg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -724,9 +724,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-darwin-x64": {
|
||||
"version": "15.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.18.tgz",
|
||||
"integrity": "sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.16.tgz",
|
||||
"integrity": "sha512-PPTo+cvcanxkuDEuDyZGk28ntmu0WjfkxqlG7hw9Mhsiribs4x1C6h2Culn0cJKqsne1gFjjZRK3ax7WYlSxgg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -740,9 +740,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-arm64-gnu": {
|
||||
"version": "15.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.18.tgz",
|
||||
"integrity": "sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.16.tgz",
|
||||
"integrity": "sha512-Jl0IL9P7S8uNl5oI1TqrQmfmLp7OqjWM58000pVnUVIsHrvPP6m9QDW/uNWYUbmd+8IYvc6MTeZKICstBMBpew==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -756,9 +756,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-arm64-musl": {
|
||||
"version": "15.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.18.tgz",
|
||||
"integrity": "sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.16.tgz",
|
||||
"integrity": "sha512-Zf0BIqv/o5uOWfyRkzgGhyV2Tky7HLt0bG+w7XWdaU1JpyX0tltM3TrSfa/Y9c597SJG4CzN47+u2InhgZZ4vg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -772,9 +772,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-x64-gnu": {
|
||||
"version": "15.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.18.tgz",
|
||||
"integrity": "sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.16.tgz",
|
||||
"integrity": "sha512-HCDDU1TRLeUDV180QQTWrs5Oa4lIcI7XH9nF0UVUVmYLN/boZ6LqyFtm3814gc1fv+lOVyKaw5B6bVC9BpXTSQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -788,9 +788,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-x64-musl": {
|
||||
"version": "15.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.18.tgz",
|
||||
"integrity": "sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.16.tgz",
|
||||
"integrity": "sha512-kvXUY1dn5wxKuMkXxQRUbPjEnKxW1PR9uKOm0zpIpj3574+cFfaePhYFmBVtrOuwt+w34OdDzNaJr5Iixf+HBQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -804,9 +804,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-win32-arm64-msvc": {
|
||||
"version": "15.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.18.tgz",
|
||||
"integrity": "sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.16.tgz",
|
||||
"integrity": "sha512-zpOQuF+eyENMXRjglp2hZCIrUjTdO37suEBnDn1mX4PXSuetXZDMLpjKOh4dYSw3SiDTnOoOUwBl5i5Elr6nnQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -820,9 +820,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-win32-x64-msvc": {
|
||||
"version": "15.5.18",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.18.tgz",
|
||||
"integrity": "sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.16.tgz",
|
||||
"integrity": "sha512-LnwKYpiSmIzXlTq76hMeeIzZoDcFwu848p6H+QBkGFJIbZphgzNUPdHruJcHM/bFnaFeco0l1Frie5I27VKglA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -4369,12 +4369,12 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/next": {
|
||||
"version": "15.5.18",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-15.5.18.tgz",
|
||||
"integrity": "sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==",
|
||||
"version": "15.5.16",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-15.5.16.tgz",
|
||||
"integrity": "sha512-aZExBk/V6JCu3NCFc90twdj9L/M3y0+ukeQwUAZbOiqRhAX+h2oMEa0NZFhcpj6HYRYjVS3V2/3xvyOpNnmw7A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@next/env": "15.5.18",
|
||||
"@next/env": "15.5.16",
|
||||
"@swc/helpers": "0.5.15",
|
||||
"caniuse-lite": "^1.0.30001579",
|
||||
"postcss": "8.4.31",
|
||||
@@ -4387,14 +4387,14 @@
|
||||
"node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@next/swc-darwin-arm64": "15.5.18",
|
||||
"@next/swc-darwin-x64": "15.5.18",
|
||||
"@next/swc-linux-arm64-gnu": "15.5.18",
|
||||
"@next/swc-linux-arm64-musl": "15.5.18",
|
||||
"@next/swc-linux-x64-gnu": "15.5.18",
|
||||
"@next/swc-linux-x64-musl": "15.5.18",
|
||||
"@next/swc-win32-arm64-msvc": "15.5.18",
|
||||
"@next/swc-win32-x64-msvc": "15.5.18",
|
||||
"@next/swc-darwin-arm64": "15.5.16",
|
||||
"@next/swc-darwin-x64": "15.5.16",
|
||||
"@next/swc-linux-arm64-gnu": "15.5.16",
|
||||
"@next/swc-linux-arm64-musl": "15.5.16",
|
||||
"@next/swc-linux-x64-gnu": "15.5.16",
|
||||
"@next/swc-linux-x64-musl": "15.5.16",
|
||||
"@next/swc-win32-arm64-msvc": "15.5.16",
|
||||
"@next/swc-win32-x64-msvc": "15.5.16",
|
||||
"sharp": "^0.34.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"dependencies": {
|
||||
"framer-motion": "^11.15.0",
|
||||
"lucide-react": "^0.468.0",
|
||||
"next": "^15.1.0",
|
||||
"next": "^15.5.16",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1"
|
||||
},
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Generated
+1117
-40
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,7 @@
|
||||
"framer-motion": "^11.15.0",
|
||||
"jose": "^6.2.2",
|
||||
"lucide-react": "^0.468.0",
|
||||
"next": "^15.1.0",
|
||||
"next": "^15.5.16",
|
||||
"nodemailer": "^8.0.4",
|
||||
"pg": "^8.13.1",
|
||||
"react": "^18.3.1",
|
||||
@@ -32,6 +32,7 @@
|
||||
"@types/react-dom": "^18.3.5",
|
||||
"@vitest/expect": "^4.1.2",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"exceljs": "^4.4.0",
|
||||
"postcss": "^8.4.49",
|
||||
"tailwindcss": "^3.4.16",
|
||||
"tsx": "^4.21.0",
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
"""
|
||||
Post-process Finanzplan Excel exports: attach charts to the Dashboard sheet
|
||||
and move Dashboard to be the first tab.
|
||||
|
||||
Run after export-finanzplan-excel.ts:
|
||||
python3 scripts/add-charts.py
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
from openpyxl import load_workbook
|
||||
from openpyxl.chart import BarChart, LineChart, Reference
|
||||
from openpyxl.chart.label import DataLabelList
|
||||
from openpyxl.utils import get_column_letter
|
||||
|
||||
EXPORTS_DIR = Path(__file__).resolve().parent.parent / "exports"
|
||||
|
||||
|
||||
def column_count_until_empty(ws, start_col: int, header_row: int) -> int:
|
||||
"""Count consecutive non-empty cells starting at (header_row, start_col)."""
|
||||
c = start_col
|
||||
while ws.cell(row=header_row, column=c).value not in (None, ""):
|
||||
c += 1
|
||||
return c - start_col
|
||||
|
||||
|
||||
def add_charts_to_workbook(path: Path) -> None:
|
||||
wb = load_workbook(path)
|
||||
if "Dashboard" not in wb.sheetnames:
|
||||
print(f" skip {path.name}: no Dashboard tab")
|
||||
return
|
||||
ws = wb["Dashboard"]
|
||||
|
||||
# --- Chart 1: YoY Revenue / Material / Personnel / EBIT ---
|
||||
# Source: rows 3..9 (3=year headers, rows 4=Umsatz, 5=Material, 6=Personal, 9=EBIT)
|
||||
# categories: B3:F3 (years), data: rows 4,5,6,9
|
||||
cat_ref = Reference(ws, min_col=2, max_col=6, min_row=3, max_row=3)
|
||||
chart1 = BarChart()
|
||||
chart1.type = "col"
|
||||
chart1.style = 11
|
||||
chart1.title = "Umsatz / Material / Personal / EBIT — YoY"
|
||||
chart1.y_axis.title = "EUR"
|
||||
chart1.x_axis.title = "Jahr"
|
||||
for r in (4, 5, 6, 9):
|
||||
data_ref = Reference(ws, min_col=1, max_col=6, min_row=r, max_row=r)
|
||||
chart1.add_data(data_ref, titles_from_data=True, from_rows=True)
|
||||
chart1.set_categories(cat_ref)
|
||||
chart1.height = 9
|
||||
chart1.width = 18
|
||||
ws.add_chart(chart1, "H3")
|
||||
|
||||
# --- Chart 2: Jahresueberschuss YoY (row 11) ---
|
||||
chart2 = BarChart()
|
||||
chart2.type = "col"
|
||||
chart2.style = 13
|
||||
chart2.title = "Jahresüberschuss — YoY"
|
||||
chart2.y_axis.title = "EUR"
|
||||
chart2.x_axis.title = "Jahr"
|
||||
data_ref = Reference(ws, min_col=1, max_col=6, min_row=11, max_row=11)
|
||||
chart2.add_data(data_ref, titles_from_data=True, from_rows=True)
|
||||
chart2.set_categories(cat_ref)
|
||||
chart2.height = 9
|
||||
chart2.width = 18
|
||||
chart2.dataLabels = DataLabelList(showVal=True)
|
||||
ws.add_chart(chart2, "H22")
|
||||
|
||||
# --- Chart 3: Liquidity monthly (row 16, months from col B) ---
|
||||
# Determine the last month column by scanning row 15 (month labels)
|
||||
n_months = column_count_until_empty(ws, 2, 15)
|
||||
last_col = 1 + n_months # col 2..(1+n_months)
|
||||
|
||||
chart3 = LineChart()
|
||||
chart3.title = "Liquidität (monatlich)"
|
||||
chart3.y_axis.title = "EUR"
|
||||
chart3.x_axis.title = "Monat"
|
||||
chart3.style = 12
|
||||
cat_months = Reference(ws, min_col=2, max_col=last_col, min_row=15, max_row=15)
|
||||
data_liq = Reference(ws, min_col=1, max_col=last_col, min_row=16, max_row=16)
|
||||
chart3.add_data(data_liq, titles_from_data=True, from_rows=True)
|
||||
chart3.set_categories(cat_months)
|
||||
chart3.height = 9
|
||||
chart3.width = 24
|
||||
ws.add_chart(chart3, "H41")
|
||||
|
||||
# --- Chart 4: Headcount (row 20) ---
|
||||
chart4 = LineChart()
|
||||
chart4.title = "Headcount (monatlich)"
|
||||
chart4.y_axis.title = "Personen"
|
||||
chart4.x_axis.title = "Monat"
|
||||
chart4.style = 10
|
||||
data_hc = Reference(ws, min_col=1, max_col=last_col, min_row=20, max_row=20)
|
||||
chart4.add_data(data_hc, titles_from_data=True, from_rows=True)
|
||||
chart4.set_categories(cat_months)
|
||||
chart4.height = 9
|
||||
chart4.width = 24
|
||||
ws.add_chart(chart4, "H60")
|
||||
|
||||
# --- Chart 5: Personalkosten total monthly (row 24) ---
|
||||
chart5 = LineChart()
|
||||
chart5.title = "Personalkosten total (monatlich)"
|
||||
chart5.y_axis.title = "EUR"
|
||||
chart5.x_axis.title = "Monat"
|
||||
chart5.style = 13
|
||||
data_pers = Reference(ws, min_col=1, max_col=last_col, min_row=24, max_row=24)
|
||||
chart5.add_data(data_pers, titles_from_data=True, from_rows=True)
|
||||
chart5.set_categories(cat_months)
|
||||
chart5.height = 9
|
||||
chart5.width = 24
|
||||
ws.add_chart(chart5, "H79")
|
||||
|
||||
# --- Move Dashboard to be the first sheet ---
|
||||
idx = wb.sheetnames.index("Dashboard")
|
||||
if idx != 0:
|
||||
# openpyxl uses _sheets internal list; reorder by index.
|
||||
wb._sheets.insert(0, wb._sheets.pop(idx))
|
||||
# Also put the Formelübersicht (docs) tab at the end if present
|
||||
for docs_name in ("Formelübersicht", "Formulas"):
|
||||
if docs_name in wb.sheetnames:
|
||||
fidx = wb.sheetnames.index(docs_name)
|
||||
wb._sheets.append(wb._sheets.pop(fidx))
|
||||
break
|
||||
# Make Dashboard the active sheet on open
|
||||
wb.active = 0
|
||||
|
||||
wb.save(path)
|
||||
print(f" charts added to {path.name}")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
if not EXPORTS_DIR.exists():
|
||||
print(f"no exports dir at {EXPORTS_DIR}")
|
||||
sys.exit(1)
|
||||
files = sorted(EXPORTS_DIR.glob("Finanzplan-*.xlsx"))
|
||||
if not files:
|
||||
print("no Finanzplan-*.xlsx files found in exports/")
|
||||
sys.exit(1)
|
||||
for f in files:
|
||||
print(f"Processing {f.name}")
|
||||
add_charts_to_workbook(f)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
File diff suppressed because it is too large
Load Diff
Executable
+16
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
# Generate Finanzplan Excel exports with formulas + charts.
|
||||
# Step 1: TS script writes data + formulas via exceljs
|
||||
# Step 2: Python script adds charts via openpyxl
|
||||
#
|
||||
# Requires PG_CONN env var pointing at the breakpilot_db postgres instance.
|
||||
set -e
|
||||
cd "$(dirname "$0")/.."
|
||||
if [[ -z "${PG_CONN:-}" ]]; then
|
||||
echo "PG_CONN env var is required (postgresql://user:pass@host:port/breakpilot_db)" >&2
|
||||
exit 1
|
||||
fi
|
||||
npx tsx scripts/export-finanzplan-excel.ts
|
||||
python3 scripts/add-charts.py
|
||||
echo
|
||||
echo "Done. Files in $(pwd)/exports/"
|
||||
Reference in New Issue
Block a user