Technische Details

Architektur

FutiCustomerServiceCenter/├── src/
│ ├── Core/
│ │ ├── Content/ # Entitäten und Definitionen│ │ │ ├── Ticket/ # Ticket-System│ │ │ ├── Category/ # Kategorien-Management│ │ │ ├── TicketMessage/ # Nachrichten-System│ │ │ └── MailTemplate/ # E-Mail-Templates│ │ └── Api/ # REST API Endpoints│ ├── Service/ # Business Logic│ │ ├── NotificationService.php
│ │ └── FaqIntegrationService.php
│ ├── Storefront/ # Frontend Controller│ │ └── Controller/
│ └── Resources/
│ ├── views/ # Twig Templates│ ├── app/ # JavaScript/CSS│ ├── config/ # Konfiguration│ └── snippet/ # Übersetzungen


Datenbank-Schema

Tickets Tabelle

CREATE TABLE `futi_customer_service_ticket` (
`id` BINARY(16) NOT NULL,
`ticket_number` VARCHAR(255) NOT NULL,
`subject` VARCHAR(255) NOT NULL,
`description` LONGTEXT,
`status` VARCHAR(50) DEFAULT 'open',
`priority` VARCHAR(50) DEFAULT 'normal',
`customer_id` BINARY(16),
`category_id` BINARY(16),
`assigned_user_id` BINARY(16),
`order_id` BINARY(16),
`created_at` DATETIME(3) NOT NULL,
`updated_at` DATETIME(3),
PRIMARY KEY (`id`)
);


Kategorien Tabelle

CREATE TABLE `futi_customer_service_category` (
`id` BINARY(16) NOT NULL,
`name` VARCHAR(255) NOT NULL,
`description` LONGTEXT,
`color` VARCHAR(7),
`icon` VARCHAR(100),
`sort_order` INT DEFAULT 0,
`active` TINYINT(1) DEFAULT 1,
`created_at` DATETIME(3) NOT NULL,
`updated_at` DATETIME(3),
PRIMARY KEY (`id`)
);

API Endpoints

REST API

# Tickets abrufen
GET /store-api/futi/service-center/tickets

# Ticket erstellen
POST /store-api/futi/service-center/tickets
{
"subject": "Mein Problem",
"description": "Beschreibung...",
"categoryId": "category-uuid",
"priority": "normal"
}

# Ticket-Details
GET /store-api/futi/service-center/tickets/{ticketId}

# Nachricht hinzufügen
POST /store-api/futi/service-center/tickets/{ticketId}/messages
{
"message": "Meine Antwort..."
}

Events und Hooks

// Event-Listener Beispielclass TicketStatusChangedListener
{
public function onTicketStatusChanged(TicketStatusChangedEvent $event): void {
$ticket = $event->getTicket();
$oldStatus = $event->getOldStatus();
$newStatus = $event->getNewStatus();
// Custom Logic hier
}
}