[{"data":1,"prerenderedAt":1643},["ShallowReactive",2],{"navigation-en":3,"search_en":84,"docs:en:receipt-printer\u002Ftroubleshooting":1642},[4],{"title":5,"path":6,"stem":7,"children":8,"page":50},"Docs","\u002Fdocs","docs",[9,13,17,51,72],{"title":10,"path":11,"stem":12},"Introduction to ShopBite","\u002Fdocs\u002Fintro","docs\u002F1.intro",{"title":14,"path":15,"stem":16},"Architecture Overview","\u002Fdocs\u002Farchitecture","docs\u002F2.architecture",{"title":18,"path":19,"stem":20,"children":21,"page":50},"Shopware","\u002Fdocs\u002Fshopware","docs\u002F7.shopware",[22,26,30,34,38,42,46],{"title":23,"path":24,"stem":25},"ShopBite Shopware Plugin","\u002Fdocs\u002Fshopware\u002Fintro","docs\u002F7.shopware\u002F0.intro",{"title":27,"path":28,"stem":29},"Shopware Installation","\u002Fdocs\u002Fshopware\u002Finstallation","docs\u002F7.shopware\u002F1.installation",{"title":31,"path":32,"stem":33},"Install ShopBite Plugin","\u002Fdocs\u002Fshopware\u002Fplugin-installation","docs\u002F7.shopware\u002F2.plugin-installation",{"title":35,"path":36,"stem":37},"ShopBite Plugin Configuration","\u002Fdocs\u002Fshopware\u002Fplugin-configuration","docs\u002F7.shopware\u002F3.plugin-configuration",{"title":39,"path":40,"stem":41},"Business Hours Management","\u002Fdocs\u002Fshopware\u002Fbusiness-hours","docs\u002F7.shopware\u002F4.business-hours",{"title":43,"path":44,"stem":45},"Holiday Management","\u002Fdocs\u002Fshopware\u002Fholidays","docs\u002F7.shopware\u002F5.holidays",{"title":47,"path":48,"stem":49},"Checkout Extensions","\u002Fdocs\u002Fshopware\u002Fcheckout","docs\u002F7.shopware\u002F6.checkout",false,{"title":52,"path":53,"stem":54,"children":55,"page":50},"Storefront","\u002Fdocs\u002Fstorefront","docs\u002F8.storefront",[56,60,64,68],{"title":57,"path":58,"stem":59},"First Steps with the Storefront","\u002Fdocs\u002Fstorefront\u002Ffirst-steps","docs\u002F8.storefront\u002F1.first-steps",{"title":61,"path":62,"stem":63},"Configuration","\u002Fdocs\u002Fstorefront\u002Fconfiguration","docs\u002F8.storefront\u002F2.configuration",{"title":65,"path":66,"stem":67},"Content Management","\u002Fdocs\u002Fstorefront\u002Fcontent","docs\u002F8.storefront\u002F3.content",{"title":69,"path":70,"stem":71},"Storefront vs Headless Sales Channel","\u002Fdocs\u002Fstorefront\u002Fstorefront-vs-headless","docs\u002F8.storefront\u002F4.storefront-vs-headless",{"title":73,"path":74,"stem":75,"children":76,"page":50},"Receipt Printer","\u002Fdocs\u002Freceipt-printer","docs\u002F9.receipt-printer",[77,81],{"title":78,"path":79,"stem":80},"Installation and Setup","\u002Fdocs\u002Freceipt-printer\u002Finstallation","docs\u002F9.receipt-printer\u002F1.installation",{"title":61,"path":82,"stem":83},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration","docs\u002F9.receipt-printer\u002F2.configuration",[85,89,93,99,104,109,114,117,121,126,131,137,142,147,152,157,162,166,169,173,178,183,187,192,197,202,207,212,216,221,226,231,236,240,245,250,254,259,264,269,273,278,283,288,293,298,302,307,310,313,316,321,326,331,335,340,345,349,354,359,364,368,373,378,383,387,392,397,402,406,409,413,418,421,426,431,436,440,445,450,455,460,465,470,474,479,484,489,493,498,503,508,511,516,521,526,531,535,540,545,550,554,557,560,564,569,574,580,585,588,593,598,603,608,613,618,621,626,631,636,641,645,648,653,658,663,668,673,678,682,687,692,697,702,707,711,716,721,726,730,734,739,744,749,754,758,761,764,768,773,776,781,786,791,796,801,805,810,815,820,825,830,834,838,843,847,852,856,861,866,871,876,880,885,890,894,897,902,907,912,916,919,922,926,930,933,938,943,947,951,955,958,962,966,970,974,977,981,986,990,994,999,1002,1007,1012,1016,1020,1025,1028,1032,1036,1039,1042,1047,1052,1057,1061,1064,1067,1071,1075,1079,1083,1088,1092,1097,1102,1106,1111,1115,1120,1125,1130,1135,1140,1145,1150,1154,1158,1163,1167,1172,1177,1180,1185,1189,1193,1196,1201,1206,1211,1215,1218,1221,1226,1231,1236,1240,1243,1248,1253,1258,1263,1268,1273,1278,1283,1288,1292,1294,1298,1303,1308,1313,1318,1323,1328,1333,1338,1343,1345,1349,1354,1359,1364,1369,1374,1379,1384,1389,1394,1399,1404,1409,1412,1417,1420,1424,1429,1434,1439,1443,1448,1453,1458,1463,1467,1471,1476,1481,1485,1490,1495,1500,1504,1509,1514,1518,1522,1525,1529,1534,1539,1544,1549,1553,1558,1563,1568,1573,1577,1582,1587,1592,1595,1600,1605,1610,1614,1619,1624,1628,1633,1638],{"id":11,"title":10,"titles":86,"content":87,"level":88},[],"A comprehensive introduction to the ShopBite E-Commerce System for gastronomy businesses",1,{"id":90,"title":10,"titles":91,"content":92,"level":88},"\u002Fdocs\u002Fintro#introduction-to-shopbite",[],"Welcome to ShopBite - the modern E-Commerce solution specifically designed for gastronomy businesses. ShopBite combines the powerful Shopware 6 platform with a modern headless architecture and special extensions for the gastronomy industry.",{"id":94,"title":95,"titles":96,"content":97,"level":98},"\u002Fdocs\u002Fintro#what-is-shopbite","What is ShopBite?",[10],"ShopBite is a modular E-Commerce system consisting of various open-source components that provide a complete webshop solution for gastronomy businesses: Shopware 6 - The core E-Commerce platformShopBite Storefront - A modern Nuxt.js-based user interfaceShopBite Plugin - Extensions for Shopware 6Order Printer - Printing solutions for orders",2,{"id":100,"title":101,"titles":102,"content":103,"level":98},"\u002Fdocs\u002Fintro#target-audience","Target Audience",[10],"ShopBite is aimed at gastronomy businesses of all sizes: Restaurants, cafés and barsFood trucks and catering servicesBakeries and confectioneriesAll gastronomy businesses that want to offer online ordering",{"id":105,"title":106,"titles":107,"content":108,"level":98},"\u002Fdocs\u002Fintro#advantages-of-shopbite","Advantages of ShopBite",[10],"Modern Technology: Headless architecture for maximum flexibilityGastronomy-specific: Functions tailored specifically to the needs of the gastronomy industryOpen Source: Full control over your systemExtensible: Easy adaptation to individual requirementsCost-efficient: No monthly license fees for the core software",{"id":110,"title":111,"titles":112,"content":113,"level":98},"\u002Fdocs\u002Fintro#next-steps","Next Steps",[10],"Architecture Overview - Technical architecture and componentsShopware Plugin - Shopware-specific functionsStorefront - Setting up the user interfaceOrder Printer - Configuring printing solutions",{"id":15,"title":14,"titles":115,"content":116,"level":88},[],"The technical architecture of the ShopBite System",{"id":118,"title":14,"titles":119,"content":120,"level":88},"\u002Fdocs\u002Farchitecture#architecture-overview",[],"ShopBite follows a modern headless architecture that offers flexibility and scalability. This architecture separates the user interface (frontend) from the business logic (backend), enabling maximum adaptability.",{"id":122,"title":123,"titles":124,"content":125,"level":98},"\u002Fdocs\u002Farchitecture#system-components","System Components",[14],"graph TD\n    A[ShopBite Storefront] -->|API Calls| B[Shopware 6]\n    B -->|Database| C[MySQL\u002FMariaDB]\n    B -->|Events| D[Order Printer]\n    D -->|Print Jobs| E[Thermal Printers]\n    A -->|Web Interface| F[Customers]",{"id":127,"title":128,"titles":129,"content":130,"level":98},"\u002Fdocs\u002Farchitecture#components-in-detail","Components in Detail",[14],"",{"id":132,"title":133,"titles":134,"content":135,"level":136},"\u002Fdocs\u002Farchitecture#_1-shopbite-storefront-nuxtjs","1. ShopBite Storefront (Nuxt.js)",[14,128],"The Storefront is a modern, responsive user interface developed with Nuxt.js. It communicates with the backend via the Shopware Store API. Technologies: Nuxt.js 3Vue.js 3TypeScriptTailwind CSS Responsibilities: Customer user interfaceProduct catalog displayOrder process (Checkout)Real-time updates",3,{"id":138,"title":139,"titles":140,"content":141,"level":136},"\u002Fdocs\u002Farchitecture#_2-shopware-6","2. Shopware 6",[14,128],"Shopware 6 serves as the core E-Commerce platform and offers: Product managementOrder managementCustomer managementPayment processing Extended Functions through ShopBite: Gastronomy-specific data modelsExtended API endpointsEvent-based integration",{"id":143,"title":144,"titles":145,"content":146,"level":136},"\u002Fdocs\u002Farchitecture#_3-shopbite-plugin","3. ShopBite Plugin",[14,128],"The ShopBite Plugin extends Shopware 6 with gastronomy-specific functions: Business hours managementHoliday managementSpecial checkout functionsAPI extensions for the storefront Technical Details: PHP-based extensionIntegration into Shopware admin interfaceREST API extensions",{"id":148,"title":149,"titles":150,"content":151,"level":136},"\u002Fdocs\u002Farchitecture#_4-order-printer","4. Order Printer",[14,128],"The Order Printer is a special service that sends orders directly to kitchen or counter printers. Supported Printers: Thermal printersESC\u002FPOS printersCUPS-compatible printers Functionality: Query new orders via APIFormatting print dataDirect communication with printers",{"id":153,"title":154,"titles":155,"content":156,"level":98},"\u002Fdocs\u002Farchitecture#data-flow","Data Flow",[14],"Customer places order → Storefront sends data to Shopware APIShopware processes order → Stores in databaseShopware sends event → Order Printer receives order informationOrder Printer prints order → Directly to kitchen printerStatus update → Storefront displays order status",{"id":158,"title":159,"titles":160,"content":161,"level":98},"\u002Fdocs\u002Farchitecture#technical-advantages","Technical Advantages",[14],"Scalability: Components can be scaled independentlyMaintainability: Clear separation of responsibilitiesFlexibility: Easy adaptation of individual componentsFuture-proof: Modern technologies and standards",{"id":163,"title":111,"titles":164,"content":165,"level":98},"\u002Fdocs\u002Farchitecture#next-steps",[14],"Shopware Plugin Documentation - Detailed information about the Shopware PluginStorefront Documentation - Setup and configuration of the StorefrontOrder Printer Documentation - Printing solutions and integration html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":24,"title":23,"titles":167,"content":168,"level":88},[],"Welcome to the comprehensive documentation for the ShopBite Shopware Plugin. This plugin is a central component of the ShopBite ecosystem and enables seamless integration between Shopware 6 and the ShopBite Nuxt Storefront.",{"id":170,"title":171,"titles":172,"content":168,"level":88},"\u002Fdocs\u002Fshopware\u002Fintro#shopbite-shopware-plugin-documentation","ShopBite Shopware Plugin - Documentation",[],{"id":174,"title":175,"titles":176,"content":177,"level":98},"\u002Fdocs\u002Fshopware\u002Fintro#overview","Overview",[171],"The ShopBite Plugin extends Shopware 6 with special functions developed specifically for gastronomy and retail businesses. It offers extended configuration options, business hours management, holiday management, and checkout extensions required for a high-performance headless storefront.",{"id":179,"title":180,"titles":181,"content":182,"level":98},"\u002Fdocs\u002Fshopware\u002Fintro#plugin-architecture","Plugin Architecture",[171],"graph TD\n    A[Shopware 6 Core] --> B[ShopBite Plugin]\n    B --> C[Business Hours Management]\n    B --> D[Holiday Management]\n    B --> E[Storefront Configuration]\n    B --> F[Checkout Enhancements]\n    B --> G[Store API Extensions]\n    G --> H[ShopBite Nuxt Storefront]\n    H --> I[Order Printer Service]",{"id":184,"title":185,"titles":186,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fintro#main-features","Main Features",[171],{"id":188,"title":189,"titles":190,"content":191,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#business-hours-management","📅 Business Hours Management",[171,185],"Flexible Opening Hours: Configure opening hours for each day of the weekSales Channel-specific: Different times for different sales channelsStore API Integration: Retrieve via \u002Fstore-api\u002Fshopbite\u002Fbusiness-hour",{"id":193,"title":194,"titles":195,"content":196,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#holiday-management","🎉 Holiday Management",[171,185],"One-time Holidays: Configure individual closing daysRecurring Holidays: Annually recurring holidaysPeriod-based: Multi-day closures (e.g., Christmas)Store API Integration: Retrieve via \u002Fstore-api\u002Fshopbite\u002Fholiday",{"id":198,"title":199,"titles":200,"content":201,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#checkout-enhancements","🛒 Checkout Enhancements",[171,185],"Container-based Products: Special processing for product groupsReceipt Print Types: Different print formats for different productsCustom Fields: Extended product attributes for gastronomy",{"id":203,"title":204,"titles":205,"content":206,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#storefront-configuration","🔧 Storefront Configuration",[171,185],"API Endpoints: Specific configuration endpoints for the storefrontCheckout Activation: Control of checkout functionalityDelivery Time Specifications: Standard delivery times and factors",{"id":208,"title":209,"titles":210,"content":211,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#database-structure","🔄 Database Structure",[171,185],"Business Hours Table: shopbite_business_hourHolidays Table: shopbite_holidayCustom Fields: Extended product attributes",{"id":213,"title":214,"titles":215,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fintro#documentation-structure","Documentation Structure",[171],{"id":217,"title":218,"titles":219,"content":220,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#introduction","📋 Introduction",[171,214],"Shopware Installation - System requirements and Shopware setupPlugin Installation - Plugin installation and activation",{"id":222,"title":223,"titles":224,"content":225,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#️-configuration","⚙️ Configuration",[171,214],"Plugin Configuration - Detailed setup and managementBusiness Hours Management - Configuration of opening hoursHoliday Management - Setup of closing daysCheckout Enhancements - Special checkout functions",{"id":227,"title":228,"titles":229,"content":230,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#administration","🔧 Administration",[171,214],"Administration Interface - Operation of the plugin interfaceAPI Reference - Technical API documentationTroubleshooting - Problem handling and support",{"id":232,"title":233,"titles":234,"content":235,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#advanced-topics","🚀 Advanced Topics",[171,214],"Developer Documentation - Extensions and adaptationsPerformance Optimization - Scaling and cachingSecurity - Best practices for secure operation",{"id":237,"title":238,"titles":239,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fintro#quick-start","Quick Start",[171],{"id":241,"title":242,"titles":243,"content":244,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#system-requirements","System Requirements",[171,238],"Shopware 6.7.0 or higherPHP 8.4 or higherMySQL 5.7+ or MariaDB 10.3+Composer 2.0+",{"id":246,"title":247,"titles":248,"content":249,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#installation-in-3-steps","Installation in 3 Steps",[171,238],"Install Plugin:composer require shopbite-de\u002Fshopware-plugin\nActivate Plugin:bin\u002Fconsole plugin:install --activate ShopBite\nClear Cache:bin\u002Fconsole cache:clear",{"id":251,"title":252,"titles":253,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fintro#support-and-resources","Support and Resources",[171],{"id":255,"title":256,"titles":257,"content":258,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#official-resources","Official Resources",[171,252],"GitHub Repository: github.com\u002Fshopbite-de\u002Fshopware-pluginShopBite Website: shopbite.deShopware Documentation: docs.shopware.com",{"id":260,"title":261,"titles":262,"content":263,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#community","Community",[171,252],"Forum: community.shopbite.deSlack Channel: shopbite.slack.comStack Overflow: stackoverflow.com\u002Ftags\u002Fshopbite",{"id":265,"title":266,"titles":267,"content":268,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#support","Support",[171,252],"Email: support@shopbite.dePhone: +49 123 456789Support Hours: Mon-Fri 09:00-17:00",{"id":270,"title":271,"titles":272,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fintro#frequently-asked-questions","Frequently Asked Questions",[171],{"id":274,"title":275,"titles":276,"content":277,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#which-shopware-version-is-supported","Which Shopware version is supported?",[171,271],"The plugin supports Shopware 6.7.0 and higher. For older versions, please contact our support.",{"id":279,"title":280,"titles":281,"content":282,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#does-the-plugin-work-with-other-plugins","Does the plugin work with other plugins?",[171,271],"Yes, the ShopBite Plugin is compatible with most Shopware plugins. In case of conflicts, please contact our support.",{"id":284,"title":285,"titles":286,"content":287,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#how-is-the-data-displayed-in-the-storefront","How is the data displayed in the storefront?",[171,271],"The data is provided via the Shopware Store API and retrieved by the ShopBite Nuxt Storefront.",{"id":289,"title":290,"titles":291,"content":292,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#can-i-customize-the-plugin","Can I customize the plugin?",[171,271],"Yes, the plugin offers extension possibilities. See Developer Documentation for details.",{"id":294,"title":295,"titles":296,"content":297,"level":136},"\u002Fdocs\u002Fshopware\u002Fintro#how-often-is-the-data-updated","How often is the data updated?",[171,271],"The data is retrieved in real-time via the Store API. The storefront can reload the data as needed.",{"id":299,"title":111,"titles":300,"content":301,"level":98},"\u002Fdocs\u002Fshopware\u002Fintro#next-steps",[171],"📖 Shopware Installation - Prepare Shopware system🛠️ Plugin Installation - Set up plugin⚙️ Plugin Configuration - Configure functions🎉 Holiday Management - Set up closing days",{"id":303,"title":304,"titles":305,"content":306,"level":98},"\u002Fdocs\u002Fshopware\u002Fintro#feedback","Feedback",[171],"Do you have questions, suggestions, or feedback about the documentation? We look forward to your feedback! Documentation Issues: GitHub IssuesImprovement Suggestions: Feedback FormContributions: Contributing Guide Thank you for using the ShopBite Shopware Plugin! html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"id":28,"title":27,"titles":308,"content":309,"level":88},[],"This chapter guides you through the installation of Shopware 6 with the specific requirements for the ShopBite Plugin.",{"id":311,"title":27,"titles":312,"content":309,"level":88},"\u002Fdocs\u002Fshopware\u002Finstallation#shopware-installation",[],{"id":314,"title":242,"titles":315,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Finstallation#system-requirements",[27],{"id":317,"title":318,"titles":319,"content":320,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#server-requirements","Server Requirements",[27,242],"Web Server: Apache 2.4+ or Nginx 1.20+PHP: 8.4 or higherDatabase: MySQL 5.7+ or MariaDB 10.3+Memory: At least 2GB RAM, 4GB recommendedDisk Space: At least 10GB free storage",{"id":322,"title":323,"titles":324,"content":325,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#php-extensions","PHP Extensions",[27,242],"# Required PHP extensions\nphp -m | grep -E \"(ctype|curl|gd|intl|json|mbstring|openssl|pdo_mysql|tokenizer|xml|zip)\"\n\n# Install missing extensions (Ubuntu\u002FDebian)\nsudo apt-get install php8.4-{ctype,curl,gd,intl,json,mbstring,openssl,pdo_mysql,tokenizer,xml,zip}",{"id":327,"title":328,"titles":329,"content":330,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#recommended-shopware-version","Recommended Shopware Version",[27,242],"The ShopBite Plugin supports Shopware 6.7.0 and higher. We recommend using the current stable version.",{"id":332,"title":333,"titles":334,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Finstallation#installation-methods","Installation Methods",[27],{"id":336,"title":337,"titles":338,"content":339,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#_1-official-shopware-installation","1. Official Shopware Installation",[27,333],"Follow the official Shopware documentation: Installation Wizard: docs.shopware.com\u002FinstallationCLI Installation:\n# Download Shopware\nwget https:\u002F\u002Fwww.shopware.com\u002Fdownload -O shopware.zip\nunzip shopware.zip\ncd shopware\n\n# Start installation\nphp bin\u002Fconsole system:install",{"id":341,"title":342,"titles":343,"content":344,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#_2-shopbite-pre-configured-repository","2. ShopBite Pre-configured Repository",[27,333],"For quick setup with ShopBite-specific configurations: # Clone repository\ngit clone https:\u002F\u002Fgithub.com\u002Fshopbite-de\u002Fshopware.git\ncd shopware\n\n# Install dependencies\ncomposer install\n\n# Set up database\nbin\u002Fconsole system:install \\\n  --db-host=localhost \\\n  --db-user=shopware \\\n  --db-password=securepassword \\\n  --db-name=shopware \\\n  --shop-name=\"My ShopBite Shop\" \\\n  --shop-locale=de-DE \\\n  --currency=EUR \\\n  --admin-username=admin \\\n  --admin-password=secureadminpassword \\\n  --admin-email=admin@my-shop.de",{"id":346,"title":347,"titles":348,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Finstallation#shopware-configuration-for-shopbite","Shopware Configuration for ShopBite",[27],{"id":350,"title":351,"titles":352,"content":353,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#basic-settings","Basic Settings",[27,347],"Language and Currency:Language: German (de-DE)Currency: Euro (EUR)Timezone: Europe\u002FBerlinSet up Sales Channel:Navigate to Settings > Sales ChannelsCreate a new Sales Channel for ShopBiteSelect Storefront Type: \"Storefront\"Configure API Access:Navigate to Settings > System > IntegrationsCreate a new integration for ShopBiteSet permissions: order:read, order:write, product:read",{"id":355,"title":356,"titles":357,"content":358,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#performance-optimization","Performance Optimization",[27,347],"# Cache configuration\nbin\u002Fconsole cache:configure --env=prod\n\n# Enable OPcache\nphp -i | grep opcache\n\n# Optimize Shopware cache\nbin\u002Fconsole cache:pool:clear\nbin\u002Fconsole cache:warmup",{"id":360,"title":361,"titles":362,"content":363,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#database-optimization","Database Optimization",[27,347],"-- MySQL optimization\nSET GLOBAL innodb_buffer_pool_size = 1024 * 1024 * 1024; -- 1GB\nSET GLOBAL innodb_log_file_size = 256 * 1024 * 1024; -- 256MB\nSET GLOBAL innodb_flush_log_at_trx_commit = 2;\n\n-- Indexes for ShopBite tables\nALTER TABLE `shopbite_business_hour` ADD INDEX `idx_sales_channel` (`sales_channel_id`);\nALTER TABLE `shopbite_holiday` ADD INDEX `idx_sales_channel` (`sales_channel_id`);",{"id":365,"title":366,"titles":367,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Finstallation#shopware-update","Shopware Update",[27],{"id":369,"title":370,"titles":371,"content":372,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#update-preparation","Update Preparation",[27,366],"# Enable maintenance mode\nbin\u002Fconsole maintenance:enable\n\n# Create backup\nmysqldump -u shopware -p shopware > shopware_backup_$(date +%Y-%m-%d).sql\ntar -czvf shopware_files_$(date +%Y-%m-%d).tar.gz public\u002F config\u002F",{"id":374,"title":375,"titles":376,"content":377,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#update-execution","Update Execution",[27,366],"# Shopware update\ncomposer update shopware\u002Fcore\nbin\u002Fconsole system:update:prepare\nbin\u002Fconsole system:update:finish\n\n# Run database migrations\nbin\u002Fconsole database:migrate\n\n# Clear cache\nbin\u002Fconsole cache:clear",{"id":379,"title":380,"titles":381,"content":382,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#post-update","Post-Update",[27,366],"# Disable maintenance mode\nbin\u002Fconsole maintenance:disable\n\n# Check plugin compatibility\nbin\u002Fconsole plugin:check-compatibility\n\n# Run ShopBite-specific migrations\nbin\u002Fconsole database:migrate --all ShopBite",{"id":384,"title":385,"titles":386,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Finstallation#common-installation-issues","Common Installation Issues",[27],{"id":388,"title":389,"titles":390,"content":391,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#problem-php-version-not-compatible","Problem: PHP Version Not Compatible",[27,385],"Symptoms: Error: \"PHP version 8.4 required\"Shopware does not start Solution: # Check PHP version\nphp -v\n\n# Install PHP 8.4 (Ubuntu\u002FDebian)\nsudo add-apt-repository ppa:ondrej\u002Fphp\nsudo apt-get update\nsudo apt-get install php8.4\n\n# Switch PHP version\nsudo update-alternatives --config php",{"id":393,"title":394,"titles":395,"content":396,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#problem-database-connection-failed","Problem: Database Connection Failed",[27,385],"Symptoms: Error: \"SQLSTATEHY000 2002 Connection refused\"Shopware cannot establish database connection Solution: # Check database service\nsudo systemctl status mysql\n\n# Restart database\nsudo systemctl restart mysql\n\n# Check permissions\nmysql -u root -p\nGRANT ALL PRIVILEGES ON shopware.* TO 'shopware'@'localhost' IDENTIFIED BY 'password';\nFLUSH PRIVILEGES;",{"id":398,"title":399,"titles":400,"content":401,"level":136},"\u002Fdocs\u002Fshopware\u002Finstallation#problem-cache-issues","Problem: Cache Issues",[27,385],"Symptoms: Changes are not displayedError: \"Cache directory not writable\" Solution: # Set cache permissions\nsudo chmod -R 777 var\u002Fcache\nsudo chown -R www-data:www-data var\u002F\n\n# Clear cache\nbin\u002Fconsole cache:clear --no-warmup\nbin\u002Fconsole cache:warmup",{"id":403,"title":111,"titles":404,"content":405,"level":98},"\u002Fdocs\u002Fshopware\u002Finstallation#next-steps",[27],"Plugin Installation - Install ShopBite PluginPlugin Configuration - Set up pluginShopware Documentation - Official Shopware Documentation html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"id":32,"title":31,"titles":407,"content":408,"level":88},[],"This chapter guides you through the installation of the ShopBite Plugin in your Shopware 6 system.",{"id":410,"title":411,"titles":412,"content":408,"level":88},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#shopbite-plugin-installation","ShopBite Plugin Installation",[],{"id":414,"title":415,"titles":416,"content":417,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#prerequisites","Prerequisites",[411],"Shopware 6.7.0 or higher (installed and functional)PHP 8.4 or higherComposer 2.0 or higherDatabase access with sufficient permissions",{"id":419,"title":333,"titles":420,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#installation-methods",[411],{"id":422,"title":423,"titles":424,"content":425,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#_1-installation-via-composer-recommended","1. Installation via Composer (recommended)",[411,333],"# Install plugin via Composer\ncomposer require shopbite-de\u002Fshopware-plugin\n\n# Activate plugin\nbin\u002Fconsole plugin:install --activate ShopBite\n\n# Clear cache\nbin\u002Fconsole cache:clear",{"id":427,"title":428,"titles":429,"content":430,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#_2-installation-via-shopware-plugin-store","2. Installation via Shopware Plugin Store",[411,333],"Open Shopware AdministrationNavigate to Extensions > StoreSearch for \"ShopBite\"Click InstallClick Activate",{"id":432,"title":433,"titles":434,"content":435,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#_3-manual-installation","3. Manual Installation",[411,333],"# Download plugin\nwget https:\u002F\u002Fgithub.com\u002Fshopbite-de\u002Fshopware-plugin\u002Freleases\u002Flatest\u002Fdownload\u002Fshopbite-plugin.zip\nunzip shopbite-plugin.zip -d custom\u002Fplugins\u002FShopBite\n\n# Install and activate plugin\nbin\u002Fconsole plugin:refresh\nbin\u002Fconsole plugin:install --activate ShopBite\n\n# Run database migrations\nbin\u002Fconsole database:migrate --all ShopBite\n\n# Clear cache\nbin\u002Fconsole cache:clear",{"id":437,"title":438,"titles":439,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#installation-process-in-detail","Installation Process in Detail",[411],{"id":441,"title":442,"titles":443,"content":444,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#step-1-download-plugin","Step 1: Download Plugin",[411,438],"# Composer method (recommended)\ncomposer require shopbite-de\u002Fshopware-plugin\n\n# Manual method\nwget https:\u002F\u002Fgithub.com\u002Fshopbite-de\u002Fshopware-plugin\u002Freleases\u002Flatest\u002Fdownload\u002Fshopbite-plugin.zip\nunzip shopbite-plugin.zip -d custom\u002Fplugins\u002FShopBite",{"id":446,"title":447,"titles":448,"content":449,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#step-2-register-plugin","Step 2: Register Plugin",[411,438],"# Update plugin list\nbin\u002Fconsole plugin:refresh\n\n# Install plugin\nbin\u002Fconsole plugin:install ShopBite",{"id":451,"title":452,"titles":453,"content":454,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#step-3-activate-plugin","Step 3: Activate Plugin",[411,438],"# Activate plugin\nbin\u002Fconsole plugin:activate ShopBite\n\n# Check status\nbin\u002Fconsole plugin:list | grep ShopBite",{"id":456,"title":457,"titles":458,"content":459,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#step-4-run-database-migrations","Step 4: Run Database Migrations",[411,438],"# Run migrations\nbin\u002Fconsole database:migrate --all ShopBite\n\n# Check migrations\nbin\u002Fconsole database:migrate:status",{"id":461,"title":462,"titles":463,"content":464,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#step-5-cache-and-assets","Step 5: Cache and Assets",[411,438],"# Clear cache\nbin\u002Fconsole cache:clear\n\n# Update theme cache\nbin\u002Fconsole theme:compile\n\n# Update administration cache\nbin\u002Fconsole administration:build",{"id":466,"title":467,"titles":468,"content":469,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#step-6-check-permissions","Step 6: Check Permissions",[411,438],"# Set directory permissions\nsudo chown -R www-data:www-data custom\u002Fplugins\u002FShopBite\nsudo chmod -R 755 custom\u002Fplugins\u002FShopBite\n\n# Cache permissions\nsudo chmod -R 777 var\u002Fcache",{"id":471,"title":472,"titles":473,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#post-installation","Post-Installation",[411],{"id":475,"title":476,"titles":477,"content":478,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#administration-interface","Administration Interface",[411,472],"Open Shopware AdministrationNavigate to Extensions > My ExtensionsFind ShopBite Plugin and click ConfigurePerform basic configuration",{"id":480,"title":481,"titles":482,"content":483,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#set-up-api-access","Set Up API Access",[411,472],"# Create API integration\nbin\u002Fconsole integration:create:admin --name=\"ShopBite Storefront\" --description=\"API access for ShopBite Storefront\"\n\n# Set permissions\nbin\u002Fconsole acl:role:create --name=\"ShopBite API Role\" --description=\"API role for ShopBite\"\nbin\u002Fconsole acl:role:assign --name=\"ShopBite API Role\" --resource=\"order:read,order:write,product:read\"",{"id":485,"title":486,"titles":487,"content":488,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#configure-sales-channel","Configure Sales Channel",[411,472],"Navigate to Settings > Sales ChannelsCreate New Sales ChannelConfigure ShopBite-specific settingsAssign API access",{"id":490,"title":491,"titles":492,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#installation-verification","Installation Verification",[411],{"id":494,"title":495,"titles":496,"content":497,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#check-plugin-status","Check Plugin Status",[411,491],"# Show plugin status\nbin\u002Fconsole plugin:list | grep ShopBite\n\n# Show plugin details\nbin\u002Fconsole plugin:info ShopBite",{"id":499,"title":500,"titles":501,"content":502,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#check-database","Check Database",[411,491],"# Check tables\nmysql -u shopware -p shopware -e \"SHOW TABLES LIKE 'shopbite_%';\"\n\n# Check data\nmysql -u shopware -p shopware -e \"SELECT * FROM shopbite_business_hour LIMIT 5;\"",{"id":504,"title":505,"titles":506,"content":507,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#test-api-endpoints","Test API Endpoints",[411,491],"# API test (replace URL and token)\ncurl -X GET \"https:\u002F\u002FYour-Shopware-Domain.de\u002Fstore-api\u002Fshopbite\u002Fbusiness-hour\" \\\n  -H \"Authorization: Bearer YourAPIToken\" \\\n  -H \"sw-access-key: YourAccessKey\"",{"id":509,"title":385,"titles":510,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#common-installation-issues",[411],{"id":512,"title":513,"titles":514,"content":515,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#problem-plugin-not-visible-in-administration","Problem: Plugin Not Visible in Administration",[411,385],"Symptoms: Plugin is installed but not visibleError: \"Plugin not found\" Solutions: # Clear cache\nbin\u002Fconsole cache:clear\n\n# Update plugin list\nbin\u002Fconsole plugin:refresh\n\n# Check permissions\nsudo chown -R www-data:www-data custom\u002Fplugins\u002FShopBite",{"id":517,"title":518,"titles":519,"content":520,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#problem-database-migrations-failed","Problem: Database Migrations Failed",[411,385],"Symptoms: Error: \"Migration failed\"Tables not created Solutions: # Run migrations manually\nbin\u002Fconsole database:migrate --all ShopBite --force\n\n# Check database permissions\nmysql -u root -p\nGRANT ALL PRIVILEGES ON shopware.* TO 'shopware'@'localhost';\nFLUSH PRIVILEGES;",{"id":522,"title":523,"titles":524,"content":525,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#problem-api-endpoints-not-reachable","Problem: API Endpoints Not Reachable",[411,385],"Symptoms: 404 error on API callsEndpoints not available Solutions: # Clear route cache\nbin\u002Fconsole router:cache:warmup\n\n# Re-activate plugin\nbin\u002Fconsole plugin:deactivate ShopBite\nbin\u002Fconsole plugin:activate ShopBite\n\n# Check API permissions\nbin\u002Fconsole acl:role:list",{"id":527,"title":528,"titles":529,"content":530,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#problem-composer-installation-failed","Problem: Composer Installation Failed",[411,385],"Symptoms: Error: \"Could not find package shopbite-de\u002Fshopware-plugin\"Composer installation aborts Solutions: # Clear Composer cache\ncomposer clear-cache\n\n# Update Packagist\ncomposer update\n\n# Manual installation\nwget https:\u002F\u002Fgithub.com\u002Fshopbite-de\u002Fshopware-plugin\u002Freleases\u002Flatest\u002Fdownload\u002Fshopbite-plugin.zip",{"id":532,"title":533,"titles":534,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#uninstallation","Uninstallation",[411],{"id":536,"title":537,"titles":538,"content":539,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#deactivate-plugin","Deactivate Plugin",[411,533],"# Deactivate plugin\nbin\u002Fconsole plugin:deactivate ShopBite",{"id":541,"title":542,"titles":543,"content":544,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#uninstall-plugin","Uninstall Plugin",[411,533],"# Uninstall plugin\nbin\u002Fconsole plugin:uninstall ShopBite\n\n# Clean data (optional)\nbin\u002Fconsole plugin:uninstall ShopBite --keep-user-data=false",{"id":546,"title":547,"titles":548,"content":549,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#manual-cleanup","Manual Cleanup",[411,533],"# Remove plugin directory\nrm -rf custom\u002Fplugins\u002FShopBite\n\n# Clear cache\nbin\u002Fconsole cache:clear\n\n# Clean database (optional)\nmysql -u shopware -p shopware -e \"DROP TABLE IF EXISTS shopbite_business_hour, shopbite_holiday;\"",{"id":551,"title":111,"titles":552,"content":553,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-installation#next-steps",[411],"Plugin Configuration - Set up and configure pluginBusiness Hours Management - Configure opening hoursHoliday Management - Set up closing daysShopware Documentation - Official Shopware Documentation html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"id":36,"title":35,"titles":555,"content":556,"level":88},[],"After installing the ShopBite Plugin, you need to configure it to activate the gastronomy-specific functions and adapt them to your requirements.",{"id":558,"title":35,"titles":559,"content":556,"level":88},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#shopbite-plugin-configuration",[],{"id":561,"title":562,"titles":563,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#basic-configuration","Basic Configuration",[35],{"id":565,"title":566,"titles":567,"content":568,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_1-activate-plugin","1. Activate Plugin",[35,562],"Open Shopware AdministrationNavigate to Extensions > My ExtensionsFind ShopBite PluginClick Activate",{"id":570,"title":571,"titles":572,"content":573,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_2-basic-settings","2. Basic Settings",[35,562],"Navigate to ShopBite > Settings in the administration:",{"id":575,"title":576,"titles":577,"content":578,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#general-settings","General Settings",[35,562,571],"Activate Plugin: Main switch for all ShopBite functionsEnable API Access: Allows the storefront to access ShopBite APIsDebug Mode: Enables detailed logging (for development only)Sales Channel Selection: Select the sales channels for which ShopBite should be active",4,{"id":581,"title":582,"titles":583,"content":584,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#storefront-settings","Storefront Settings",[35,562,571],"Storefront URL: The URL of your ShopBite Storefront (e.g., https:\u002F\u002FYour-Storefront.de)API Access Key: The key for storefront API communicationCORS Origin: The allowed domains for CORS (e.g., https:\u002F\u002FYour-Storefront.de)API Timeout: Maximum wait time for API requests (default: 30 seconds)",{"id":586,"title":39,"titles":587,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#business-hours-management",[35],{"id":589,"title":590,"titles":591,"content":592,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_1-set-up-business-hours","1. Set Up Business Hours",[35,39],"Navigate to ShopBite > Business HoursClick Add New Business HoursConfigure the following fields:",{"id":594,"title":595,"titles":596,"content":597,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#business-hours-fields","Business Hours Fields",[35,39,590],"FieldDescriptionExampleSales ChannelSelect sales channel\"My Restaurant\"Day of WeekDay of the week (0=Sunday, 1=Monday, etc.)1 (Monday)Opening TimeOpening time in HH:MM format11:00Closing TimeClosing time in HH:MM format22:00ClosedMark day as closed✓",{"id":599,"title":600,"titles":601,"content":602,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#example-configuration","Example Configuration",[35,39,590],"Monday: 11:00 - 22:00\nTuesday: 11:00 - 22:00\nWednesday: Closed\nThursday: 11:00 - 23:00\nFriday: 11:00 - 00:00\nSaturday: 12:00 - 00:00\nSunday: 12:00 - 22:00",{"id":604,"title":605,"titles":606,"content":607,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_2-special-opening-hours","2. Special Opening Hours",[35,39],"For special occasions or seasonal changes: Navigate to ShopBite > Business Hours > Special Opening HoursClick Add New Special Opening HoursConfigure the following fields:",{"id":609,"title":610,"titles":611,"content":612,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#special-opening-hours-fields","Special Opening Hours Fields",[35,39,605],"FieldDescriptionExampleSales ChannelSelect sales channel\"My Restaurant\"DateDate of special opening24.12.2024Opening TimeSpecial opening time10:00Closing TimeSpecial closing time14:00DescriptionOptional description\"Christmas Eve - shortened hours\"",{"id":614,"title":615,"titles":616,"content":617,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_3-api-query","3. API Query",[35,39],"Business hours can be retrieved via the Store API: # API Endpoint\nGET \u002Fstore-api\u002Fshopbite\u002Fbusiness-hour\n\n# Example Response\n{\n  \"data\": [\n    {\n      \"dayOfWeek\": 1,\n      \"openingTime\": \"11:00\",\n      \"closingTime\": \"22:00\",\n      \"salesChannelId\": \"019a36f224b0704fb6835914050392f4\"\n    },\n    {\n      \"dayOfWeek\": 2,\n      \"openingTime\": \"11:00\",\n      \"closingTime\": \"22:00\",\n      \"salesChannelId\": \"019a36f224b0704fb6835914050392f4\"\n    }\n  ]\n}",{"id":619,"title":43,"titles":620,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#holiday-management",[35],{"id":622,"title":623,"titles":624,"content":625,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_1-set-up-holidays","1. Set Up Holidays",[35,43],"Navigate to ShopBite > HolidaysClick Add New HolidayConfigure the following fields:",{"id":627,"title":628,"titles":629,"content":630,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#holiday-fields","Holiday Fields",[35,43,623],"FieldDescriptionExampleNameName of the holiday\"Christmas\"Start DateBeginning of closure24.12.2024 18:00End DateEnd of closure26.12.2024 23:59Sales ChannelSelect sales channel\"My Restaurant\"Recur AnnuallyRepeat holiday annually✓DescriptionOptional description\"Christmas holidays\"",{"id":632,"title":633,"titles":634,"content":635,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#example-holidays","Example Holidays",[35,43,623],"New Year's Day: 01.01.2024 00:00 - 01.01.2024 23:59\nGood Friday: 29.03.2024 00:00 - 29.03.2024 23:59\nEaster Monday: 01.04.2024 00:00 - 01.04.2024 23:59\nLabor Day: 01.05.2024 00:00 - 01.05.2024 23:59\nChristmas: 24.12.2024 18:00 - 26.12.2024 23:59",{"id":637,"title":638,"titles":639,"content":640,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_2-recurring-holidays","2. Recurring Holidays",[35,43],"For annually recurring holidays: Enable Recur AnnuallySelect Month and DayEnter Name (e.g., \"Christmas\")Define Period (e.g., 24.12. - 26.12.)",{"id":642,"title":615,"titles":643,"content":644,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_3-api-query-1",[35,43],"Holidays can be retrieved via the Store API: # API Endpoint\nGET \u002Fstore-api\u002Fshopbite\u002Fholiday\n\n# Example Response\n{\n  \"data\": [\n    {\n      \"id\": \"019a36f224b0704fb6835914050392f4\",\n      \"start\": \"2024-12-24T18:00:00+01:00\",\n      \"end\": \"2024-12-26T23:59:00+01:00\",\n      \"salesChannelId\": \"019a36f224b0704fb6835914050392f4\",\n      \"name\": \"Christmas\",\n      \"description\": \"Christmas holidays\"\n    }\n  ]\n}",{"id":646,"title":47,"titles":647,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#checkout-extensions",[35],{"id":649,"title":650,"titles":651,"content":652,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_1-order-types","1. Order Types",[35,47],"ShopBite supports different order types: Pickup: Customers pick up the order themselvesDelivery: Order is deliveredOn Site: Order for immediate consumption on site Configure the available order types under ShopBite > Checkout > Order Types",{"id":654,"title":655,"titles":656,"content":657,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_2-time-windows-for-orders","2. Time Windows for Orders",[35,47],"Set how far in advance orders can be placed: Minimum Lead Time: 15 minutes (default)Maximum Lead Time: 7 days (default)Time Window Interval: 15 minutes (default)",{"id":659,"title":660,"titles":661,"content":662,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_3-receipt-print-types","3. Receipt Print Types",[35,47],"The plugin supports different receipt print types for products: Configure Custom Fields:Navigate to Settings > Custom FieldsSelect ShopBite Product SetConfigure Receipt Print Type for productsPrint Types:Standard: Normal receipt printKitchen: Kitchen receipt for preparationBar: Bar receipt for drinksNo Print: No receipt print required",{"id":664,"title":665,"titles":666,"content":667,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_4-delivery-time-factors","4. Delivery Time Factors",[35,47],"Configure delivery time factors for products: Standard Delivery Time: 30 minutes (configurable)Product-Specific Factors: Multiplier for standard timeExample: Pizza (factor 2) = 60 minutes delivery time",{"id":669,"title":670,"titles":671,"content":672,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_5-delivery-times-in-minutes","5. Delivery Times in Minutes",[35,47],"Shopware's own delivery times (Settings > Shop > Delivery times) only offer hours, days, weeks, months and years as units. The ShopBite Plugin adds Minute as an additional unit so that shipping methods and products can carry realistic food-delivery times such as \"30–45 min\". Navigate to Settings > Shop > Delivery timesClick Add delivery time (or open an existing one)Select Minute as the unit and enter the minimum and maximum, e.g. 30 and 45Assign the delivery time to a shipping method (Settings > Shop > Shipping) or to individual products (Product > Deliverability) The unit is exposed unchanged via the Store API (deliveryTime.unit = \"minute\"), so the storefront can display it as configured.",{"id":674,"title":675,"titles":676,"content":677,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#notes-on-the-cart-calculation","Notes on the cart calculation",[35,47,670],"Shopware calculates the estimated delivery date of the cart with a resolution of one day. For this calculation, minute-based delivery times are internally rounded up to the next full hour (e.g. 45 min → 1 hour, 90 min → 2 hours). The configured values on the delivery time itself, on the products and in the Store API are not changed by this.",{"id":679,"title":680,"titles":681,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#api-configuration","API Configuration",[35],{"id":683,"title":684,"titles":685,"content":686,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_1-set-up-api-access","1. Set Up API Access",[35,680],"Navigate to Settings > System > IntegrationsClick Add IntegrationConfigure the following settings:",{"id":688,"title":689,"titles":690,"content":691,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#api-integration-settings","API Integration Settings",[35,680,684],"FieldValueDescriptionNameShopBite StorefrontName of the integrationDescriptionAPI access for ShopBiteDescriptionPermissionsorder:read, order:write, product:readRequired API permissionsAccess TypeAdmin IntegrationFull API access",{"id":693,"title":694,"titles":695,"content":696,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_2-set-up-webhooks","2. Set Up Webhooks",[35,680],"For real-time updates: Navigate to Settings > System > WebhooksClick Add WebhookConfigure the following webhooks:",{"id":698,"title":699,"titles":700,"content":701,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#recommended-webhooks","Recommended Webhooks",[35,680,694],"EventURLDescriptionorder.state.changedhttps:\u002F\u002FYour-Storefront.de\u002Fapi\u002Fwebhooks\u002Forder-statusOrder status changesorder.createdhttps:\u002F\u002FYour-Storefront.de\u002Fapi\u002Fwebhooks\u002Forder-createdNew ordersproduct.changedhttps:\u002F\u002FYour-Storefront.de\u002Fapi\u002Fwebhooks\u002Fproduct-changedProduct changes",{"id":703,"title":704,"titles":705,"content":706,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_3-cors-configuration","3. CORS Configuration",[35,680],"Configure CORS for the storefront: # In .env or configuration\nSHOPWARE_CORS_ALLOW_ORIGIN=\"https:\u002F\u002FYour-Storefront.de\"\nSHOPWARE_CORS_ALLOW_METHODS=\"GET, POST, PUT, DELETE, OPTIONS\"\nSHOPWARE_CORS_ALLOW_HEADERS=\"Authorization, Content-Type, sw-access-key\"",{"id":708,"title":709,"titles":710,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#advanced-settings","Advanced Settings",[35],{"id":712,"title":713,"titles":714,"content":715,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_1-performance-optimization","1. Performance Optimization",[35,709],"Cache TTL: 3600 seconds (default)API Rate Limiting: 100 requests per minute (default)Database Index Optimization: Enabled (recommended)",{"id":717,"title":718,"titles":719,"content":720,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_2-logging","2. Logging",[35,709],"Log Level: Info (default), Debug (for development)Log Rotation: Daily (default)Maximum Log Size: 100MB (default)",{"id":722,"title":723,"titles":724,"content":725,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#_3-database-optimization","3. Database Optimization",[35,709],"-- Indexes for ShopBite tables\nALTER TABLE `shopbite_business_hour` ADD INDEX `idx_sales_channel` (`sales_channel_id`);\nALTER TABLE `shopbite_holiday` ADD INDEX `idx_sales_channel` (`sales_channel_id`);\n\n-- Optimization for frequent queries\nALTER TABLE `shopbite_business_hour` ADD INDEX `idx_day_of_week` (`day_of_week`);\nALTER TABLE `shopbite_holiday` ADD INDEX `idx_date_range` (`start`, `end`);",{"id":727,"title":728,"titles":729,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#troubleshooting","Troubleshooting",[35],{"id":731,"title":732,"titles":733,"content":130,"level":136},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#common-issues","Common Issues",[35,728],{"id":735,"title":736,"titles":737,"content":738,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#problem-api-connection-failed","Problem: API Connection Failed",[35,728,732],"Symptoms: \"Connection refused\" errorAPI endpoints not reachable Solutions: # Check API credentials\nbin\u002Fconsole integration:list\n\n# Check CORS settings\nbin\u002Fconsole config:get Shopware.Core.SystemConfig.corsAllowOrigin\n\n# Check firewall settings\nsudo ufw status",{"id":740,"title":741,"titles":742,"content":743,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#problem-business-hours-not-displayed","Problem: Business Hours Not Displayed",[35,728,732],"Symptoms: API returns empty resultsBusiness hours not visible Solutions: # Clear cache\nbin\u002Fconsole cache:clear\n\n# Check database\nmysql -u shopware -p shopware -e \"SELECT * FROM shopbite_business_hour;\"\n\n# Check Sales Channel ID\nbin\u002Fconsole sales-channel:list",{"id":745,"title":746,"titles":747,"content":748,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#problem-holidays-not-considered","Problem: Holidays Not Considered",[35,728,732],"Symptoms: Orders possible on holidaysHolidays not visible in API Solutions: # Check holiday data\nmysql -u shopware -p shopware -e \"SELECT * FROM shopbite_holiday;\"\n\n# Check time format\nbin\u002Fconsole database:check-timezone\n\n# Test API query\ncurl -X GET \"https:\u002F\u002FYour-Domain.de\u002Fstore-api\u002Fshopbite\u002Fholiday\" -H \"Authorization: Bearer YourToken\"",{"id":750,"title":751,"titles":752,"content":753,"level":579},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#problem-checkout-extensions-not-working","Problem: Checkout Extensions Not Working",[35,728,732],"Symptoms: Receipt print types ignoredDelivery time calculation incorrect Solutions: # Check custom fields\nbin\u002Fconsole custom-field:set:list\n\n# Clear plugin cache\nbin\u002Fconsole plugin:refresh ShopBite\n\n# Check checkout processor\nbin\u002Fconsole debug:container --tag=shopware.checkout.cart.processor",{"id":755,"title":111,"titles":756,"content":757,"level":98},"\u002Fdocs\u002Fshopware\u002Fplugin-configuration#next-steps",[35],"Business Hours Management - Detailed business hours configurationHoliday Management - Advanced holiday managementAdministration Interface - Operation of the plugin interfaceAPI Reference - Technical API documentation html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":40,"title":39,"titles":759,"content":760,"level":88},[],"The ShopBite plugin offers a powerful business hours management system, specifically designed for gastronomy and retail businesses. This chapter explains the detailed configuration and management of business hours.",{"id":762,"title":39,"titles":763,"content":760,"level":88},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#business-hours-management",[],{"id":765,"title":175,"titles":766,"content":767,"level":98},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#overview",[39],"The business hours system enables: Flexible opening hours for each day of the weekSales Channel-specific configurationSpecial opening hours for special occasionsAPI integration for the storefrontReal-time query via the Shopware Store API",{"id":769,"title":770,"titles":771,"content":772,"level":98},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#database-structure","Database Structure",[39],"CREATE TABLE `shopbite_business_hour` (\n    `id` BINARY(16) NOT NULL,\n    `day_of_week` INT(11) NOT NULL,  -- 0=Sunday, 1=Monday, ..., 6=Saturday\n    `opening_time` VARCHAR(5) NOT NULL,  -- Format: HH:MM\n    `closing_time` VARCHAR(5) NOT NULL, -- Format: HH:MM\n    `sales_channel_id` BINARY(16) NOT NULL,\n    `created_at` DATETIME(3) NOT NULL,\n    `updated_at` DATETIME(3) NULL,\n    PRIMARY KEY (`id`),\n    CONSTRAINT `fk.shopbite_business_hour.sales_channel_id` \n        FOREIGN KEY (`sales_channel_id`) \n        REFERENCES `sales_channel` (`id`) \n        ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;",{"id":774,"title":476,"titles":775,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#administration-interface",[39],{"id":777,"title":778,"titles":779,"content":780,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#business-hours-list","Business Hours List",[39,476],"Navigate to ShopBite > Business HoursOverview of all configured business hoursFiltering by Sales ChannelBulk actions (Export, Import)",{"id":782,"title":783,"titles":784,"content":785,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#add-new-business-hour","Add New Business Hour",[39,476],"Click Add new business hourFill out the form:",{"id":787,"title":788,"titles":789,"content":790,"level":579},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#form-fields","Form Fields",[39,476,783],"FieldTypeDescriptionExampleSales ChannelDropdownSelect sales channel\"My Restaurant\"Day of WeekDropdownDay of the week (0-6)1 (Monday)Opening TimeTime pickerOpening time11:00Closing TimeTime pickerClosing time22:00ClosedCheckboxMark day as closed✓",{"id":792,"title":793,"titles":794,"content":795,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#edit-business-hours","Edit Business Hours",[39,476],"Click Edit buttonAdjust fieldsClick Save",{"id":797,"title":798,"titles":799,"content":800,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#delete-business-hours","Delete Business Hours",[39,476],"Click Delete buttonConfirmation dialogClick Confirm",{"id":802,"title":803,"titles":804,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#api-integration","API Integration",[39],{"id":806,"title":807,"titles":808,"content":809,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#api-endpoint","API Endpoint",[39,803],"GET \u002Fstore-api\u002Fshopbite\u002Fbusiness-hour",{"id":811,"title":812,"titles":813,"content":814,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#request-parameters","Request Parameters",[39,803],"ParameterTypeDescriptionExamplesales-channel-idUUIDFilter by Sales Channel019a36f224b0704fb6835914050392f4include-closedBooleanInclude closed daystrue",{"id":816,"title":817,"titles":818,"content":819,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#example-request","Example Request",[39,803],"curl -X GET \"https:\u002F\u002Fyour-shopware-domain.com\u002Fstore-api\u002Fshopbite\u002Fbusiness-hour\" \\\n  -H \"Authorization: Bearer YourAPIToken\" \\\n  -H \"sw-access-key: YourAccessKey\" \\\n  -H \"Accept: application\u002Fjson\"",{"id":821,"title":822,"titles":823,"content":824,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#example-response","Example Response",[39,803],"{\n  \"apiAlias\": \"shopbite_business_hour\",\n  \"data\": [\n    {\n      \"id\": \"019a36f224b0704fb6835914050392f4\",\n      \"dayOfWeek\": 1,\n      \"openingTime\": \"11:00\",\n      \"closingTime\": \"22:00\",\n      \"salesChannelId\": \"019a36f224b0704fb6835914050392f4\",\n      \"createdAt\": \"2024-01-11T14:30:00+01:00\",\n      \"updatedAt\": \"2024-01-11T14:30:00+01:00\",\n      \"salesChannel\": {\n        \"id\": \"019a36f224b0704fb6835914050392f4\",\n        \"name\": \"My Restaurant\",\n        \"typeId\": \"019a36f224b0704fb6835914050392f4\"\n      }\n    },\n    {\n      \"id\": \"019a36f224b0704fb6835914050392f5\",\n      \"dayOfWeek\": 2,\n      \"openingTime\": \"11:00\",\n      \"closingTime\": \"22:00\",\n      \"salesChannelId\": \"019a36f224b0704fb6835914050392f4\",\n      \"createdAt\": \"2024-01-11T14:30:00+01:00\",\n      \"updatedAt\": \"2024-01-11T14:30:00+01:00\",\n      \"salesChannel\": {\n        \"id\": \"019a36f224b0704fb6835914050392f4\",\n        \"name\": \"My Restaurant\",\n        \"typeId\": \"019a36f224b0704fb6835914050392f4\"\n      }\n    }\n  ],\n  \"total\": 7\n}",{"id":826,"title":827,"titles":828,"content":829,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#error-handling","Error Handling",[39,803],"Status CodeMeaningSolution200SuccessData successfully retrieved401UnauthorizedCheck API credentials403ForbiddenCheck permissions404Not FoundEndpoint or Sales Channel not found500Internal Server ErrorCheck server logs",{"id":831,"title":832,"titles":833,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#special-opening-hours","Special Opening Hours",[39],{"id":835,"title":770,"titles":836,"content":837,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#database-structure-1",[39,832],"Special opening hours are stored in the same table, but with a special flag: -- Special opening hours are stored as separate entries\n-- with a special date instead of day of the week\nALTER TABLE `shopbite_business_hour` \nADD COLUMN `special_date` DATE NULL AFTER `day_of_week`;",{"id":839,"title":840,"titles":841,"content":842,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#management","Management",[39,832],"Navigate to ShopBite > Business Hours > Special Opening HoursClick Add new special opening hourFill out the form:",{"id":844,"title":788,"titles":845,"content":846,"level":579},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#form-fields-1",[39,832,840],"FieldTypeDescriptionExampleSales ChannelDropdownSelect sales channel\"My Restaurant\"DateDate pickerDate of special opening2024-12-24Opening TimeTime pickerSpecial opening time10:00Closing TimeTime pickerSpecial closing time14:00DescriptionTextOptional description\"Christmas Eve - shortened opening hours\"",{"id":848,"title":849,"titles":850,"content":851,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#api-query-for-special-opening-hours","API Query for Special Opening Hours",[39,832],"curl -X GET \"https:\u002F\u002Fyour-shopware-domain.com\u002Fstore-api\u002Fshopbite\u002Fbusiness-hour?special=true\" \\\n  -H \"Authorization: Bearer YourAPIToken\" \\\n  -H \"sw-access-key: YourAccessKey\"",{"id":853,"title":854,"titles":855,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#best-practices","Best Practices",[39],{"id":857,"title":858,"titles":859,"content":860,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#_1-consistent-time-settings","1. Consistent Time Settings",[39,854],"Always use the 24-hour format (HH:MM)Ensure that opening time \u003C closing timeFor overnight opening: opening time = 18:00, closing time = 02:00 (next day)",{"id":862,"title":863,"titles":864,"content":865,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#_2-sales-channel-specific-configuration","2. Sales Channel-specific Configuration",[39,854],"Each sales channel can have its own business hoursIdeal for multiple locations or servicesExample: Restaurant vs. Catering Service",{"id":867,"title":868,"titles":869,"content":870,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#_3-performance-optimization","3. Performance Optimization",[39,854],"-- Indexes for better performance\nCREATE INDEX `idx_sales_channel` ON `shopbite_business_hour` (`sales_channel_id`);\nCREATE INDEX `idx_day_of_week` ON `shopbite_business_hour` (`day_of_week`);\n\n-- For special opening hours\nCREATE INDEX `idx_special_date` ON `shopbite_business_hour` (`special_date`);",{"id":872,"title":873,"titles":874,"content":875,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#_4-caching-strategy","4. Caching Strategy",[39,854],"# In config\u002Fpackages\u002Fcache.yaml\nframework:\n    cache:\n        pools:\n            shopbite.business_hours:\n                adapter: cache.adapter.redis\n                default_lifetime: 3600  # 1 hour cache",{"id":877,"title":878,"titles":879,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#storefront-integration","Storefront Integration",[39],{"id":881,"title":882,"titles":883,"content":884,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#javascript-example","JavaScript Example",[39,878],"\u002F\u002F Fetch business hours\nasync function fetchBusinessHours(salesChannelId) {\n  const response = await fetch(\n    `\u002Fstore-api\u002Fshopbite\u002Fbusiness-hour?sales-channel-id=${salesChannelId}`,\n    {\n      headers: {\n        'Authorization': `Bearer ${apiToken}`,\n        'sw-access-key': accessKey\n      }\n    }\n  );\n  \n  if (!response.ok) {\n    throw new Error('Failed to fetch business hours');\n  }\n  \n  return await response.json();\n}\n\n\u002F\u002F Display business hours\nfunction displayBusinessHours(hours) {\n  const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n  \n  hours.data.forEach(hour => {\n    const dayName = days[hour.dayOfWeek];\n    console.log(`${dayName}: ${hour.openingTime} - ${hour.closingTime}`);\n  });\n}\n\n\u002F\u002F Example call\nfetchBusinessHours('019a36f224b0704fb6835914050392f4')\n  .then(displayBusinessHours)\n  .catch(console.error);",{"id":886,"title":887,"titles":888,"content":889,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#vuejs-component","Vue.js Component",[39,878],"\u003Ctemplate>\n  \u003Cdiv class=\"business-hours\">\n    \u003Ch3>Opening Hours\u003C\u002Fh3>\n    \u003Cdiv v-for=\"hour in businessHours\" :key=\"hour.id\" class=\"hour-item\">\n      \u003Cspan class=\"day\">{{ getDayName(hour.dayOfWeek) }}\u003C\u002Fspan>\n      \u003Cspan class=\"time\">{{ hour.openingTime }} - {{ hour.closingTime }}\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nexport default {\n  data() {\n    return {\n      businessHours: [],\n      days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n    };\n  },\n  \n  async mounted() {\n    await this.fetchBusinessHours();\n  },\n  \n  methods: {\n    getDayName(dayOfWeek) {\n      return this.days[dayOfWeek];\n    },\n    \n    async fetchBusinessHours() {\n      try {\n        const response = await this.$axios.get('\u002Fstore-api\u002Fshopbite\u002Fbusiness-hour');\n        this.businessHours = response.data.data;\n      } catch (error) {\n        console.error('Failed to fetch business hours:', error);\n      }\n    }\n  }\n};\n\u003C\u002Fscript>\n\n\u003Cstyle scoped>\n.business-hours {\n  margin: 20px 0;\n  padding: 15px;\n  background: #f5f5f5;\n  border-radius: 8px;\n}\n\n.hour-item {\n  display: flex;\n  justify-content: space-between;\n  padding: 8px 0;\n  border-bottom: 1px solid #ddd;\n}\n\n.day {\n  font-weight: bold;\n}\n\n.time {\n  color: #666;\n}\n\u003C\u002Fstyle>",{"id":891,"title":892,"titles":893,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#troubleshooting-and-debugging","Troubleshooting and Debugging",[39],{"id":895,"title":732,"titles":896,"content":130,"level":136},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#common-issues",[39,892],{"id":898,"title":899,"titles":900,"content":901,"level":579},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#problem-business-hours-are-not-displayed","Problem: Business hours are not displayed",[39,892,732],"Causes: Cache issuesIncorrect Sales Channel IDDatabase connection error Solutions: # Clear cache\nbin\u002Fconsole cache:clear\n\n# Check database\nmysql -u shopware -p shopware -e \"SELECT * FROM shopbite_business_hour;\"\n\n# Check Sales Channel ID\nbin\u002Fconsole sales-channel:list",{"id":903,"title":904,"titles":905,"content":906,"level":579},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#problem-api-delivers-empty-results","Problem: API delivers empty results",[39,892,732],"Causes: No data in the databaseIncorrect permissionsIncorrect filter parameters Solutions: # Check database\nmysql -u shopware -p shopware -e \"SELECT COUNT(*) FROM shopbite_business_hour;\"\n\n# Check API permissions\nbin\u002Fconsole integration:list\n\n# API test\ncurl -X GET \"https:\u002F\u002Fyour-domain.com\u002Fstore-api\u002Fshopbite\u002Fbusiness-hour\" -H \"Authorization: Bearer YourToken\"",{"id":908,"title":909,"titles":910,"content":911,"level":579},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#problem-incorrect-time-format","Problem: Incorrect time format",[39,892,732],"Causes: Incorrect time format in the databaseTime zone issues Solutions: # Check time format\nmysql -u shopware -p shopware -e \"SELECT opening_time, closing_time FROM shopbite_business_hour LIMIT 5;\"\n\n# Check time zone\nbin\u002Fconsole config:get Shopware.Core.SystemConfig.timezone",{"id":913,"title":111,"titles":914,"content":915,"level":98},"\u002Fdocs\u002Fshopware\u002Fbusiness-hours#next-steps",[39],"Holiday Management - Configure closing days and holidaysAdministration Interface - Operating the plugin interfaceAPI Reference - Technical API documentationTroubleshooting - Problem handling and support html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}",{"id":44,"title":43,"titles":917,"content":918,"level":88},[],"The ShopBite plugin offers a comprehensive holiday management system, specifically designed for gastronomy and retail businesses. This chapter explains the detailed configuration and management of holidays and closing days.",{"id":920,"title":43,"titles":921,"content":918,"level":88},"\u002Fdocs\u002Fshopware\u002Fholidays#holiday-management",[],{"id":923,"title":175,"titles":924,"content":925,"level":98},"\u002Fdocs\u002Fshopware\u002Fholidays#overview",[43],"The holiday management system enables: One-time holidays: Configuration of individual closing daysRecurring holidays: Annually repeating holidaysPeriod-based closures: Multi-day closures (e.g., Christmas)Sales Channel-specific: Different holidays for different sales channelsAPI integration: Retrieval via the Shopware Store API",{"id":927,"title":770,"titles":928,"content":929,"level":98},"\u002Fdocs\u002Fshopware\u002Fholidays#database-structure",[43],"CREATE TABLE `shopbite_holiday` (\n    `id` BINARY(16) NOT NULL,\n    `start` DATETIME(3) NOT NULL,  -- Start of closure\n    `end` DATETIME(3) NOT NULL,    -- End of closure\n    `sales_channel_id` BINARY(16) NOT NULL,\n    `name` VARCHAR(255) NULL,     -- Name of holiday\n    `description` TEXT NULL,      -- Description\n    `recurring` TINYINT(1) DEFAULT 0,  -- Annually repeating\n    `created_at` DATETIME(3) NOT NULL,\n    `updated_at` DATETIME(3) NULL,\n    PRIMARY KEY (`id`),\n    KEY `fk.shopbite_holiday.sales_channel_id` (`sales_channel_id`),\n    CONSTRAINT `fk.shopbite_holiday.sales_channel_id` \n        FOREIGN KEY (`sales_channel_id`) \n        REFERENCES `sales_channel` (`id`) \n        ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;",{"id":931,"title":476,"titles":932,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fholidays#administration-interface",[43],{"id":934,"title":935,"titles":936,"content":937,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#holiday-list","Holiday List",[43,476],"Navigate to ShopBite > HolidaysOverview of all configured holidaysFiltering by Sales Channel and dateBulk actions (Export, Import)",{"id":939,"title":940,"titles":941,"content":942,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#add-new-holiday","Add New Holiday",[43,476],"Click Add new holidayFill out the form:",{"id":944,"title":788,"titles":945,"content":946,"level":579},"\u002Fdocs\u002Fshopware\u002Fholidays#form-fields",[43,476,940],"FieldTypeDescriptionExampleNameTextName of the holiday\"Christmas\"Start DateDate\u002FTimeStart of closure2024-12-24 18:00End DateDate\u002FTimeEnd of closure2024-12-26 23:59Sales ChannelDropdownSelect sales channel\"My Restaurant\"Repeat annuallyCheckboxRepeat holiday annually✓DescriptionTextareaOptional description\"Christmas holidays - closed\"",{"id":948,"title":949,"titles":950,"content":795,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#edit-holidays","Edit Holidays",[43,476],{"id":952,"title":953,"titles":954,"content":800,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#delete-holidays","Delete Holidays",[43,476],{"id":956,"title":803,"titles":957,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fholidays#api-integration",[43],{"id":959,"title":807,"titles":960,"content":961,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#api-endpoint",[43,803],"GET \u002Fstore-api\u002Fshopbite\u002Fholiday",{"id":963,"title":812,"titles":964,"content":965,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#request-parameters",[43,803],"ParameterTypeDescriptionExamplesales-channel-idUUIDFilter by Sales Channel019a36f224b0704fb6835914050392f4from-dateDateFilter by start date2024-01-01to-dateDateFilter by end date2024-12-31include-recurringBooleanInclude recurring holidaystrue",{"id":967,"title":817,"titles":968,"content":969,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#example-request",[43,803],"curl -X GET \"https:\u002F\u002Fyour-shopware-domain.com\u002Fstore-api\u002Fshopbite\u002Fholiday\" \\\n  -H \"Authorization: Bearer YourAPIToken\" \\\n  -H \"sw-access-key: YourAccessKey\" \\\n  -H \"Accept: application\u002Fjson\"",{"id":971,"title":822,"titles":972,"content":973,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#example-response",[43,803],"{\n  \"apiAlias\": \"shopbite_holiday\",\n  \"data\": [\n    {\n      \"id\": \"019a36f224b0704fb6835914050392f4\",\n      \"start\": \"2024-12-24T18:00:00+01:00\",\n      \"end\": \"2024-12-26T23:59:00+01:00\",\n      \"salesChannelId\": \"019a36f224b0704fb6835914050392f4\",\n      \"name\": \"Christmas\",\n      \"description\": \"Christmas holidays - closed\",\n      \"recurring\": false,\n      \"createdAt\": \"2024-01-11T14:30:00+01:00\",\n      \"updatedAt\": \"2024-01-11T14:30:00+01:00\",\n      \"salesChannel\": {\n        \"id\": \"019a36f224b0704fb6835914050392f4\",\n        \"name\": \"My Restaurant\",\n        \"typeId\": \"019a36f224b0704fb6835914050392f4\"\n      }\n    },\n    {\n      \"id\": \"019a36f224b0704fb6835914050392f5\",\n      \"start\": \"2024-01-01T00:00:00+01:00\",\n      \"end\": \"2024-01-01T23:59:00+01:00\",\n      \"salesChannelId\": \"019a36f224b0704fb6835914050392f4\",\n      \"name\": \"New Year\",\n      \"description\": \"Closed\",\n      \"recurring\": true,\n      \"createdAt\": \"2024-01-11T14:30:00+01:00\",\n      \"updatedAt\": \"2024-01-11T14:30:00+01:00\",\n      \"salesChannel\": {\n        \"id\": \"019a36f224b0704fb6835914050392f4\",\n        \"name\": \"My Restaurant\",\n        \"typeId\": \"019a36f224b0704fb6835914050392f4\"\n      }\n    }\n  ],\n  \"total\": 10\n}",{"id":975,"title":827,"titles":976,"content":829,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#error-handling",[43,803],{"id":978,"title":979,"titles":980,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fholidays#recurring-holidays","Recurring Holidays",[43],{"id":982,"title":983,"titles":984,"content":985,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#how-it-works","How it works",[43,979],"Recurring holidays are automatically recreated for each year: Annual creation: On January 1st of each yearPeriod: Based on the original dateNotification: Admin notification upon creation",{"id":987,"title":840,"titles":988,"content":989,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#management",[43,979],"Navigate to ShopBite > Holidays > Recurring HolidaysClick Add new recurring holidayFill out the form:",{"id":991,"title":788,"titles":992,"content":993,"level":579},"\u002Fdocs\u002Fshopware\u002Fholidays#form-fields-1",[43,979,840],"FieldTypeDescriptionExampleNameTextName of the holiday\"Christmas\"MonthDropdownSelect monthDecemberDayNumberDay in month25Start TimeTimeStart of closure18:00End TimeTimeEnd of closure23:59Sales ChannelDropdownSelect sales channel\"My Restaurant\"DescriptionTextareaOptional description\"Christmas holidays\"",{"id":995,"title":996,"titles":997,"content":998,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#api-query-for-recurring-holidays","API Query for Recurring Holidays",[43,979],"curl -X GET \"https:\u002F\u002Fyour-shopware-domain.com\u002Fstore-api\u002Fshopbite\u002Fholiday?include-recurring=true\" \\\n  -H \"Authorization: Bearer YourAPIToken\" \\\n  -H \"sw-access-key: YourAccessKey\"",{"id":1000,"title":854,"titles":1001,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fholidays#best-practices",[43],{"id":1003,"title":1004,"titles":1005,"content":1006,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#_1-consistent-date-formats","1. Consistent Date Formats",[43,854],"Always use the ISO-8601 format (YYYY-MM-DD)Time entries in 24-hour format (HH:MM:SS)Consider time zones (Default: Europe\u002FBerlin)",{"id":1008,"title":1009,"titles":1010,"content":1011,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#_2-avoid-overlapping-holidays","2. Avoid Overlapping Holidays",[43,854],"Check for overlaps with other holidaysUse the calendar in the administrationUtilize validation when saving",{"id":1013,"title":868,"titles":1014,"content":1015,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#_3-performance-optimization",[43,854],"-- Indexes for better performance\nCREATE INDEX `idx_sales_channel` ON `shopbite_holiday` (`sales_channel_id`);\nCREATE INDEX `idx_date_range` ON `shopbite_holiday` (`start`, `end`);\nCREATE INDEX `idx_recurring` ON `shopbite_holiday` (`recurring`);",{"id":1017,"title":873,"titles":1018,"content":1019,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#_4-caching-strategy",[43,854],"# In config\u002Fpackages\u002Fcache.yaml\nframework:\n    cache:\n        pools:\n            shopbite.holidays:\n                adapter: cache.adapter.redis\n                default_lifetime: 86400  # 24 hour cache",{"id":1021,"title":1022,"titles":1023,"content":1024,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#_5-automatic-notifications","5. Automatic Notifications",[43,854],"Set up notifications for upcoming holidays: \u002F\u002F In a cron job or event listener\n$upcomingHolidays = $holidayRepository->getUpcomingHolidays(7); \u002F\u002F Next 7 days\n\nforeach ($upcomingHolidays as $holiday) {\n    $mailer->sendHolidayReminder($holiday);\n}",{"id":1026,"title":878,"titles":1027,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fholidays#storefront-integration",[43],{"id":1029,"title":882,"titles":1030,"content":1031,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#javascript-example",[43,878],"\u002F\u002F Fetch holidays\nasync function fetchHolidays(salesChannelId, fromDate, toDate) {\n  const params = new URLSearchParams({\n    'sales-channel-id': salesChannelId,\n    'from-date': fromDate,\n    'to-date': toDate\n  });\n  \n  const response = await fetch(\n    `\u002Fstore-api\u002Fshopbite\u002Fholiday?${params.toString()}`,\n    {\n      headers: {\n        'Authorization': `Bearer ${apiToken}`,\n        'sw-access-key': accessKey\n      }\n    }\n  );\n  \n  if (!response.ok) {\n    throw new Error('Failed to fetch holidays');\n  }\n  \n  return await response.json();\n}\n\n\u002F\u002F Display holidays\nfunction displayHolidays(holidays) {\n  holidays.data.forEach(holiday => {\n    const start = new Date(holiday.start);\n    const end = new Date(holiday.end);\n    \n    console.log(`${holiday.name}: ${start.toLocaleDateString()} - ${end.toLocaleDateString()}`);\n    console.log(`Description: ${holiday.description || 'No description'}`);\n  });\n}\n\n\u002F\u002F Example call\nconst today = new Date().toISOString().split('T')[0];\nconst nextYear = new Date();\nnextYear.setFullYear(nextYear.getFullYear() + 1);\nconst nextYearEnd = nextYear.toISOString().split('T')[0];\n\nfetchHolidays('019a36f224b0704fb6835914050392f4', today, nextYearEnd)\n  .then(displayHolidays)\n  .catch(console.error);",{"id":1033,"title":887,"titles":1034,"content":1035,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#vuejs-component",[43,878],"\u003Ctemplate>\n  \u003Cdiv class=\"holidays\">\n    \u003Ch3>Holidays and Closing Days\u003C\u002Fh3>\n    \u003Cdiv v-for=\"holiday in holidays\" :key=\"holiday.id\" class=\"holiday-item\">\n      \u003Cdiv class=\"holiday-header\">\n        \u003Cspan class=\"holiday-name\">{{ holiday.name }}\u003C\u002Fspan>\n        \u003Cspan v-if=\"holiday.recurring\" class=\"badge recurring\">Annual\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"holiday-dates\">\n        {{ formatDate(holiday.start) }} - {{ formatDate(holiday.end) }}\n      \u003C\u002Fdiv>\n      \u003Cdiv v-if=\"holiday.description\" class=\"holiday-description\">\n        {{ holiday.description }}\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nexport default {\n  data() {\n    return {\n      holidays: [],\n      loading: false,\n      error: null\n    };\n  },\n  \n  async mounted() {\n    await this.fetchHolidays();\n  },\n  \n  methods: {\n    formatDate(dateString) {\n      const date = new Date(dateString);\n      return date.toLocaleDateString('en-GB', {\n        weekday: 'short',\n        day: 'numeric',\n        month: 'short',\n        year: 'numeric',\n        hour: '2-digit',\n        minute: '2-digit'\n      });\n    },\n    \n    async fetchHolidays() {\n      this.loading = true;\n      this.error = null;\n      \n      try {\n        const response = await this.$axios.get('\u002Fstore-api\u002Fshopbite\u002Fholiday');\n        this.holidays = response.data.data;\n      } catch (error) {\n        console.error('Failed to fetch holidays:', error);\n        this.error = 'Holidays could not be loaded.';\n      } finally {\n        this.loading = false;\n      }\n    }\n  }\n};\n\u003C\u002Fscript>\n\n\u003Cstyle scoped>\n.holidays {\n  margin: 20px 0;\n  padding: 15px;\n  background: #fff5f5;\n  border-radius: 8px;\n  border: 1px solid #ffebee;\n}\n\n.holiday-item {\n  padding: 12px 0;\n  border-bottom: 1px solid #ffcdcd;\n}\n\n.holiday-item:last-child {\n  border-bottom: none;\n}\n\n.holiday-header {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  margin-bottom: 4px;\n}\n\n.holiday-name {\n  font-weight: bold;\n  color: #d32f2f;\n}\n\n.badge {\n  padding: 2px 6px;\n  border-radius: 4px;\n  font-size: 12px;\n  font-weight: bold;\n}\n\n.badge.recurring {\n  background: #ffeb3b;\n  color: #000;\n}\n\n.holiday-dates {\n  color: #b71c1c;\n  font-size: 14px;\n  margin-bottom: 4px;\n}\n\n.holiday-description {\n  color: #666;\n  font-size: 13px;\n  font-style: italic;\n}\n\u003C\u002Fstyle>",{"id":1037,"title":892,"titles":1038,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fholidays#troubleshooting-and-debugging",[43],{"id":1040,"title":732,"titles":1041,"content":130,"level":136},"\u002Fdocs\u002Fshopware\u002Fholidays#common-issues",[43,892],{"id":1043,"title":1044,"titles":1045,"content":1046,"level":579},"\u002Fdocs\u002Fshopware\u002Fholidays#problem-holidays-are-not-taken-into-account","Problem: Holidays are not taken into account",[43,892,732],"Symptoms: Orders possible on holidaysHolidays not visible in API Solutions: # Check holiday data\nmysql -u shopware -p shopware -e \"SELECT * FROM shopbite_holiday;\"\n\n# Check time format\nbin\u002Fconsole database:check-timezone\n\n# Test API query\ncurl -X GET \"https:\u002F\u002Fyour-domain.com\u002Fstore-api\u002Fshopbite\u002Fholiday\" -H \"Authorization: Bearer YourToken\"",{"id":1048,"title":1049,"titles":1050,"content":1051,"level":579},"\u002Fdocs\u002Fshopware\u002Fholidays#problem-recurring-holidays-are-not-created","Problem: Recurring holidays are not created",[43,892,732],"Symptoms: Recurring holidays are missingNo automatic creation Solutions: # Check cron job\ncrontab -l\n\n# Execute manually\nbin\u002Fconsole shopbite:holidays:generate-recurring\n\n# Check logs\ntail -n 50 \u002Fvar\u002Flog\u002Fshopware\u002Fprod.log | grep holiday",{"id":1053,"title":1054,"titles":1055,"content":1056,"level":579},"\u002Fdocs\u002Fshopware\u002Fholidays#problem-time-overlaps","Problem: Time overlaps",[43,892,732],"Symptoms: Holidays overlapIncorrect closing times Solutions: # Check for overlaps\nmysql -u shopware -p shopware -e \"\n  SELECT * FROM shopbite_holiday \n  WHERE start \u003C (SELECT end FROM shopbite_holiday WHERE id != shopbite_holiday.id)\n  AND end > (SELECT start FROM shopbite_holiday WHERE id != shopbite_holiday.id);\"\n\n# Enable validation\nbin\u002Fconsole config:set ShopBitePlugin.config.validateHolidayOverlaps true",{"id":1058,"title":111,"titles":1059,"content":1060,"level":98},"\u002Fdocs\u002Fshopware\u002Fholidays#next-steps",[43],"Checkout Extensions - Configure special checkout functionsAdministration Interface - Operating the plugin interfaceAPI Reference - Technical API documentationTroubleshooting - Problem handling and support html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}",{"id":48,"title":47,"titles":1062,"content":1063,"level":88},[],"The ShopBite plugin offers advanced checkout functions specifically developed for gastronomy and retail businesses. This chapter explains the configuration and use of these functions.",{"id":1065,"title":47,"titles":1066,"content":1063,"level":88},"\u002Fdocs\u002Fshopware\u002Fcheckout#checkout-extensions",[],{"id":1068,"title":175,"titles":1069,"content":1070,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#overview",[47],"The checkout extensions include: Container-based products: Special processing for product groupsReceipt print types: Different print formats for various productsCustom Fields: Advanced product attributes for gastronomyDelivery time calculation: Dynamic calculation based on product attributesCart suggestions: Suggest add-ons such as desserts in the cart (up-selling)Order types: Pickup, Delivery, On-site",{"id":1072,"title":1073,"titles":1074,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#container-based-products","Container-based Products",[47],{"id":1076,"title":983,"titles":1077,"content":1078,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#how-it-works",[47,1073],"Container-based products allow the grouping of items: Example: Menu with main dish, side dish, and drinkAdvantages: Easy ordering of complex product combinationsProcessing: Special logic in the checkout process",{"id":1080,"title":61,"titles":1081,"content":1082,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#configuration",[47,1073],"Create product:Navigate to Catalog > ProductsCreate New productProduct type: Select \"Container\"Define container contents:Add container elementsMark Mandatory fieldsConfigure Selection optionsPricing:Fixed price: Total price for the containerDynamic price: Sum of included itemsDiscounts: Container-specific discounts",{"id":1084,"title":1085,"titles":1086,"content":1087,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#example-pizza-menu","Example: Pizza Menu",[47,1073],"Container: Pizza Menu\n- Main dish: Pizza (Mandatory)\n  - Options: Margherita, Salami, Hawaii\n- Side dish: Salad or Fries (Mandatory)\n  - Options: Caesar Salad, Mixed Salad, Fries\n- Drink: Optional\n  - Options: Cola, Fanta, Water, Beer",{"id":1089,"title":1090,"titles":1091,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#receipt-print-types","Receipt Print Types",[47],{"id":1093,"title":1094,"titles":1095,"content":1096,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#custom-fields-configuration","Custom Fields Configuration",[47,1090],"Set up Custom Fields:Navigate to Settings > Custom FieldsSelect ShopBite Product SetReceipt Print Type field:Field name: shopbite_receipt_print_typeType: Select fieldOptions:\nstandard: Normal receipt printingkitchen: Kitchen receipt for preparationbar: Bar receipt for drinksno_print: No receipt printing required",{"id":1098,"title":1099,"titles":1100,"content":1101,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#product-configuration","Product Configuration",[47,1090],"Edit product:Navigate to Catalog > ProductsSelect productSet Custom Fields:Select Receipt Print TypeSave",{"id":1103,"title":600,"titles":1104,"content":1105,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#example-configuration",[47,1090],"ProductReceipt Print TypeDescriptionPizza MargheritakitchenPrepared in the kitchenCola 0.33lbarServed at the barDessertstandardNormal receipt printingVoucherno_printNo physical receipt needed",{"id":1107,"title":1108,"titles":1109,"content":1110,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#technical-implementation","Technical Implementation",[47,1090],"The ReceiptPrintTypeProcessor processes the receipt print types: \u002F\u002F src\u002FCheckout\u002FCart\u002FReceiptPrintTypeProcessor.php\n\npublic function process(CartDataCollection $data, Cart $original, Cart $toCalculate, SalesChannelContext $context, CartBehavior $behavior): void\n{\n    foreach ($toCalculate->getLineItems()->filterFlatByType(LineItem::PRODUCT_LINE_ITEM_TYPE) as $lineItem) {\n        $productId = $lineItem->getReferencedId();\n        if ($productId === null) {\n            continue;\n        }\n        \n        $product = $data->get(self::DATA_KEY . $productId);\n        if ($product === null) {\n            continue;\n        }\n        \n        $customFields = $product->getCustomFields() ?? [];\n        if (!isset($customFields[CustomFieldsInstaller::SHOPBITE_RECEIPT_PRINT_TYPE])) {\n            continue;\n        }\n        \n        $lineItem->setPayloadValue(\n            CustomFieldsInstaller::SHOPBITE_RECEIPT_PRINT_TYPE,\n            $customFields[CustomFieldsInstaller::SHOPBITE_RECEIPT_PRINT_TYPE]\n        );\n    }\n}",{"id":1112,"title":1113,"titles":1114,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#delivery-time-calculation","Delivery Time Calculation",[47],{"id":1116,"title":1117,"titles":1118,"content":1119,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#custom-fields-for-delivery-times","Custom Fields for Delivery Times",[47,1113],"Delivery time factor field:Field name: shopbite_delivery_time_factorType: IntegerDefault value: 1Product configuration:Factor 1: Standard delivery timeFactor 2: Double delivery timeFactor 3: Triple delivery time",{"id":1121,"title":1122,"titles":1123,"content":1124,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#calculation-logic","Calculation Logic",[47,1113],"\u002F\u002F Example calculation in the storefront\nfunction calculateDeliveryTime(product) {\n    const baseTime = 30; \u002F\u002F Base delivery time in minutes\n    const factor = product.customFields?.shopbite_delivery_time_factor || 1;\n    \n    return baseTime * factor; \u002F\u002F Result in minutes\n}\n\n\u002F\u002F Example\nconst pizza = { customFields: { shopbite_delivery_time_factor: 2 } };\nconst deliveryTime = calculateDeliveryTime(pizza); \u002F\u002F 60 minutes",{"id":1126,"title":1127,"titles":1128,"content":1129,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#example-products","Example Products",[47,1113],"ProductFactorCalculated Delivery TimePizza260 minutesSalad130 minutesDrink0.515 minutesDessert130 minutes",{"id":1131,"title":1132,"titles":1133,"content":1134,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#cart-suggestions-up-selling","Cart Suggestions (Up-Selling)",[47],"Right before checkout, the storefront shows products in the cart that customers can add with one click, e.g. a tiramisu for dessert. You choose which products appear there on the product itself. Shopware's cross-selling is not used for this, because in ShopBite it already models the extras of a product (e.g. \"Extras\", \"Side dishes\").",{"id":1136,"title":1137,"titles":1138,"content":1139,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#mark-a-product-as-a-suggestion","Mark a product as a suggestion",[47,1132],"Navigate to Catalog > Products and open the productIn the ShopBite custom field set, tick the checkbox Cart suggestion (up-selling)Save The field is created when the plugin is installed or updated. If it is missing after an update, run bin\u002Fconsole plugin:update ShopBitePlugin. PropertyValueField nameshopbite_cart_upsellTypeCheckbox (boolean)Custom field setshopbite_product_set Only products that are active and visible in the sales channel are suggested.",{"id":1141,"title":1142,"titles":1143,"content":1144,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#variants","Variants",[47,1132],"The storefront loads the suggestions with inheritance. If the checkbox is ticked on the parent product, it applies to all of its variants. The parent product itself is never suggested, since it cannot be added to the cart directly. To suggest only one specific variant, tick the checkbox on that single variant instead of the parent.",{"id":1146,"title":1147,"titles":1148,"content":1149,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#store-api-query","Store API query",[47,1132],"There is no dedicated endpoint. The storefront filters the standard product listing by the custom field: curl -X POST \"https:\u002F\u002Fyour-shopware-domain.com\u002Fstore-api\u002Fproduct\" \\\n  -H \"sw-access-key: YourAccessKey\" \\\n  -H \"sw-inheritance: true\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": [\n      { \"type\": \"equals\", \"field\": \"customFields.shopbite_cart_upsell\", \"value\": true },\n      { \"type\": \"equals\", \"field\": \"childCount\", \"value\": 0 }\n    ]\n  }' The sw-inheritance: true header makes variants inherit the value from their parent product. The childCount = 0 filter excludes parent products that have variants.",{"id":1151,"title":1152,"titles":1153,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#order-types","Order Types",[47],{"id":1155,"title":61,"titles":1156,"content":1157,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#configuration-1",[47,1152],"Enable order types:Navigate to ShopBite > Checkout > Order TypesEnable desired typesOrder types:Pickup: Customers pick up the order themselvesDelivery: Order is deliveredOn-site: Order for immediate consumption",{"id":1159,"title":1160,"titles":1161,"content":1162,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#checkout-integration","Checkout Integration",[47,1152],"\u002F\u002F Order types in the storefront\nconst orderTypes = [\n    { id: 'pickup', name: 'Pickup', description: 'Self pickup' },\n    { id: 'delivery', name: 'Delivery', description: 'Delivery' },\n    { id: 'on_site', name: 'On-site', description: 'Eat here' }\n];\n\n\u002F\u002F Select order type\nfunction selectOrderType(typeId) {\n    \u002F\u002F Logic for selecting order type\n    console.log(`Order type selected: ${typeId}`);\n}",{"id":1164,"title":1165,"titles":1166,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#custom-fields-installation","Custom Fields Installation",[47],{"id":1168,"title":1169,"titles":1170,"content":1171,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#automatic-installation","Automatic Installation",[47,1165],"The plugin installs the Custom Fields automatically: \u002F\u002F src\u002FService\u002FCustomFieldsInstaller.php\n\npublic function install(Context $context): void\n{\n    $customFieldSetId = Uuid::fromHexToBytes(self::CUSTOM_FIELDSET_ID);\n    \n    $customFieldSetData = [\n        'id' => self::CUSTOM_FIELDSET_ID,\n        'name' => self::CUSTOM_FIELDSET_NAME,\n        'config' => [\n            'label' => [\n                'en-GB' => 'ShopBite',\n                'de-DE' => 'ShopBite',\n            ],\n        ],\n        'customFields' => [\n            [\n                'id' => '0198be8b24a0722cac46b07e3a9686ec',\n                'name' => 'shopbite_delivery_time_factor',\n                'type' => CustomFieldTypes::INT,\n                'config' => [\n                    'label' => [\n                        'en-GB' => 'Delivery Time Factor',\n                        'de-DE' => 'Lieferzeitfaktor',\n                    ],\n                ],\n            ],\n            [\n                'id' => '01944f2b1875706596395b8d23966952',\n                'name' => self::SHOPBITE_RECEIPT_PRINT_TYPE,\n                'type' => CustomFieldTypes::SELECT,\n                'config' => [\n                    'label' => [\n                        'en-GB' => 'Receipt Print Type',\n                        'de-DE' => 'Bon-Drucktyp',\n                    ],\n                    'options' => [\n                        ['value' => 'standard', 'label' => ['en-GB' => 'Standard', 'de-DE' => 'Standard']],\n                        ['value' => 'kitchen', 'label' => ['en-GB' => 'Kitchen', 'de-DE' => 'Küche']],\n                        ['value' => 'bar', 'label' => ['en-GB' => 'Bar', 'de-DE' => 'Bar']],\n                        ['value' => 'no_print', 'label' => ['en-GB' => 'No Print', 'de-DE' => 'Kein Druck']],\n                    ],\n                ],\n            ],\n        ],\n    ];\n    \n    $this->customFieldSetRepository->upsert([$customFieldSetData], $context);\n}",{"id":1173,"title":1174,"titles":1175,"content":1176,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#manual-installation","Manual Installation",[47,1165],"If automatic installation fails: # Manually install Custom Fields\nbin\u002Fconsole shopbite:custom-fields:install\n\n# Check Custom Fields\nbin\u002Fconsole custom-field:set:list | grep shopbite",{"id":1178,"title":803,"titles":1179,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#api-integration",[47],{"id":1181,"title":1182,"titles":1183,"content":1184,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#checkout-api-endpoints","Checkout API Endpoints",[47,803],"POST \u002Fstore-api\u002Fcheckout\u002Fcart\u002Fline-item",{"id":1186,"title":817,"titles":1187,"content":1188,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#example-request",[47,803],"curl -X POST \"https:\u002F\u002Fyour-shopware-domain.com\u002Fstore-api\u002Fcheckout\u002Fcart\u002Fline-item\" \\\n  -H \"Authorization: Bearer YourAPIToken\" \\\n  -H \"sw-access-key: YourAccessKey\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"items\": [\n      {\n        \"id\": \"019a36f224b0704fb6835914050392f4\",\n        \"type\": \"product\",\n        \"referencedId\": \"019a36f224b0704fb6835914050392f4\",\n        \"quantity\": 1,\n        \"payload\": {\n          \"shopbite_receipt_print_type\": \"kitchen\",\n          \"shopbite_delivery_time_factor\": 2\n        }\n      }\n    ]\n  }'",{"id":1190,"title":822,"titles":1191,"content":1192,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#example-response",[47,803],"{\n  \"data\": {\n    \"lineItems\": [\n      {\n        \"id\": \"019a36f224b0704fb6835914050392f4\",\n        \"type\": \"product\",\n        \"referencedId\": \"019a36f224b0704fb6835914050392f4\",\n        \"quantity\": 1,\n        \"payload\": {\n          \"shopbite_receipt_print_type\": \"kitchen\",\n          \"shopbite_delivery_time_factor\": 2\n        }\n      }\n    ],\n    \"deliveryTime\": 60\n  }\n}",{"id":1194,"title":854,"titles":1195,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#best-practices",[47],{"id":1197,"title":1198,"titles":1199,"content":1200,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#_1-consistent-product-configuration","1. Consistent Product Configuration",[47,854],"Use uniform Custom Fields for all productsDocument the meaning of the fieldsTrain your team in correct usage",{"id":1202,"title":1203,"titles":1204,"content":1205,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#_2-performance-optimization","2. Performance Optimization",[47,854],"-- Indexes for Custom Fields\nCREATE INDEX `idx_custom_fields` ON `product` (`custom_fields`);\n\n-- Optimization for frequent queries\nCREATE INDEX `idx_receipt_print_type` ON `product` \n  ((CAST(custom_fields->>'$.shopbite_receipt_print_type' AS CHAR(50))));",{"id":1207,"title":1208,"titles":1209,"content":1210,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#_3-validation","3. Validation",[47,854],"\u002F\u002F Validation in the checkout process\npublic function validateCheckout(Cart $cart): array\n{\n    $errors = [];\n    \n    foreach ($cart->getLineItems() as $lineItem) {\n        $payload = $lineItem->getPayload();\n        \n        if (!isset($payload['shopbite_receipt_print_type'])) {\n            $errors[] = sprintf(\n                'Product %s has no receipt print type',\n                $lineItem->getLabel()\n            );\n        }\n        \n        if (!isset($payload['shopbite_delivery_time_factor'])) {\n            $errors[] = sprintf(\n                'Product %s has no delivery time factor',\n                $lineItem->getLabel()\n            );\n        }\n    }\n    \n    return $errors;\n}",{"id":1212,"title":873,"titles":1213,"content":1214,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#_4-caching-strategy",[47,854],"# In config\u002Fpackages\u002Fcache.yaml\nframework:\n    cache:\n        pools:\n            shopbite.checkout:\n                adapter: cache.adapter.redis\n                default_lifetime: 300  # 5 minutes cache",{"id":1216,"title":728,"titles":1217,"content":130,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#troubleshooting",[47],{"id":1219,"title":732,"titles":1220,"content":130,"level":136},"\u002Fdocs\u002Fshopware\u002Fcheckout#common-issues",[47,728],{"id":1222,"title":1223,"titles":1224,"content":1225,"level":579},"\u002Fdocs\u002Fshopware\u002Fcheckout#problem-custom-fields-are-not-displayed","Problem: Custom Fields are not displayed",[47,728,732],"Symptoms: Custom Fields are missing in the administrationFields are not saved Solutions: # Reinstall Custom Fields\nbin\u002Fconsole shopbite:custom-fields:install --force\n\n# Clear cache\nbin\u002Fconsole cache:clear\n\n# Check database\nmysql -u shopware -p shopware -e \"SELECT * FROM custom_field_set WHERE name = 'shopbite_product_set';\"",{"id":1227,"title":1228,"titles":1229,"content":1230,"level":579},"\u002Fdocs\u002Fshopware\u002Fcheckout#problem-receipt-print-type-is-ignored","Problem: Receipt print type is ignored",[47,728,732],"Symptoms: All receipts are printed with standard typeCustom Field values are not applied Solutions: # Check checkout processor\nbin\u002Fconsole debug:container --tag=shopware.checkout.cart.processor\n\n# Refresh plugin cache\nbin\u002Fconsole plugin:refresh ShopBite\n\n# Check Custom Fields\nbin\u002Fconsole custom-field:set:list",{"id":1232,"title":1233,"titles":1234,"content":1235,"level":579},"\u002Fdocs\u002Fshopware\u002Fcheckout#problem-delivery-time-calculation-incorrect","Problem: Delivery time calculation incorrect",[47,728,732],"Symptoms: Incorrect delivery timesCalculation does not match expectations Solutions: # Check Custom Field values\nmysql -u shopware -p shopware -e \"\n  SELECT id, custom_fields FROM product \n  WHERE custom_fields LIKE '%shopbite_delivery_time_factor%' LIMIT 5;\n\"\n\n# Check calculation logic\nbin\u002Fconsole config:get ShopBitePlugin.config.baseDeliveryTime\n\n# Enable debug mode\nbin\u002Fconsole config:set ShopBitePlugin.config.debug true",{"id":1237,"title":111,"titles":1238,"content":1239,"level":98},"\u002Fdocs\u002Fshopware\u002Fcheckout#next-steps",[47],"Administration Interface - Operating the plugin interfaceAPI Reference - Technical API documentationTroubleshooting - Problem handling and supportPerformance Optimization - Scaling and caching html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"id":58,"title":57,"titles":1241,"content":1242,"level":88},[],"An introduction to using the ShopBite Storefront",{"id":1244,"title":1245,"titles":1246,"content":1247,"level":88},"\u002Fdocs\u002Fstorefront\u002Ffirst-steps#first-steps-with-the-shopbite-storefront","First Steps with the ShopBite Storefront",[],"Congratulations on installing your ShopBite Storefront! This guide will walk you through the first steps.",{"id":1249,"title":1250,"titles":1251,"content":1252,"level":98},"\u002Fdocs\u002Fstorefront\u002Ffirst-steps#preparatory-steps","Preparatory Steps",[1245],"Ensure that the following prerequisites are met: Shopware 6 is installed and functionalYou have a domain for your storefront",{"id":1254,"title":1255,"titles":1256,"content":1257,"level":98},"\u002Fdocs\u002Fstorefront\u002Ffirst-steps#preparing-shopware","Preparing Shopware",[1245],"Create Sales Channel:Create a Storefront sales channel in ShopwareAlternatively, you can use an existing sales channelMore information: Storefront vs. HeadlessDomain Configuration:Bind your domain to the sales channelEnsure all configurations are complete",{"id":1259,"title":1260,"titles":1261,"content":1262,"level":98},"\u002Fdocs\u002Fstorefront\u002Ffirst-steps#installing-nuxt","Installing Nuxt",[1245],"A detailed guide for Nuxt installation can be found in the official Nuxt Documentation.",{"id":1264,"title":1265,"titles":1266,"content":1267,"level":136},"\u002Fdocs\u002Fstorefront\u002Ffirst-steps#step-1-create-nuxt-project","Step 1: Create Nuxt Project",[1245,1260],"Run the following command and navigate through the questions. Choose the default settings to create a new Nuxt application: pnpm create nuxt@latest",{"id":1269,"title":1270,"titles":1271,"content":1272,"level":136},"\u002Fdocs\u002Fstorefront\u002Ffirst-steps#step-2-install-shopbite-storefront-module","Step 2: Install ShopBite Storefront Module",[1245,1260],"Install the ShopBite Storefront module and the required dev dependencies: pnpm add @shopbite-de\u002Fstorefront\npnpm add -D @nuxt\u002Ftest-utils @nuxt\u002Feslint @nuxt\u002Fhints",{"id":1274,"title":1275,"titles":1276,"content":1277,"level":136},"\u002Fdocs\u002Fstorefront\u002Ffirst-steps#step-3-create-configuration-files","Step 3: Create Configuration Files",[1245,1260],"Create the following files with the appropriate content: .env File: # .env\nNUXT_PUBLIC_APP_ENV=\"development\"\nNUXT_PUBLIC_STORE_URL=\"http:\u002F\u002Flocalhost:3000\"\n\nNUXT_PUBLIC_SHOPWARE_ENDPOINT=\"https:\u002F\u002Fmy-shopware-instance.de\u002Fstore-api\u002F\"\nNUXT_PUBLIC_SHOPWARE_ACCESS_TOKEN=\"SALES-CHANNEL-ACCESS-TOKEN\"\nNUXT_PUBLIC_SITE_COUNTRY_ID=\"YOUR-DEFAULT-COUNTRY-ID\" nuxt.config.ts File: \u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n   extends: ['@shopbite-de\u002Fstorefront'],\n   compatibilityDate: '2025-07-15',\n   devtools: { enabled: true }\n}) app\u002Fassets\u002Fcss\u002Fmain.css File: \u002F* app\u002Fassets\u002Fcss\u002Fmain.css *\u002F\n@import \"@shopbite-de\u002Fstorefront\u002Fapp\u002Fassets\u002Fcss\u002Fmain.css\"; content.config.ts File: \u002F\u002F content.config.ts\nimport contentConfig from \"@shopbite-de\u002Fstorefront\u002Fcontent.config\";\nexport default contentConfig;",{"id":1279,"title":1280,"titles":1281,"content":1282,"level":136},"\u002Fdocs\u002Fstorefront\u002Ffirst-steps#step-4-update-packagejson","Step 4: Update package.json",[1245,1260],"Your package.json should look something like this: {\n  \"name\": \"storefront\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"nuxt build\",\n    \"dev\": \"nuxt dev\",\n    \"generate\": \"nuxt generate\",\n    \"preview\": \"nuxt preview\",\n    \"postinstall\": \"nuxt prepare\"\n  },\n  \"dependencies\": {\n    \"@shopbite-de\u002Fstorefront\": \"^1.6.0\",\n    \"nuxt\": \"^4.2.2\"\n  },\n  \"devDependencies\": {\n    \"@nuxt\u002Feslint\": \"^1.15.2\",\n    \"@nuxt\u002Fhints\": \"^1.0.3\",\n    \"@nuxt\u002Ftest-utils\": \"^4.0.0\"\n  }\n}",{"id":1284,"title":1285,"titles":1286,"content":1287,"level":136},"\u002Fdocs\u002Fstorefront\u002Ffirst-steps#step-5-start-storefront","Step 5: Start Storefront",[1245,1260],"This should be enough to start the default ShopBite Storefront: pnpm run build\nnode .output\u002Fserver\u002Findex.mjs For development, start the development server: pnpm run dev",{"id":1289,"title":111,"titles":1290,"content":1291,"level":98},"\u002Fdocs\u002Fstorefront\u002Ffirst-steps#next-steps",[1245],"Advanced Storefront Configuration - Detailed configuration optionsContent Management - Manage products and contentStorefront vs. Headless - Architecture comparison html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"id":62,"title":61,"titles":1293,"content":130,"level":88},[],{"id":1295,"title":1296,"titles":1297,"content":130,"level":88},"\u002Fdocs\u002Fstorefront\u002Fconfiguration#storefront-configuration","Storefront Configuration",[],{"id":1299,"title":1300,"titles":1301,"content":1302,"level":98},"\u002Fdocs\u002Fstorefront\u002Fconfiguration#feature-flags","Feature Flags",[1296],"Feature flags are set via environment variables and control optional storefront behaviour. VariableTypeDefaultDescriptionNUXT_PUBLIC_SHOP_BITE_FEATURE_MULTI_CHANNELbooleanfalseEnables the sales channel switcher in the header. Use this when you operate multiple locations under one storefront.NUXT_PUBLIC_SHOP_BITE_FEATURE_SECURE_KEYstring(empty)When set, the entire storefront is locked behind this key. Visitors must provide ?secureKey=\u003Cvalue> in the URL once; the key is then persisted in a cookie for 30 days. Without a valid cookie, all pages redirect to \u002Fmaintenance. Leave empty to disable.NUXT_PUBLIC_SHOP_BITE_FEATURE_CONTACT_FORMbooleanfalseEnables the \u002Fkontakt contact page. When false, the page returns a 404.NUXT_PUBLIC_SHOP_BITE_FEATURE_DEMO_BANNERbooleanfalseShows a non-dismissible notice above the header that the shop is a demo and orders are not fulfilled. Enable it for the demo shops in demos\u002F.NUXT_PUBLIC_SHOP_BITE_MENU_CATEGORY_IDstring\"main-navigation\"The Shopware category ID used as the root of the navigation menu.NUXT_PUBLIC_SHOP_BITE_ADDRESS_AUTOCOMPLETE_BOUNDING_BOXstring(empty)Rectangle lon1,lat1,lon2,lat2 that narrows the address suggestions (Geoapify) in the checkout, e.g. 8.822251,50.055026,8.899077,50.104327. Convenience only: where the shop delivers is decided by the cart rules in Shopware. Leave empty for unrestricted suggestions. .env example: NUXT_PUBLIC_SHOP_BITE_FEATURE_MULTI_CHANNEL=false\nNUXT_PUBLIC_SHOP_BITE_FEATURE_SECURE_KEY=\nNUXT_PUBLIC_SHOP_BITE_FEATURE_CONTACT_FORM=false\nNUXT_PUBLIC_SHOP_BITE_FEATURE_DEMO_BANNER=false\nNUXT_PUBLIC_SHOP_BITE_MENU_CATEGORY_ID=main-navigation\nNUXT_PUBLIC_SHOP_BITE_ADDRESS_AUTOCOMPLETE_BOUNDING_BOX=\"8.822251,50.055026,8.899077,50.104327\"",{"id":1304,"title":1305,"titles":1306,"content":1307,"level":98},"\u002Fdocs\u002Fstorefront\u002Fconfiguration#seo","SEO",[1296],"The storefront outputs a sitemap, canonical URLs, share previews and page titles automatically. Environment variables control the values. VariableDefaultDescriptionNUXT_PUBLIC_STORE_URL(empty)Public URL of the shop, e.g. https:\u002F\u002Fwww.my-shop.com. Base for canonical URLs, og:url, og:image, the sitemap and the sitemap entry in robots.txt. Without it the request URL is used, which can be wrong behind a reverse proxy.NUXT_PUBLIC_SITE_NAMENUXT_STORE_NAME at build timeShop name in page titles and og:site_name.NUXT_PUBLIC_SITE_TITLE_TEMPLATEsee belowPage title template. %s is the page title, %siteName the shop name. Leave empty to output the page title only.NUXT_PUBLIC_SITE_OG_IMAGE\u002Fcard.pngShare preview image (WhatsApp, Facebook) for pages without their own image. Path relative to public\u002F or an absolute URL; the output is always an absolute URL.NUXT_PUBLIC_SITE_ADDRESS_CITY(empty)City, e.g. Obertshausen. Used in the home page title and description and in the footer.NUXT_PUBLIC_SITE_CUISINE(empty)Cuisine, e.g. Italienisch-deutsche Küche. Used in the home page description. .env example: NUXT_PUBLIC_STORE_URL=\"https:\u002F\u002Fwww.my-shop.com\"\nNUXT_PUBLIC_SITE_NAME=\"Pizzeria Example\"\nNUXT_PUBLIC_SITE_TITLE_TEMPLATE=\"%s | %siteName – Online bestellen\"\nNUXT_PUBLIC_SITE_OG_IMAGE=\"\u002Fcard.png\"\nNUXT_PUBLIC_SITE_ADDRESS_CITY=\"Obertshausen\"\nNUXT_PUBLIC_SITE_CUISINE=\"Italienisch-deutsche Küche\"",{"id":1309,"title":1310,"titles":1311,"content":1312,"level":136},"\u002Fdocs\u002Fstorefront\u002Fconfiguration#page-titles-and-descriptions","Page titles and descriptions",[1296,1305],"Subpages and categories get the title template, e.g. Pizza | Pizzeria Example – Online bestellen. Categories use the meta title and meta description from Shopware, otherwise the category name and description.The home page does not use the template. Its default title is \u003Cshop name> \u003Ccity> | Online bestellen & liefern lassen; the description is built from cuisine, city and shop name.Set custom home page values in content\u002Findex.yml under seo. They take precedence over the defaults, but only if they differ from the page's title and description: Nuxt Content otherwise fills seo with those values automatically. seo:\n  title: Pizzeria Example Obertshausen | Pizza online bestellen\n  description: Pizza, Pasta und Salate in Obertshausen online bestellen, liefern lassen oder abholen.\n  image: \u002Fcard.png",{"id":1314,"title":1315,"titles":1316,"content":1317,"level":136},"\u002Fdocs\u002Fstorefront\u002Fconfiguration#share-preview-ogimage","Share preview (og:image)",[1296,1305],"Category pages use the category image from Shopware, the home page uses seo.image from content\u002Findex.yml. All other pages fall back to NUXT_PUBLIC_SITE_OG_IMAGE. twitter:card is summary_large_image. The default \u002Fcard.png shows the ShopBite demo. Put your own public\u002Fcard.png into the shop project (1200 × 630 px recommended) to replace it. Check the preview with the Facebook Sharing Debugger. WhatsApp caches previews for a while.",{"id":1319,"title":1320,"titles":1321,"content":1322,"level":136},"\u002Fdocs\u002Fstorefront\u002Fconfiguration#sitemap","Sitemap",[1296,1305],"\u002Fsitemap.xml contains: the home pagecontent pages from content\u002F (e.g. payment and shipping)all categories of the main navigation and the menu category tree (NUXT_PUBLIC_SHOP_BITE_MENU_CATEGORY_ID) with their SEO URL, modification date and category image\u002Fkontakt if the contact form is enabled robots.txt references the sitemap automatically. Paths blocked via robots.disallow are left out of the sitemap. Exclude a single content page with sitemap: false in its frontmatter. The sitemap is cached for ten minutes. Category URLs come from the SEO URL templates in Shopware. A trailing slash (e.g. \u002Fc\u002FPizza\u002F) is kept in both the sitemap and the canonical URL.",{"id":1324,"title":1325,"titles":1326,"content":1327,"level":98},"\u002Fdocs\u002Fstorefront\u002Fconfiguration#contact-details-and-opening-hours-in-the-footer","Contact details and opening hours in the footer",[1296],"The footer shows the address, phone number, a link to the Google Business Profile and the opening hours on every page as text in the HTML. Search engines read name, address and phone (NAP) straight from the shop, which strengthens local ranking. Keep the values identical to the Google Business Profile and the imprint. VariableDefaultDescriptionNUXT_PUBLIC_SITE_ADDRESS_STREET(empty)Street and number, e.g. Kantstr. 6.NUXT_PUBLIC_SITE_ADDRESS_POSTAL_CODE(empty)Postal code, e.g. 63179.NUXT_PUBLIC_SITE_ADDRESS_CITY(empty)City, see SEO.NUXT_PUBLIC_SITE_TELEPHONE(empty)Phone number as it should be displayed, e.g. +49 6104 71427. The tel: link is generated from it; it also sits behind the phone icon in the header and the \"Jetzt anrufen\" button on the order page. Without a number these elements are hidden.NUXT_PUBLIC_SITE_GOOGLE_BUSINESS_PROFILE_URL(empty)Link to the Google Business Profile, e.g. from Google Maps via \"Share\". The shop name comes from NUXT_PUBLIC_SITE_NAME. Empty values are hidden. Without contact details and opening hours the footer stays as before. Opening hours come from the business hours of the ShopBite plugin in Shopware. Consecutive days with the same hours are grouped (e.g. Mi–Fr); days without hours show as \"Ruhetag\". .env example: NUXT_PUBLIC_SITE_ADDRESS_STREET=\"Kantstr. 6\"\nNUXT_PUBLIC_SITE_ADDRESS_POSTAL_CODE=\"63179\"\nNUXT_PUBLIC_SITE_ADDRESS_CITY=\"Obertshausen\"\nNUXT_PUBLIC_SITE_TELEPHONE=\"+49 6104 71427\"\nNUXT_PUBLIC_SITE_GOOGLE_BUSINESS_PROFILE_URL=\"https:\u002F\u002Fmaps.app.goo.gl\u002F...\" Do not also maintain address and phone as link categories in the Shopware footer navigation, or they show up twice.",{"id":1329,"title":1330,"titles":1331,"content":1332,"level":98},"\u002Fdocs\u002Fstorefront\u002Fconfiguration#brand-colour-and-contrast","Brand colour and contrast",[1296],"The brand colour is set in app\u002Fassets\u002Fcss\u002Fmain.css as a colour scale --color-brand-50 to --color-brand-950, either mapped to a Tailwind scale or as custom hex values. The storefront derives the primary colour from it: brand-600 in light mode, brand-400 in dark mode (the Nuxt UI convention). @import \"@shopbite-de\u002Fstorefront\u002Fapp\u002Fassets\u002Fcss\u002Fmain.css\";\n\n@theme {\n    --color-brand-50:  var(--color-rose-50);\n    \u002F* ... *\u002F\n    --color-brand-400: var(--color-rose-400);\n    --color-brand-500: var(--color-rose-500);\n    --color-brand-600: var(--color-rose-600);\n    \u002F* ... *\u002F\n    --color-brand-950: var(--color-rose-950);\n} Text in the primary colour (headlines, links, product numbers) and text on primary buttons need a contrast ratio of at least 4.5:1 (WCAG AA), otherwise Lighthouse reports a contrast failure under \"Accessibility\". Subtle buttons and badges (variant: subtle) put the colour on a light tint of itself, so the light step should reach 5:1 on white. Check two values, e.g. with the Contrast Checker: StepBackgroundMinimum contrastbrand-600White #ffffff5:1brand-400Dark #1717174.5:1 If the customer's colour misses that, pick darker or lighter values for the 600 and 400 steps; the 500 step stays free for accents without text.",{"id":1334,"title":1335,"titles":1336,"content":1337,"level":98},"\u002Fdocs\u002Fstorefront\u002Fconfiguration#nuxt-config","Nuxt Config",[1296],"Some examples how to configure the storefront. Checkout the\nNuxt Config for more information. export default defineNuxtConfig({\n    app: {\n        head: {\n            title: \"My Store\",\n            htmlAttrs: {\n                lang: \"en\",\n            },\n            meta: [\n                {charset: \"utf-8\"},\n                {name: \"viewport\", content: \"width=device-width, initial-scale=1\"},\n                {name: \"description\", content: \"My Store description\"},\n                {property: \"og:title\", content: \"My Store\"},\n                {property: \"og:description\", content: \"My Store description\",},\n            ],\n            link: [{rel: \"icon\", href: \"\u002Ffavicon.ico\"}],\n        },\n    },\n    runtimeConfig: {\n        public: {\n            site: {\n                name: \"My Store\",\n                description: \"My Store description\",\n                countryId: \"\",\n                titleTemplate: \"%s | %siteName – Online bestellen\",\n                ogImage: \"\u002Fcard.png\",\n                cuisine: \"Italian cuisine\",\n                address: {\n                    street: \"Kantstr. 6\",\n                    postalCode: \"63179\",\n                    city: \"Obertshausen\",\n                },\n                telephone: \"+49 6104 71427\",\n                googleBusinessProfileUrl: \"https:\u002F\u002Fmaps.app.goo.gl\u002F...\",\n            },\n        },\n    },\n    colorMode: {\n        preference: \"light\",\n    },\n    pwa: {\n        manifest: {\n            name: \"My Store\",\n            short_name: \"mystore\",\n            theme_color: \"#4d7c0f\",\n            icons: [\n                {\n                    src: \"log192x192.png\",\n                    sizes: \"192x192\",\n                    type: \"image\u002Fpng\",\n                    purpose: \"any maskable\",\n                }\n            ],\n        },\n    },\n})",{"id":1339,"title":1340,"titles":1341,"content":1342,"level":98},"\u002Fdocs\u002Fstorefront\u002Fconfiguration#structured-data-schemaorg","Structured data (schema.org)",[1296],"The storefront emits JSON-LD so Google understands the shop as a restaurant with opening hours and a menu: Home page: Restaurant (a LocalBusiness) with name, address, phone, cuisine, price range, image, link to the Google Business Profile, the weekly opening hours (openingHoursSpecification) and closing days (specialOpeningHoursSpecification) from the ShopBite plugin, plus hasMenu with one MenuSection per menu category.Category pages: MenuSection with the category's products as MenuItem including the price (offers), next to the existing CollectionPage and BreadcrumbList. The values come from the same variables as the footer (NUXT_PUBLIC_SITE_NAME, NUXT_PUBLIC_SITE_ADDRESS_*, NUXT_PUBLIC_SITE_TELEPHONE, NUXT_PUBLIC_SITE_CUISINE, NUXT_PUBLIC_SITE_GOOGLE_BUSINESS_PROFILE_URL, NUXT_PUBLIC_SITE_OG_IMAGE). Two variables exist for the schema only: VariableDefaultDescriptionNUXT_PUBLIC_SITE_ADDRESS_COUNTRYDECountry of the address as ISO code.NUXT_PUBLIC_SITE_PRICE_RANGE(empty)Price range, e.g. €€. Empty values are left out. Check the result with the Rich Results Test or the Schema Markup Validator: both should detect a Restaurant with opening hours on the home page. html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"id":66,"title":65,"titles":1344,"content":130,"level":88},[],{"id":1346,"title":1347,"titles":1348,"content":130,"level":88},"\u002Fdocs\u002Fstorefront\u002Fcontent#customizing-content","Customizing Content",[],{"id":1350,"title":1351,"titles":1352,"content":1353,"level":98},"\u002Fdocs\u002Fstorefront\u002Fcontent#backend-content","Backend Content",[1347],"ProductsCategoriesMedia",{"id":1355,"title":1356,"titles":1357,"content":1358,"level":98},"\u002Fdocs\u002Fstorefront\u002Fcontent#frontend-content","Frontend Content",[1347],"TextUI Components",{"id":1360,"title":1361,"titles":1362,"content":1363,"level":136},"\u002Fdocs\u002Fstorefront\u002Fcontent#nuxt-content","Nuxt Content",[1347,1356],"To manage text and UI components, we use Nuxt Content. Official Nuxt Content Documentation",{"id":1365,"title":1366,"titles":1367,"content":1368,"level":579},"\u002Fdocs\u002Fstorefront\u002Fcontent#structure","Structure",[1347,1356,1361],"These are the default CMS pages that are already available: content\u002F\n├── index.yaml\n├── navigation.yaml\n├── impressum.md\n└── unternehmen\u002F\n    ├── agb.md\n    ├── datenschutz.md\n    └── zahlung-und-versand.md You can of course create more and\u002For override these. You probably want to override the content of your homepage.\nTo do this, proceed as follows: Create the mandatory content.config.ts file with the content: export { default } from '@shopbite-de\u002Fstorefront\u002Fcontent.config'\nexport * from '@shopbite-de\u002Fstorefront\u002Fcontent.config' Create a new file in your content folder. For example \u002Fcontent\u002Findex.ymlLook at the original file.Copy the content into your new file and override the content You can of course also completely override the content configuration including the data objects and create your own\ncontent and structures if you want to redesign your homepage from scratch. If you want to create additional landing pages, you can do so. By creating a Markdown file in your content folder.\nThe file can be located anywhere in the folder. The file structure is also reflected in the URL path. For example: content\u002Fmeine-landing-page.md --> https:\u002F\u002Fshop.de\u002Fmeine-landing-pagecontent\u002Funterseite\u002Flanding-page-2.md --> https:\u002F\u002Fshop.de\u002Funterseite\u002Funterseiten-landing-page-2",{"id":1370,"title":1371,"titles":1372,"content":1373,"level":579},"\u002Fdocs\u002Fstorefront\u002Fcontent#ui-components-nuxt-ui","UI Components (Nuxt UI)",[1347,1356,1361],"You can also use UI components in the Markdown files. You can basically use all UI components from\nNuxt UI. For more information, including styling, see the Official Documentation",{"id":1375,"title":1376,"titles":1377,"content":1378,"level":98},"\u002Fdocs\u002Fstorefront\u002Fcontent#media-and-performance","Media and performance",[1347],"The home page loads the hero video and the images from content\u002Findex.yml first. Oversized files make the biggest difference in Lighthouse (\"Performance\", metric LCP), especially on phones.",{"id":1380,"title":1381,"titles":1382,"content":1383,"level":136},"\u002Fdocs\u002Fstorefront\u002Fcontent#hero-video-and-poster","Hero video and poster",[1347,1376],"Add a poster for the video (hero.poster): the first frame as WebP, 1280 px wide, already blurred (boxblur, the video gets the same blur via CSS), about 20 to 30 KB. The storefront renders the poster as the first image of the page and preloads it. Phones (below 768 px) never load the video, only the poster.The video itself: 720p, no audio, 5 to 10 seconds, under 1 MB. A 3 MB 1080p video doubles the load time of the home page. Create both with ffmpeg: ffmpeg -ss 1 -i hero.mp4 -frames:v 1 -vf \"scale=1280:-2,boxblur=4:2\" -c:v libwebp -quality 70 hero-poster.webp\nffmpeg -i hero.mp4 -vf \"scale=1280:-2\" -r 25 -c:v libx264 -crf 28 -preset medium -an -movflags +faststart hero-720p.mp4 hero:\n  backgroundVideo: https:\u002F\u002Fshop.example.com\u002Fmedia\u002F...\u002Fhero-720p.mp4\n  poster: \u002Fhero-poster.webp The poster can live in the public\u002F folder of the shop project; the video belongs in the Shopware media.",{"id":1385,"title":1386,"titles":1387,"content":1388,"level":136},"\u002Fdocs\u002Fstorefront\u002Fcontent#hero-copy-and-buttons","Hero copy and buttons",[1347,1376],"The hero shows the USPs (hero.usps) as a compact row at the bottom left, above them the title, the description, a status line and the buttons: hero.title (optional): the title, e.g. \"Italian, freshly delivered.\" Without it, the shop name (title) is used.hero.headline (optional): small line above the title, e.g. the restaurant name in capitals.The status line (\"Geöffnet bis 23:00 · Lieferung ca. 30 Min\") comes automatically from the business hours and the plugin's delivery time.The first entry in hero.links is the single order button; all further entries render as quiet text buttons. Directly below the hero, the home page shows the top sellers (products with \"Mark as top seller\" in Shopware, up to eight) as a horizontal row; a tap opens the product options. hero:\n  title: Italienisch, frisch geliefert.\n  headline: ALTE SCHMIEDE",{"id":1390,"title":1391,"titles":1392,"content":1393,"level":136},"\u002Fdocs\u002Fstorefront\u002Fcontent#information-cards","Information cards",[1347,1376],"The section \"Alle Informationen auf einen Blick\" renders the entries of features.features as cards: icon, small category (title), a bold lead line, detail text (description) and an optional action. kind (optional): hours fills the lead with today's opening hours (\"Heute 11:30–14:30 und 17:30–23:00\", \"Heute Ruhetag\") plus the open\u002Fclosed status, delivery with the delivery time from the plugin (\"In ca. 30 Minuten bei dir\"). Both are live, the text needs no maintenance.lead (optional): the lead line for every other card, e.g. \"Tisch nur telefonisch\".link (optional): label and to. A tel: target becomes a call button, anything else a text link. The opening hours in the footer are reachable via #oeffnungszeiten. features:\n  features:\n    - title: Öffnungszeiten\n      kind: hours\n      description: Samstags 17:30 - 23:30 Uhr, Dienstag ist Ruhetag.\n      icon: i-lucide-clock\n      link:\n        label: Alle Öffnungszeiten\n        to: \"#oeffnungszeiten\"\n    - title: Reservierung\n      kind: reservation\n      lead: Tisch nur telefonisch\n      description: Bestellungen nehmen wir gerne online oder telefonisch entgegen.\n      icon: i-lucide-phone\n      link:\n        label: 06104 71427 anrufen\n        to: \"tel:+49610471427\"",{"id":1395,"title":1396,"titles":1397,"content":1398,"level":136},"\u002Fdocs\u002Fstorefront\u002Fcontent#images","Images",[1347,1376],"Category and product images from Shopware need no extra work: Shopware generates thumbnails (400, 800 and 1920 px), the storefront serves them as srcset, the browser loads the fitting size.Images from content\u002Findex.yml (CTA background, gallery, customer photos) are loaded as they are. Use WebP up to 1920 px wide, under 200 KB. If the image lives in the Shopware media, use the thumbnail URL (\u002Fthumbnail\u002F...\u002Fname_1920x545.webp) instead of the original.The gallery shows images in 4:3 and loads them on scroll.",{"id":1400,"title":1401,"titles":1402,"content":1403,"level":136},"\u002Fdocs\u002Fstorefront\u002Fcontent#cache-headers-on-the-object-storage","Cache headers on the object storage",[1347,1376],"If the Shopware media lives on S3 storage (e.g. Hetzner Object Storage), the storage sends no Cache-Control header by default. Every visit reloads all images and the video. Shopware's media URLs carry a timestamp, so they may be cached for a long time: # all existing objects (AWS CLI with the Hetzner endpoint)\naws --endpoint-url https:\u002F\u002Fnbg1.your-objectstorage.com s3 cp s3:\u002F\u002Fmy-bucket\u002F s3:\u002F\u002Fmy-bucket\u002F \\\n  --recursive --metadata-directive REPLACE --cache-control \"public, max-age=31536000, immutable\" For new uploads set the header in Shopware: shopware.filesystem.public.config.options.CacheControl: \"public, max-age=31536000, immutable\" in config\u002Fpackages\u002Fshopware.yaml. Check the result with curl -I \u003Cmedia URL>: the response must contain a cache-control line.",{"id":1405,"title":1406,"titles":1407,"content":1408,"level":136},"\u002Fdocs\u002Fstorefront\u002Fcontent#checking","Checking",[1347,1376],"npx lighthouse@12 https:\u002F\u002Fwww.my-shop.com\u002F --only-categories=performance --view Target: performance above 90 and LCP below 2.5 seconds on a phone. html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"id":70,"title":69,"titles":1410,"content":1411,"level":88},[],"The main reason is that an important function is not available for headless sales channels: SEO URLs.",{"id":1413,"title":1414,"titles":1415,"content":1416,"level":88},"\u002Fdocs\u002Fstorefront\u002Fstorefront-vs-headless#why-should-you-use-a-storefront-sales-channel","Why should you use a Storefront Sales Channel?",[],"The main reason is that an important function is not available for headless sales channels: SEO URLs. SEO URLs for categories and products are only automatically generated by Shopware when the sales channel is a\nStorefront. ShopBite needs this function to enable SEO optimization. More information about Shopware's SEO URLs can be found here.",{"id":79,"title":78,"titles":1418,"content":1419,"level":88},[],"This guide will walk you through the installation and setup of the ShopBite Order Printer.",{"id":1421,"title":1422,"titles":1423,"content":1419,"level":88},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#installation-of-the-order-printer","Installation of the Order Printer",[],{"id":1425,"title":1426,"titles":1427,"content":1428,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#check-prerequisites","Check Prerequisites",[1422],"Before you begin the installation, make sure all prerequisites are met:",{"id":1430,"title":1431,"titles":1432,"content":1433,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#server-prerequisites","Server Prerequisites",[1422,1426],"# Check PHP version\nphp -v\n# Should show PHP 8.2 or higher\n\n# Install Composer (if not present)\nphp -r \"copy('https:\u002F\u002Fgetcomposer.org\u002Finstaller', 'composer-setup.php');\"\nphp composer-setup.php\nphp -r \"unlink('composer-setup.php');\"\n\n# Check SQLite extension\nphp -m | grep sqlite",{"id":1435,"title":1436,"titles":1437,"content":1438,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#printer-prerequisites","Printer Prerequisites",[1422,1426],"The Order Printer sends ESC\u002FPOS directly to the printer; CUPS is not required. You need one of: a USB or serial thermal printer attached to the machine running the Order Printer. It appears as a device file such as \u002Fdev\u002Fusb\u002Flp0; the user running the service needs write access to it (Debian\u002FUbuntu: sudo usermod -aG lp \u003Cuser>).a network printer (or a Raspberry Pi acting as a printer gateway) reachable on TCP port 9100 (raw ESC\u002FPOS).",{"id":1440,"title":1441,"titles":1442,"content":130,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#installation","Installation",[1422],{"id":1444,"title":1445,"titles":1446,"content":1447,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#_1-clone-repository","1. Clone Repository",[1422,1441],"git clone https:\u002F\u002Fgithub.com\u002Fshopbite\u002Forder-printer.git\ncd order-printer",{"id":1449,"title":1450,"titles":1451,"content":1452,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#_2-install-dependencies","2. Install Dependencies",[1422,1441],"composer install --no-dev --optimize-autoloader For development purposes: composer install",{"id":1454,"title":1455,"titles":1456,"content":1457,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#_3-configure-environment","3. Configure Environment",[1422,1441],"Copy the example environment file: cp .env .env.local",{"id":1459,"title":1460,"titles":1461,"content":1462,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#_4-set-up-database","4. Set Up Database",[1422,1441],"# Create database\nbin\u002Fconsole doctrine:database:create\n\n# Update schema\nbin\u002Fconsole doctrine:schema:update --force",{"id":1464,"title":1465,"titles":1466,"content":130,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#shopware-6-integration","Shopware 6 Integration",[1422],{"id":1468,"title":481,"titles":1469,"content":1470,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#set-up-api-access",[1422,1465],"Open Shopware AdministrationSettings > System > IntegrationsAdd New IntegrationSet Permissions:\norder:read - Read ordersorder:update - Update order statuscustomer:read - Read customer data",{"id":1472,"title":1473,"titles":1474,"content":1475,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#configure-integration","Configure Integration",[1422,1465],"Edit the .env.local file: # Shopware API Access\nSHOPWARE_HOST=https:\u002F\u002Fyour-shopware-domain.de\nSHOPWARE_CLIENT_ID=your_client_id\nSHOPWARE_CLIENT_SECRET=your_client_secret\n\n# Printer connection (see \"Set Up Printer\" below)\nPRINTER_DSN=file:\u002F\u002F\u002Fdev\u002Fusb\u002Flp0\n\n# Data Directory\nDATA_DIR=\"\u002Fdata\u002Freceipts\u002F\"",{"id":1477,"title":1478,"titles":1479,"content":1480,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#set-up-printer","Set Up Printer",[1422],"The printer is selected with the PRINTER_DSN variable in .env.local: PrinterPRINTER_DSNUSB \u002F serial devicefile:\u002F\u002F\u002Fdev\u002Fusb\u002Flp0Network printer or Pi gateway on port 9100tcp:\u002F\u002F192.168.1.100:9100No printer (receipts are only archived in DATA_DIR)dummy:\u002F\u002F Connections to tcp:\u002F\u002F printers time out after 5 seconds, so an unreachable printer fails the print job instead of blocking the worker. Check the connection without Shopware and without a real order: bin\u002Fconsole printer:check   # reachability only, prints nothing, exit code 0\u002F1 (also usable as Docker health check)\nbin\u002Fconsole printer:test    # prints a test receipt with shop name, time, hostname and printer DSN Both accept --dsn=tcp:\u002F\u002F… to try another printer than the configured one. Set SHOP_NAME in .env.local to print your restaurant name on the test receipt; otherwise the SHOPWARE_HOST domain is used.",{"id":1482,"title":1483,"titles":1484,"content":130,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#start-service","Start Service",[1422],{"id":1486,"title":1487,"titles":1488,"content":1489,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#development-mode","Development Mode",[1422,1483],"# Start scheduler (checks every 10 seconds for new orders)\nbun run scheduler\n\n# Start worker (processes print jobs)\nbun run worker",{"id":1491,"title":1492,"titles":1493,"content":1494,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#docker-recommended-for-dokploy","Docker (recommended for Dokploy)",[1422,1483],"The repository ships a Dockerfile and a reference compose.yaml that run both workers under supervisor in one container, with a health check that verifies the printer connection. Configuration is done entirely through environment variables, the SQLite queue and the receipt copies live on the \u002Fapp\u002Fdata volume: APP_SECRET=$(openssl rand -hex 16) \\\nSHOPWARE_HOST=https:\u002F\u002Fyour-shopware-domain.de \\\nSHOPWARE_CLIENT_ID=your_client_id \\\nSHOPWARE_CLIENT_SECRET=your_client_secret \\\nPRINTER_DSN=tcp:\u002F\u002F192.168.1.100:9100 \\\ndocker compose up -d\n\ndocker compose logs -f\ndocker compose exec order-printer su-exec app php bin\u002Fconsole printer:test On Dokploy create a Compose service from the repository, set the same variables in its Environment tab and deploy; Dokploy builds the image itself. For a USB printer attached to the Docker host map the device (devices: - \u002Fdev\u002Fusb\u002Flp0:\u002Fdev\u002Fusb\u002Flp0) and add the host's lp group (group_add). Details: docs\u002Fdocker.md in the repository.",{"id":1496,"title":1497,"titles":1498,"content":1499,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#production-mode","Production Mode",[1422,1483],"For production operation, we recommend using Supervisor: Create Supervisor Configuration (\u002Fetc\u002Fsupervisor\u002Fconf.d\u002Forder-printer.conf): [program:order-printer-scheduler]\ncommand=\u002Fpath\u002Fto\u002Fproject\u002Fbin\u002Fconsole messenger:consume scheduler_default\nuser=www-data\nautostart=true\nautorestart=true\nstderr_logfile=\u002Fvar\u002Flog\u002Forder-printer-scheduler.err.log\nstdout_logfile=\u002Fvar\u002Flog\u002Forder-printer-scheduler.out.log\n\n[program:order-printer-worker]\ncommand=\u002Fpath\u002Fto\u002Fproject\u002Fbin\u002Fconsole messenger:consume async\nuser=www-data\nautostart=true\nautorestart=true\nstderr_logfile=\u002Fvar\u002Flog\u002Forder-printer-worker.err.log\nstdout_logfile=\u002Fvar\u002Flog\u002Forder-printer-worker.out.log Update Supervisor: sudo supervisorctl reread\nsudo supervisorctl update\nsudo supervisorctl start all",{"id":1501,"title":1502,"titles":1503,"content":130,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#getting-started","Getting Started",[1422],{"id":1505,"title":1506,"titles":1507,"content":1508,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#create-test-order","Create Test Order",[1422,1502],"Create a test order in ShopwareSet order status to \"Open\"Monitor printer - The receipt should be printed automatically",{"id":1510,"title":1511,"titles":1512,"content":1513,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#check-logs","Check Logs",[1422,1502],"# Scheduler logs\ntail -f \u002Fvar\u002Flog\u002Forder-printer-scheduler.out.log\n\n# Worker logs\ntail -f \u002Fvar\u002Flog\u002Forder-printer-worker.out.log",{"id":1515,"title":385,"titles":1516,"content":1517,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#common-installation-issues",[1422,1502],"Problem: Nothing is printed Solution: Check PRINTER_DSN in .env.local, then run bin\u002Fconsole printer:check (reachability) and bin\u002Fconsole printer:test (test receipt); both explain what is wrongSolution (USB): make sure the device exists (ls -l \u002Fdev\u002Fusb\u002Flp*) and the service user can write to it (sudo usermod -aG lp \u003Cuser>, then log in again)Solution (network): make sure port 9100 is reachable (nc -vz 192.168.1.100 9100); an unreachable printer fails after 5 seconds with Cannot connect to printerSolution: the receipt copy in DATA_DIR shows whether the order was processed at all Problem: Connection to Shopware API failed Solution: Check API credentials in .env.localSolution: Check firewall settingsSolution: Check Shopware logs for API errors Problem: Database error Solution: Check SQLite permissions: chmod 666 data\u002Fqueue_*.dbSolution: Recreate database: rm data\u002Fqueue_*.db && bin\u002Fconsole doctrine:database:create",{"id":1519,"title":111,"titles":1520,"content":1521,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Finstallation#next-steps",[1422],"ConfigurationOperation and MaintenanceTroubleshooting html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"id":82,"title":61,"titles":1523,"content":1524,"level":88},[],"The Order Printer offers extensive configuration options to adapt the system to your specific requirements.",{"id":1526,"title":1527,"titles":1528,"content":1524,"level":88},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#configuration-of-the-order-printer","Configuration of the Order Printer",[],{"id":1530,"title":1531,"titles":1532,"content":1533,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#environment-configuration","Environment Configuration",[1527],"The main configuration is done via the .env.local file. Here are the most important settings:",{"id":1535,"title":1536,"titles":1537,"content":1538,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#shopware-api-configuration","Shopware API Configuration",[1527,1531],"# Shopware API Access\nSHOPWARE_HOST=https:\u002F\u002Fyour-shopware-domain.de\nSHOPWARE_CLIENT_ID=your_client_id\nSHOPWARE_CLIENT_SECRET=your_client_secret\n\n# API Timeout (in seconds)\nSHOPWARE_API_TIMEOUT=30\n\n# API Rate Limiting\nSHOPWARE_API_RATE_LIMIT=100\nSHOPWARE_API_RATE_LIMIT_INTERVAL=60",{"id":1540,"title":1541,"titles":1542,"content":1543,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#printer-configuration","Printer Configuration",[1527,1531],"# Printer connection: file:\u002F\u002F\u002Fdev\u002Fusb\u002Flp0, tcp:\u002F\u002F\u003Chost>:9100 or dummy:\u002F\u002F\nPRINTER_DSN=file:\u002F\u002F\u002Fdev\u002Fusb\u002Flp0\n\n# Optional: restaurant name on test receipts (bin\u002Fconsole printer:test), defaults to the SHOPWARE_HOST domain\nSHOP_NAME=\"Masala Mio\"\n\n# Printer resolution (DPI)\nPRINTER_DPI=203\n\n# Characters per line\nPRINTER_CHARACTERS_PER_LINE=42\n\n# Print speed (1-5, 1 = slow, 5 = fast)\nPRINTER_SPEED=3\n\n# Printer density (1-15)\nPRINTER_DENSITY=10",{"id":1545,"title":1546,"titles":1547,"content":1548,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#system-configuration","System Configuration",[1527,1531],"# Polling interval (in seconds)\nPOLLING_INTERVAL=10\n\n# Maximum number of concurrent print jobs\nMAX_CONCURRENT_PRINTS=5\n\n# Queue timeout (in seconds)\nQUEUE_TIMEOUT=300\n\n# Data directory for receipt archive\nDATA_DIR=\"\u002Fdata\u002Freceipts\u002F\"\n\n# Log level (debug, info, notice, warning, error, critical, alert, emergency)\nLOG_LEVEL=info",{"id":1550,"title":1551,"titles":1552,"content":130,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#receipt-formatting","Receipt Formatting",[1527],{"id":1554,"title":1555,"titles":1556,"content":1557,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#standard-receipt-layout","Standard Receipt Layout",[1527,1551],"The Order Printer generates receipts with the following standard layout: ┌────────────────────────────────────────┐\n│              YOUR SHOP NAME             │\n│    Sample Street 123 • 12345 Sample City │\n│          Tel: 01234\u002F567890              │\n├────────────────────────────────────────┤\n│                RECEIPT #1001             │\n│            11.01.2024 14:30            │\n├────────────────────────────────────────┤\n│ Customer: Max Mustermann                 │\n│ Tel: 0176\u002F12345678                       │\n├────────────────────────────────────────┤\n│ 1x Pizza Margherita              8,99 € │\n│ 2x Spaghetti Bolognese          15,98 € │\n│ 1x Salad Caesar                  5,99 € │\n├────────────────────────────────────────┤\n│ Subtotal:                        30,96 € │\n│ Delivery costs:                   2,50 € │\n│ Total:                           33,46 € │\n├────────────────────────────────────────┤\n│ Payment method: Cash                      │\n│ Delivery type: Pickup                     │\n├────────────────────────────────────────┤\n│           Thank you for your             │\n│                purchase!                 │\n└────────────────────────────────────────┘",{"id":1559,"title":1560,"titles":1561,"content":1562,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#customize-receipt-layout","Customize Receipt Layout",[1527,1551],"You can change the receipt layout by adjusting the ReceiptFormatter class: \u002F\u002F In src\u002FInfra\u002FPrinter\u002FEpson\u002FReceiptFormatter.php\n\npublic function formatHeader(): self\n{\n    $this->content .= self::ALIGN_CENTER;\n    $this->content .= self::DOUBLE_WIDTH_ON;\n    $this->content .= \"YOUR SHOP NAME\\n\";\n    $this->content .= self::DOUBLE_WIDTH_OFF;\n    $this->content .= self::ALIGN_CENTER;\n    $this->content .= \"Sample Street 123 • 12345 Sample City\\n\";\n    $this->content .= \"Tel: 01234\u002F567890\\n\";\n    $this->content .= self::FEED;\n    \n    return $this;\n}",{"id":1564,"title":1565,"titles":1566,"content":1567,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#add-logo","Add Logo",[1527,1551],"To add a logo to the receipt, you need to convert the logo to ESC\u002FPOS bitmap: # Convert logo (requires ImageMagick)\nconvert logo.png -resize 384x128 -colorspace Gray -dither None logo.bmp\n\n# Convert logo to ESC\u002FPOS format\nphp bin\u002Fconsole order-printer:convert-logo logo.bmp logo.escpos Then you can include the logo in the ReceiptFormatter class: public function addLogo(): self\n{\n    $logoPath = __DIR__ . '\u002F..\u002F..\u002F..\u002Fpublic\u002Flogo.escpos';\n    if (file_exists($logoPath)) {\n        $this->content .= file_get_contents($logoPath);\n        $this->content .= self::FEED;\n    }\n    \n    return $this;\n}",{"id":1569,"title":1570,"titles":1571,"content":1572,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#retries-on-print-failures","Retries on Print Failures",[1527],"Short outages are normal: the Pi reboots, the restaurant WLAN drops, the printer is out of paper. The Order Printer therefore never gives up after a single failed attempt: A failed print job is retried 10 times with increasing delays: 10 s, 20 s, 40 s, 80 s, 160 s and then every 5 minutes, about 30 minutes in total.The order stays open in Shopware until the receipt was actually printed. Only a successful print sets it to in progress.While a job is waiting for its retry, the poll does not queue the same order again. When the printer is back, every order is printed exactly once.After the last retry the job is marked as failed and an error log line with the order number is written, for example Printing order 10556 failed permanently after 11 attempt(s): Cannot connect to printer \"tcp:\u002F\u002F…\". Use it for monitoring. Because the order is still open, the next poll queues it again and a new retry window starts, so nothing is lost as long as the printer comes back eventually. Permanently failed jobs can be listed and cleaned up: bin\u002Fconsole messenger:failed:show\nbin\u002Fconsole messenger:failed:remove \u003Cid> To reprint one order by hand: bin\u002Fconsole app:print-order --order-number=10556",{"id":1574,"title":1575,"titles":1576,"content":130,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#advanced-configuration","Advanced Configuration",[1527],{"id":1578,"title":1579,"titles":1580,"content":1581,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#multiple-printers","Multiple Printers",[1527,1575],"One Order Printer instance prints to exactly one PRINTER_DSN. To drive several printers (for example kitchen and counter), run one instance per printer, each with its own .env.local, DATA_DIR and DATABASE_URL, pointing at the same Shopware shop. Because every instance marks printed orders as in progress, only one of them should run with --mark-in-progress; start the others with bin\u002Fconsole app:print-order --all-open --no-mark-in-progress on their own schedule, or filter orders per instance as described below.",{"id":1583,"title":1584,"titles":1585,"content":1586,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#order-filtering","Order Filtering",[1527,1575],"You can filter the orders to be retrieved by adjusting the OrderRepository class: \u002F\u002F In src\u002FInfra\u002FShopware\u002FOrderRepository.php\n\npublic function findNewNumbers(): array\n{\n    \u002F\u002F Only orders with certain payment methods\n    $paymentMethods = ['cash', 'card'];\n    \n    \u002F\u002F Only orders above a certain value\n    $minOrderValue = 5.00;\n    \n    \u002F\u002F Only orders for certain delivery types\n    $deliveryTypes = ['delivery', 'takeaway'];\n    \n    return $this->shopwareClient->getOrders(\n        $paymentMethods,\n        $minOrderValue,\n        $deliveryTypes\n    );\n}",{"id":1588,"title":1589,"titles":1590,"content":1591,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#notifications","Notifications",[1527,1575],"You can set up notifications for certain events: # In config\u002Fpackages\u002Fmessenger.yaml\n\nframework:\n    messenger:\n        routing:\n            'Veliu\\OrderPrinter\\Domain\\Event\\OrderPrintedEvent': async\n            'Veliu\\OrderPrinter\\Domain\\Event\\PrintFailedEvent': failed Then you can create event listeners: #[AsMessageHandler]\nfinal class OrderPrintedNotificationHandler\n{\n    public function __construct(\n        private MailerInterface $mailer,\n        private string $adminEmail\n    ) {}\n    \n    public function __invoke(OrderPrintedEvent $event): void\n    {\n        $email = (new Email())\n            ->from('noreply@shopbite.de')\n            ->to($this->adminEmail)\n            ->subject('Order printed: ' . $event->orderNumber)\n            ->text('The order ' . $event->orderNumber . ' has been successfully printed.');\n        \n        $this->mailer->send($email);\n    }\n}",{"id":1593,"title":356,"titles":1594,"content":130,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#performance-optimization",[1527],{"id":1596,"title":1597,"titles":1598,"content":1599,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#caching","Caching",[1527,356],"Enable caching for frequently retrieved data: # In config\u002Fpackages\u002Fcache.yaml\n\nframework:\n    cache:\n        app: cache.adapter.filesystem\n        default_redis_provider: 'redis:\u002F\u002Flocalhost'\n        pools:\n            shopware.cache:\n                adapter: cache.adapter.redis\n                default_lifetime: 3600",{"id":1601,"title":1602,"titles":1603,"content":1604,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#batch-processing","Batch Processing",[1527,356],"For high order volumes, you can enable batch processing: # Batch Configuration\nBATCH_SIZE=10\nBATCH_INTERVAL=30",{"id":1606,"title":1607,"titles":1608,"content":1609,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#load-distribution","Load Distribution",[1527,356],"For systems with high throughput, you can set up multiple workers: # Start multiple workers\nbin\u002Fconsole messenger:consume async --limit=10 --time-limit=3600 &\nbin\u002Fconsole messenger:consume async --limit=10 --time-limit=3600 &\nbin\u002Fconsole messenger:consume async --limit=10 --time-limit=3600 &",{"id":1611,"title":1612,"titles":1613,"content":130,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#security","Security",[1527],{"id":1615,"title":1616,"titles":1617,"content":1618,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#api-security","API Security",[1527,1612],"Enforce HTTPS: Ensure your Shopware instance uses HTTPSIP Restriction: Restrict API access to specific IP addressesRate Limiting: Configure appropriate rate limits",{"id":1620,"title":1621,"titles":1622,"content":1623,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#printer-security","Printer Security",[1527,1612],"Printer IP Restriction: Restrict access to the printerPrinter Password: Set up a printer passwordEncryption: Use encrypted connections for network printers",{"id":1625,"title":1626,"titles":1627,"content":130,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#maintenance-configuration","Maintenance Configuration",[1527],{"id":1629,"title":1630,"titles":1631,"content":1632,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#log-rotation","Log Rotation",[1527,1626],"Set up log rotation to save disk space: # Logrotate Configuration (\u002Fetc\u002Flogrotate.d\u002Forder-printer)\n\u002Fvar\u002Flog\u002Forder-printer-*.log {\n    daily\n    rotate 7\n    compress\n    delaycompress\n    missingok\n    notifempty\n    create 644 www-data www-data\n}",{"id":1634,"title":1635,"titles":1636,"content":1637,"level":136},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#data-cleanup","Data Cleanup",[1527,1626],"Set up regular data cleanup: # Cron job for data cleanup (daily at 3 AM)\n0 3 * * * \u002Fpath\u002Fto\u002Fproject\u002Fbin\u002Fconsole order-printer:cleanup --days=30",{"id":1639,"title":111,"titles":1640,"content":1641,"level":98},"\u002Fdocs\u002Freceipt-printer\u002Fconfiguration#next-steps",[1527],"Operation and MaintenanceTroubleshootingAdvanced Printer Configuration html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",null,1789820454929]