Der Order Printer bietet umfangreiche Konfigurationsmöglichkeiten, um das System an Ihre spezifischen Anforderungen anzupassen.
Die Hauptkonfiguration erfolgt über die .env.local-Datei. Hier sind die wichtigsten Einstellungen:
# Shopware API-Zugang
SHOPWARE_HOST=https://ihre-shopware-domain.de
SHOPWARE_CLIENT_ID=ihre_client_id
SHOPWARE_CLIENT_SECRET=ihre_client_secret
# API-Timeout (in Sekunden)
SHOPWARE_API_TIMEOUT=30
# API-Rate-Limiting
SHOPWARE_API_RATE_LIMIT=100
SHOPWARE_API_RATE_LIMIT_INTERVAL=60
# Druckername (muss mit CUPS übereinstimmen)
PRINTER_NAME=TM-T20
# Druckerauflösung (DPI)
PRINTER_DPI=203
# Zeichen pro Zeile
PRINTER_CHARACTERS_PER_LINE=42
# Druckgeschwindigkeit (1-5, 1 = langsam, 5 = schnell)
PRINTER_SPEED=3
# Druckerdichte (1-15)
PRINTER_DENSITY=10
# Polling-Intervall (in Sekunden)
POLLING_INTERVAL=10
# Maximale Anzahl gleichzeitiger Druckaufträge
MAX_CONCURRENT_PRINTS=5
# Warteschlangen-Timeout (in Sekunden)
QUEUE_TIMEOUT=300
# Datenverzeichnis für Bon-Archiv
DATA_DIR="/data/receipts/"
# Log-Level (debug, info, notice, warning, error, critical, alert, emergency)
LOG_LEVEL=info
Der Order Printer generiert Bons mit folgendem Standardlayout:
┌────────────────────────────────────────┐
│ IHR SHOP-NAME │
│ Musterstraße 123 • 12345 Musterstadt │
│ Tel: 01234/567890 │
├────────────────────────────────────────┤
│ BON #1001 │
│ 11.01.2024 14:30 │
├────────────────────────────────────────┤
│ Kunde: Max Mustermann │
│ Tel: 0176/12345678 │
├────────────────────────────────────────┤
│ 1x Pizza Margherita 8,99 € │
│ 2x Spaghetti Bolognese 15,98 € │
│ 1x Salat Caesar 5,99 € │
├────────────────────────────────────────┤
│ Zwischensumme: 30,96 € │
│ Lieferkosten: 2,50 € │
│ Gesamt: 33,46 € │
├────────────────────────────────────────┤
│ Zahlungsart: Barzahlung │
│ Lieferart: Abholung │
├────────────────────────────────────────┤
│ Vielen Dank für Ihren │
│ Einkauf! │
└────────────────────────────────────────┘
Sie können das Bon-Layout durch Anpassung der ReceiptFormatter-Klasse ändern:
// In src/Infra/Printer/Epson/ReceiptFormatter.php
public function formatHeader(): self
{
$this->content .= self::ALIGN_CENTER;
$this->content .= self::DOUBLE_WIDTH_ON;
$this->content .= "IHR SHOP-NAME\n";
$this->content .= self::DOUBLE_WIDTH_OFF;
$this->content .= self::ALIGN_CENTER;
$this->content .= "Musterstraße 123 • 12345 Musterstadt\n";
$this->content .= "Tel: 01234/567890\n";
$this->content .= self::FEED;
return $this;
}
Um ein Logo zum Bon hinzuzufügen, müssen Sie das Logo als ESC/POS-Bitmap konvertieren:
# Logo konvertieren (erfordert ImageMagick)
convert logo.png -resize 384x128 -colorspace Gray -dither None logo.bmp
# Logo in ESC/POS-Format konvertieren
php bin/console order-printer:convert-logo logo.bmp logo.escpos
Dann können Sie das Logo in der ReceiptFormatter-Klasse einbinden:
public function addLogo(): self
{
$logoPath = __DIR__ . '/../../../public/logo.escpos';
if (file_exists($logoPath)) {
$this->content .= file_get_contents($logoPath);
$this->content .= self::FEED;
}
return $this;
}
Für mehrere Drucker können Sie verschiedene CUPS-Warteschlangen einrichten:
# Küchendrucker einrichten
lpadmin -p KitchenPrinter -E -v usb://Epson/TM-U220 -m drv:///sample.drv/generic.ppd
# Kassendrucker einrichten
lpadmin -p CashierPrinter -E -v usb://Epson/TM-T88 -m drv:///sample.drv/generic.ppd
Dann können Sie den Drucker dynamisch basierend auf der Bestellart auswählen:
// In Ihrer Drucklogik
$printerName = $order->isTakeaway() ? 'KitchenPrinter' : 'CashierPrinter';
Sie können die abzurufenden Bestellungen filtern, indem Sie die OrderRepository-Klasse anpassen:
// In src/Infra/Shopware/OrderRepository.php
public function findNewNumbers(): array
{
// Nur Bestellungen mit bestimmten Zahlungsarten
$paymentMethods = ['cash', 'card'];
// Nur Bestellungen über einem bestimmten Wert
$minOrderValue = 5.00;
// Nur Bestellungen für bestimmte Lieferarten
$deliveryTypes = ['delivery', 'takeaway'];
return $this->shopwareClient->getOrders(
$paymentMethods,
$minOrderValue,
$deliveryTypes
);
}
Sie können Benachrichtigungen für bestimmte Ereignisse einrichten:
# In config/packages/messenger.yaml
framework:
messenger:
routing:
'Veliu\OrderPrinter\Domain\Event\OrderPrintedEvent': async
'Veliu\OrderPrinter\Domain\Event\PrintFailedEvent': failed
Dann können Sie Event-Listener erstellen:
#[AsMessageHandler]
final class OrderPrintedNotificationHandler
{
public function __construct(
private MailerInterface $mailer,
private string $adminEmail
) {}
public function __invoke(OrderPrintedEvent $event): void
{
$email = (new Email())
->from('noreply@shopbite.de')
->to($this->adminEmail)
->subject('Bestellung gedruckt: ' . $event->orderNumber)
->text('Die Bestellung ' . $event->orderNumber . ' wurde erfolgreich gedruckt.');
$this->mailer->send($email);
}
}
Aktivieren Sie das Caching für häufig abgerufene Daten:
# In config/packages/cache.yaml
framework:
cache:
app: cache.adapter.filesystem
default_redis_provider: 'redis://localhost'
pools:
shopware.cache:
adapter: cache.adapter.redis
default_lifetime: 3600
Für hohe Bestellvolumen können Sie die Batch-Verarbeitung aktivieren:
# Batch-Konfiguration
BATCH_SIZE=10
BATCH_INTERVAL=30
Für Systeme mit hohem Durchsatz können Sie mehrere Worker einrichten:
# Mehrere Worker starten
bin/console messenger:consume async --limit=10 --time-limit=3600 &
bin/console messenger:consume async --limit=10 --time-limit=3600 &
bin/console messenger:consume async --limit=10 --time-limit=3600 &
Richten Sie eine Log-Rotation ein, um Speicherplatz zu sparen:
# Logrotate-Konfiguration (/etc/logrotate.d/order-printer)
/var/log/order-printer-*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 www-data www-data
}
Richten Sie eine regelmäßige Datenbereinigung ein:
# Cron-Job für Datenbereinigung (täglich um 3 Uhr)
0 3 * * * /pfad/zum/project/bin/console order-printer:cleanup --days=30