Înapoi la portofoliu
PlatformăClient real

Zip Code Platform

Platformă pentru centralizarea codurilor poștale din România: import Excel în background, normalizarea adreselor, lookup după localitate, stradă și număr, validare prin API și administrarea cheilor de acces.

Zip Code Platform

Stack principal

PHP 8.2
Laravel 12
Eloquent ORM
MySQL
Laravel QueueLaravel JobsLaravel CachePhpSpreadsheetMaatwebsite ExcelBladeTailwind CSSAlpine.jsAxiosVite 7PHPUnit 11

Provocarea

Provocarea a fost transformarea unui dataset Excel cu localități, județe, străzi și expresii variabile pentru numerele imobilelor într-un serviciu de lookup care să tolereze diferențe de scriere fără a bloca aplicația în timpul importului. În paralel, accesul API trebuia separat pe chei administrabile, iar operatorul avea nevoie de vizibilitate asupra importului și datelor încărcate.

Soluția

Soluția separă importul de request-ul web printr-un Laravel Job și procesează fișierul în chunk-uri de 500 de rânduri cu PhpSpreadsheet. Un serviciu dedicat parsează județele, sectoarele Bucureștiului și intervalele de numere, apoi face inserări bulk după verificarea duplicatelor. Progresul este publicat în cache și urmărit din admin prin polling. API-ul normalizează adresa înainte de lookup, folosește mai multe niveluri de fallback și este protejat de middleware-ul de API key cu activare și expirare, iar panoul Blade oferă administrarea datasetului, utilizatorilor și cheilor.

Complexitate notabilă

Zip Code Platform este o aplicație Laravel construită pentru a transforma un fișier operațional de coduri poștale într-o bază de date interogabilă și într-un API reutilizabil de aplicații e-commerce sau alte sisteme care au nevoie de validarea și completarea adreselor. Repository-ul include o suprafață publică simplă, conturi de utilizator, un panou administrativ și API-ul protejat prin chei.

Fluxul de date pornește din admin, unde poate fi încărcat un fișier Excel .xlsx/.xls. Controllerul îl salvează local, determină numărul de rânduri și lansează un Laravel Job pe queue-ul configurat în baza de date. Importul citește fișierul în ferestre de câte 500 de rânduri și limitează coloanele procesate la cod poștal, localitate/județ și stradă. Pentru fiecare rând sunt separate localitatea și județul, sunt interpretate sectoarele Bucureștiului și sunt transformate expresiile de numere în intervale sau valori individuale. Scrierea se face în batch-uri, după verificarea combinațiilor deja existente. Progresul este păstrat temporar în Laravel Cache și interfața admin îl interoghează periodic fără a ține request-ul de upload deschis pe toată durata procesării.

API-ul expune patru operații dedicate: căutarea codului poștal pornind de la adresă, lista localităților, validarea unui cod poștal și normalizarea unei adrese. Căutarea normalizează diacriticele și abrevierile județelor, încearcă variante ale denumirii străzii și aplică o succesiune de fallback-uri: potrivire cu număr, potrivire pe stradă, potrivire fuzzy și, în final, localitate + județ. Accesul este filtrat de un middleware de API key care verifică existența, starea activă și data de expirare.

Panoul administrativ acoperă trei zone principale: coduri poștale, utilizatori și chei API. Tabelele permit filtrare, sortare și paginare, iar administratorul poate genera chei pentru un utilizator, poate seta expirarea și le poate activa sau dezactiva. Utilizatorul autentificat are propriul dashboard pentru datele contului și cheile asociate. UI-ul este server-rendered cu Blade și Tailwind, cu Alpine.js pentru interacțiunile de navigație/modal și JavaScript simplu pentru polling-ul progresului de import.

Codul conține și începutul unui flux comercial cu Stripe Checkout, un webhook care ar genera o cheie temporară după checkout și o rută de download pentru un plugin. Aceste zone nu sunt complete în snapshotul analizat: configurația Stripe lipsește din services.php, webhook-ul este plasat în grupul web autentificat, formularul de plată nu apelează ruta de procesare, plățile nu sunt persistate de acest flux, iar arhiva pluginului nu există în repository. Din acest motiv ele sunt tratate ca direcție de produs, nu ca rezultat livrat.

Pentru producție, următoarele îmbunătățiri importante sunt hardening-ul API-ului și al importului: validare explicită pentru request-uri, rate limiting per cheie, stocarea hash-uită a cheilor cu afișare o singură dată, parametrizarea completă a fallback-ului fuzzy, constrângeri unique/upsert pentru deduplicare concurentă, indexuri aliniate cu interogările reale și retry/cleanup explicit pentru jobul de import. Repository-ul nu conține workflow-uri CI/CD, Docker sau configurație de deployment reproductibilă; există însă endpointul standard Laravel /up și scripturile locale pentru build, test și worker de queue.

Rezultate cheie

  • Aplicație Laravel 12 cu suprafețe publică, utilizator autentificat, administrare și API
  • Import Excel .xlsx/.xls executat în background prin Laravel Job și queue configurat în baza de date
  • Procesare incrementală a fișierului în ferestre de 500 de rânduri și inserare bulk a datelor normalizate
  • Parsing pentru județe românești, sectoarele Bucureștiului și intervale de numere ale străzilor
  • Progres de import păstrat în cache și urmărit din interfața admin prin polling
  • API cu endpointuri pentru search, cities, validate și normalize
  • Autentificare API prin chei cu stare activă și dată opțională de expirare
  • Căutare de cod poștal cu potrivire pe adresă și fallback-uri pe stradă, termeni fuzzy și localitate
  • Administrare cu filtrare, sortare și paginare pentru coduri poștale și utilizatori
  • Administrarea cheilor API: generare per utilizator, expirare opțională și activare/dezactivare
  • Endpoint Laravel standard de health check la /up

Proiecte asemănătoare

Vrei ceva similar?

Începe cu wizard-ul de estimare — răspunzi la câteva întrebări și primești un range de preț + timeline realist.