282 lines
12 KiB
Markdown
282 lines
12 KiB
Markdown
---
|
||
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
|