Temă
Fluxuri tehnice
Procesele de business (cine face ce) sunt în procesele de business. Aici sunt detaliile tehnice: stări, secvențe, bani, notificări.
Stările anunțului
- Doar anunțurile active apar în căutare, în categorii și în sitemap.
- Orice modificare a unui anunț activ îl trimite din nou la verificare.
- Expirarea se calculează din
expiresAt; reactivarea îl retrimite la moderare. - Suspendarea vânzătorului mută anunțurile active în
deactivated; reactivarea contului le readuce.
Stările comenzii
| Tranziție | Cine | Efecte |
|---|---|---|
→ paid | cumpărătorul (checkout) | anunț sold; plată captured (card) sau înregistrată la livrare (ramburs); SMS + push vânzătorului |
paid → shipped | vânzătorul | AWB simulat (FAN, GLS sau Sameday pentru easybox); SMS cumpărătorului |
shipped → delivered | curierul (simulat) | autoConfirmAt = acum + 48 h; plata ramburs se înregistrează |
delivered → completed | cumpărătorul sau procesul automat | plata vânzătorului programată pentru a doua zi; evaluarea devine posibilă |
paid/shipped → cancelled | părțile sau echipa | rambursare integrală; anunțul revine activ dacă nu a fost expediat |
delivered/shipped → disputed | cumpărătorul | plata vânzătorului blocată; confirmarea automată oprită |
disputed → refunded/completed | echipa | rambursare totală, parțială (vânzătorul primește diferența) sau integral vânzătorului |
Banii unei comenzi
Toate sumele sunt în bani (1 leu = 100 de bani), calculate pe server de funcția priceOrder:
taxă protecție = 299 + rotunjire(preț × 300 / 10.000) (2,99 lei + 3%)
livrare = curier 1.999 | easybox 1.299 | predare personală 0
ramburs = 499 dacă plata e la livrare, altfel 0
total = max(0, preț + livrare + protecție + ramburs − reducere)
de plătit vânzătorului = preț (− rambursări parțiale, la dispute)Exemplu: produs de 2.400 lei, curier, card → protecție 2,99 + 72,00 = 74,99 lei; total 2.494,98 lei; vânzătorul primește 2.400 lei; Taraba păstrează 74,99 lei, iar livrarea de 19,99 lei merge la curier.
Secvențe importante
Diagramele de secvență folosesc notația UML: oamenii apar ca actori (omuleți), părțile sistemului ca dreptunghiuri, iar timpul curge de sus în jos, cu mesajele numerotate. Săgeata plină e un apel care așteaptă răspunsul, săgeata deschisă un mesaj trimis fără așteptare (notificări, jurnal), iar linia punctată un răspuns (roșu: eroare). Dreptunghiurile înguste de pe liniile verticale arată cât timp lucrează fiecare participant; cadrele alt / opt marchează pașii care se întâmplă doar uneori. ▶ Redă, în fereastra diagramei, le parcurge mesaj cu mesaj.
Plasarea unei comenzi
Blocarea rândului anunțului (SELECT … FOR UPDATE, mesajul 3) e motivul pentru care două persoane nu pot cumpăra același produs: a doua așteaptă și apoi primește „indisponibil”.
Conectarea clientului cu verificarea în doi pași
Parola corectă singură nu pornește sesiunea: API-ul răspunde cu o provocare (mesajul 6), iar sesiunea apare abia după codul din aplicație, folosit o singură dată.
Autentificarea echipei
Returul și rambursarea
Plata programată a vânzătorului se retrage în același pas în care se înregistrează returul (mesajul 4), deci nu poate pleca până nu se încheie returul.
Încărcarea unei fotografii
Trimiterea unei campanii
Celelalte diagrame de analiză (context, cazuri de utilizare, fluxuri de date, ERD conceptual, activitate) sunt în Diagrame de analiză.
Notificări și mesaje
| Canal | Cum | Respectă |
|---|---|---|
| În aplicație | rând în notifications | — (întotdeauna) |
| Push | creat automat la fiecare notificare (abonat la evenimentul ORM), trimis prin PushGateway | preferințele de notificare pe tip |
| SMS tranzacțional | comenzi: plasată (vânzătorului), expediată, livrată, finalizată | — (necesar pentru comandă) |
| E-mail tranzacțional | confirmare cont, resetare parolă, tichete, invitații | lista de adrese permise (în dezvoltare) |
| Marketing (e-mail, push, SMS) | campanii și automatizări, prin DeliveryPolicy | acord pe canal, excluderi, plafoane, ore de liniște |
SMS-urile se trimit fără diacritice, într-un singur segment GSM-7 (160 de caractere) unde e posibil.
Căutarea
MySQL FULLTEXT pe titlu și descriere, în mod boolean cu prefix (+cuvant*), cu colaționare care ignoră diacriticele și majusculele: „geaca” găsește „Geacă”. Cuvintele sub 3 litere și operatorii introduși de utilizator sunt eliminați. Filtrele (categorie, preț, stare, județ, livrare) sunt condiții SQL normale, cu indecși.
Fișiere
- Fotografiile anunțurilor și avatarele: reprocesate cu Intervention Image (rotire după EXIF, redimensionare, WebP, fără metadate), cheie nouă la fiecare încărcare (cache permanent în browser).
- O fotografie încărcată e „revendicată” de client 24 de ore (un token unic în baza de date); doar cheile revendicate pot fi atașate unui anunț.
- Actele de identitate: prefix
private/identity/, servite doar prin endpoint-ul echipei, șterse la decizie.