diff --git a/.mimocode/plans/1783597417429-calm-comet.md b/.mimocode/plans/1783597417429-calm-comet.md
new file mode 100644
index 000000000..e29047c1f
--- /dev/null
+++ b/.mimocode/plans/1783597417429-calm-comet.md
@@ -0,0 +1,178 @@
+# Plan: ContactBundle Tailwind-Migration + Passwort-Reset
+
+## Übersicht
+Das ContactBundle (Kundenbereich) wird von Bootstrap 5 auf Tailwind CSS umgestellt, analog zur SettingsBundle-Referenz. Das Passwort-Feld wird aus dem Edit-Formular entfernt (bleibt im Create-Formular) und durch eine separate "Passwort neu setzen"-Seite ersetzt.
+
+## Aktueller Stand
+- **Bereits Tailwind**: `list/index.html.twig`, `edit/delete.html.twig`
+- **Noch Bootstrap**: `edit/edit.html.twig`, `edit/create.html.twig`, `edit/anonymisieren.html.twig`, `addressdetail/*`, `addressimport/*`, `upload/deleteAll.html.twig`
+- **Base Template**: `backend_tailwind_base.html.twig` (Tailwind) statt `backend_base.html.twig` (Bootstrap)
+- **Form Theme**: `tailwind_formtheme.html.twig`
+
+---
+
+## Phase 1: Passwort-Feld entfernen + Reset-Seite erstellen
+
+### 1.1 Passwort-Feld nur aus Edit-Template entfernen
+- **Edit-Template**: `Resources/views/backend/edit/edit.html.twig` (Zeilen ~91-107) - Passwort-Block mit data-pw-wrap entfernen
+- **Create-Template**: Passwort-Feld BLEIBT erhalten (Neuanlage mit Passwort möglich)
+- **ContactType.php**: `->add('password', ...)` bleibt (wird von Create noch benötigt)
+
+### 1.2 Passwort-Logik im EditController
+- Bestehende Logik bleibt: `if ($form->get('password')->getData() !== null) { ... }` (Zeilen ~347-349)
+- Wird nur noch beim Create aufgerufen, da Edit das Feld nicht mehr hat
+
+### 1.3 Neue "Passwort neu setzen"-Seite erstellen
+
+#### Controller-Action in EditController hinzufügen
+**Datei**: `Controller/Backend/EditController.php`
+- Neue Action `resetPasswordAction(Request $request, Contact $contact, DocumentManager $dm)`
+- Route: `/backend/contact/edit/reset-password/{uuid}`
+- Name: `psc_shop_contact_backend_reset_password`
+- **GET**: Zeigt Formular mit Passwort-Eingabefeld (mit Show/Hide Toggle)
+- **POST**: Hasht das eingegebene Passwort mit `password_hash(PASSWORD_DEFAULT)` und speichert es
+- Zeigt nach erfolgreichem Speichern eine Bestätigung
+
+#### Neues Template erstellen
+**Datei**: `Resources/views/backend/edit/reset_password.html.twig`
+- Extends `backend_tailwind_base.html.twig`
+- Formular mit Passwort-Eingabefeld (mit Show/Hide Toggle)
+- Speichern-Button
+- Bestätigungsmeldung nach erfolgreichem Speichern
+- Zurück-Button zum Kunden
+- Styling analog zu `delete.html.twig` (Karte mit Kopfzeile)
+
+### 1.4 "Passwort neu setzen"-Button in Edit-Formular
+**Datei**: `Resources/views/backend/edit/edit.html.twig` (nach Tailwind-Migration)
+- Statt Passwort-Feld: Button "Passwort neu setzen" der zur Reset-Seite führt
+- Styling: `inline-flex items-center gap-1.5 px-3 py-2 rounded-sm text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm`
+
+---
+
+## Phase 2: edit.html.twig Tailwind-Migration (1746 Zeilen)
+
+### 2.1 Base-Template wechseln
+- `{% extends 'backend_base.html.twig' %}` → `{% extends 'backend_tailwind_base.html.twig' %}`
+- Form-Theme: `{% form_theme form ... %}` auf `tailwind_formtheme.html.twig` setzen
+
+### 2.2 Seitenstruktur
+```
+{% block header %}
+ Titel + Aktionsbuttons (Speichern, Löschen, Anonymisieren)
+{% endblock %}
+
+{% block body %}
+
+ Tab-Navigation (sidebar links) + Tab-Inhalte (rechts)
+
+{% endblock %}
+```
+
+### 2.3 Tab-System (aus SettingsBundle übernehmen)
+- Tab-Sidebar: `tab-group flex-none md:flex w-full`
+- Tab-Links: `tab-link flex items-center text-sm px-4 py-2 relative`
+- Tab-Inhalte: `tab-content w-full text-stone-500 text-sm hidden/block`
+
+### 2.4 Tabs die migriert werden müssen
+1. **Allgemein** - Username, Email, Enable, Level, Shops, PriceFactor
+2. **Adressdaten** - Adresstabelle (existierende Tailwind-Tabelle nutzen)
+3. **Individualisierung** - Custom fields
+4. **Kalkulationsvariablen** - Preisanpassungen
+5. **Variablenfelder** - basketfield1/2, Freefields
+6. **Zugriffsrechte** - Rollen, Berechtigungen
+7. **Erweitert** - Zusätzliche Einstellungen
+8. **Plugin-Tabs** - Dynamisch aus Plugin-System
+
+### 2.5 Bootstrap → Tailwind Klassen-Mapping
+| Bootstrap | Tailwind |
+|-----------|----------|
+| `panel panel-default > header/body` | `rounded-md border bg-white px-7.5 py-6 shadow-lg` |
+| `row > col-md-*` | `flex flex-wrap > w-full lg:w-6/12 px-4` |
+| `form-control` | `border-1 px-3 py-3 bg-white rounded text-sm shadow` |
+| `form-control-label` | `block uppercase text-xs font-bold mb-2` |
+| `btn btn-primary` | `bg-psc-500 hover:bg-psc-600 text-white rounded-sm px-4 py-1` |
+| `btn btn-danger` | `bg-red-600 hover:bg-red-700 text-white rounded-sm px-4 py-2` |
+| `btn btn-info` | `bg-blue-600 hover:bg-blue-700 text-white rounded-sm px-4 py-2` |
+| `nav nav-pills > nav-item > nav-link` | `tab-link flex items-center text-sm px-4 py-2 relative` |
+| `table table-striped` | `min-w-full text-sm` mit `hover:bg-gray-50` |
+| `badge bg-success/danger` | `text-green-600` / `text-red-600` |
+| `collapse` | Alpine.js `x-show` oder `hidden` Klasse |
+
+### 2.6 JavaScript anpassen
+- AJAX Username-Check: Muss weiter funktionieren
+- Tab-Switching: Bereits in `backend_tailwind_base.html.twig` implementiert
+- jQuery durch Vanilla JS/Alpine.js ersetzen wo nötig
+
+---
+
+## Phase 3: create.html.twig Tailwind-Migration (1617 Zeilen)
+
+- Fast identisch zu edit.html.twig
+- Keine Adresstabelle, kein Change-Log
+- Keine Plugin-Tabs
+- Preis-Tab (priceFactor) vorhanden
+- Gleiche Bootstrap → Tailwind Konvertierung
+
+---
+
+## Phase 4: Weitere Templates migrieren
+
+### 4.1 anonymisieren.html.twig (38 Zeilen)
+- Analog zu `delete.html.twig` (bereits Tailwind)
+- Bestätigungsdialog mit Ja/Nein Buttons
+
+### 4.2 addressdetail/edit.html.twig (320 Zeilen)
+- Formularfelder: type, UUID, homepage, sort, email, KundenNr, company, salutation, name, street, zip, phone, fax, mobile, ustid, steuerid, lid, zusatz1/2
+- Change-Log Tabelle
+- 2-Spalten Layout mit `flex flex-wrap`
+
+### 4.3 addressdetail/create.html.twig (296 Zeilen)
+- Wie edit aber ohne Change-Log
+
+### 4.4 addressdetail/delete.html.twig (40 Zeilen)
+- Analog zu bestehender delete.html.twig
+
+### 4.5 addressimport/step1-3.html.twig (39+86+41 Zeilen)
+- Step 1: Datei-Upload
+- Step 2: Spalten-Mapping
+- Step 3: Bestätigung
+
+### 4.6 upload/deleteAll.html.twig (74 Zeilen)
+- Tabelle mit Uploads + Bestätigung
+
+---
+
+## Betroffene Dateien (Zusammenfassung)
+
+### Zu bearbeiten:
+1. `src/PSC/Shop/ContactBundle/Controller/Backend/EditController.php` - Reset-Action hinzufügen
+2. `src/PSC/Shop/ContactBundle/Resources/views/backend/edit/edit.html.twig` - Tailwind + Passwort-Button statt Passwort-Feld
+3. `src/PSC/Shop/ContactBundle/Resources/views/backend/edit/create.html.twig` - Tailwind (Passwort-Feld bleibt)
+4. `src/PSC/Shop/ContactBundle/Resources/views/backend/edit/anonymisieren.html.twig` - Tailwind
+5. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressdetail/edit.html.twig` - Tailwind
+6. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressdetail/create.html.twig` - Tailwind
+7. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressdetail/delete.html.twig` - Tailwind
+8. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressimport/step1.html.twig` - Tailwind
+9. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressimport/step2.html.twig` - Tailwind
+10. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressimport/step3.html.twig` - Tailwind
+11. `src/PSC/Shop/ContactBundle/Resources/views/backend/upload/deleteAll.html.twig` - Tailwind
+
+### Neu erstellen:
+12. `src/PSC/Shop/ContactBundle/Resources/views/backend/edit/reset_password.html.twig` - Neue Reset-Seite
+
+### NICHT bearbeiten:
+- `src/PSC/Shop/ContactBundle/Form/Backend/General/ContactType.php` - bleibt unverändert (Passwort-Feld für Create benötigt)
+
+---
+
+## Verifikation
+
+1. **Kundenliste**: `/backend/contact/list/index` laden - funktioniert bereits
+2. **Kunde bearbeiten**: `/backend/contact/edit/edit/{uuid}` - Tailwind-Layout prüfen
+3. **Kunde anlegen**: `/backend/contact/edit/create` - Tailwind-Layout prüfen
+4. **Passwort-Reset**: "Passwort neu setzen" Button klicken → Reset-Seite → Neues Passwort anzeigen
+5. **Adresse bearbeiten**: `/backend/contact/address/detail/edit/{uuid}` - Tailwind prüfen
+6. **Adresse anlegen**: `/backend/contact/address/detail/create/{uuid}` - Tailwind prüfen
+7. **Löschen/Anonymisieren**: Bestätigungsdialoge prüfen
+8. **Tabs**: Alle Tabs durchklicken, Inhalte sichtbar/versteckt korrekt
+9. **Formulare speichern**: Alle Formulare testweise absenden
diff --git a/src/new/.mimocode/.cron-lock b/src/new/.mimocode/.cron-lock
index 0c161b20a..e4ad328c2 100644
--- a/src/new/.mimocode/.cron-lock
+++ b/src/new/.mimocode/.cron-lock
@@ -1 +1 @@
-{"pid":2966987,"startedAt":1783596410229}
\ No newline at end of file
+{"pid":187559,"startedAt":1783930446903}
\ No newline at end of file
diff --git a/src/new/config/reference.php b/src/new/config/reference.php
index 0cc464fe7..68fd85c85 100644
--- a/src/new/config/reference.php
+++ b/src/new/config/reference.php
@@ -476,7 +476,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* datetime?: array{
* default_format?: scalar|Param|null, // Default: "Y-m-d\\TH:i:sP"
* default_deserialization_formats?: list,
- * default_timezone?: scalar|Param|null, // Default: "UTC"
+ * default_timezone?: scalar|Param|null, // Default: "Europe/Berlin"
* cdata?: scalar|Param|null, // Default: true
* },
* array_collection?: array{
@@ -576,7 +576,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* datetime?: array{
* default_format?: scalar|Param|null, // Default: "Y-m-d\\TH:i:sP"
* default_deserialization_formats?: list,
- * default_timezone?: scalar|Param|null, // Default: "UTC"
+ * default_timezone?: scalar|Param|null, // Default: "Europe/Berlin"
* cdata?: scalar|Param|null, // Default: true
* },
* array_collection?: array{
diff --git a/src/new/src/PSC/Shop/ContactBundle/Controller/Backend/EditController.php b/src/new/src/PSC/Shop/ContactBundle/Controller/Backend/EditController.php
index 2640ee0bb..ced8e25ed 100755
--- a/src/new/src/PSC/Shop/ContactBundle/Controller/Backend/EditController.php
+++ b/src/new/src/PSC/Shop/ContactBundle/Controller/Backend/EditController.php
@@ -646,6 +646,41 @@ class EditController extends AbstractController
);
}
+ #[Route(path: '/edit/reset-password/{uuid}', name: 'psc_shop_contact_backend_reset_password')]
+ #[Template('@PSCShopContact/backend/edit/reset_password.html.twig')]
+ #[IsGranted('ROLE_SHOP')]
+ public function resetPasswordAction(
+ Request $request,
+ EntityManagerInterface $entityManager,
+ $uuid = ""
+ ) {
+ /** @var Contact $contact */
+ $contact = $entityManager
+ ->getRepository('PSC\Shop\EntityBundle\Entity\Contact')
+ ->findOneBy(array('uuid' => $uuid));
+
+ if (!$contact) {
+ throw $this->createNotFoundException('Kunde nicht gefunden.');
+ }
+
+ $saved = false;
+
+ if ($request->isMethod('POST')) {
+ $newPassword = $request->request->get('password', '');
+ if (strlen($newPassword) >= 4) {
+ $contact->setPassword(password_hash($newPassword, PASSWORD_DEFAULT));
+ $entityManager->persist($contact);
+ $entityManager->flush();
+ $saved = true;
+ }
+ }
+
+ return array(
+ 'contact' => $contact,
+ 'saved' => $saved,
+ );
+ }
+
/**
* @param array... $arrayCollections
* @return ArrayCollection
diff --git a/src/new/src/PSC/Shop/ContactBundle/Resources/translations/core_contact_detail_create_and_edit.de.yaml b/src/new/src/PSC/Shop/ContactBundle/Resources/translations/core_contact_detail_create_and_edit.de.yaml
index a63a49a2b..2a625a92c 100755
--- a/src/new/src/PSC/Shop/ContactBundle/Resources/translations/core_contact_detail_create_and_edit.de.yaml
+++ b/src/new/src/PSC/Shop/ContactBundle/Resources/translations/core_contact_detail_create_and_edit.de.yaml
@@ -1,10 +1,11 @@
general: Allgemein
art: Art
add: anlegen
+back: Zurück
steuerid: Steuer Nr
lid: Leitweg Id
detail: bearbeiten
-customeraddress: Kunde
+customeraddress: Kundenadresse
Company: Firma
Company2: Firma Zusatz
salutations: Anrede
diff --git a/src/new/src/PSC/Shop/ContactBundle/Resources/translations/core_contact_detail_create_and_edit.en.yaml b/src/new/src/PSC/Shop/ContactBundle/Resources/translations/core_contact_detail_create_and_edit.en.yaml
index 596ea1e84..6f1416b49 100755
--- a/src/new/src/PSC/Shop/ContactBundle/Resources/translations/core_contact_detail_create_and_edit.en.yaml
+++ b/src/new/src/PSC/Shop/ContactBundle/Resources/translations/core_contact_detail_create_and_edit.en.yaml
@@ -2,6 +2,7 @@ general: General
art: Art
detail: edit
add: Add
+back: Back
customeraddress: Customer address
Company: Company
Companyaddition: Company Addition
diff --git a/src/new/src/PSC/Shop/ContactBundle/Resources/views/backend/addressdetail/create.html.twig b/src/new/src/PSC/Shop/ContactBundle/Resources/views/backend/addressdetail/create.html.twig
index 8d092292d..66d4821fe 100644
--- a/src/new/src/PSC/Shop/ContactBundle/Resources/views/backend/addressdetail/create.html.twig
+++ b/src/new/src/PSC/Shop/ContactBundle/Resources/views/backend/addressdetail/create.html.twig
@@ -1,296 +1,83 @@
-{% extends 'backend_base.html.twig' %}
+{% extends 'backend_tailwind_base.html.twig' %}
+{% form_theme form 'tailwind_formtheme.html.twig' %}
{% trans_default_domain 'core_contact_detail_create_and_edit' %}
-{% block body %}
-