diff --git a/scripts/seed-testdata.sh b/scripts/seed-testdata.sh new file mode 100755 index 0000000..8c0a232 --- /dev/null +++ b/scripts/seed-testdata.sh @@ -0,0 +1,140 @@ +#!/bin/bash +# Generiert realistische HACCP-Testdaten für die letzten 30 Tage + +set -euo pipefail + +PB_URL="${PB_URL:-https://api.checkflo.de}" + +if [ -z "${PB_EMAIL:-}" ] || [ -z "${PB_PASSWORD:-}" ]; then + echo "Aufruf: PB_EMAIL=... PB_PASSWORD=... ./seed-testdata.sh" + exit 1 +fi + +TOKEN=$(curl -sf -X POST "$PB_URL/api/collections/_superusers/auth-with-password" \ + -H "Content-Type: application/json" \ + -d "{\"identity\":\"$PB_EMAIL\",\"password\":\"$PB_PASSWORD\"}" | jq -r '.token') + +echo "✓ Eingeloggt" + +TENANT_ID="mengbzc3ajxpccz" + +# Stationen als JSON laden +STATIONS_JSON=$(curl -sf "$PB_URL/api/collections/stations/records?filter=tenant%3D'$TENANT_ID'&perPage=50" \ + -H "Authorization: $TOKEN") + +STATION_COUNT=$(echo "$STATIONS_JSON" | jq '.items | length') +echo "→ $STATION_COUNT Stationen gefunden" + +NAMES=("Maria S." "Klaus B." "Sandra M." "Tobias R." "Anna K." "Michael F." "Lisa W.") +NOTES_ABW=("Tür stand leicht offen" "Dichtung prüfen" "Kompressor läuft laut" "Temperatur leicht erhöht" "Nach Lieferung noch warm") +NOTES_KRIT=("Tür war 2h offen" "Kompressor ausgefallen" "Sofortmaßnahme eingeleitet" "Produkte aussortiert" "Techniker verständigt") + +create_log() { + local station_id=$1 + local date_str=$2 + local status=$3 + local temp=$4 + local notes=$5 + local person=$6 + + curl -sf -X POST "$PB_URL/api/collections/check_logs/records" \ + -H "Authorization: $TOKEN" \ + -H "Content-Type: application/json" \ + -d "{ + \"station\": \"$station_id\", + \"tenant\": \"$TENANT_ID\", + \"temperature\": $temp, + \"status\": \"$status\", + \"notes\": \"$notes\", + \"checked_by\": \"$person\", + \"created\": \"$date_str\", + \"updated\": \"$date_str\" + }" > /dev/null +} + +rand_between() { + local min=$1 + local max=$2 + echo $(( min + RANDOM % (max - min + 1) )) +} + +echo "→ Erstelle Einträge für die letzten 30 Tage..." +COUNT=0 + +for DAY in $(seq 29 -1 0); do + # Datum berechnen (macOS + Linux kompatibel) + if date -v -${DAY}d +"%Y-%m-%d" > /dev/null 2>&1; then + DATE=$(date -v -${DAY}d +"%Y-%m-%d") + DOW=$(date -v -${DAY}d +"%u") + else + DATE=$(date -d "-${DAY} days" +"%Y-%m-%d") + DOW=$(date -d "-${DAY} days" +"%u") + fi + + for i in $(seq 0 $((STATION_COUNT - 1))); do + SID=$(echo "$STATIONS_JSON" | jq -r ".items[$i].id") + TYPE=$(echo "$STATIONS_JSON" | jq -r ".items[$i].type") + TMIN=$(echo "$STATIONS_JSON" | jq -r ".items[$i].target_temp_min // 0") + TMAX=$(echo "$STATIONS_JSON" | jq -r ".items[$i].target_temp_max // 0") + + PERSON=${NAMES[$((RANDOM % ${#NAMES[@]}))]} + + if [ "$TYPE" = "kuehlschrank" ] || [ "$TYPE" = "tiefkuehl" ]; then + # Morgencheck + HOUR=$(rand_between 7 8) + MIN_T=$(rand_between 0 5) + SEC_T=$(rand_between 0 59) + TIME="${DATE} 0${HOUR}:$(printf "%02d" $MIN_T):$(printf "%02d" $SEC_T)" + + RAND=$((RANDOM % 100)) + if [ $RAND -lt 90 ]; then + TEMP=$(rand_between $TMIN $TMAX) + create_log "$SID" "$TIME" "ok" "$TEMP" "" "$PERSON" + elif [ $RAND -lt 98 ]; then + TEMP=$(( TMAX + 1 + RANDOM % 3 )) + NOTE=${NOTES_ABW[$((RANDOM % ${#NOTES_ABW[@]}))]} + create_log "$SID" "$TIME" "abweichung" "$TEMP" "$NOTE" "$PERSON" + else + TEMP=$(( TMAX + 4 + RANDOM % 5 )) + NOTE=${NOTES_KRIT[$((RANDOM % ${#NOTES_KRIT[@]}))]} + create_log "$SID" "$TIME" "kritisch" "$TEMP" "$NOTE" "$PERSON" + fi + COUNT=$((COUNT + 1)) + + # Abendcheck (Mo-Fr) + if [ "$DOW" -lt 6 ]; then + HOUR=$(rand_between 17 19) + TIME="${DATE} ${HOUR}:$(printf "%02d" $(rand_between 0 59)):00" + TEMP=$(rand_between $TMIN $TMAX) + create_log "$SID" "$TIME" "ok" "$TEMP" "" "$PERSON" + COUNT=$((COUNT + 1)) + fi + + elif [ "$TYPE" = "warmhalte" ]; then + TIME="${DATE} 11:$(printf "%02d" $(rand_between 0 30)):00" + RAND=$((RANDOM % 100)) + if [ $RAND -lt 85 ]; then + TEMP=$(rand_between $TMIN $TMAX) + create_log "$SID" "$TIME" "ok" "$TEMP" "" "$PERSON" + else + TEMP=$(( TMIN - 3 - RANDOM % 5 )) + NOTE=${NOTES_ABW[$((RANDOM % ${#NOTES_ABW[@]}))]} + create_log "$SID" "$TIME" "abweichung" "$TEMP" "$NOTE" "$PERSON" + fi + COUNT=$((COUNT + 1)) + + elif [ "$TYPE" = "hygiene" ]; then + if [ "$DOW" -eq 1 ]; then + TIME="${DATE} 09:$(printf "%02d" $(rand_between 0 30)):00" + create_log "$SID" "$TIME" "ok" "0" "" "$PERSON" + COUNT=$((COUNT + 1)) + fi + fi + done + + printf " Tag -%02d: %s (%s)..." "$DAY" "$DATE" "DOW $DOW" + echo " OK" +done + +echo "" +echo " ✓ $COUNT Einträge erstellt"