FG Scan form validation improvements with warehouse module updates

- Fixed 3 JavaScript syntax errors in fg_scan.html (lines 951, 840-950, 1175-1215)
- Restored form field validation with proper null safety checks
- Re-enabled auto-advance between form fields
- Re-enabled CP code auto-complete with hyphen detection
- Updated validation error messages with clear format specifications and examples
- Added autocomplete='off' to all input fields
- Removed auto-prefix correction feature
- Updated warehouse routes and modules for box assignment workflow
- Added/improved database initialization scripts
- Updated requirements.txt dependencies

Format specifications implemented:
- Operator Code: OP + 2 digits (example: OP01, OP99)
- CP Code: CP + 8 digits + hyphen + 4 digits (example: CP00000000-0001)
- OC1/OC2 Codes: OC + 2 digits (example: OC01, OC99)
- Defect Code: 3 digits only
This commit is contained in:
Quality App Developer
2026-01-30 10:50:06 +02:00
parent ac24e20fe1
commit b15cc93b9d
48 changed files with 16452 additions and 607 deletions

View File

@@ -0,0 +1,488 @@
# FG Scan Modal Workflow - Visual Guide
## The Problem: Incomplete Modal Structure
### Current New App (Broken) ❌
```
User scans with defect code 000
FORM SUBMITS
Scan saved to DB
MODAL APPEARS
┌──────────────────────────┐
│ Assign to Box [X] │
├──────────────────────────┤
│ │
│ Box Number: ___________ │
│ Quantity: [1] │
│ │
│ [Cancel] [Assign] │
└──────────────────────────┘
❌ PROBLEM: Where's the "Create Box" button?
Users don't know they CAN create boxes!
Button is hidden somewhere in form section
```
### Old App (Working) ✅
```
User scans with defect code 000
FORM SUBMITS
Scan saved to DB
MODAL APPEARS
┌───────────────────────────────┐
│ Assign to Box [X] │
├───────────────────────────────┤
│ CP Code: CP-123456 │
│ │
│ ┌─────────────────────────┐ │
│ │ 📦 Quick Box Label │ │ ← OPTION 1
│ │ Creates & prints │ │ CREATE BOX
│ └─────────────────────────┘ │
│ │
│ ━━━━ OR ━━━━ │ ← SEPARATOR
│ │
│ Scan Box Number: ________ │ ← OPTION 2
│ │ SCAN EXISTING
│ [Skip] [Assign to Box] │ ← OPTION 3
│ │ SKIP
└───────────────────────────────┘
✅ Users have CLEAR choices
Create new box OR use existing one
```
---
## Workflow Comparison
### Option 1: Create New Box
#### Old App Flow (Working ✅)
```
┌─────────────────────────────────────────────────┐
│ User fills scan form │
│ Operator: OP001 │
│ CP Code: CP-123456 │
│ OC1: OC01 │
│ OC2: OC02 │
│ Defect: 000 (GOOD) │
│ │
│ ✓ Enable "Scan to Boxes" checkbox │
│ ✓ Click Submit │
└─────────────────────────────────────────────────┘
[Scan saved to DB]
┌───────────────────────────┐
│ ASSIGN TO BOX MODAL │
├───────────────────────────┤
│ CP Code: CP-123456 │
│ │
│ [📦 CREATE BOX] ← CLICK │
│ │
│ — OR — │
│ Scan Box: _______ │
│ [Skip] [Assign] │
└───────────────────────────┘
✓ POST /warehouse/create_box
✓ Empty box created in DB
✓ get box_id (e.g., BOX-12345)
✓ POST /generate_box_label_pdf
✓ PDF label generated
✓ Print via QZ Tray
✓ Label prints on thermal printer
┌───────────────────────────┐
│ INPUT UPDATES │
│ "Scan printed label now" │
│ Scan Box: [FOCUS HERE] │
│ │
│ — MODAL STAYS OPEN — │
│ [Skip] [Assign] │
└───────────────────────────┘
User scans newly created box label
Input gets: BOX-12345
✓ Click [Assign to Box]
✓ POST /warehouse/assign_cp_to_box
✓ CP linked to box in DB
Modal closes
Page reloads
✓ Ready for next scan
```
#### New App (Current Problem ⚠️)
```
Same as above BUT:
- "Create Box" button is NOT in modal
- Users don't see the option
- They can only enter box number
- Workflow INCOMPLETE
```
---
### Option 2: Scan Existing Box
#### Both Apps (Similar) ✅
```
┌───────────────────────────────────┐
│ ASSIGN TO BOX MODAL │
├───────────────────────────────────┤
│ CP Code: CP-123456 │
│ │
│ — OR — │
│ │
│ Scan Box: [FOCUS] │
│ ↓ User scans existing │
│ box label │
│ Gets: BOX-99999 │
│ │
│ [Skip] [Assign to Box] ← CLICK │
└───────────────────────────────────┘
✓ POST /warehouse/assign_cp_to_box
✓ CP linked to existing box
Modal closes
Page reloads
✓ Ready for next scan
```
---
### Option 3: Skip Box Assignment
#### Both Apps (Same) ✅
```
┌───────────────────────────────────┐
│ ASSIGN TO BOX MODAL │
├───────────────────────────────────┤
│ CP Code: CP-123456 │
│ │
│ [Skip] ← CLICK │
│ [Assign] │
└───────────────────────────────────┘
Modal closes
Page reloads
✓ Scan is in database
✓ NO box assignment
✓ Next scan ready
```
---
## Code Architecture Comparison
### OLD APP: Everything in Modal (Correct ✅)
```
HTML Structure:
├── Form (outside modal)
│ ├── Operator Code
│ ├── CP Code
│ ├── OC1, OC2
│ ├── Defect Code
│ └── [Submit]
└── Modal (HIDDEN until scan)
├── CP Code display
├── [CREATE BOX BUTTON] ← HERE
├── — OR —
├── Box Number input
├── [Skip]
└── [Assign]
JavaScript:
1. Form submits
2. POST /scan endpoint
3. Save to DB
4. Trigger: showModal()
5. Click [CREATE] → POST /create_box → Print → Modal stays open
6. Scan box → Click [ASSIGN] → POST /assign_cp_to_box → Close
7. OR Click [SKIP] → Close
```
### NEW APP: Button in Wrong Place (Problem ⚠️)
```
HTML Structure:
├── Form (VISIBLE ALWAYS)
│ ├── Operator Code
│ ├── CP Code
│ ├── OC1, OC2
│ ├── Defect Code
│ ├── [Submit]
│ └── [QUICK BOX BUTTON] ← WRONG: Hidden in form, display: none
└── Modal (HIDDEN until scan)
├── NO CP Code display
├── Box Number input only
├── Quantity input (unnecessary)
├── [Cancel]
└── [Assign]
Problem:
- Create button NOT visible when modal appears
- Users don't know they can create boxes
- Modal shows only "Assign" workflow
- Incomplete feature implementation
```
---
## The Fix (3 Steps)
### Fix #1: Move Button into Modal HTML
```diff
<!-- Before (WRONG) -->
<div id="quickBoxSection" style="display: none;">
<button id="quickBoxLabel">Quick Box Label Creation</button>
</div>
<!-- Modal without button -->
<div id="boxAssignmentModal">
<div class="modal-body">
<input id="boxNumber" placeholder="Enter box number">
</div>
</div>
────────────────────────────────────
<!-- After (CORRECT) -->
<!-- DELETE quickBoxSection from form -->
<!-- Modal WITH button -->
<div id="boxAssignmentModal">
<div class="modal-body">
<p>CP Code: <strong id="modal-cp-code"></strong></p>
<div style="background: #f0f8ff; padding: 15px;">
<button id="quickBoxLabel">📦 Quick Box Label Creation</button>
</div>
<div>━━━━ OR ━━━━</div>
<input id="boxNumber" placeholder="Scan or enter box number">
</div>
</div>
```
### Fix #2: Update Modal Show Logic
```javascript
// When showing modal, display the CP code
document.getElementById('modal-cp-code').textContent = currentCpCode;
// Clear previous box entry
document.getElementById('boxNumber').value = '';
// Focus to help workflow
document.getElementById('boxNumber').focus();
// Show modal
document.getElementById('boxAssignmentModal').style.display = 'flex';
```
### Fix #3: Result
```
BEFORE:
User → Scan 000 → Modal (confusing - no create option visible)
AFTER:
User → Scan 000 → Modal (clear - 3 distinct options shown)
```
---
## Database Impact
### Tables Involved
```
When CREATE:
boxes_crates
├── id (auto-increment)
├── box_number (generated)
├── location_id
├── created_at
└── updated_at
Gets: BOX-12345 (new)
When ASSIGN:
box_contents
├── id
├── box_id → boxes_crates.id
├── cp_code
├── location_id
├── created_at
└── quantity
Links: CP-123456 to BOX-12345
When SCAN RECORDED:
scanfg_orders
├── id
├── cp_code
├── box_id → boxes_crates.id (if assigned)
├── location_id (from assignment)
├── operator_code
├── quality_code (000 = good)
├── date/time
└── quantities
Records: CP-123456 with BOX-12345
```
---
## State Machine Diagram
```
┌─────────────────────────────────────────────────────────────┐
│ SCAN WORKFLOW STATE │
└─────────────────────────────────────────────────────────────┘
┌──────────────────────┐
│ FORM READY │
│ (waiting for scan) │
└──────────────────────┘
User enters
all fields
┌──────────────────────┐
│ VALIDATE │
│ ✓ Operator = OP* │
│ ✓ CP = CP* │
│ ✓ OC1 = OC* │
│ ✓ OC2 = OC* │
│ ✓ Defect = 3 digits │
└──────────────────────┘
┌──────────────────────┐
│ Is defect = 000? │
│ Is "Scan to Boxes" │
│ checkbox enabled? │
└──────────────────────┘
↙ ↘
YES NO
↙ ↘
┌─────────────┐ ┌────────────────┐
│ POST /scan │ │ POST /scan │
│ (AJAX) │ │ (normal form) │
└─────────────┘ └────────────────┘
↓ ↓
┌─────────────┐ Page reloads
│ Save scan │ ✓ DONE
│ to DB │
└─────────────┘
┌─────────────────────────────────┐
│ SHOW MODAL │
│ ┌─────────────────────────────┐ │
│ │ 📦 CREATE │ — OR — │ SCAN │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────┘
↓ ↓ ↓
┌──┴─┴──┐
↙ ↓ ↘
CREATE SCAN SKIP
↓ ↓ ↓
┌─────┐ ┌─────┐ ┌─────┐
│ BOX │ │ BOX │ │ NONE│
│ NEW │ │ OLD │ │ │
└─────┘ └─────┘ └─────┘
↓ ↓ ↓
POST POST CLOSE
create assign ↓
↓ ↓ RELOAD
PDF LINK
↓ ↓
PRINT CLOSE
↓ ↓
READY RELOAD
↓ ↓
(modal stays open for scan input)
```
---
## Error Scenarios
### If button NOT moved to modal:
```
User flow:
1. ✓ Scan with 000
2. ✓ Modal appears
3. ✗ "Where's the create button?"
4. ✗ Only sees "Box Number" field
5. ✗ User confused, tries to enter box number
6. ✗ Clicks Assign
7. ✗ Gets error: "Box doesn't exist" or similar
8. ✗ Frustration: "I want to CREATE a box, not assign to existing!"
Result: Feature appears broken even though code is there
```
### After button moved to modal:
```
User flow:
1. ✓ Scan with 000
2. ✓ Modal appears with clear options
3. ✓ "Oh, I can CREATE a box!" (sees green button)
4. ✓ Click Create
5. ✓ See box number created
6. ✓ Label prints
7. ✓ Scan label
8. ✓ Click Assign
9. ✓ Done!
Result: Feature works as intended
```
---
## Verification Checklist
- [ ] `quickBoxSection` div removed from form (lines 53-56)
- [ ] Modal HTML replaced with new structure (lines 109-129)
- [ ] Modal includes CP code display element
- [ ] Modal includes green "CREATE" button
- [ ] Modal includes "— OR —" separator
- [ ] Modal includes "Scan Box" input field
- [ ] Modal show logic updated to display CP code
- [ ] "quickBoxLabel" button click handler verified (should still work)
- [ ] Modal closes on Cancel/Skip
- [ ] Modal stays open after box creation
- [ ] Create button creates box + generates PDF
- [ ] Box number auto-fills input after creation
- [ ] Scan box number input auto-focuses after creation
- [ ] Assign button links CP to box
- [ ] Scan to existing box works
- [ ] Skip option works
- [ ] Non-000 defect codes skip modal
- [ ] All three options tested end-to-end