222 lines
6.1 KiB
Python
222 lines
6.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Update paris results - Intègre les résultats PMU dans la table paris
|
|
Usage: python3 update_paris_results.py [--date YYYY-MM-DD]
|
|
"""
|
|
|
|
import sqlite3
|
|
import sys
|
|
from datetime import datetime, timedelta
|
|
|
|
DB_PATH = "/home/h3r7/turf_scraper/turf.db"
|
|
|
|
|
|
def create_paris_from_recommendations(conn, date: str):
|
|
"""Crée les paris depuis les recommandations du jour"""
|
|
cursor = conn.cursor()
|
|
|
|
# Récupère les recommandations du jour
|
|
cursor.execute(
|
|
"""
|
|
SELECT id, race_name, type_pari, cheval1, numero1, cote, confiance
|
|
FROM recommendations
|
|
WHERE date = ?
|
|
""",
|
|
(date,),
|
|
)
|
|
|
|
recs = cursor.fetchall()
|
|
|
|
for rec in recs:
|
|
rec_id, race_name, type_pari, cheval1, numero1, cote, confiance = rec
|
|
|
|
# Extrait le code course du race_name
|
|
race_label = race_name.split(" - ")[0] if " - " in race_name else race_name
|
|
|
|
# Vérifie si le pari existe déjà
|
|
cursor.execute(
|
|
"""
|
|
SELECT id FROM paris
|
|
WHERE date_course = ? AND race_label = ? AND type_pari = ? AND numero1 = ?
|
|
""",
|
|
(date, race_label, type_pari, numero1),
|
|
)
|
|
|
|
if cursor.fetchone():
|
|
continue
|
|
|
|
# Crée le pari
|
|
cursor.execute(
|
|
"""
|
|
INSERT INTO paris
|
|
(date_pari, date_course, race_name, race_label, type_pari, cheval1, numero1, cote, mise, statut, source_reco, model_source)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'EN_ATTENTE', 'agent_turf', 'scoring_v1')
|
|
""",
|
|
(date, date, race_name, race_label, type_pari, cheval1, numero1, cote, 2.0),
|
|
)
|
|
|
|
conn.commit()
|
|
return len(recs)
|
|
|
|
|
|
def get_course_results(conn, date: str):
|
|
"""Récupère les résultats des courses pour une date"""
|
|
cursor = conn.cursor()
|
|
|
|
cursor.execute(
|
|
"""
|
|
SELECT
|
|
p.date_programme,
|
|
p.num_reunion,
|
|
p.num_course,
|
|
r.hippodrome_court,
|
|
c.libelle,
|
|
p.num_pmu,
|
|
p.nom,
|
|
p.ordre_arrivee
|
|
FROM pmu_partants p
|
|
JOIN pmu_courses c ON c.date_programme = p.date_programme
|
|
AND c.num_reunion = p.num_reunion
|
|
AND c.num_course = p.num_course
|
|
JOIN pmu_reunions r ON r.date_programme = p.date_programme
|
|
AND r.num_reunion = p.num_reunion
|
|
WHERE p.date_programme = ?
|
|
AND p.ordre_arrivee > 0
|
|
ORDER BY p.num_reunion, p.num_course, p.ordre_arrivee
|
|
""",
|
|
(date,),
|
|
)
|
|
|
|
return cursor.fetchall()
|
|
|
|
|
|
def update_paris_status(conn, date: str):
|
|
"""Met à jour le statut des paris pour une date"""
|
|
cursor = conn.cursor()
|
|
|
|
# Récupère les paris en attente pour cette date
|
|
cursor.execute(
|
|
"""
|
|
SELECT id, race_label, type_pari, numero1, numero2, numero3
|
|
FROM paris
|
|
WHERE date_course = ? AND statut = 'EN_ATTENTE'
|
|
""",
|
|
(date,),
|
|
)
|
|
|
|
paris_en_attente = cursor.fetchall()
|
|
|
|
if not paris_en_attente:
|
|
return 0
|
|
|
|
results = get_course_results(conn, date)
|
|
|
|
if not results:
|
|
return 0
|
|
|
|
# Construit un dict des résultats par nom de course
|
|
results_by_course = {}
|
|
for row in results:
|
|
# Utilise le nom de la course comme clé
|
|
key = row[4] # c.libelle
|
|
if key not in results_by_course:
|
|
results_by_course[key] = []
|
|
if row[7] <= 4: # TOP 4
|
|
results_by_course[key].append(
|
|
{"numero": row[5], "nom": row[6], "place": row[7]}
|
|
)
|
|
|
|
updated = 0
|
|
|
|
for pari in paris_en_attente:
|
|
pari_id, race_label, type_pari, num1, num2, num3 = pari
|
|
|
|
# Trouve la course correspondante par nom
|
|
course_key = None
|
|
for key in results_by_course.keys():
|
|
if key and race_label:
|
|
if key in race_label or race_label in key:
|
|
course_key = key
|
|
break
|
|
|
|
if not course_key:
|
|
continue
|
|
|
|
podium = results_by_course[course_key]
|
|
podium_nums = [p["numero"] for p in podium]
|
|
|
|
# Vérifie le résultat selon le type de pari
|
|
statut = "PERDU"
|
|
gain = 0.0
|
|
|
|
if type_pari == "simple_gagnant":
|
|
if num1 == podium_nums[0] if podium_nums else False:
|
|
statut = "GAGNE"
|
|
gain = 1.0
|
|
|
|
elif type_pari == "simple_place":
|
|
if num1 in podium_nums[:3] if len(podium_nums) >= 3 else False:
|
|
statut = "GAGNE"
|
|
gain = 1.0
|
|
|
|
elif type_pari in ["tierce", "quarte", "quinte"]:
|
|
nums_pari = [n for n in [num1, num2, num3] if n]
|
|
nums_podium = podium_nums[: len(nums_pari)]
|
|
|
|
if set(nums_pari) == set(nums_podium):
|
|
statut = "GAGNE"
|
|
gain = 1.0
|
|
|
|
elif type_pari.startswith("top"):
|
|
# TOP 1, TOP 2, TOP 3, TOP 4
|
|
rang = int(type_pari.replace("top", ""))
|
|
if num1 in podium_nums[:rang] if len(podium_nums) >= rang else False:
|
|
statut = "GAGNE"
|
|
gain = 1.0
|
|
|
|
# Met à jour le pari
|
|
cursor.execute(
|
|
"""
|
|
UPDATE paris
|
|
SET statut = ?, gain = ?, commentaire = ?
|
|
WHERE id = ?
|
|
""",
|
|
(
|
|
statut,
|
|
gain,
|
|
f"Résultat intégré automatiquement - {datetime.now().strftime('%Y-%m-%d %H:%M')}",
|
|
pari_id,
|
|
),
|
|
)
|
|
|
|
updated += 1
|
|
|
|
conn.commit()
|
|
return updated
|
|
|
|
|
|
def main():
|
|
date = (
|
|
sys.argv[2]
|
|
if len(sys.argv) > 2 and sys.argv[1] == "--date"
|
|
else datetime.now().strftime("%Y-%m-%d")
|
|
)
|
|
|
|
print(f"Processing paris for {date}...")
|
|
|
|
conn = sqlite3.connect(DB_PATH)
|
|
|
|
# 1. Crée les paris depuis les recommandations
|
|
created = create_paris_from_recommendations(conn, date)
|
|
print(f"Created {created} paris from recommendations")
|
|
|
|
# 2. Met à jour les statuts avec les résultats
|
|
updated = update_paris_status(conn, date)
|
|
print(f"Updated {updated} paris with results")
|
|
|
|
conn.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|