03 / Automatizare operațională

Licto

Monitorizare automată a licitațiilor SEAP, cu rezultate relevante și ușor de verificat.

Fluxul Licto, de la API-ul public SEAP la normalizare, potrivire deterministă, verificare, notificare și monitorizare

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ă
Preluare API public Paginare, reîncercare și perioade suprapuse
Decizie Potrivire cu profilul Scoruri deterministe și excluderi explicite
Operare Verificare + notificare Listă, etape, termene, email și Slack
Monitorizare Starea rulărilor Istoric, verificarea anomaliilor și alerte de eroare

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

Fiecare rezultat are un motiv Fiecare rezultat păstrează motivele scorului și etapa curentă. Sistemul urmărește notificările, eratele și schimbările termenelor-limită.
Control pentru operator Operatorul poate vedea starea, porni o actualizare și modifica regulile profilului fără acces la terminal.
Erorile nu trec neobservate Istoricul și verificările independente fac diferența dintre o zi liniștită și o preluare defectă.

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