# Kontaktmodul ## Übersicht Das Kontaktmodul verwaltet Firmenkontakte (Debitoren/Kreditoren) mit bis zu 2 Ansprechpartnern pro Firma. ## Entities ### Contact Hauptentity für Firmenkontakte mit folgenden Feldern: **Firmendaten:** - `companyName` (Pflicht): Firmenname - `companyNumber`: Kundennummer - `street`: Straße - `zipCode`: PLZ - `city`: Ort - `country`: Land - `phone`: Telefon - `fax`: Fax - `email`: E-Mail - `website`: Website - `taxNumber`: Steuernummer - `vatNumber`: USt-IdNr. **Klassifizierung:** - `isDebtor`: Ist Debitor (boolean) - `isCreditor`: Ist Kreditor (boolean) - `isActive`: Ist aktiv (boolean) **Sonstiges:** - `notes`: Notizen (Text) - `contactPersons`: Collection von Ansprechpartnern (OneToMany) - `createdAt`: Erstellungsdatum - `updatedAt`: Änderungsdatum ### ContactPerson Ansprechpartner-Entity mit folgenden Feldern: - `salutation`: Anrede (Herr/Frau/Divers) - `title`: Titel (z.B. Dr., Prof.) - `firstName` (Pflicht): Vorname - `lastName` (Pflicht): Nachname - `position`: Position - `department`: Abteilung - `phone`: Telefon - `mobile`: Mobil - `email`: E-Mail - `isPrimary`: Hauptansprechpartner (boolean) ## API Endpoints ### Kontakte - `GET /api/contacts` - Alle Kontakte auflisten - `GET /api/contacts/{id}` - Einzelnen Kontakt abrufen - `POST /api/contacts` - Neuen Kontakt erstellen (erfordert ROLE_USER) - `PUT /api/contacts/{id}` - Kontakt bearbeiten (erfordert ROLE_USER) - `DELETE /api/contacts/{id}` - Kontakt löschen (erfordert ROLE_ADMIN) ### Request/Response Format **Kontakt erstellen/bearbeiten:** ```json { "companyName": "Beispiel GmbH", "companyNumber": "K-12345", "street": "Musterstraße 123", "zipCode": "12345", "city": "Berlin", "country": "Deutschland", "phone": "+49 30 12345678", "fax": "+49 30 12345679", "email": "info@beispiel.de", "website": "https://www.beispiel.de", "taxNumber": "123/456/78901", "vatNumber": "DE123456789", "isDebtor": true, "isCreditor": false, "isActive": true, "notes": "Wichtiger Kunde", "contactPersons": [ { "salutation": "Herr", "title": "Dr.", "firstName": "Max", "lastName": "Mustermann", "position": "Geschäftsführer", "department": "Management", "phone": "+49 30 12345680", "mobile": "+49 170 1234567", "email": "max.mustermann@beispiel.de", "isPrimary": true } ] } ``` ## Repository-Methoden ### ContactRepository **findByType(?bool $isDebtor, ?bool $isCreditor): array** - Filtert Kontakte nach Typ (Debitor/Kreditor) - Gibt nur aktive Kontakte zurück - Sortiert nach Firmennamen **search(string $searchTerm): array** - Durchsucht Kontakte nach: - Firmenname - E-Mail - Stadt - Ansprechpartner (Vor-/Nachname, E-Mail) ## Vue.js Komponente ### ContactManagement.vue **Features:** - DataTable mit Pagination (10/25/50 Einträge) - Globale Suche über alle Felder - Filter nach Typ (Alle/Debitoren/Kreditoren) - Sortierung nach Spalten - CRUD-Operationen über Dialoge - Bis zu 2 Ansprechpartner pro Kontakt - Validierung (Pflichtfelder, E-Mail-Format, URL-Format) - Responsive Design (mobile + desktop) - Toast-Benachrichtigungen für Erfolg/Fehler - Bestätigungsdialog beim Löschen **Verwendete PrimeVue Komponenten:** - DataTable, Column - Dialog - Card - Button - InputText, Textarea - Checkbox, Dropdown - Tag - Divider - IconField, InputIcon ## Berechtigungen - **ROLE_USER**: Kann Kontakte ansehen, erstellen und bearbeiten - **ROLE_ADMIN**: Kann zusätzlich Kontakte löschen ## Navigation Das Kontaktmodul ist über den Menüpunkt "Kontakte" erreichbar (Route: `/contacts`). ## Datenbank-Tabellen ### contacts ```sql CREATE TABLE contacts ( id INT AUTO_INCREMENT PRIMARY KEY, company_name VARCHAR(255) NOT NULL, company_number VARCHAR(50), street TEXT, zip_code VARCHAR(20), city VARCHAR(100), country VARCHAR(100), phone VARCHAR(50), fax VARCHAR(50), email VARCHAR(180), website VARCHAR(255), tax_number VARCHAR(50), vat_number VARCHAR(50), is_debtor TINYINT(1) DEFAULT 0, is_creditor TINYINT(1) DEFAULT 0, is_active TINYINT(1) DEFAULT 1, notes TEXT, created_at DATETIME NOT NULL, updated_at DATETIME, INDEX idx_company_name (company_name), INDEX idx_city (city), INDEX idx_is_debtor (is_debtor), INDEX idx_is_creditor (is_creditor), INDEX idx_is_active (is_active) ); ``` ### contact_persons ```sql CREATE TABLE contact_persons ( id INT AUTO_INCREMENT PRIMARY KEY, contact_id INT NOT NULL, salutation VARCHAR(20), title VARCHAR(100), first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, position VARCHAR(100), department VARCHAR(100), phone VARCHAR(50), mobile VARCHAR(50), email VARCHAR(180), is_primary TINYINT(1) DEFAULT 0, FOREIGN KEY (contact_id) REFERENCES contacts(id) ON DELETE CASCADE, INDEX idx_contact_id (contact_id), INDEX idx_is_primary (is_primary) ); ``` ## Best Practices 1. **Ansprechpartner-Limit**: Maximal 2 Ansprechpartner pro Kontakt (UI-Limitierung) 2. **Cascade Delete**: Beim Löschen eines Kontakts werden auch alle Ansprechpartner gelöscht 3. **Timestamps**: Automatische Verwaltung von `createdAt` und `updatedAt` 4. **Validierung**: Alle Validierungen erfolgen sowohl im Backend (Symfony Validator) als auch im Frontend (Vue.js) 5. **Session-basierte API**: Alle API-Aufrufe verwenden `credentials: 'include'` für Session-Authentifizierung ## Erweiterungsmöglichkeiten - Aktivitäten-Tracking (Anrufe, E-Mails, Meetings) - Dokumente-Verwaltung - Deals/Opportunities - Import/Export (CSV, Excel) - Duplikatserkennung - Kontakt-Historie - Tags/Labels - Mehr als 2 Ansprechpartner (aktuell UI-limitiert)