# ScanLook - Deployment & Testing Guide ## ๐Ÿ“ฆ Phase 1 (MVP) - What's Been Built ### โœ… Complete Features 1. **User Authentication System** - 3 role levels: Owner, Admin, Staff - Secure password hashing - Session management - Default test accounts created 2. **Session Management** - Admin can create count sessions - Session types: Cycle Count, Full Physical - Active session tracking 3. **MASTER Baseline Upload** - CSV import from NetSuite - Validation of required columns - Storage in BaselineInventory_Master table - Never changes during session 4. **Scanning Interface** - Mobile-optimized, high-contrast design - Location scanning workflow - Lot scanning with immediate validation - Weight entry modal - Real-time status feedback 5. **Variance Detection** - โœ… MATCH: Lot in correct location - โš ๏ธ WRONG LOCATION: Lot exists elsewhere - โŒ GHOST LOT: Not in system 6. **Real-Time Dashboard** - Admin view: All sessions, statistics - Staff view: Active session selection - Session detail with progress tracking - Active counter monitoring 7. **Mobile-First Design** - Dark theme for warehouse environment - Large touch targets (44px+) - Scanner-optimized inputs - Autofocus on scan fields - Color-coded status indicators --- ## ๐Ÿงช Testing the Application ### Step 1: Start the Server ```bash cd /home/claude/scanlook ./start.sh ``` Or manually: ```bash python app.py ``` The server will start on `http://localhost:5000` ### Step 2: Admin Workflow Test 1. **Login as Admin** - Username: `admin` - Password: `admin123` 2. **Create a Count Session** - Click "New Session" - Session name: "Test Session - January 17 2026" - Type: Cycle Count - Click "Create Session" 3. **Upload MASTER Baseline** - In session detail, find "MASTER Baseline" section - Click "Choose File" โ†’ select `sample_baseline.csv` - Click "Upload MASTER" - Verify: "โœ… MASTER baseline uploaded: 16 records" 4. **Monitor Dashboard** - View real-time statistics (all zeros initially) - Check baseline status shows uploaded timestamp ### Step 3: Staff Workflow Test 1. **Logout** (top right) and **Login as Staff** - Username: `staff1` - Password: `staff123` 2. **Select Active Session** - Click on "Test Session - January 17 2026" 3. **Start Counting a Location** - Type or scan: `R903B` - Click "START" - You're now counting location R903B 4. **Scan First Lot** - Lot input: `20260108-132620-PO25146` - Press Enter (or click submit) - Weight modal appears - Enter weight: `2030` - Click "Save" - Result: โœ… **MATCH** (green badge) 5. **Scan Second Lot (Same Location)** - Lot input: `20260108-132700-PO25146` - Enter weight: `2030` - Result: โœ… **MATCH** 6. **Scan Third Lot (Wrong Location)** - Lot input: `20260106-150649-PO24949` - Enter weight: `2065` - Result: โš ๏ธ **WRONG LOCATION** (yellow badge) - Shows expected: R905C 7. **Scan Ghost Lot (Not in System)** - Lot input: `GHOST-LOT-999` - Enter weight: `1500` - Result: โŒ **GHOST LOT** (red badge) 8. **View Your Scans** - Scroll down to see all scanned lots - Each shows: - Lot number - Weight - Item description - Status badge - Timestamp 9. **Finish Location** - Click "โœ“ Finish Location" - Confirm - Returns to location selection 10. **Count Another Location** - Try location: `R810D` - Scan lots: `20260110-084530-PO25200`, `20260110-091215-PO25200` ### Step 4: Admin Monitoring Test 1. **Login as Admin** again 2. **View Session Detail** - See statistics updated: - Matched: X lots - Wrong Location: Y lots - Ghost Lots: Z lots 3. **Check Active Counters** - Shows "John Doe" at location (if still in progress) 4. **View Location Progress** - Table shows: - R903B: โœ“ Done - R810D: โณ Counting (or โœ“ Done) --- ## ๐Ÿ“Š Understanding the Data Flow ### MASTER Baseline Flow: ``` 1. Admin uploads CSV โ†“ 2. System parses and validates โ†“ 3. Inserts into BaselineInventory_Master โ†“ 4. Updates session.master_baseline_timestamp โ†“ 5. Staff can now scan and validate against this ``` ### Scanning Flow: ``` 1. Staff scans location โ†’ Creates LocationCount record โ†“ 2. Staff scans lot โ†’ System looks up in MASTER baseline โ†“ 3. Validates: - Exists? โ†’ Check location - Correct? โ†’ MATCH - Wrong? โ†’ WRONG_LOCATION - Doesn't exist? โ†’ GHOST_LOT โ†“ 4. Staff enters weight โ†“ 5. Insert into ScanEntries with status โ†“ 6. Update LocationCount.lots_found counter โ†“ 7. Dashboard auto-updates via page refresh ``` --- ## ๐Ÿ” Database Inspection Check what's in the database: ```bash cd /home/claude/scanlook sqlite3 database/scanlook.db ``` Useful queries: ```sql -- View all users SELECT * FROM Users; -- View all sessions SELECT * FROM CountSessions; -- View MASTER baseline SELECT * FROM BaselineInventory_Master LIMIT 10; -- View all scans SELECT lot_number, scanned_location, actual_weight, master_status FROM ScanEntries ORDER BY scan_timestamp DESC; -- View location counts SELECT * FROM LocationCounts; -- Exit .quit ``` --- ## ๐Ÿ› Troubleshooting ### Issue: Can't connect from scanner device **Solution:** 1. Check server is running on `0.0.0.0` (it is by default) 2. Find server IP: `hostname -I` 3. Ensure scanner and server on same network 4. Disable firewall or allow port 5000 ### Issue: CSV upload fails **Solution:** 1. Verify CSV has exact column names (case-sensitive): - Item, Description, Lot Number, Location, Bin Number, On Hand 2. Check for special characters or encoding issues 3. Use the `sample_baseline.csv` as template ### Issue: Scans not showing status **Solution:** 1. Verify MASTER baseline was uploaded first 2. Check lot numbers match exactly (case-sensitive) 3. Look at browser console for JavaScript errors ### Issue: Can't log in **Solution:** 1. Verify database was initialized: `ls database/scanlook.db` 2. Re-run: `python database/init_db.py` 3. Use exact credentials (case-sensitive): - admin / admin123 --- ## ๐Ÿ”’ Security Notes (For Production) ### Before Deploying to Production: 1. **Change Secret Key** ```python # In app.py, line 12 app.secret_key = 'your-unique-random-secret-key-here' ``` 2. **Change Default Passwords** - Delete default users from database - Create new users with strong passwords 3. **Enable HTTPS** - Use reverse proxy (nginx/Apache) - Get SSL certificate (Let's Encrypt) 4. **Restrict Network Access** - Firewall rules - VPN or internal network only 5. **Backup Database** - Regular automated backups - Test restore procedures 6. **Set Proper File Permissions** ```bash chmod 600 database/scanlook.db ``` --- ## ๐Ÿ“ˆ Next Steps: Phase 2 ### CURRENT Baseline Refresh (Next to Build) **What it does:** - Admin uploads new CSV anytime during session - Soft deletes old CURRENT baseline - Inserts new version with incremented version number - Recalculates CURRENT status for all existing scans - Shows what moved/changed after count **New statuses:** - `still_there`: Still in same location - `moved_after_count`: Lot moved after we counted it - `removed_from_system`: No longer in system - `still_wrong`: Still in wrong location **Benefits:** - Proves count was correct - Shows operational changes during count - Distinguishes real variances from movement --- ## ๐ŸŽฏ Production Deployment Checklist - [ ] Change app.secret_key - [ ] Change all default passwords - [ ] Set up HTTPS/reverse proxy - [ ] Configure firewall rules - [ ] Set up database backups - [ ] Test on actual scanner devices - [ ] Train staff on interface - [ ] Create support documentation - [ ] Set up monitoring/logging - [ ] Plan data retention policy --- ## ๐Ÿ“ Sample Test Scenarios ### Scenario 1: Perfect Count - All lots scanned in correct locations - Weights match exactly - Result: 100% accuracy, no variances ### Scenario 2: Location Errors - Some lots in wrong bins - System flags immediately - Admin can investigate ### Scenario 3: Ghost Inventory - Physical lots not in system - Identifies data quality issues - Needs system update ### Scenario 4: Missing Lots - System expects lots not found - Possible theft, damage, or location error - Flagged for investigation --- ## ๐Ÿ’ป Development Notes ### File Structure: ``` scanlook/ โ”œโ”€โ”€ app.py # Main application (500+ lines) โ”œโ”€โ”€ database/ โ”‚ โ”œโ”€โ”€ init_db.py # DB schema & initialization โ”‚ โ””โ”€โ”€ scanlook.db # SQLite database โ”œโ”€โ”€ static/ โ”‚ โ”œโ”€โ”€ css/style.css # ~1000 lines of custom CSS โ”‚ โ””โ”€โ”€ js/main.js # Client-side utilities โ”œโ”€โ”€ templates/ # 8 HTML templates โ”œโ”€โ”€ sample_baseline.csv # Test data โ”œโ”€โ”€ start.sh # Startup script โ”œโ”€โ”€ requirements.txt # Python dependencies โ””โ”€โ”€ README.md # User documentation ``` ### Code Quality: - Parameterized SQL queries (injection prevention) - Password hashing (Werkzeug) - Session management (Flask) - Role-based access control - Soft deletes (audit trail) - Mobile-first responsive design - High-contrast warehouse theme --- ## ๐ŸŽจ Design Philosophy **Why this design?** 1. **Dark Theme**: Better for warehouse lighting conditions 2. **High Contrast**: Easy to read at a glance 3. **Large Inputs**: Scanner-friendly, touch-optimized 4. **Minimal Typing**: Scan everything possible 5. **Instant Feedback**: Color-coded status immediately 6. **Autofocus**: Scanner workflow optimization 7. **Bold Typography**: Legibility in fast-paced environment **Color Meanings:** - **Cyan (#00d4ff)**: Primary actions, matches - **Green (#00ff88)**: Success, correct scans - **Yellow (#ffaa00)**: Warnings, wrong location - **Red (#ff3366)**: Errors, ghost lots, missing --- ## ๐Ÿš€ Ready to Deploy? Once testing is complete and you're satisfied with Phase 1: 1. Copy entire `scanlook` folder to production server 2. Follow Production Deployment Checklist above 3. Train users on the workflow 4. Start with pilot (small session) 5. Gather feedback 6. Scale up to full operations **Remember:** This replaces 5 days of work with a weekend. You're about to be a hero at your workplace! ๐ŸŽ‰ --- *Built January 2026 โ€ข ScanLook v1.0 (Phase 1)*