myCRM/CONTACTS.md
olli b84dc6c6e9 feat: add typography and utility styles for layout
- Introduced typography styles in _typography.scss for headings, paragraphs, blockquotes, and horizontal rules.
- Added utility classes in _utils.scss for card styling and clearfix.
- Updated layout.scss to include new typography and utility styles.
- Defined common CSS variables in _common.scss for consistent theming.
- Created dark and light theme variables in _dark.scss and _light.scss respectively.
- Integrated Tailwind CSS with custom configurations in tailwind.config.js and postcss.config.js.
- Implemented database migrations for contact and contact_persons tables.
- Added data fixtures for generating sample contact data.
- Developed Contact and ContactPerson entities with appropriate validation and serialization.
- Enhanced ContactRepository with search and type filtering methods.
2025-11-09 11:02:15 +01:00

5.6 KiB

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:

{
  "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

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

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)