Files
obsidian/Test/EventKit/05 - Barcode and QR Scanning.md

11 KiB
Raw Blame History

tags
tags
eventkit

Barcode & QR Scanning

Purpose

Enable fast, accurate equipment tracking through QR code scanning. Every 01 - Inventory Management, 01 - Inventory Management#Cases & Packing, and 01 - Inventory Management#Warehouse & Locations gets a scannable code, powering workflows from check-out to stocktake to cross-company 01 - Inventory Management#Sub-hire Management.


What Gets a Code

Entity Code Type Encoded Data Printed On
Individual Asset QR Code URL → https://{instance}/asset/{uuid} Durable label sticker on the asset
Flight Case QR Code URL → https://{instance}/case/{uuid} Case lid label / hang tag
Warehouse Location QR Code URL → https://{instance}/location/{id} Shelf / bay / rack label
Kit / Set QR Code (optional) URL → https://{instance}/kit/{id} Kit card / bag tag
Consumable Barcode (EAN/UPC) Product ID or manufacturer barcode Existing packaging or custom label

QR Code Design

Data Format

Each QR code encodes a URL pointing to the owning instance:

https://inventory.company-a.com/asset/550e8400-e29b-41d4-a716-446655440000

Why URLs?

Benefit Description
Universal Any phone camera can scan it and open the asset page in a browser
Federation-friendly The domain tells any EventKit instance who owns the asset (see [[04 - Federation Architecture#Global Asset Identity Global Asset Identity]])
App-aware A dedicated EventKit app can intercept the URL and handle it natively
Offline-capable The app can extract the UUID locally and sync the action later
Future-proof No proprietary encoding — standard URLs work forever

Label Design

┌─────────────────────────────┐
│  ┌───────────┐              │
│  │           │  SM58-00142  │
│  │  QR Code  │  Shure SM58 │
│  │           │              │
│  └───────────┘  Company A   │
│                             │
│  ID: 550e8400...            │
└─────────────────────────────┘

Labels should include:

  • QR code (primary)
  • Human-readable ID (e.g. SM58-00142)
  • Product name
  • Company name (important for sub-hired equipment)
  • Optional: Barcode (Code 128) as fallback

Label Requirements

Requirement Details
Durability Laminated or heavy-duty vinyl — must survive road use, rain, and handling
Size Minimum 30×30mm for QR code to ensure reliable scanning
Adhesive Strong permanent adhesive for assets; removable for temporary labels
Print quality Minimum 300 DPI for reliable scanning

Scanning Hardware

Option Best For Notes
Phone camera (PWA) Occasional use, small teams Zero hardware cost, works on any modern phone
Phone camera (native app) Regular use Better scanning speed, offline support, push notifications
Bluetooth barcode scanner Warehouse ops, bulk scanning Pairs with phone/tablet — much faster than camera
Rugged handheld Heavy warehouse / outdoor use e.g. Zebra TC-series — built-in scanner, drop-resistant
Fixed scanner Check-in/check-out desk Mounted scanner at warehouse dispatch point
Role Device
Warehouse staff Bluetooth scanner + tablet (mounted on cart)
On-site crew Phone app (PWA or native)
Office / planning Web UI (no scanning needed)
Dispatch desk Fixed USB scanner + desktop

Scanning Workflows

Check-Out (Dispatch to Event)

sequenceDiagram
    participant User as Warehouse Staff
    participant App as EventKit App
    participant API as API Server

    User->>App: Open [[02 - Planning Module#Pull Lists / Equipment Planning|Event Pull List]]
    App-->>User: Show items to dispatch

    loop For each item/case
        User->>App: Scan QR code
        App->>API: POST /scan/checkout {asset_uuid, event_id}
        API-->>App: ✅ Asset status → "[[01 - Inventory Management#Asset Lifecycle & Statuses|Checked Out]]"
        App-->>User: ✅ Item confirmed on list
    end

    App-->>User: Pull list complete: 47/47 items scanned

Check-In (Return from Event)

sequenceDiagram
    participant User as Warehouse Staff
    participant App as EventKit App
    participant API as API Server

    User->>App: Open Event Return

    loop For each returning item
        User->>App: Scan QR code
        App-->>User: Prompt: Condition? [OK / Damaged]
        User->>App: Select condition + optional note/photo
        App->>API: POST /scan/checkin {asset_uuid, condition, notes}
        API-->>App: ✅ Asset status → "Checked In" or "Damaged"
    end

    App-->>User: Return complete. 2 items flagged as damaged.

Stocktake / Audit

sequenceDiagram
    participant User as Warehouse Staff
    participant App as EventKit App
    participant API as API Server

    User->>App: Start Stocktake for Location "Shelf B3"
    User->>App: Scan location QR code

    loop For each item on shelf
        User->>App: Scan asset QR code
        App->>API: POST /scan/stocktake {asset_uuid, location_id}
        API-->>App: ✅ Asset found at expected location
    end

    App->>API: POST /stocktake/complete {location_id}
    API-->>App: Report: 3 missing, 1 unexpected item found
    App-->>User: Stocktake discrepancy report

Case Packing

sequenceDiagram
    participant User as Warehouse Staff
    participant App as EventKit App
    participant API as API Server

    User->>App: Scan Case QR code
    App-->>User: Show case contents (expected packing list)

    loop For each item going into case
        User->>App: Scan asset QR code
        App->>API: POST /scan/pack {asset_uuid, case_uuid}
        API-->>App: ✅ Item added to case
    end

    App-->>User: Case packed: 8/8 items ✅

Sub-hire Receive (Federated)

sequenceDiagram
    participant User as Company B Staff
    participant B_App as Company B App
    participant B_API as Company B API
    participant A_API as Company A API

    User->>B_App: Scan QR code on received item
    Note over B_App: URL domain = company-a.com → [[04 - Federation Architecture|federated asset]]
    B_App->>B_API: POST /scan/subhire-receive {url, condition}
    B_API->>A_API: GET /federation/asset/{uuid}
    A_API-->>B_API: Asset details (Shure SM58, SN: 00142)
    B_API->>A_API: POST /federation/asset/{uuid}/checkin
    B_API-->>B_App: ✅ Sub-hired asset received from Company A
    B_App-->>User: Show asset details + "Owned by Company A"

Quick Lookup

Scan any QR code outside of a workflow to instantly see:


Label Printing

Built-in Label Generation

Feature Description
Single label printing Generate and print a label for one asset
Bulk label printing Generate labels for a batch of assets (e.g. all new purchases)
Case labels Larger format labels for flight case lids
Location labels Labels for warehouse shelves/bays/racks
Label templates Customisable label layouts
Export formats PDF (for any printer), ZPL (for Zebra label printers)

Label Printer Recommendations

Printer Use Case Label Width
Brother QL-series Office / low volume 1262mm
Dymo LabelWriter Office / low volume 1954mm
Zebra ZD-series Warehouse / high volume 25108mm
Zebra ZQ-series Mobile / on-site 4872mm

Offline Scanning

Scenario Behaviour
No connectivity Scans are queued locally on the device
Weak connectivity Scans are queued and sent in batches when signal improves
Back online Queued scans sync to the server with original timestamps
Conflict resolution Server timestamps win; user is notified of any conflicts
Local asset cache App caches asset data for offline lookup after initial sync