etm-terrain/handlers/chantier.py

84 lines
3.4 KiB
Python

from datetime import datetime
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import ContextTypes
from telegram import Update
from services.nextcloud import get_chantiers_actifs
from models.session import set_state, set_data, get_data, ATTENTE_PHOTO_FIN, ATTENTE_CONTENU_SAV, ATTENTE_CONTENU_MATERIEL, SAISIE_MANUELLE_CHANTIER
FLOW_FIN = "fin"
FLOW_SAV = "sav"
FLOW_MAT = "mat"
_NEXT_STATE = {
FLOW_FIN: ATTENTE_PHOTO_FIN,
FLOW_SAV: ATTENTE_CONTENU_SAV,
FLOW_MAT: ATTENTE_CONTENU_MATERIEL,
}
_FALLBACK_PROMPT = {
FLOW_FIN: "📸 *Fin de Chantier*\n\nEnvoyez la/les photo(s) avec :\n`NOM_Ville / Notes`",
FLOW_SAV: "⚠️ *Alerte SAV*\n\nEnvoyez avec :\n`NOM_Ville / Description`\nPhoto optionnelle.",
FLOW_MAT: "📦 *Matériel Manquant*\n\nEnvoyez avec :\n`NOM_Ville / - item1 - item2`",
}
_SELECTED_PROMPT = {
FLOW_FIN: "📸 *{nom}*\n\nEnvoyez la/les photo(s).\nLégende optionnelle pour des notes.",
FLOW_SAV: "⚠️ *{nom}*\n\nDécrivez le problème.\nPhoto optionnelle.",
FLOW_MAT: "📦 *{nom}*\n\nEnvoyez la liste :\n`- item1 - item2`",
}
def formater_nom(dossier: str) -> str:
"""260518_Müller_Strasbourg → Müller Strasbourg — 18/05/26"""
if len(dossier) >= 8 and dossier[:6].isdigit() and dossier[6] == "_":
d = dossier[:6]
nom = dossier[7:].replace("_", " ")
return f"{nom}{d[4:6]}/{d[2:4]}/{d[:2]}"
return dossier.replace("_", " ")
def nom_depuis_dossier(dossier: str) -> str:
"""260518_Müller_Strasbourg → Müller_Strasbourg"""
if len(dossier) >= 8 and dossier[:6].isdigit() and dossier[6] == "_":
return dossier[7:]
return dossier
async def afficher_choix_chantier(query, flow: str) -> None:
chantiers = await get_chantiers_actifs()
if not chantiers:
set_state(query.from_user.id, _NEXT_STATE[flow])
await query.edit_message_text(_FALLBACK_PROMPT[flow], parse_mode="Markdown")
return
keyboard = [
[InlineKeyboardButton(formater_nom(c), callback_data=f"chantier:{flow}:{c[:45]}")]
for c in chantiers
]
keyboard.append([InlineKeyboardButton("✏️ Nouveau chantier", callback_data=f"chantier_manuel:{flow}")])
await query.edit_message_text("🏠 Quel chantier ?", reply_markup=InlineKeyboardMarkup(keyboard))
async def handle_chantier_callback(query, user_id: int) -> None:
_, flow, chantier_folder = query.data.split(":", 2)
set_data(user_id, "chantier_folder", chantier_folder)
set_data(user_id, "flow", flow)
set_state(user_id, _NEXT_STATE[flow])
prompt = _SELECTED_PROMPT[flow].format(nom=formater_nom(chantier_folder))
await query.edit_message_text(prompt, parse_mode="Markdown")
async def handle_saisie_manuelle(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
from handlers import get_menu_keyboard, MENU_TEXT
msg = update.message
chantier = (msg.text or "").strip()
if not chantier:
await msg.reply_text("❌ Nom invalide. Format : `NOM_Ville`", parse_mode="Markdown")
return
user_id = msg.from_user.id
flow = get_data(user_id, "flow", FLOW_FIN)
chantier_folder = f"{datetime.now().strftime('%y%m%d')}_{chantier}"
set_data(user_id, "chantier_folder", chantier_folder)
set_state(user_id, _NEXT_STATE[flow])
prompt = _SELECTED_PROMPT[flow].format(nom=chantier)
await msg.reply_text(prompt, parse_mode="Markdown")