143 lines
4.5 KiB
Bash
143 lines
4.5 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Valideringsskript för konkurrensdata
|
||
|
|
# Kontrollerar att all data är komplett och konsekvent
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
WORKSPACE="/home/bernt/.openclaw/workspace"
|
||
|
|
WATCH_DIR="$WORKSPACE/intelligence/competitor-watch"
|
||
|
|
DATA_DIR="$WATCH_DIR/data"
|
||
|
|
DATE=$(date +%Y-%m-%d)
|
||
|
|
|
||
|
|
ERRORS=0
|
||
|
|
WARNINGS=0
|
||
|
|
|
||
|
|
echo "=== Validering av konkurrensdata — $DATE ==="
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# 1. Kontrollera att competitors.json finns och är giltig JSON
|
||
|
|
echo "--- 1. Kontrollerar competitors.json ---"
|
||
|
|
if [ ! -f "$DATA_DIR/competitors.json" ]; then
|
||
|
|
echo " ❌ ERROR: competitors.json saknas"
|
||
|
|
ERRORS=$((ERRORS + 1))
|
||
|
|
else
|
||
|
|
if python3 -c "import json; json.load(open('$DATA_DIR/competitors.json'))" 2>/dev/null; then
|
||
|
|
echo " ✅ competitors.json är giltig JSON"
|
||
|
|
|
||
|
|
# Kontrollera antal konkurrenter
|
||
|
|
COUNT=$(python3 -c "import json; d=json.load(open('$DATA_DIR/competitors.json')); print(len(d['competitors']))")
|
||
|
|
echo " 📊 Antal konkurrenter: $COUNT"
|
||
|
|
|
||
|
|
if [ "$COUNT" -lt 10 ]; then
|
||
|
|
echo " ⚠️ WARNING: Färre än 10 konkurrenter ($COUNT)"
|
||
|
|
WARNINGS=$((WARNINGS + 1))
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo " ❌ ERROR: competitors.json är ogiltig JSON"
|
||
|
|
ERRORS=$((ERRORS + 1))
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# 2. Kontrollera att alla konkurrenter har nödvändiga fält
|
||
|
|
echo "--- 2. Kontrollerar obligatoriska fält ---"
|
||
|
|
REQUIRED_FIELDS=("rank" "name" "segment" "priority" "status" "threat_level")
|
||
|
|
|
||
|
|
for field in "${REQUIRED_FIELDS[@]}"; do
|
||
|
|
MISSING=$(python3 -c "
|
||
|
|
import json
|
||
|
|
d=json.load(open('$DATA_DIR/competitors.json'))
|
||
|
|
missing = [c['name'] for c in d['competitors'] if '$field' not in c or not c['$field']]
|
||
|
|
print('\n'.join(missing)) if missing else print('OK')
|
||
|
|
" 2>/dev/null)
|
||
|
|
|
||
|
|
if [ "$MISSING" = "OK" ]; then
|
||
|
|
echo " ✅ $field: alla konkurrenter har värdet"
|
||
|
|
else
|
||
|
|
echo " ⚠️ WARNING: $field saknas för:"
|
||
|
|
echo "$MISSING" | sed 's/^/ - /'
|
||
|
|
WARNINGS=$((WARNINGS + 1))
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# 3. Kontrollera att prisdata är aktuell
|
||
|
|
echo "--- 3. Kontrollerar prisdata ---"
|
||
|
|
STALE_PRICES=$(python3 -c "
|
||
|
|
import json
|
||
|
|
from datetime import datetime, timedelta
|
||
|
|
d=json.load(open('$DATA_DIR/competitors.json'))
|
||
|
|
stale = []
|
||
|
|
for c in d['competitors']:
|
||
|
|
if 'pricing' in c and 'last_verified' in c['pricing']:
|
||
|
|
lv = c['pricing']['last_verified']
|
||
|
|
if lv:
|
||
|
|
date = datetime.strptime(lv, '%Y-%m-%d')
|
||
|
|
if datetime.now() - date > timedelta(days=90):
|
||
|
|
stale.append(f\"{c['name']} (senast: {lv})\")
|
||
|
|
print('\n'.join(stale)) if stale else print('OK')
|
||
|
|
" 2>/dev/null)
|
||
|
|
|
||
|
|
if [ "$STALE_PRICES" = "OK" ]; then
|
||
|
|
echo " ✅ All prisdata är aktuell (< 90 dagar)"
|
||
|
|
else
|
||
|
|
echo " ⚠️ WARNING: Föråldrade priser:"
|
||
|
|
echo "$STALE_PRICES" | sed 's/^/ - /'
|
||
|
|
WARNINGS=$((WARNINGS + 1))
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# 4. Kontrollera att senaste rapporten finns
|
||
|
|
echo "--- 4. Kontrollerar rapporter ---"
|
||
|
|
LATEST_REPORT=$(find "$WATCH_DIR/reports" -name "*-weekly-report.md" | sort | tail -1)
|
||
|
|
if [ -n "$LATEST_REPORT" ]; then
|
||
|
|
REPORT_DATE=$(basename "$LATEST_REPORT" | cut -d'-' -f1-3)
|
||
|
|
echo " ✅ Senaste rapport: $REPORT_DATE"
|
||
|
|
|
||
|
|
# Kontrollera om rapporten är äldre än 8 dagar
|
||
|
|
REPORT_AGE=$(( ($(date +%s) - $(date -d "$REPORT_DATE" +%s)) / 86400 ))
|
||
|
|
if [ "$REPORT_AGE" -gt 8 ]; then
|
||
|
|
echo " ⚠️ WARNING: Rapporten är $REPORT_AGE dagar gammal"
|
||
|
|
WARNINGS=$((WARNINGS + 1))
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo " ⚠️ WARNING: Ingen rapport hittad"
|
||
|
|
WARNINGS=$((WARNINGS + 1))
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# 5. Kontrollera att skrapade filer finns
|
||
|
|
echo "--- 5. Kontrollerar skrapade data ---"
|
||
|
|
LATEST_SIGNALS=$(find "$DATA_DIR/signals" -maxdepth 1 -type d -name "2026-*" | sort | tail -1)
|
||
|
|
if [ -n "$LATEST_SIGNALS" ]; then
|
||
|
|
SIGNAL_COUNT=$(find "$LATEST_SIGNALS" -type f | wc -l)
|
||
|
|
echo " ✅ Senaste skrapning: $(basename $LATEST_SIGNALS) ($SIGNAL_COUNT filer)"
|
||
|
|
|
||
|
|
SIGNAL_AGE=$(( ($(date +%s) - $(date -d "$(basename $LATEST_SIGNALS)" +%s)) / 86400 ))
|
||
|
|
if [ "$SIGNAL_AGE" -gt 8 ]; then
|
||
|
|
echo " ⚠️ WARNING: Skrapningen är $SIGNAL_AGE dagar gammal"
|
||
|
|
WARNINGS=$((WARNINGS + 1))
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo " ⚠️ WARNING: Inga skrapade signaler hittade"
|
||
|
|
WARNINGS=$((WARNINGS + 1))
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Sammanfattning
|
||
|
|
echo "=== Validering slutförd ==="
|
||
|
|
echo "Errors: $ERRORS"
|
||
|
|
echo "Warnings: $WARNINGS"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
if [ "$ERRORS" -gt 0 ]; then
|
||
|
|
echo "❌ VALIDERING MISSLYCKADES — åtgärda errors"
|
||
|
|
exit 1
|
||
|
|
elif [ "$WARNINGS" -gt 0 ]; then
|
||
|
|
echo "⚠️ VALIDERING GODKÄND med varningar"
|
||
|
|
exit 0
|
||
|
|
else
|
||
|
|
echo "✅ VALIDERING GODKÄND"
|
||
|
|
exit 0
|
||
|
|
fi
|