v0.14.0 - Major Logic Overhaul & Real-Time Dashboard
Logic: Implemented "One User, One Bin" locking to prevent duplicate counting.
Integrity: Standardized is_deleted = 0 and tightened "Matched" criteria to require zero weight variance.
Refresh: Added silent 30-second dashboard polling for all 6 status categories and active counter list.
Tracking: Built user-specific activity tracking to identify who is counting where in real-time.
Stability: Resolved persistent 500 errors by finalizing the active-counters-fragment structure.
This commit is contained in:
@@ -29,35 +29,6 @@ def reopen_location(location_count_id):
|
||||
return jsonify({'success': True, 'message': 'Bin reopened for counting'})
|
||||
|
||||
|
||||
@admin_locations_bp.route('/location/<int:location_count_id>/delete', methods=['POST'])
|
||||
@login_required
|
||||
def delete_location_count(location_count_id):
|
||||
"""Delete all counts for a location (soft delete)"""
|
||||
# Verify ownership
|
||||
loc = query_db('SELECT * FROM LocationCounts WHERE location_count_id = ?', [location_count_id], one=True)
|
||||
|
||||
if not loc:
|
||||
return jsonify({'success': False, 'message': 'Location not found'})
|
||||
|
||||
if loc['counted_by'] != session['user_id'] and session['role'] not in ['owner', 'admin']:
|
||||
return jsonify({'success': False, 'message': 'Permission denied'})
|
||||
|
||||
# Soft delete all scan entries for this location
|
||||
execute_db('''
|
||||
UPDATE ScanEntries
|
||||
SET is_deleted = 1
|
||||
WHERE location_count_id = ?
|
||||
''', [location_count_id])
|
||||
|
||||
# Delete the location count record
|
||||
execute_db('''
|
||||
DELETE FROM LocationCounts
|
||||
WHERE location_count_id = ?
|
||||
''', [location_count_id])
|
||||
|
||||
return jsonify({'success': True, 'message': 'Bin count deleted'})
|
||||
|
||||
|
||||
@admin_locations_bp.route('/location/<int:location_count_id>/scans')
|
||||
@login_required
|
||||
def get_location_scans(location_count_id):
|
||||
@@ -86,4 +57,40 @@ def get_location_scans(location_count_id):
|
||||
return jsonify({'success': True, 'scans': scans_list})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({'success': False, 'message': str(e)})
|
||||
return jsonify({'success': False, 'message': str(e)})
|
||||
|
||||
@admin_locations_bp.route('/location/<int:location_count_id>/delete', methods=['POST'])
|
||||
@login_required
|
||||
def soft_delete_location(location_count_id):
|
||||
"""Admin-only: Soft delete a bin count and its associated data"""
|
||||
if session.get('role') not in ['owner', 'admin']:
|
||||
return jsonify({'success': False, 'message': 'Admin role required'}), 403
|
||||
|
||||
# 1. Verify location exists
|
||||
loc = query_db('SELECT session_id, location_name FROM LocationCounts WHERE location_count_id = ?',
|
||||
[location_count_id], one=True)
|
||||
|
||||
if not loc:
|
||||
return jsonify({'success': False, 'message': 'Location not found'})
|
||||
|
||||
# 2. Soft delete the bin count itself
|
||||
execute_db('''
|
||||
UPDATE LocationCounts
|
||||
SET is_deleted = 1
|
||||
WHERE location_count_id = ?
|
||||
''', [location_count_id])
|
||||
|
||||
# 3. Soft delete all scans in that bin
|
||||
execute_db('''
|
||||
UPDATE ScanEntries
|
||||
SET is_deleted = 1
|
||||
WHERE location_count_id = ?
|
||||
''', [location_count_id])
|
||||
|
||||
# 4. Remove any MissingLots records generated for this bin
|
||||
execute_db('''
|
||||
DELETE FROM MissingLots
|
||||
WHERE session_id = ? AND master_expected_location = ?
|
||||
''', [loc['session_id'], loc['location_name']])
|
||||
|
||||
return jsonify({'success': True, 'message': 'Bin count and associated data soft-deleted'})
|
||||
Reference in New Issue
Block a user