03 / Automatizare operațională
Licto
Monitorizare automată a licitațiilor SEAP, cu rezultate relevante și ușor de verificat.
Rezultat
Licto filtrează fluxul național de achiziții publice și îi oferă operatorului o listă scurtă de oportunități pe care le poate verifica în fiecare zi.
Pentru fiecare rezultat arată de ce a fost selectat, urmărește termenele-limită și modificările lor și separă licitațiile active de semnalele timpurii. În același timp, verifică dacă preluarea datelor funcționează normal.
Context
Datele există în portalul public. Problema este să afli rapid ce este nou, ce merită atenție, ce s-a schimbat și ce trebuie făcut astăzi.
O alertă bazată pe câteva cuvinte-cheie trimite prea multe rezultate. Un scraper fragil creează o problemă în plus. Licto avea nevoie de o preluare stabilă, reguli adaptate fiecărui client și o interfață pe care echipa să o poată folosi fără ajutor tehnic.
Constrângeri
Sistemul trebuie să inspire aceeași încredere într-o zi aglomerată și într-una fără rezultate.
- SEAP expune date JSON utile, dar nu le documentează drept un API extern stabil.
- Fiecare client urmărește alte coduri CPV, expresii, autorități și valori și are propriile excluderi.
- Zero rezultate poate însemna o zi liniștită sau o preluare defectă. Sistemul trebuie să distingă cele două situații.
- Fiecare rulare verifică și o perioadă deja parcursă, deci duplicatele și alertele repetate trebuie eliminate sigur.
- Datele fiecărui client rămân separate, deși fluxul public este preluat o singură dată și apoi reutilizat.
Ce am livrat
Am construit întregul flux: preluare programată, filtrare, verificare, notificare și monitorizarea funcționării.
- Client pentru API-ul SEAP, cu paginare, reîncercări și filtrare locală.
- Scor de relevanță bazat pe coduri CPV, contextul titlului, autorități, valori și excluderi explicite.
- Mementouri pentru termene-limită, urmărirea eratelor și semnale timpurii din consultări, planuri și anunțuri de intenție.
- Liste HTML disponibile offline, notificări prin email și Slack și un panou pentru stare, rulări și editarea profilurilor.
- Istoricul rulărilor, detectarea anomaliilor, autentificare, roluri, migrări, backup și teste de regresie.
Vedere de ansamblu
O singură preluare, reguli pentru fiecare client
Arhitectură simplificatăCum devin vizibile erorile silențioase
Faptul că mesajul de dimineață a fost trimis nu dovedește că datele au fost preluate corect. Licto înregistrează fiecare rulare și o compară cu istoricul normal al profilului.
- Zero anunțuri preluate nu este același lucru cu zero anunțuri relevante.
- O scădere bruscă este comparată cu istoricul profilului, nu cu un prag ales arbitrar.
- Dacă niciun anunț nu mai conține termen de depunere, sistemul semnalează o posibilă schimbare de structură a datelor.
- Un timer separat detectează și cazul în care procesul zilnic nu pornește deloc.
Decizii importante
- Folosirea datelor JSON
- Portalul oferă deja date structurate. Parsarea paginilor HTML ar fi mai fragilă și nu ar aduce informații în plus.
- Structura JSON trebuie totuși monitorizată, fiindcă nu este garantată ca API public de integrare.
- Filtrare locală
- Volumul săptămânal poate fi preluat integral. Astfel evit filtrele nedocumentate ale serverului și pot aplica reguli mai bune local.
- Sursele care cer multe pagini de detaliu au nevoie de limite separate pentru numărul de solicitări.
- Scor determinist
- Fiecare rezultat arată codul CPV, expresia, autoritatea sau excluderea care i-a influențat scorul. Operatorul poate înțelege și regla filtrarea.
- Profilurile trebuie întreținute. Sistemul nu ascunde alegerile importante în spatele unui model opac.
- Suprapunere și deduplicare
- Fiecare rulare se uită suficient de mult în urmă pentru a recupera datele după o eroare temporară. Cheile persistente previn repetarea anunțurilor și mementourilor.
- Baza de date și migrările devin componente esențiale, nu doar un cache opțional.
- Un reper pentru fiecare profil
- Același prag zilnic nu funcționează în industrii diferite. Anomaliile sunt evaluate față de rulările reușite ale fiecărui profil.
- La început, sistemul are nevoie de o perioadă de calibrare înainte să poată semnala abateri.
Dovezi
Limite
Integrarea trebuie supravegheată.
Structura SEAP se poate schimba, unele surse cer multe solicitări, iar calitatea rezultatelor depinde de regulile fiecărui client. Pentru că sistemul este privat, acest studiu de caz arată arhitectura și deciziile tehnice, nu datele clienților sau un demo artificial.
Rol și tehnologii
Am proiectat și construit întregul sistem: preluarea și filtrarea datelor, modelul de stare, interfața operatorului, notificările și detectarea erorilor.
Python · requests · profiluri YAML · SQLite · HTML generat · SMTP · Slack · systemd