Dateien
AegisSight-Monitor-Verwaltung/migrations/2026-07-25_credits_period.py
claude-dev 9bf3adbacb feat(abrechnung): Credits-Uebertrag komplett entfernt
Produktentscheidung 07/2026: ungenutzte Credits verfallen zum
Periodenende. Uebertrag-Checkbox aus allen drei Formularen
(Kontingent bearbeiten, Lizenz anlegen, Org anlegen) samt
Ausgrau-Logik raus, credits_rollover/credits_carried aus Modellen,
Endpoints (overview/current/PUT budget) und insert_license_row raus,
Anzeige inkl. Uebertrag im Org-Detail raus. Migrationsskript legt die
beiden Spalten nicht mehr an. Gegenstueck zum Monitor-Commit f8499c4,
Promote-Reihenfolge wie immer Monitor VOR Portal.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 21:51:02 +00:00

58 Zeilen
2.2 KiB
Python

"""Migration 2026-07-25: Credits-Perioden-Spalten in licenses.
Legt die fünf Spalten des Credits-Monatskontingents an, exakt dieselben
Statements wie die Monitor-Migration (AegisSight-Monitor, src/database.py,
Block "Credits-Periode"). Idempotent, ein zweiter Lauf ist ein No-op.
Hintergrund: Der Monitor legt diese Spalten beim Start selbst an. Die
Portal-Staging-Umgebung nutzt aber eine EIGENE Datenbank, auf der kein
Monitor läuft, deshalb braucht sie dieses Skript. Auf der Live-DB ist es
nur ein Fallback für den Fall, dass das Portal vor dem Monitor deployt wird.
Ausführung:
DB_PATH=/home/claude-dev/AegisSight-Monitor-staging/data/osint.db python3 migrations/2026-07-25_credits_period.py
DB_PATH=/home/claude-dev/osint-data/osint.db python3 migrations/2026-07-25_credits_period.py
"""
import os
import sqlite3
import sys
# Spaltenname -> ALTER-Statement, wortgleich mit der Monitor-Migration.
# credits_rollover/credits_carried gab es hier kurzzeitig, der Uebertrag
# wurde als Produktentscheidung 07/2026 entfernt (verfaellt zum Periodenende).
COLUMNS = {
"credits_period": "ALTER TABLE licenses ADD COLUMN credits_period TEXT DEFAULT 'monthly'",
"credits_period_start": "ALTER TABLE licenses ADD COLUMN credits_period_start TEXT",
"budget_warning_sent": "ALTER TABLE licenses ADD COLUMN budget_warning_sent INTEGER DEFAULT 0",
}
def main(db_path: str) -> int:
if not os.path.exists(db_path):
print(f"FEHLER: DB nicht gefunden: {db_path}", file=sys.stderr)
return 1
conn = sqlite3.connect(db_path, timeout=60)
conn.execute("PRAGMA busy_timeout = 60000")
conn.execute("PRAGMA journal_mode = WAL")
print(f"Migration auf {db_path}")
cols = [c[1] for c in conn.execute("PRAGMA table_info(licenses)")]
for name, stmt in COLUMNS.items():
if name not in cols:
conn.execute(stmt)
print(f" + licenses.{name} Spalte hinzugefügt")
else:
print(f" = licenses.{name} war bereits da")
conn.commit()
conn.close()
print("Migration abgeschlossen.")
return 0
if __name__ == "__main__":
db_path = os.environ.get("DB_PATH", "/home/claude-dev/osint-data/osint.db")
sys.exit(main(db_path))