Business Intelligence în domeniul medical

Începe, de regulă, cu o cerere simplă, trimisă vineri după-amiaza: „Adrian, am vrea să vedem și noi niște cifre clare despre vânzările noastre pe regiuni și puncte de lucru”. Sună ca o sarcină de câteva ore — extragi un raport, cureți datele într-un spreadsheet, tragi câteva grafice și trimiți fișierul înapoi.

Dar când intri în detalii, realizezi că datele sunt captive într-un sistem proprietar rigid, iar deciziile de business au nevoie de fluiditate, nu de tabele statice trimise prin e-mail.

Câteva luni mai târziu, acea solicitare inițială s-a transformat într-un sistem complet de Business Intelligence (BI) construit de la zero: cu portal web dedicat, roluri de securitate stricte și un server AI integrat prin protocolul MCP, care le permite managerilor să își întrebe datele direct în limbaj natural.

Acesta nu este un ghid tehnic pas cu pas, ci o analiză a deciziilor de arhitectură, a compromisurilor tehnice și a principiilor operaționale care au transformat un proiect simplu într-o infrastructură robustă.


Captivitatea datelor: De la sisteme rigide la depozite curate

Majoritatea companiilor din sectorul medical și a afacerilor cu istoric folosesc aplicații ERP sau CRM închise. Datele există — mii de înregistrări despre servicii, programări, agenți comerciali și tranzacții —, dar sunt accesibile doar prin interfețe predefinite. Nu poți rula o interogare personalizată de tipul: „Arată-mi evoluția unui produs specific pe parcursul ultimelor trei trimestre, corelată cu performanța agenților din județul X”.

Pentru a reda libertatea acestor date, prima decizie a fost extragerea lor într-un depozit de date dedicat (Data Warehouse).

Am abordat această etapă prin construirea unui web scraper optimizat:

  • Automatizare zilnică: Un serviciu programat rulează în fiecare dimineață, se autentifică securizat în sistemul central și extrage diferențele de date (delta) din ultimele 24 de ore.
  • Trasabilitate completă: Fiecare rulare a scraper-ului scrie într-un jurnal detaliat: volumul de date procesat, eventualele discrepanțe și timpul de execuție.
  • Validare la import: Înainte de a fi scrise în baza de date PostgreSQL, înregistrările trec printr-un filtru de curățare și deduplicare pentru a menține integritatea analizelor viitoare.

Dilema ready-made: De ce prototipul rapid nu este soluția finală

Pentru a valida rapid ideea, prima iterație a sistemului a fost construită folosind o platformă open-source populară de vizualizare a datelor. O instalezi pe server, o conectezi la PostgreSQL și poți asambla vizual grafice fără să scrii cod.

În trei zile aveam deja un dashboard funcțional. Însă, pe măsură ce cerințele au evoluat, am lovit limitele structurale ale instrumentelor generice:

  • Rigiditatea sistemului de roluri: Reglementările privind datele sensibile și confidențialitatea comercială cer ca un agent de vânzări să vadă doar performanța sa, în timp ce conducerea trebuie să vadă întregul ansamblu. Implementarea unei astfel de securități la nivel de rând (Row-Level Security) devenea complexă și extrem de restrictivă în varianta gratuită a platformei.
  • Amprenta de resurse: Soluția monolitică consuma memorie substanțială pe server doar pentru a rula serviciile de fundal, chiar și în perioadele fără activitate.
  • Limitele de customizare: Interfețele standard sunt greu de modificat pentru a răspunde unor detalii vizuale specifice sau pentru a introduce filtre avansate de business.
Dimensiune Platformă Ready-Made (Open-Source) Portal Propriu (Python / Custom)
Viteză de prototipare Excelentă (dashboard în 2-3 zile) Medie (necesită construirea UI și a rutelor)
Controlul accesului (RLS) Complicat, blocat adesea în versiuni Enterprise Nativ, definit direct în query-urile SQL
Consum de resurse Ridicat (monolit greoi pe server) Neglijabil (serviciu Python minimalist)
Flexibilitate UI Limitată la widget-urile predefinite Totală (HTML5 / JS / biblioteci custom)

În fața acestor constrângeri, decizia strategică a fost simplă: am retras soluția ready-made și am început dezvoltarea portalului nostru personalizat.


Portalul dedicat: Control granular și securitate contextuală

Folosind Python și un framework minimalist, am construit un portal web unde fiecare pixel și fiecare interogare SQL se află sub controlul nostru. Pilonul central al aplicației este sistemul de securitate bazat pe roluri (RBAC):

  • Administrator: Are vizibilitate completă asupra operațiunilor, control total asupra performanțelor de business și administrează conturile de utilizatori.
  • Viewer: Accesează toate rapoartele financiare și operaționale, dar nu are drepturi de configurare.
  • Agent: Vede exclusiv datele aferente propriului portofoliu.

Implementarea acestui ultim rol a cerut o atenție deosebită. Filtrarea nu se face în interfață (ceea ce ar permite unui utilizator tehnic să ocolească restricțiile prin API), ci la nivelul cel mai de jos: fiecare interogare SQL injectează automat ID-ul agentului autentificat direct în clauza WHERE, garantând izolarea totală a datelor.

În plus, rapoartele construite manual ne-au permis să adăugăm elemente specifice de workflow:

  • Filtru pentru luna curentă: Un simplu comutator (toggle) permite excluderea lunii în curs din graficele de tendințe, prevenind concluziile eronate cauzate de datele incomplete.
  • Calcul automat de trend: Un algoritm compară în timp real prima lună a anului curent cu ultima lună complet încheiată, oferind instant direcția de evoluție a performanței.

Securitatea: Fundația, nu o opțiune de final

Când expui date financiare și operaționale reale pe internet, securitatea trebuie gândită de la prima linie de cod. Sistemul a fost supus unor sesiuni riguroase de testare, eliminând riscurile clasice de securitate web:

Gestiunea strictă a sesiunilor

  • Sesiunile utilizatorilor expiră automat după 8 ore de inactivitate.
  • Am implementat un mecanism de invalidare globală: la schimbarea parolei, câmpul token_valid_from din baza de date se actualizează, respingând instantaneu orice sesiune activă emisă anterior pe alte dispozitive.
  • Conturile se blochează automat timp de 15 minute după 5 tentative eșuate de autentificare.

Protecție împotriva vectorilor de atac comuni

  • CSRF (Cross-Site Request Forgery): Token-urile de sesiune se rotesc la fiecare request autentificat, reducând la minimum riscul de deturnare a sesiunilor.
  • SQL Injection: Nu se folosește concatenare de string-uri în query-uri. Toate interogările către PostgreSQL sunt parametrizate strict.
  • Security Headers: Politicile CORS și Content Security Policy (CSP) sunt configurate pentru a interzice încărcarea oricărui script extern neautorizat.

[!IMPORTANT] 🔒 Securitate implicită + 🛠️ SQL parametrizat + 🛡️ Roluri granulare = 💎 Integritatea datelor de business în producție.


Integrarea AI: Interogări securizate prin server MCP propriu

Una dintre cele mai valoroase adăugiri a fost realizarea unui strat de analiză prin inteligență artificială, bazat pe Model Context Protocol (MCP). MCP este un protocol deschis care îi permite unui asistent AI să interacționeze în mod controlat cu surse locale de date.

În loc să oferim AI-ului acces direct și necontrolat la baza de date principală, am dezvoltat un server MCP intermediar:

  1. Izolarea schemei: Serverul expune doar tabelele de analiză agregate (vânzări, volume, performanțe regionale), ascunzând structura tabelelor de utilizatori sau jurnalele de securitate.
  2. Autentificare strictă: Orice apel al asistentului AI către serverul MCP trebuie să poarte un token Bearer valid asociat utilizatorului din portal.
  3. Păstrarea contextului: AI-ul nu doar că returnează date brute, dar poate procesa cereri complexe precum: „Compară performanța punctului de lucru din Cluj cu cel din Timișoara pe trimestrul trecut și explică în două paragrafe sursa diferențelor”.

[!TIP] 🧠 Limbaj natural + 🔌 Server MCP + 🗄️ Bază de date securizată = ⚡ Decizii de management în timp real, fără cunoștințe de SQL.


Infrastructura minimalistă: Stabilitate la costuri minime

Am optat pentru o arhitectură simplă și stabilă, care rulează eficient pe un singur server virtual (VPS) cu resurse moderate:

  • Containerizare cu Docker: Atât portalul web (Python), cât și baza de date PostgreSQL rulează în containere izolate. Acest lucru simplifică procedurile de actualizare și procedurile de backup.
  • Nginx ca Reverse Proxy: Gestionează conexiunile securizate (SSL/TLS) și asigură rutarea internă a pachetelor.
  • Automatizarea certificatelor: Pentru că infrastructura folosește un serviciu DNS dinamic, am configurat obținerea certificatelor SSL prin validare DNS (DNS-01 challenge) direct cu furnizorul de domenii, ocolind restricțiile portului 80 standard.

Lecții extrase din teren

Construcția acestui sistem de Business Intelligence mi-a reconfirmat câteva adevăruri simple din managementul de proiecte software:

  1. Uneltele gata-făcute sunt excelente pentru validare, nu pentru rezoluție. Folosește-le pentru a demonstra valoarea rapid, dar nu ezita să scrii cod personalizat când cerințele de business o cer.
  2. Securitatea se proiectează de la început, nu se adaugă la final. Implementarea CSRF-ului sau a politicilor de sesiune pe un sistem gata construit este de trei ori mai anevoioasă decât definirea lor în faza de design.
  3. Datele curate bat graficele sofisticate. Poți avea cele mai animate dashboard-uri din lume — dacă logica de extragere și deduplicare din scraper dă erori, deciziile bazate pe acele cifre vor fi greșite.

Sistemul rulează stabil în producție. Fiecare dimineață aduce un import proaspăt de date, oferind echipei manageriale claritatea de care are nevoie pentru a conduce business-ul pe baza cifrelor reale.


Dacă dezvolți un sistem de date securizat sau vrei să discutăm despre arhitecturi de date și integrări AI în operațiuni, scrie-mi direct.