Documentation

Geschäftszeiten Management

Das ShopBite Plugin bietet ein leistungsstarkes Geschäftszeiten-Management-System, das speziell für Gastronomie- und Einzelhandelsbetriebe entwickelt wurde. Dieses Kapitel erklärt die detaillierte Konfiguration und Verwaltung von Geschäftszeiten.

Übersicht

Das Geschäftszeiten-System ermöglicht:

  • Flexible Öffnungszeiten für jeden Wochentag
  • Sales Channel-spezifische Konfiguration
  • Sonderöffnungszeiten für besondere Anlässe
  • API-Integration für die Storefront
  • Echtzeit-Abfrage über die Shopware Store API

Datenbankstruktur

CREATE TABLE `shopbite_business_hour` (
    `id` BINARY(16) NOT NULL,
    `day_of_week` INT(11) NOT NULL,  -- 0=Sonntag, 1=Montag, ..., 6=Samstag
    `opening_time` VARCHAR(5) NOT NULL,  -- Format: HH:MM
    `closing_time` VARCHAR(5) NOT NULL, -- Format: HH:MM
    `sales_channel_id` BINARY(16) NOT NULL,
    `created_at` DATETIME(3) NOT NULL,
    `updated_at` DATETIME(3) NULL,
    PRIMARY KEY (`id`),
    CONSTRAINT `fk.shopbite_business_hour.sales_channel_id` 
        FOREIGN KEY (`sales_channel_id`) 
        REFERENCES `sales_channel` (`id`) 
        ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Administrationsoberfläche

Geschäftszeiten-Liste

  1. ShopBite > Geschäftszeiten navigieren
  2. Übersicht aller konfigurierten Geschäftszeiten
  3. Filterung nach Sales Channel
  4. Massenaktionen (Export, Import)

Neue Geschäftszeit hinzufügen

  1. Neue Geschäftszeit hinzufügen klicken
  2. Formular ausfüllen:

Formularfelder

FeldTypBeschreibungBeispiel
Sales ChannelDropdownVertriebskanal auswählen"Mein Restaurant"
WochentagDropdownTag der Woche (0-6)1 (Montag)
ÖffnungszeitZeitauswahlÖffnungszeit11:00
SchließzeitZeitauswahlSchließzeit22:00
GeschlossenCheckboxTag als geschlossen markieren

Geschäftszeiten bearbeiten

  1. Bearbeiten-Button klicken
  2. Felder anpassen
  3. Speichern klicken

Geschäftszeiten löschen

  1. Löschen-Button klicken
  2. Bestätigung dialog
  3. Bestätigen klicken

API-Integration

API-Endpunkt

GET /store-api/shopbite/business-hour

Anfrageparameter

ParameterTypBeschreibungBeispiel
sales-channel-idUUIDFilter nach Sales Channel019a36f224b0704fb6835914050392f4
include-closedBooleanGeschlossene Tage einbeziehentrue

Beispielanfrage

curl -X GET "https://Ihre-Shopware-Domain.de/store-api/shopbite/business-hour" \
  -H "Authorization: Bearer IhrAPIToken" \
  -H "sw-access-key: IhrAccessKey" \
  -H "Accept: application/json"

Beispielantwort

{
  "apiAlias": "shopbite_business_hour",
  "data": [
    {
      "id": "019a36f224b0704fb6835914050392f4",
      "dayOfWeek": 1,
      "openingTime": "11:00",
      "closingTime": "22:00",
      "salesChannelId": "019a36f224b0704fb6835914050392f4",
      "createdAt": "2024-01-11T14:30:00+01:00",
      "updatedAt": "2024-01-11T14:30:00+01:00",
      "salesChannel": {
        "id": "019a36f224b0704fb6835914050392f4",
        "name": "Mein Restaurant",
        "typeId": "019a36f224b0704fb6835914050392f4"
      }
    },
    {
      "id": "019a36f224b0704fb6835914050392f5",
      "dayOfWeek": 2,
      "openingTime": "11:00",
      "closingTime": "22:00",
      "salesChannelId": "019a36f224b0704fb6835914050392f4",
      "createdAt": "2024-01-11T14:30:00+01:00",
      "updatedAt": "2024-01-11T14:30:00+01:00",
      "salesChannel": {
        "id": "019a36f224b0704fb6835914050392f4",
        "name": "Mein Restaurant",
        "typeId": "019a36f224b0704fb6835914050392f4"
      }
    }
  ],
  "total": 7
}

Fehlerbehandlung

StatuscodeBedeutungLösung
200ErfolgDaten erfolgreich abgerufen
401UnauthorizedAPI-Zugangsdaten prüfen
403ForbiddenBerechtigungen prüfen
404Not FoundEndpunkt oder Sales Channel nicht gefunden
500Internal Server ErrorServer-Logs prüfen

Sonderöffnungszeiten

Datenbankstruktur

Sonderöffnungszeiten werden in der gleichen Tabelle gespeichert, aber mit einem speziellen Flag:

-- Sonderöffnungszeiten werden als separate Einträge gespeichert
-- mit einem speziellen Datum statt Wochentag
ALTER TABLE `shopbite_business_hour` 
ADD COLUMN `special_date` DATE NULL AFTER `day_of_week`;

Verwaltung

  1. ShopBite > Geschäftszeiten > Sonderöffnungszeiten navigieren
  2. Neue Sonderöffnungszeit hinzufügen klicken
  3. Formular ausfüllen:

Formularfelder

FeldTypBeschreibungBeispiel
Sales ChannelDropdownVertriebskanal auswählen"Mein Restaurant"
DatumDatumauswahlDatum der Sonderöffnung24.12.2024
ÖffnungszeitZeitauswahlSpezielle Öffnungszeit10:00
SchließzeitZeitauswahlSpezielle Schließzeit14:00
BeschreibungTextOptional Beschreibung"Heiligabend - verkürzte Öffnungszeiten"

API-Abfrage für Sonderöffnungszeiten

curl -X GET "https://Ihre-Shopware-Domain.de/store-api/shopbite/business-hour?special=true" \
  -H "Authorization: Bearer IhrAPIToken" \
  -H "sw-access-key: IhrAccessKey"

Best Practices

1. Konsistente Zeiteinstellungen

  • Verwenden Sie immer das 24-Stunden-Format (HH:MM)
  • Stellen Sie sicher, dass Öffnungszeit < Schließzeit
  • Für Übernacht-Öffnung: Öffnungszeit = 18:00, Schließzeit = 02:00 (nächster Tag)

2. Sales Channel-spezifische Konfiguration

  • Jeder Vertriebskanal kann eigene Geschäftszeiten haben
  • Ideal für mehrere Standorte oder Dienstleistungen
  • Beispiel: Restaurant vs. Catering-Service

3. Performance-Optimierung

-- Indizes für bessere Performance
CREATE INDEX `idx_sales_channel` ON `shopbite_business_hour` (`sales_channel_id`);
CREATE INDEX `idx_day_of_week` ON `shopbite_business_hour` (`day_of_week`);

-- Für Sonderöffnungszeiten
CREATE INDEX `idx_special_date` ON `shopbite_business_hour` (`special_date`);

4. Caching-Strategie

# In config/packages/cache.yaml
framework:
    cache:
        pools:
            shopbite.business_hours:
                adapter: cache.adapter.redis
                default_lifetime: 3600  # 1 Stunde Cache

Integration mit der Storefront

JavaScript-Beispiel

// Geschäftszeiten abrufen
async function fetchBusinessHours(salesChannelId) {
  const response = await fetch(
    `/store-api/shopbite/business-hour?sales-channel-id=${salesChannelId}`,
    {
      headers: {
        'Authorization': `Bearer ${apiToken}`,
        'sw-access-key': accessKey
      }
    }
  );
  
  if (!response.ok) {
    throw new Error('Failed to fetch business hours');
  }
  
  return await response.json();
}

// Geschäftszeiten anzeigen
function displayBusinessHours(hours) {
  const days = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'];
  
  hours.data.forEach(hour => {
    const dayName = days[hour.dayOfWeek];
    console.log(`${dayName}: ${hour.openingTime} - ${hour.closingTime}`);
  });
}

// Beispielaufruf
fetchBusinessHours('019a36f224b0704fb6835914050392f4')
  .then(displayBusinessHours)
  .catch(console.error);

Vue.js-Komponente

<template>
  <div class="business-hours">
    <h3>Öffnungszeiten</h3>
    <div v-for="hour in businessHours" :key="hour.id" class="hour-item">
      <span class="day">{{ getDayName(hour.dayOfWeek) }}</span>
      <span class="time">{{ hour.openingTime }} - {{ hour.closingTime }}</span>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      businessHours: [],
      days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag']
    };
  },
  
  async mounted() {
    await this.fetchBusinessHours();
  },
  
  methods: {
    getDayName(dayOfWeek) {
      return this.days[dayOfWeek];
    },
    
    async fetchBusinessHours() {
      try {
        const response = await this.$axios.get('/store-api/shopbite/business-hour');
        this.businessHours = response.data.data;
      } catch (error) {
        console.error('Failed to fetch business hours:', error);
      }
    }
  }
};
</script>

<style scoped>
.business-hours {
  margin: 20px 0;
  padding: 15px;
  background: #f5f5f5;
  border-radius: 8px;
}

.hour-item {
  display: flex;
  justify-content: space-between;
  padding: 8px 0;
  border-bottom: 1px solid #ddd;
}

.day {
  font-weight: bold;
}

.time {
  color: #666;
}
</style>

Fehlerbehandlung und Debugging

Häufige Probleme

Problem: Geschäftszeiten werden nicht angezeigt

Ursachen:

  • Cache-Probleme
  • Falsche Sales Channel-ID
  • Datenbankverbindungsfehler

Lösungen:

# Cache leeren
bin/console cache:clear

# Datenbank prüfen
mysql -u shopware -p shopware -e "SELECT * FROM shopbite_business_hour;"

# Sales Channel-ID prüfen
bin/console sales-channel:list

Problem: API liefert leere Ergebnisse

Ursachen:

  • Keine Daten in der Datenbank
  • Falsche Berechtigungen
  • Filterparameter falsch

Lösungen:

# Datenbank prüfen
mysql -u shopware -p shopware -e "SELECT COUNT(*) FROM shopbite_business_hour;"

# API-Berechtigungen prüfen
bin/console integration:list

# API-Test
curl -X GET "https://Ihre-Domain.de/store-api/shopbite/business-hour" -H "Authorization: Bearer IhrToken"

Problem: Zeitformat falsch

Ursachen:

  • Falsches Zeitformat in der Datenbank
  • Zeitzonenprobleme

Lösungen:

# Zeitformat prüfen
mysql -u shopware -p shopware -e "SELECT opening_time, closing_time FROM shopbite_business_hour LIMIT 5;"

# Zeitzone prüfen
bin/console config:get Shopware.Core.SystemConfig.timezone

Nächste Schritte