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

271 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- eventkit
---
# Barcode & QR Scanning
## Purpose
Enable fast, accurate equipment tracking through QR code scanning. Every [[01 - Inventory Management|asset]], [[01 - Inventory Management#Cases & Packing|case]], and [[01 - Inventory Management#Warehouse & Locations|warehouse location]] gets a scannable code, powering workflows from check-out to stocktake to cross-company [[01 - Inventory Management#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 |
### 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 |
---
## 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 - Inventory Management#Asset Lifecycle & Statuses|available, checked out, in repair]], etc.)
- Current [[01 - Inventory Management#Warehouse & Locations|location]]
- Current [[02 - Planning Module|event]] assignment (if any)
- Condition notes
- [[01 - Inventory Management#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 | 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 |
---
## Related Documentation
- [[00 - System Overview]] — High-level system overview
- [[01 - Inventory Management]] — Assets and cases that get scanned
- [[04 - Federation Architecture]] — Scanning federated assets
- [[07 - Technical Requirements]] — Hardware and deployment considerations