--- tags: - eventkit --- # Barcode & QR Scanning ## Purpose Enable fast, accurate equipment tracking through QR code scanning. Every [[01-InventoryManagement|asset]], [[01-InventoryManagement#Cases & Packing|case]], and [[01-InventoryManagement#Warehouse & Locations|warehouse location]] gets a scannable code, powering workflows from check-out to stocktake to cross-company [[01-InventoryManagement#Sub-hire Management|sub-hire]]. --- ## 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 | ### Legacy Barcode Support Companies migrating to EventKit may already have existing barcode/label schemes. EventKit supports **dual scanning** — both legacy barcodes and new QR codes are recognised: | Feature | Description | | ---------------------- | ---------------------------------------------------------------------------- | | Legacy barcode import | Import existing barcode-to-asset mappings during onboarding | | Dual scanning | Scan either a legacy barcode or an EventKit QR code — both resolve the asset | | Gradual migration | No need to re-label everything at once; legacy barcodes remain valid | | Barcode format support | Code 128, Code 39, EAN-13, UPC-A, QR — any standard 1D/2D format | --- ## 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 | | **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 | **Default**: Phone camera (web or native). **Power-user option**: Bluetooth barcode scanner paired to phone/tablet for bulk warehouse operations. ### Recommended Setup | 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 | ### Label Printing | Method | Description | | ------------------- | ------------------------------------------------------------------------ | | **PDF generation** | Default — generate PDF sheets for any label printer (Avery sheets, etc.) | | **Direct printing** | Optional — integration with label printers (Brother QL, DYMO, Zebra) | Users can also print QR codes however they prefer — EventKit provides the QR data and a printable format. --- ## Scanning Workflows ### Check-Out (Dispatch to Event) ```mermaid sequenceDiagram participant User as Warehouse Staff participant App as EventKit App participant API as API Server User->>App: Open 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 → "Checked Out" App-->>User: ✅ Item confirmed on list end App-->>User: Pull list complete: 47/47 items scanned ``` ### Check-In (Return from Event) ```mermaid 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 ```mermaid 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 ```mermaid 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) ```mermaid 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 → 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: - Asset/case details (model, serial, owner) - Current status ([[01-InventoryManagement#Asset Lifecycle & Statuses|available, checked out, in repair]], etc.) - Current [[01-InventoryManagement#Warehouse & Locations|location]] - Current [[02-PlanningModule|event]] assignment (if any) - Condition notes - [[01-InventoryManagement#Maintenance & Testing|Maintenance]] due dates --- ## 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 | 12–62mm | | **Dymo LabelWriter** | Office / low volume | 19–54mm | | **Zebra ZD-series** | Warehouse / high volume | 25–108mm | | **Zebra ZQ-series** | Mobile / on-site | 48–72mm | --- ## 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 | --- ## Related Documentation - [[00-SystemOverview]] — High-level system overview - [[01-InventoryManagement]] — Assets and cases that get scanned - [[04-FederationArchitecture]] — Scanning federated assets - [[07-TechnicalRequirements]] — Hardware and deployment considerations