diff --git a/backend/src/routes/contract.routes.ts b/backend/src/routes/contract.routes.ts
index 1725e374..32cc29f3 100644
--- a/backend/src/routes/contract.routes.ts
+++ b/backend/src/routes/contract.routes.ts
@@ -31,7 +31,7 @@ const docUpload = multer({
if (allowed.includes(file.mimetype)) cb(null, true);
else cb(new Error('Nur PDF, JPG, PNG, GIF oder WebP-Dateien sind erlaubt'));
},
- limits: { fileSize: 10 * 1024 * 1024 },
+ limits: { fileSize: 25 * 1024 * 1024 },
});
router.get('/', authenticate, requirePermission('contracts:read'), contractController.getContracts);
diff --git a/backend/src/routes/gdpr.routes.ts b/backend/src/routes/gdpr.routes.ts
index 804594a2..0f7f8b99 100644
--- a/backend/src/routes/gdpr.routes.ts
+++ b/backend/src/routes/gdpr.routes.ts
@@ -28,7 +28,7 @@ const authUpload = multer({
cb(new Error('Nur PDF-Dateien sind erlaubt'));
}
},
- limits: { fileSize: 10 * 1024 * 1024 },
+ limits: { fileSize: 25 * 1024 * 1024 },
});
// Alle Routen erfordern Authentifizierung
diff --git a/backend/src/routes/upload.routes.ts b/backend/src/routes/upload.routes.ts
index bbf76fd2..07986a4d 100644
--- a/backend/src/routes/upload.routes.ts
+++ b/backend/src/routes/upload.routes.ts
@@ -83,7 +83,10 @@ const upload = multer({
storage,
fileFilter,
limits: {
- fileSize: 10 * 1024 * 1024, // 10MB max
+ // 25 MB – passt für Ausweis-Scans, Handy-Photos im JpgToPdf-Flow,
+ // mehrseitige PDFs aus dem Modal (bis ~5-7 Seiten je nach Auflösung).
+ // Vorher 10 MB → Multer brach bei zwei Smartphone-Fotos ab.
+ fileSize: 25 * 1024 * 1024,
},
});
diff --git a/docs/todo.md b/docs/todo.md
index 37fed902..df169222 100644
--- a/docs/todo.md
+++ b/docs/todo.md
@@ -97,6 +97,21 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
+- [x] **🐞 AddressModal: Straße-Feld ließ sich nicht editieren**
+ - `setFormData` wurde unbedingt im Render-Body aufgerufen, wenn
+ `formData.street !== address.street`. Jeder Tastendruck löste neu
+ aus → Reset auf DB-Wert → Cursor sprang zurück → keine Eingabe
+ möglich.
+ - Fix: in `useEffect` mit `[address?.id]`-Dependency umgezogen.
+ Re-Init nur beim Wechsel/Open, nicht bei jedem Render.
+
+- [x] **🐞 Upload-Limit: Multer 10 MB → 25 MB (Ausweis-Scans, JPGs→PDF)**
+ - Zwei Smartphone-Fotos zu PDF kombiniert kratzten am 10-MB-Limit
+ (auch mit Original-Bytes-Optimierung aus 431792e). Limits in
+ `upload.routes.ts`, `gdpr.routes.ts`, `contract.routes.ts` auf
+ 25 MB hochgezogen. `pdfTemplate.routes.ts` war eh schon bei 20 MB.
+ - Frontend: `FileUpload`-Hinweis „max. 10 MB" → „max. 25 MB".
+
- [x] **🆕 SIM-Karten: Checkbox „eSIM" zwischen „Hauptkarte" und „Multisim"**
- Hardware-Plastikkarte vs. eSIM-Profil ist eine eigene Eigenschaft –
eSIM kann sowohl Hauptkarte als auch Multisim sein, also zusätzlich
diff --git a/frontend/src/components/ui/FileUpload.tsx b/frontend/src/components/ui/FileUpload.tsx
index ddcfa103..a30745c0 100644
--- a/frontend/src/components/ui/FileUpload.tsx
+++ b/frontend/src/components/ui/FileUpload.tsx
@@ -119,7 +119,7 @@ export default function FileUpload({
<>
{label}
-PDF, JPG oder PNG (max. 10MB)
+PDF, JPG oder PNG (max. 25 MB)
> )} diff --git a/frontend/src/pages/customers/CustomerDetail.tsx b/frontend/src/pages/customers/CustomerDetail.tsx index 83d5289a..7d77e75f 100644 --- a/frontend/src/pages/customers/CustomerDetail.tsx +++ b/frontend/src/pages/customers/CustomerDetail.tsx @@ -2451,10 +2451,13 @@ function AddressModal({ const isPending = createMutation.isPending || updateMutation.isPending; - // Update form when address prop changes - if (isEditing && formData.street !== address.street) { + // Beim Öffnen / Wechsel zwischen Adressen aus den Props re-initialisieren. + // Vorher als unbedingte if-setState im Render-Body → Reset bei jedem + // Tastendruck, Straße ließ sich nicht eintippen. + useEffect(() => { setFormData(getInitialFormData()); - } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [address?.id]); return (