Skip to content

Table Sections

Overview

Table sections organize tables into logical groups for Table QR ordering and in-house management.

Key Purpose: Organize tables into sections for easier management.

Purpose

This page lets you organize a location's physical tables into named sections, each with auto-generated QR codes for table-based QR ordering.

Key Concepts

  • Table Section: A named group of tables belonging to a single location (e.g., "Main Floor," "Terrace," "Bar Area"), stored in MongoDB's settings collection with soft delete support
  • Automatic Naming: Tables are named as "{section_name} {label} {index}" (e.g., "Terrace Table 1") based on a label (max 10 chars) and a count of tables
  • Custom Naming: Users manually enter each table name individually (max 20 chars each), allowing flexible naming like "Window Seat" or "VIP Booth 3"
  • QR Code Generation: QR codes (PDF and SVG zip files) are generated asynchronously via background jobs and stored in Cloudflare R2 storage — regenerated automatically when sections are created or updated
  • Free Table Detection: The system tracks active OrderSession records per section to determine which tables are currently occupied, used by Kassanet POS integrations (Hendrickx/Vanhoutte)

Actions

Create a Table Section

Navigate to In-House Settings → Tables & Sections, click Add Section. Enter a name (required, max 25 chars, must be unique), choose Automatic or Custom naming, and configure table details.

Edit a Table Section

Modify the section name, naming type, or table configuration. Saving triggers QR code regeneration via background jobs.

Delete a Table Section

Remove a section and its tables. Blocked if the section is used in QR Ordering or is a Kassanet-integrated section (prefixed with "Hendrickx" or "Vanhoutte").

Download QR Codes

Access qr_code_zip_path (SVG zip) or qr_code_pdf_path (PDF) from the section response to download all QR codes for that section.

Location

  • Backoffice Route: /in-house/qr-ordering
  • Backend Controller: app/Http/Controllers/Api/TableQrOrderingController.php

Fields

Section Name

PropertyValue
Field IDname
LabelSection Name
TypeText
RequiredYes

Description: Name of the section (e.g., "Terrace", "Main Floor").


Tables

PropertyValue
Field IDtables
LabelTables
TypeArray

Description: Tables in this section.


Table Fields

Table Number

PropertyValue
Field IDtable_number
LabelTable Number
TypeText
RequiredYes

Description: Identifier for the table.


Table Name

PropertyValue
Field IDtable_name
LabelTable Name
TypeText
RequiredNo

Description: Optional friendly name.


Seats

PropertyValue
Field IDseats
LabelNumber of Seats
TypeNumber
Default4

Description: Seating capacity.


QR Code

PropertyValue
Field IDqr_code
LabelQR Code
TypeGenerated

Description: Unique QR code for this table.


Business Logic

Section Organization

Location
├── Section: Main Floor
│   ├── Table 1 (4 seats)
│   ├── Table 2 (4 seats)
│   ├── Table 3 (2 seats)
│   └── Table 4 (6 seats)

├── Section: Terrace
│   ├── Table T1 (4 seats)
│   ├── Table T2 (4 seats)
│   └── Table T3 (2 seats)

└── Section: Private Room
    └── Table P1 (10 seats)

QR Code Flow

Customer scans QR code


Identify table from QR


Load menu for location


Orders linked to table


KDS shows table number

Business Rules

  • Section names are required, limited to 25 characters, and must be unique within the location
  • For Automatic naming, table_numbers (min 1) is required; for Custom naming, a table_names array of non-empty strings (max 20 chars each) is required
  • QR code files (PDF + SVG zip) are regenerated via background jobs when sections are created or updated, with a 5-minute lock per location to prevent concurrent generation
  • Deleting a section triggers cleanup of both PDF and SVG zip files from Cloudflare R2 storage (errors are logged if cleanup fails)
  • Kassanet-integrated sections (names prefixed with "Hendrickx " or "Vanhoutte ") cannot be deleted or modified through the UI and have special free-table detection logic

FAQs

  • "Can a table belong to multiple sections?" No, each table is defined within exactly one section. Table names should be unique within a location to avoid confusion on the KDS.
  • "What happens to QR codes when a section is updated?" QR codes are regenerated automatically via a background job whenever the section is saved or updated.
  • "How are table names generated in Automatic mode?" Names follow the pattern "{section_name} {label} {index}" (e.g., "Terrace Table 1"). If no label is provided, it uses "{section_name} {index}".
  • "What is the QR code URL format?" https://table-eu.upvendo.com/{location_slug}?table={table_id} — scanning opens the online ordering menu linked to that specific table.
  • "Why can't I delete a section?" The section may be used in QR Ordering settings or may be a Kassanet-integrated section (Hendrickx/Vanhoutte). Remove it from QR Ordering first, or contact support for POS-integrated sections.

Troubleshooting

  • QR codes not generating → QR code generation runs as a background job. Check that the queue worker is running. If the job was recently submitted, wait a few minutes for it to complete.
  • Cannot delete a section → The section is either used in QR Ordering settings or is a Kassanet-integrated section (Hendrickx/Vanhoutte prefix). Remove it from QR Ordering first.
  • Table names not updating on QR codes → QR codes are regenerated when sections are saved. Verify the save was successful and check for any background job failures.
  • Duplicate table names across sections → While allowed by the system, duplicate names cause confusion on the KDS. Use unique table names across all sections within a location.

Customer Impact

Table QR Ordering

  • Scan QR to start ordering
  • Orders linked to table
  • Multiple orders per table session
  • Pay at table option

KDS

  • Orders show table number
  • Section grouping optional
  • Easy identification

Relations

Depends On

  • Locations: Sections per location
  • QR Ordering: Table QR settings

Affects

  • Transactions: Table linked to order
  • KDS: Table display
  • Reports: Table analytics

Examples

Section with Tables

json
{
  "section": {
    "id": "section-1",
    "name": "Main Floor",
    "tables": [
      {
        "id": "table-1",
        "table_number": "1",
        "table_name": "Window Table",
        "seats": 4,
        "qr_code_url": "https://table.upvendo.com/loc123/t1"
      },
      {
        "id": "table-2",
        "table_number": "2",
        "seats": 2,
        "qr_code_url": "https://table.upvendo.com/loc123/t2"
      }
    ]
  }
}

Multiple Sections

json
{
  "sections": [
    {
      "name": "Main Floor",
      "tables": [
        { "table_number": "1", "seats": 4 },
        { "table_number": "2", "seats": 4 },
        { "table_number": "3", "seats": 2 }
      ]
    },
    {
      "name": "Terrace",
      "tables": [
        { "table_number": "T1", "seats": 4 },
        { "table_number": "T2", "seats": 4 }
      ]
    }
  ]
}

QR Code URL Format

https://table-eu.upvendo.com/{location_slug}?table={table_id}