Files
roa2web-service-auto/reports-app/telegram-bot/TELEGRAM_UI_REFACTOR_PLAN.md
Marius Mutu 6b13ffa183 Initial commit: ROA2WEB - FastAPI + Vue.js + Telegram Bot
Modern ERP Reports Application with microservices architecture

Tech Stack:
- Backend: FastAPI + python-oracledb (Oracle DB integration)
- Frontend: Vue.js 3 + PrimeVue + Vite
- Telegram Bot: python-telegram-bot + SQLite
- Infrastructure: Shared database pool, JWT authentication, SSH tunnel

Features:
- FastAPI backend with async Oracle connection pool
- Vue.js 3 responsive frontend with PrimeVue components
- Telegram bot alternative interface
- Microservices architecture with shared components
- Complete deployment support (Linux Docker + Windows IIS)
- Comprehensive testing (Playwright E2E + pytest)

Repository Structure:
- reports-app/ - Main application (backend, frontend, telegram-bot)
- shared/ - Shared components (database pool, auth, utils)
- deployment/ - Deployment scripts (Linux & Windows)
- docs/ - Project documentation
- security/ - Security scanning and git hooks
2025-10-25 14:55:08 +03:00

29 KiB

🎯 TELEGRAM BOT UI REFACTOR - Plan Detaliat

Data creării: 2025-10-24 Data implementării: 2025-10-24 Obiectiv: Transformare completă a interfeței Telegram bot într-o interfață 100% bazată pe butoane Status: IMPLEMENTAT - NECESITĂ TESTARE


📋 REZUMAT EXECUTIV

Cerințe Utilizator

  1. Interfață 100% cu butoane - Fără comenzi / (exceptând /start cu cod și căutare text pentru companii)
  2. Fără emoji - Toate mesajele fără emoji/icon-uri
  3. Input minimal de text - Doar pentru cod linking (8 chars) și căutare companii opțională
  4. Paginare butoane - Pentru liste lungi (>10 companii)
  5. Toate fluxurile testate - Verificare completă a tuturor ramurilor

Situația Actuală

  • 7 probleme critice identificate
  • 15+ comenzi active care nu ar trebui folosite
  • Mesaje cu comenzi în loc de butoane pentru selectare companie
  • Lipsă paginare pentru liste lungi
  • Emoji rămase în cod după ultima commitare

🔴 PROBLEME IDENTIFICATE (Detaliat)

P1: 🚨 CRITICĂ - Selectare Companie prin Comandă

Fișier: app/bot/handlers.py Linie: 1287-1291 Funcție: handle_menu_callback()

# COD ACTUAL (INCORECT):
elif action == "select_company":
    await query.edit_message_text(
        "📋 Folosește comanda /selectcompany pentru a alege compania."
    )

Problema:

  • Când user apasă butonul "Selectare Companie" din main menu
  • Bot-ul afișează mesaj care cere comanda /selectcompany
  • User se așteaptă să vadă butoanele cu companiile DIRECT

Impact: 🔴 BLOCKER - User nu poate selecta compania prin butoane

Soluție:

elif action == "select_company":
    # Get companies from backend
    auth_data = await get_user_auth_data(telegram_user_id)
    jwt_token = auth_data['jwt_token']

    client = get_backend_client()
    async with client:
        companies = await client.get_user_companies(jwt_token=jwt_token)

    if not companies:
        await query.edit_message_text(
            "Nu ai acces la nicio companie.\n"
            "Contacteaza administratorul pentru permisiuni.",
            parse_mode=ParseMode.MARKDOWN
        )
        return

    # Create paginated keyboard
    from app.bot.helpers import create_company_selection_keyboard_paginated
    keyboard = create_company_selection_keyboard_paginated(companies, page=0)

    await query.edit_message_text(
        f"**Selecteaza Compania**\n\n"
        f"Companiile tale ({len(companies)}):",
        reply_markup=keyboard,
        parse_mode=ParseMode.MARKDOWN
    )

P2: 🚨 CRITICĂ - Blocare Acces Date fără Companie

Fișier: app/bot/handlers.py Linie: 1159-1166 Funcție: handle_menu_callback()

# COD ACTUAL (INCORECT):
if not company and action != "select_company":
    await query.edit_message_text(
        "**Nu ai selectat o companie**\n\n"
        "Selecteaza mai intai compania:\n"
        "/selectcompany",
        parse_mode=ParseMode.MARKDOWN
    )
    return

Problema:

  • User linkuit apasă "Sold", "Casa", "Clienti", etc. fără să aibă companie selectată
  • Bot-ul afișează mesaj cu comanda /selectcompany
  • User se așteaptă să vadă butoanele cu companiile DIRECT

Impact: 🔴 BLOCKER - User nu poate accesa date fără să știe comanda

Soluție:

if not company and action != "select_company":
    # Get companies and show selection directly
    auth_data = await get_user_auth_data(telegram_user_id)
    jwt_token = auth_data['jwt_token']

    client = get_backend_client()
    async with client:
        companies = await client.get_user_companies(jwt_token=jwt_token)

    if not companies:
        await query.edit_message_text(
            "Nu ai acces la nicio companie.\n"
            "Contacteaza administratorul.",
            parse_mode=ParseMode.MARKDOWN
        )
        return

    from app.bot.helpers import create_company_selection_keyboard_paginated
    keyboard = create_company_selection_keyboard_paginated(companies, page=0)

    await query.edit_message_text(
        f"**Selecteaza mai intai o companie**\n\n"
        f"Companiile tale ({len(companies)}):",
        reply_markup=keyboard,
        parse_mode=ParseMode.MARKDOWN
    )
    return

P3: 🟡 MEDIE - Helper Function cere Comenzi

Fișier: app/bot/helpers.py Linie: 16-54 Funcție: get_active_company_or_prompt()

# COD ACTUAL (INCORECT):
async def get_active_company_or_prompt(...):
    if not company:
        await update.message.reply_text(
            "📋 **Nu ai selectat o companie**\n\n"
            "Te rog să selectezi mai întâi compania:\n"
            "/companies - Vezi lista companiilor\n"
            "/selectcompany <nume> - Caută după nume",
            parse_mode="Markdown"
        )
        return None

Problema:

  • Funcție folosită de command handlers (nu callback handlers)
  • Trimite mesaj cu comenzi /companies și /selectcompany
  • Conține emoji 📋

Impact: 🟡 MEDIE - Folosit doar de comenzi vechi (care vor fi ascunse)

Soluție: Două opțiuni:

Opțiunea A - Modifică să nu trimită mesaj:

async def get_active_company_or_prompt(...):
    session = await session_manager.get_or_create_session(telegram_user_id)
    company = session.get_active_company()

    # Just return None, let the caller handle the prompt
    return company  # None if no company

Opțiunea B - Trimite butoane în loc de mesaj:

async def get_active_company_or_prompt(...):
    session = await session_manager.get_or_create_session(telegram_user_id)
    company = session.get_active_company()

    if not company:
        # Get auth data and companies
        from app.auth.linking import get_user_auth_data
        auth_data = await get_user_auth_data(telegram_user_id)
        jwt_token = auth_data['jwt_token']

        client = get_backend_client()
        async with client:
            companies = await client.get_user_companies(jwt_token=jwt_token)

        if companies:
            keyboard = create_company_selection_keyboard_paginated(companies, page=0)
            await update.message.reply_text(
                f"**Selecteaza mai intai o companie**\n\n"
                f"Companiile tale ({len(companies)}):",
                reply_markup=keyboard,
                parse_mode="Markdown"
            )
        else:
            await update.message.reply_text(
                "Nu ai acces la nicio companie.\n"
                "Contacteaza administratorul.",
                parse_mode="Markdown"
            )
        return None

    return company

Recomandare: Opțiunea B (afișare butoane)


P4: 🔴 CRITICĂ - Lipsă Paginare pentru Companii

Fișier: app/bot/helpers.py Linie: 96-141 Funcție: create_company_selection_keyboard()

# COD ACTUAL (INCOMPLET):
def create_company_selection_keyboard(companies, max_buttons=10):
    # Shows only first 10 companies
    # Overflow indicator (text only, no navigation buttons)
    if len(companies) > max_buttons:
        keyboard.append([InlineKeyboardButton(
            f"... și încă {len(companies) - max_buttons} companii",
            callback_data="noop"
        )])

Problema:

  • Afișează doar primele 10 companii
  • Overflow indicator este text static, nu buton funcțional
  • User cu 25+ companii NU le poate vedea pe toate!

Impact: 🔴 BLOCKER - User nu poate accesa toate companiile

Soluție: Creează funcție nouă cu paginare

def create_company_selection_keyboard_paginated(
    companies: List[Dict],
    page: int = 0,
    per_page: int = 10
) -> InlineKeyboardMarkup:
    """
    Create paginated company selection keyboard.

    Args:
        companies: Full list of companies
        page: Current page (0-indexed)
        per_page: Companies per page

    Returns:
        InlineKeyboardMarkup with pagination
    """
    keyboard = []

    # Calculate pagination
    total_companies = len(companies)
    total_pages = (total_companies + per_page - 1) // per_page  # Ceiling division
    start_idx = page * per_page
    end_idx = min(start_idx + per_page, total_companies)

    # Display companies for current page
    page_companies = companies[start_idx:end_idx]

    for company in page_companies:
        company_id = company.get('id_firma', company.get('id'))
        company_name = company.get('name', company.get('nume_firma', 'N/A'))
        company_cui = company.get('fiscal_code', company.get('cui', ''))

        button_text = f"{company_name}"
        if company_cui:
            button_text += f" ({company_cui})"

        callback_data = f"select_company:{company_id}"
        keyboard.append([InlineKeyboardButton(button_text, callback_data=callback_data)])

    # Pagination controls
    if total_pages > 1:
        nav_buttons = []

        # Previous button
        if page > 0:
            nav_buttons.append(
                InlineKeyboardButton("< Anterior", callback_data=f"select_company_page:{page-1}")
            )

        # Page indicator (non-clickable)
        nav_buttons.append(
            InlineKeyboardButton(f"Pagina {page+1}/{total_pages}", callback_data="noop")
        )

        # Next button
        if page < total_pages - 1:
            nav_buttons.append(
                InlineKeyboardButton("Următor >", callback_data=f"select_company_page:{page+1}")
            )

        keyboard.append(nav_buttons)

    # Back to menu button
    keyboard.append([
        InlineKeyboardButton("< Înapoi la Meniu", callback_data="action:menu")
    ])

    return InlineKeyboardMarkup(keyboard)

Handler pentru paginare (adaugă în button_callback):

# In button_callback function, add this handler:
elif callback_data.startswith("select_company_page:"):
    # Extract page number
    page = int(callback_data.split(":")[1])

    # Get companies
    auth_data = await get_user_auth_data(telegram_user_id)
    jwt_token = auth_data['jwt_token']

    client = get_backend_client()
    async with client:
        companies = await client.get_user_companies(jwt_token=jwt_token)

    # Create paginated keyboard for requested page
    from app.bot.helpers import create_company_selection_keyboard_paginated
    keyboard = create_company_selection_keyboard_paginated(companies, page=page)

    await query.edit_message_text(
        f"**Selecteaza Compania**\n\n"
        f"Companiile tale ({len(companies)}):",
        reply_markup=keyboard,
        parse_mode=ParseMode.MARKDOWN
    )

P5: 🟡 MEDIE - Comenzi Financiare Încă Active

Fișier: app/main.py Linie: 91-110

# COD ACTUAL (REDUNDANT):
application.add_handler(CommandHandler("selectcompany", selectcompany_command))
application.add_handler(CommandHandler("dashboard", dashboard_command))
application.add_handler(CommandHandler("sold", sold_command))
application.add_handler(CommandHandler("facturi", facturi_command))
application.add_handler(CommandHandler("trezorerie", trezorerie_command))
application.add_handler(CommandHandler("trezorerie_casa", trezorerie_casa_command))
application.add_handler(CommandHandler("trezorerie_banca", trezorerie_banca_command))
application.add_handler(CommandHandler("clienti", clienti_command))
application.add_handler(CommandHandler("furnizori", furnizori_command))
application.add_handler(CommandHandler("evolutie", evolutie_command))
application.add_handler(CommandHandler("companies", companies_command))
application.add_handler(CommandHandler("clear", clear_command))

Problema:

  • Toate aceste comenzi sunt redundante - totul se poate face prin butoane
  • User le învață și le folosește în loc de butoane
  • Apar în help text

Impact: 🟡 MEDIE - Confuzie pentru utilizatori

Soluție: Două opțiuni:

Opțiunea A - Elimină complet:

# Keep only essential commands:
application.add_handler(CommandHandler("start", start_command))
application.add_handler(CommandHandler("menu", menu_command))
application.add_handler(CommandHandler("help", help_command))
application.add_handler(CommandHandler("unlink", unlink_command))
# All other commands removed - use buttons instead

Opțiunea B - Păstrează ascunse (backwards compatibility):

# Keep handlers but don't mention in help
# Users can still use them if they know, but we push buttons
application.add_handler(CommandHandler("selectcompany", selectcompany_command))
# ... etc (keep all handlers)

Recomandare: Opțiunea A (elimină complet) - mai curat și forțează folosirea butoanelor


P6: 🟠 PRIORITATE - Help Text Învechit

Fișier: app/bot/handlers.py Linie: 186-209 Funcție: help_command()

# COD ACTUAL (ÎNVECHIT):
help_text = """
**ROA2WEB Bot - Ghid Utilizare**

**Comenzi disponibile:**

/start - Link cont sau pornire
/menu - Afiseaza meniul principal
/selectcompany - Selecteaza compania activa
/companies - Lista companii
/dashboard sau /sold - Situatie financiara
/facturi [filtru] - Lista facturi
/trezorerie - Date trezorerie
/clear - Sterge companie activa
/unlink - Deconecteaza contul
/help - Acest mesaj
...
"""

Problema:

  • Listează comenzi care nu ar trebui folosite
  • Nu explică interfața cu butoane
  • Nu ajută utilizatorul să înțeleagă fluxul cu butoane

Impact: 🟠 PRIORITATE - User învață să folosească comenzi

Soluție:

help_text = """
**ROA2WEB Bot - Asistent Financiar**

**Cum folosesc bot-ul?**

Dupa conectarea contului, foloseste **butoanele interactive** pentru:

**Operatiuni:**
- Selectare companie activa
- Vizualizare sold si situatie financiara
- Trezorerie (Casa, Banca)
- Sold Clienti cu detalii facturi
- Sold Furnizori cu detalii facturi
- Evolutie incasari/plati lunare

**Navigare:**
- Toate optiunile sunt accesibile prin butoane
- Apasa pe numele companiei pentru a schimba compania activa
- Foloseste butoanele "Refresh" pentru actualizare date
- Foloseste "Meniu Principal" pentru a reveni la menu

**Comenzi disponibile:**
/start - Porneste bot-ul (cu/fara cod de linking)
/menu - Afiseaza meniul principal cu butoane
/help - Acest mesaj de ajutor
/unlink - Deconecteaza contul (securitate)

**Conectare cont:**
1. Logheaza-te in aplicatia web ROA2WEB
2. Acceseaza Setari > Telegram Linking
3. Genereaza cod (valabil 15 minute)
4. Trimite codul in Telegram: /start <cod>

**Securitate:**
Datele sunt protejate prin autentificare JWT.
Poti deconecta oricand cu /unlink.
"""

P7: 🟢 MINOR - Emoji Rămase în Cod

Multiple fișiere

Problema: Emoji rămase după commitarea "remove emojis"

Locații identificate:

  1. handlers.py:1290 - "📋 Folosește comanda..."
  2. helpers.py:46 - "📋 **Nu ai selectat..."
  3. Alte locații posibile (verificare necesară)

Impact: 🟢 MINOR - Estetic, dar user a cerut explicit fără emoji

Soluție: Căutare globală și înlocuire

# Search for all emoji in codebase
grep -r "📋\|🔗\|✅\|❌\|⏳\|🚨" app/bot/

Înlocuiri:

  • "📋" → șterge (nu înlocui cu text)
  • "🔗" → șterge
  • "" → "[PLATIT]" sau "OK"
  • "" → "[EROARE]"
  • "" → "[NEPLATIT]"
  • Status emoji → Text markers "[P]" / "[N]"

PLAN DE IMPLEMENTARE

FAZA 1: 🔴 Probleme Critice (BLOCKER)

Durata estimată: 2-3 ore

Task 1.1: Selectare Companie prin Butoane

  • Modifică handle_menu_callback() - callback "menu:select_company"
  • Preia companiile de la backend
  • Afișează keyboard cu create_company_selection_keyboard_paginated()
  • Testează: User apasă "Selectare Companie" → vede butoane

Task 1.2: Blocare Acces fără Companie

  • Modifică handle_menu_callback() - verificare if not company
  • Înlocuiește mesaj cu comanda cu afișare butoane
  • Testează: User apasă "Sold" fără companie → vede butoane

Task 1.3: Paginare Companii

  • Creează funcție create_company_selection_keyboard_paginated() în helpers.py
  • Implementează logică paginare (Previous/Next buttons)
  • Adaugă handler pentru "select_company_page:{page}" în button_callback()
  • Testează: User cu 25 companii → poate naviga toate paginile

Checkpoint: User poate selecta orice companie DOAR prin butoane, fără comenzi


FAZA 2: 🟡 Optimizări Helper Functions

Durata estimată: 1-2 ore

Task 2.1: Modifică get_active_company_or_prompt()

  • Implementează Opțiunea B (afișare butoane)
  • Testează cu comenzi vechi (/dashboard, /sold, etc.)
  • Verifică că afișează butoane în loc de mesaj cu comandă

Task 2.2: Șterge Emoji

  • Căutare globală pentru toate emoji: grep -r "📋\|🔗\|✅\|❌" app/bot/
  • Înlocuiește/șterge toate emoji-urile
  • Verifică în handlers.py, helpers.py, formatters.py

Checkpoint: Niciun mesaj nu conține emoji sau comenzi


FAZA 3: 🟠 Curățare Comenzi și Help COMPLETAT

Durata estimată: 1 oră | Durata efectivă: 0.5 ore

Task 3.1: Elimină Comenzi Redundante

  • Modifică main.py - comentează/șterge handler-ii comenzilor financiare
  • Păstrează pentru backwards compatibility (secțiune LEGACY)
  • Documentează decizia în cod

Task 3.2: Actualizează Help Text

  • Rescrie complet help_command() pentru interfață cu butoane
  • Șterge referințele la comenzi eliminate
  • Explică fluxul de conectare și navigare cu butoane

Checkpoint: Help text reflectă corect interfața cu butoane


FAZA 4: Testare Completă

Durata estimată: 2-3 ore

Test Suite 1: Utilizator Nelinkuit

  • /start (fără cod) → Butoane: "Cum obtin codul?" / "Am cod"
  • Apasă "Cum obtin codul?" → Instrucțiuni + butoane înapoi
  • Apasă "Am cod" → ForceReply pentru input cod
  • Introduce cod valid → Linking + Main menu cu butoane
  • Introduce cod invalid → Mesaj eroare + butoane retry

Test Suite 2: Utilizator Linkuit fără Companie

  • /start → Main menu (Selectare Companie, Sold, Casa, etc.)
  • Apasă "Selectare Companie" → Butoane cu companiile (paginare dacă >10)
  • Apasă pe companie → Selectare → Main menu actualizat cu compania
  • Apasă "Sold" fără companie → Butoane cu companiile direct
  • Apasă "Casa" fără companie → Butoane cu companiile direct
  • Apasă "Clienti" fără companie → Butoane cu companiile direct

Test Suite 3: Utilizator Linkuit cu Companie

  • /start → Main menu (afișează compania activă)
  • Apasă "Sold" → Dashboard cu butoane Refresh/Export/Meniu
  • Apasă "Refresh" → Date actualizate
  • Apasă "Meniu Principal" → Înapoi la main menu
  • Apasă "Casa" → Trezorerie casa cu butoane
  • Apasă "Banca" → Trezorerie banca cu butoane
  • Apasă "Clienti" → Sold + listă clienți cu butoane
  • Apasă pe client → Detalii client + facturi
  • Apasă "Furnizori" → Sold + listă furnizori
  • Apasă pe furnizor → Detalii furnizor + facturi
  • Apasă "Evolutie" → Cash flow evolution cu butoane

Test Suite 4: Paginare și Liste Lungi

  • User cu 1 companie → Fără paginare, buton direct
  • User cu 5 companii → Fără paginare, 5 butoane
  • User cu 10 companii → Fără paginare, 10 butoane
  • User cu 15 companii → Paginare: pagina 1 (10 comp) + Next
  • Apasă "Next" → Pagina 2 (5 comp) + Previous
  • Apasă "Previous" → Înapoi la pagina 1
  • User cu 25 companii → 3 pagini funcționale
  • User cu 50 companii → 5 pagini funcționale

Test Suite 5: Schimbare Companie

  • User cu companie selectată apasă "Companie activă: X"
  • Vede lista cu TOATE companiile (inclusiv cea activă)
  • Selectează altă companie → Compania se schimbă
  • Main menu se actualizează cu noua companie
  • Date financiare reflectă noua companie

Test Suite 6: Edge Cases

  • User fără nicio companie → Mesaj "Nu ai acces..."
  • Token expirat → Refresh automat token + continuare
  • Eroare backend → Mesaj eroare + butoane pentru retry
  • User introduce text random (nu cod) → Mesaj helpful + butoane

Test Suite 7: Căutare și Text Input

  • User introduce text pentru căutare companie (viitor)
  • Bot detectează text (nu cod) → Afișează rezultate căutare
  • User introduce cod 8 chars → Linking

Checkpoint: TOATE fluxurile funcționează 100% cu butoane


📊 PROGRESS TRACKER

Status Global

  • FAZA 1 COMPLETĂ - Probleme critice rezolvate
  • FAZA 2 COMPLETĂ - Optimizări helper functions
  • FAZA 3 COMPLETĂ - Curățare comenzi și help
  • FAZA 4 COMPLETĂ - Testare completă (PENDING)

Metrici

  • Probleme rezolvate: 7/7
  • Teste passed: 0/40+ (PENDING - manual testing required)
  • Comenzi reorganizate: 12/12 (moved to legacy section)
  • Emoji eliminate: 4/4 user-facing emojis

Blockers

  • Niciun blocker identificat

📁 FIȘIERE MODIFICATE

1. app/bot/handlers.py

Modificări:

  • handle_menu_callback() - callback "menu:select_company" (P1) - liniile 1287-1310
  • handle_menu_callback() - verificare companie lipsă (P2) - liniile 1159-1182
  • button_callback() - handler paginare "select_company_page:" (P4) - liniile 1527-1549
  • help_command() - help text complet nou (P6) - liniile 186-222
  • Șterge toate emoji (P7) - liniile 1049, 489

Linii afectate: ~150 linii

2. app/bot/helpers.py

Modificări:

  • get_active_company_or_prompt() - afișare butoane (P3) - liniile 16-70
  • create_company_selection_keyboard_paginated() - funcție nouă (P4) - liniile 147-224
  • Șterge toate emoji (P7) - linia 261

Linii afectate: ~100 linii

3. app/bot/formatters.py

Modificări:

  • Status emoji înlocuit cu text markers (P7) - liniile 59-61

Linii afectate: ~5 linii

4. app/main.py

Modificări:

  • Reorganizează handler-ii comenzilor (P5) - liniile 90-114

Linii afectate: ~25 linii


🧪 TESTARE MANUALĂ - CHECKLIST COMPLET

Setup Test Environment

  • Bot rulează local pe development
  • Backend API disponibil și funcțional
  • Acces la 3+ conturi test:
    • Cont cu 1 companie
    • Cont cu 15 companii (test paginare)
    • Cont cu 50+ companii (test paginare multiplă)
    • Cont fără nicio companie

Pre-Testing

  • Verifică că toate modificările sunt implementate
  • Reîncearcă bot-ul: python -m app.main
  • Verifică logs pentru erori la startup
  • /help afișează help text nou

Testing Execution

Urmează Test Suite 1-7 de mai sus

Post-Testing

  • Documentează orice bug găsit
  • Verifică logs pentru erori/warnings
  • Performance OK (răspuns <2 secunde)
  • UI/UX este clar și intuitiv

🚀 DEPLOYMENT

Pre-Deployment Checklist

  • Toate testele passed
  • Code review complet
  • Documentație actualizată (README.md, TELEGRAM_COMMANDS.md)
  • Changelog actualizat

Deployment Steps

  1. Merge branch în v2-roa2web-fastapi
  2. Tag versiune: git tag telegram-bot-v2.0-buttons
  3. Push to remote
  4. Deploy pe production (follow DEPLOYMENT_GUIDE.md)
  5. Monitorizează logs pentru erori

Post-Deployment

  • Verifică că bot-ul funcționează în production
  • Testează cu 2-3 utilizatori reali
  • Gather feedback
  • Documentează issues găsite

📝 NOTES & DECISIONS

Decizie 1: Păstrare sau Eliminare Comenzi

Întrebare: Păstrăm comenzile vechi pentru backwards compatibility sau le eliminăm complet?

Opțiuni:

  • A) Elimină complet → Forțează utilizatorii să folosească butoane (clean)
  • B) Păstrează ascunse → User știe comanda → poate funcționa (legacy)

Decizie: PENDING - Așteaptă feedback utilizator

Update: _____________


Decizie 2: Paginare - Companii per Pagină

Întrebare: Câte companii afișăm per pagină în interfața de selectare?

Opțiuni:

  • A) 10 companii/pagină → Mai multe pagini, mai puține scroll-uri
  • B) 15 companii/pagină → Mai puține pagini, mai multe scroll-uri
  • C) 20 companii/pagină → Foarte puține pagini, mult scroll

Decizie: 10 companii/pagină - Balanț optimal


Decizie 3: Căutare Companii prin Text

Întrebare: Implementăm căutare companii prin text input sau doar prin butoane?

Opțiuni:

  • A) Doar butoane + paginare → Simplu, consistent
  • B) Butoane + text search → Mai flexibil pentru multe companii

Decizie: PENDING - Testăm mai întâi cu paginare, apoi evaluăm

Update: _____________


📚 REFERINȚE

Documente Externe

  • TELEGRAM_COMMANDS.md - Documentație comenzi (ACTUALIZARE NECESARĂ)
  • README.md - README bot (ACTUALIZARE NECESARĂ)
  • tests/MANUAL_TESTING_CHECKLIST.md - Checklist testare manuală

Code References

  • app/bot/handlers.py - Toate handler-urile pentru comenzi și callbacks
  • app/bot/helpers.py - Funcții helper pentru API calls și formatare
  • app/bot/menus.py - Builders pentru inline keyboards
  • app/bot/formatters.py - Formatare răspunsuri pentru Telegram

API Backend

  • Endpoint: GET /api/companies - Lista companii user
  • Endpoint: GET /api/dashboard/{company_id} - Dashboard data
  • Endpoint: POST /api/telegram/auth/refresh-token - Refresh JWT

✍️ PROGRESS LOG

2025-10-24 (Morning) - Plan Creat

  • Analiză completă a codului existent
  • Identificare 7 probleme critice
  • Plan detaliat de implementare
  • Checklist testare completă

2025-10-24 (Afternoon) - Implementare Completă

Update: TOATE FAZELE 1-3 IMPLEMENTATE CU SUCCES Status: IMPLEMENTAT - Cod gata pentru testare

Modificări efectuate:

FAZA 1 - Probleme Critice:

  • P1: handlers.py:1287-1310 - Selectare companie afișează butoane direct
  • P2: handlers.py:1159-1182 - Blocare acces fără companie afișează butoane
  • P4: helpers.py:147-224 - Funcție paginare create_company_selection_keyboard_paginated()
  • P4: handlers.py:1527-1549 - Handler paginare select_company_page:{page}

FAZA 2 - Optimizări:

  • P3: helpers.py:16-70 - get_active_company_or_prompt() afișează butoane
  • P7: handlers.py:1049, 489 - Emoji eliminate din mesaje user
  • P7: formatters.py:59-61 - Status emoji înlocuit cu [PLATIT]/[NEPLATIT]
  • P7: helpers.py:261 - Emoji eliminat din footer companie

FAZA 3 - Curățare:

  • P5: main.py:90-114 - Comenzi reorganizate (essential + legacy section)
  • P6: handlers.py:186-222 - Help text complet actualizat pentru butoane

Total linii modificate: ~300+ linii în 3 fișiere

Blockers: Niciun blocker - totul funcționează conform planului

2025-10-24 (Evening) - FAZA 4 Setup Completă

Update: TESTING INFRASTRUCTURE READY Status: SETUP COMPLET - Gata pentru testare manuală

Infrastructură creată:

  • MANUAL_TESTING_CHECKLIST.md - Checklist complet 40+ teste (7 suite-uri)
  • test_runner.sh - Script management bot (start/stop/status/logs)
  • PRE_TESTING_VERIFICATION.md - Raport verificare implementare
  • PHASE4_TESTING_GUIDE.md - Ghid complet testare manuală
  • logs/ directory - Pentru logging detaliat

Verificări efectuate:

  • Bot pornește fără erori
  • Backend API funcțional (port 8001)
  • SQLite database inițializat
  • Toate implementări P1-P7 verificate în cod
  • .env configurat corect

Următorii pași:

  1. Pregătire 5 conturi test (1, 5, 15, 50+, 0 companii)
  2. Start bot: ./test_runner.sh start
  3. Execuție Test Suite 1-7 din MANUAL_TESTING_CHECKLIST.md
  4. Documentare rezultate și buguri
  5. Update plan cu rezultate finale

Total timp estimat testare: 2-3 ore


🎯 DEFINITION OF DONE

Implementarea este considerată COMPLETĂ când:

Funcționalitate:

  • User poate selecta ORICE companie DOAR prin butoane (0 comenzi)
  • Paginarea funcționează pentru 1, 10, 25, 50+ companii
  • TOATE fluxurile (nelinkuit, linkuit fără/cu companie) funcționează
  • Schimbarea companiei funcționează perfect din main menu

Calitate Cod:

  • 0 emoji în tot codul user-facing
  • 0 referințe la comenzi / în mesaje (exceptând help pentru /start, /menu)
  • Cod documentat și comentat
  • Nicio eroare în logs

Testare: (PENDING - user testing required)

  • TOATE testele din Test Suite 1-7 passed
  • Testat manual cu 3+ conturi diferite
  • Performance OK (<2 sec răspuns)
  • UI/UX validat de user

Documentație:

  • Help text actualizat
  • README actualizat
  • TELEGRAM_COMMANDS.md actualizat (TODO)
  • Acest plan actualizat cu status final

STATUS GLOBAL: 🟢 IMPLEMENTATION COMPLETE - READY FOR TESTING


END OF PLAN

Acest document este un plan viu - actualizează-l pe măsură ce implementezi și descoperi noi informații.