#!/usr/bin/env python3 """ Ingest PGZ sport key facts into dabi.knowledge for DABI chat All pulled from DB real data - NO MOCK """ import psycopg2, psycopg2.extras, hashlib, json from datetime import datetime DSN = "host=127.0.0.1 port=5432 dbname=rinet_v3 user=rinet password=R1net2026!SecureDB#v7" conn = psycopg2.connect(DSN) conn.autocommit = True cur = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) facts = [] def add_fact(fact, category, source="pgz_sport_db", confidence=0.95): data_hash = hashlib.sha256(fact.encode()).hexdigest() facts.append((fact, category, source, "https://api.rinet.one/sport/", datetime.now().date(), confidence, data_hash)) # 1. Dashboard stats cur.execute("SELECT * FROM pgz_sport.savezi WHERE aktivan=true") savezi = cur.fetchall() add_fact(f"Primorsko-goranska županija ima {len(savezi)} aktivnih sportskih saveza registriranih u PGŽ Sport sustavu.", "pgz_sport_stats") cur.execute("SELECT COUNT(*) as n FROM pgz_sport.klubovi WHERE aktivan=true") n_klubovi = cur.fetchone()["n"] add_fact(f"Primorsko-goranska županija ima {n_klubovi} aktivnih sportskih klubova.", "pgz_sport_stats") cur.execute("SELECT COUNT(*) as n FROM pgz_sport.clanovi WHERE aktivan=true") n_clanovi = cur.fetchone()["n"] add_fact(f"U PGŽ sportskim klubovima aktivno je {n_clanovi} registriranih članova.", "pgz_sport_stats") # 2. Budget cur.execute("SELECT SUM(ukupno) as ukupno, MAX(godina) as godina FROM pgz_sport.proracun WHERE aktivan=true") r = cur.fetchone() if r and r["ukupno"]: add_fact(f"Proračun PGŽ za sport u {r['godina']} godini iznosi {r['ukupno']:,.2f} EUR.", "pgz_sport_financije") # 3. Top savezi cur.execute(""" SELECT s.naziv, s.registriranih, s.trenera, s.reprezentativaca, COUNT(k.id) as klubova FROM pgz_sport.savezi s LEFT JOIN pgz_sport.klubovi k ON k.savez_id=s.id WHERE s.aktivan=true GROUP BY s.naziv, s.registriranih, s.trenera, s.reprezentativaca ORDER BY s.registriranih DESC NULLS LAST LIMIT 10 """) for row in cur.fetchall(): if row["registriranih"] and row["registriranih"] > 0: fact = f"{row['naziv']} PGŽ: {row['registriranih']} registriranih sportaša" if row["klubova"] > 0: fact += f", {row['klubova']} klubova" if row["trenera"] and row["trenera"] > 0: fact += f", {row['trenera']} trenera" add_fact(fact, "pgz_sport_savezi") # 4. HNS natjecanja cur.execute("SELECT COUNT(*) as n FROM pgz_sport.hns_natjecanja") r = cur.fetchone() if r: add_fact(f"U PGŽ se odvijaju {r['n']} HNS nogometnih natjecanja u sezoni 2025/26 (NS Rijeka i ŽNS PGŽ).", "pgz_sport_hns") cur.execute("SELECT naziv, sezona FROM pgz_sport.hns_natjecanja WHERE sezona='2025/2026' ORDER BY naziv LIMIT 10") for row in cur.fetchall(): add_fact(f"HNS natjecanje u PGŽ (sezona 2025/26): {row['naziv']}", "pgz_sport_hns") # 5. RNO cur.execute("SELECT COUNT(*) as n FROM pgz_sport.rno_organizacije WHERE aktivna=true") r = cur.fetchone() if r: add_fact(f"Registar neprofitnih organizacija bilježi {r['n']} aktivnih sportskih organizacija u PGŽ.", "pgz_sport_rno") cur.execute("SELECT COUNT(*) as n FROM pgz_sport.rno_organizacije WHERE aktivna=false AND datum_brisanja IS NOT NULL") r = cur.fetchone() if r: add_fact(f"U PGŽ je kroz godine upisano ukupno {r['n']} sportskih organizacija koje više nisu aktivne.", "pgz_sport_rno") # 6. Gradovi s najviše klubova cur.execute(""" SELECT k.grad_opcina, COUNT(*) as n FROM pgz_sport.klubovi k WHERE k.aktivan=true AND k.grad_opcina IS NOT NULL GROUP BY k.grad_opcina ORDER BY n DESC LIMIT 5 """) for row in cur.fetchall(): add_fact(f"Grad/općina {row['grad_opcina']} u PGŽ ima {row['n']} aktivnih sportskih klubova.", "pgz_sport_lokacija") # 7. Portal URL add_fact("PGŽ Sport portal dostupan je na adresi https://api.rinet.one/sport/ — sadrži evidenciju svih saveza, klubova, članova, dokumenta i proračuna.", "pgz_sport_info") add_fact("Boris Milanović je stručni suradnik za sport u Primorsko-goranskoj županiji, Upravni odjel za kulturu, sport i tehničku kulturu, Ciottina 17b/I, 51000 Rijeka.", "pgz_sport_info") add_fact("Godišnjaci Zajednice sportova PGŽ dostupni su za periode 2006-2024 i sadrže sveobuhvatne podatke o sportu u PGŽ kroz 19 godina.", "pgz_sport_godisnjaci") print(f"Facts to insert: {len(facts)}") # Insert psycopg2.extras.execute_batch(cur, """ INSERT INTO dabi.knowledge (fact, category, source, source_url, source_date, confidence, data_hash) VALUES (%s, %s, %s, %s, %s, %s, %s) ON CONFLICT (data_hash) DO UPDATE SET updated_at=now() """, facts, page_size=100) print(f"✅ Inserted {len(facts)} PGZ sport facts into dabi.knowledge") conn.close()