84 lines
3.4 KiB
Python
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")
|