fix: show '— No report yet' for assets without dex_report_date
This commit is contained in:
@@ -1,22 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Auto-backup for canteen-asset-tracker database
|
|
||||||
# Runs before every server start and on a cron schedule
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
DB_DIR="/home/oplabs/projects/canteen-asset-tracker"
|
|
||||||
BACKUP_DIR="/home/oplabs/backups/canteen-db"
|
|
||||||
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
|
||||||
|
|
||||||
mkdir -p "$BACKUP_DIR"
|
|
||||||
|
|
||||||
for db in assets.db; do
|
|
||||||
if [ -f "${DB_DIR}/${db}" ]; then
|
|
||||||
cp "${DB_DIR}/${db}" "${BACKUP_DIR}/${db}-${TIMESTAMP}"
|
|
||||||
# Keep only last 30 backups
|
|
||||||
ls -t "${BACKUP_DIR}/${db}-"* 2>/dev/null | tail -n +31 | xargs rm -f 2>/dev/null || true
|
|
||||||
echo "✅ Backed up ${db} -> ${BACKUP_DIR}/${db}-${TIMESTAMP}"
|
|
||||||
else
|
|
||||||
echo "⚠️ ${db} not found, skipping"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
+5
-5
@@ -88,13 +88,13 @@ DN_PREFIXES = [
|
|||||||
'112206', '112510',
|
'112206', '112510',
|
||||||
# Other DN 11-prefixed: 11 + 4-digit year/week code
|
# Other DN 11-prefixed: 11 + 4-digit year/week code
|
||||||
]
|
]
|
||||||
DN_RULE = _make_rule(DN_PREFIXES, 'DN', 'BevMax/5800/3800/200E', 'GF Bev',
|
DN_RULE = _make_rule(DN_PREFIXES, 'DN', 'BevMax/5800/3800/200E', 'Bev',
|
||||||
min_len=10, max_len=14)
|
min_len=10, max_len=14)
|
||||||
|
|
||||||
# Broader DN catch: any 12-13 digit serial starting with '11'
|
# Broader DN catch: any 12-13 digit serial starting with '11'
|
||||||
def _dn_broad(sn_clean):
|
def _dn_broad(sn_clean):
|
||||||
return len(sn_clean) >= 11 and sn_clean.startswith('11') and sn_clean.isdigit()
|
return len(sn_clean) >= 11 and sn_clean.startswith('11') and sn_clean.isdigit()
|
||||||
DN_BROAD = (_dn_broad, 'DN', 'Unknown', 'GF Bev', 'medium')
|
DN_BROAD = (_dn_broad, 'DN', 'Unknown', 'Bev', 'medium')
|
||||||
|
|
||||||
# ─── CRANE ─────────────────────────────────────────────────────────────────
|
# ─── CRANE ─────────────────────────────────────────────────────────────────
|
||||||
# Multiple serial formats for Crane/National machines
|
# Multiple serial formats for Crane/National machines
|
||||||
@@ -119,12 +119,12 @@ CRANE_222 = (_crane_222, 'Crane', 'Merchant Media', 'Snack', 'high')
|
|||||||
# 12-digit: 221XXXXXXXXX (Crane Merchant Media, 472)
|
# 12-digit: 221XXXXXXXXX (Crane Merchant Media, 472)
|
||||||
def _crane_221(sn_clean):
|
def _crane_221(sn_clean):
|
||||||
return len(sn_clean) >= 11 and sn_clean.startswith('221') and sn_clean.isdigit()
|
return len(sn_clean) >= 11 and sn_clean.startswith('221') and sn_clean.isdigit()
|
||||||
CRANE_221 = (_crane_221, 'Crane', 'Merchant Media', 'Snack/GF Food', 'high')
|
CRANE_221 = (_crane_221, 'Crane', 'Merchant Media', 'Snack/Food', 'high')
|
||||||
|
|
||||||
# 471/472: dash or 9-digit
|
# 471/472: dash or 9-digit
|
||||||
def _crane_47(sn_clean):
|
def _crane_47(sn_clean):
|
||||||
return (sn_clean.startswith('471') or sn_clean.startswith('472')) and len(sn_clean) >= 8
|
return (sn_clean.startswith('471') or sn_clean.startswith('472')) and len(sn_clean) >= 8
|
||||||
CRANE_47 = (_crane_47, 'Crane', '471/472', 'GF Food', 'high')
|
CRANE_47 = (_crane_47, 'Crane', '471/472', 'Food', 'high')
|
||||||
|
|
||||||
# Dash format: 168-XXXXXX, 167-XXXXXX
|
# Dash format: 168-XXXXXX, 167-XXXXXX
|
||||||
def _crane_dash(orig_sn):
|
def _crane_dash(orig_sn):
|
||||||
@@ -220,7 +220,7 @@ def _dn_8digit_short(sn_clean):
|
|||||||
return (len(sn_clean) == 8 and sn_clean.isdigit() and
|
return (len(sn_clean) == 8 and sn_clean.isdigit() and
|
||||||
(sn_clean.startswith('114') or sn_clean.startswith('241') or
|
(sn_clean.startswith('114') or sn_clean.startswith('241') or
|
||||||
sn_clean.startswith('1149') or sn_clean.startswith('2411')))
|
sn_clean.startswith('1149') or sn_clean.startswith('2411')))
|
||||||
DN_SHORT_8 = (_dn_8digit_short, 'DN', 'BevMax/5800/3800/200E', 'GF Bev', 'medium')
|
DN_SHORT_8 = (_dn_8digit_short, 'DN', 'BevMax/5800/3800/200E', 'Bev', 'medium')
|
||||||
|
|
||||||
# 10-digit 76/77 prefix → DN (e.g., 76820565BD, 76920191BD, 77090262AE)
|
# 10-digit 76/77 prefix → DN (e.g., 76820565BD, 76920191BD, 77090262AE)
|
||||||
def _dn_76_77(sn_clean):
|
def _dn_76_77(sn_clean):
|
||||||
|
|||||||
+2
-2
@@ -77,13 +77,13 @@ def main(xlsx_path):
|
|||||||
# New columns from export
|
# New columns from export
|
||||||
dex_report_date = row[7]
|
dex_report_date = row[7]
|
||||||
if isinstance(dex_report_date, datetime):
|
if isinstance(dex_report_date, datetime):
|
||||||
dex_report_date = dex_report_date.isoformat()
|
dex_report_date = dex_report_date.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
else:
|
else:
|
||||||
dex_report_date = str(dex_report_date) if dex_report_date else ''
|
dex_report_date = str(dex_report_date) if dex_report_date else ''
|
||||||
deployed = str(row[34]) if row[34] else ''
|
deployed = str(row[34]) if row[34] else ''
|
||||||
pulled_date = row[35]
|
pulled_date = row[35]
|
||||||
if isinstance(pulled_date, datetime):
|
if isinstance(pulled_date, datetime):
|
||||||
pulled_date = pulled_date.isoformat()
|
pulled_date = pulled_date.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
else:
|
else:
|
||||||
pulled_date = str(pulled_date) if pulled_date else ''
|
pulled_date = str(pulled_date) if pulled_date else ''
|
||||||
device = str(row[0]) if row[0] else ''
|
device = str(row[0]) if row[0] else ''
|
||||||
|
|||||||
@@ -1056,7 +1056,7 @@ def list_assets(
|
|||||||
like = f"%{q}%"
|
like = f"%{q}%"
|
||||||
params.extend([like, like, like, like])
|
params.extend([like, like, like, like])
|
||||||
if no_dex_days is not None:
|
if no_dex_days is not None:
|
||||||
conditions.append("(dex_report_date IS NULL OR dex_report_date < datetime('now', '-' || ? || ' days'))")
|
conditions.append("(dex_report_date IS NULL OR REPLACE(dex_report_date, 'T', ' ') < datetime('now', '-' || ? || ' days'))")
|
||||||
params.append(no_dex_days)
|
params.append(no_dex_days)
|
||||||
|
|
||||||
where = " AND ".join(conditions)
|
where = " AND ".join(conditions)
|
||||||
|
|||||||
@@ -3813,6 +3813,7 @@
|
|||||||
df('Category', catLabel(a.category)),
|
df('Category', catLabel(a.category)),
|
||||||
df('Make', a.make),
|
df('Make', a.make),
|
||||||
df('Model', a.model),
|
df('Model', a.model),
|
||||||
|
df('Last Dex Report', a.dex_report_date || '— No report yet', true),
|
||||||
|
|
||||||
].filter(Boolean).join('');
|
].filter(Boolean).join('');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user