Skip to main content

Schema bazei de date

PostgreSQL 16+. Toate cheile primare sunt UUID. Toate marcajele temporale sunt stocate în UTC.


Users & Auth

users

ColoanăTipDescriere
idUUID (PK)
emailstringUnic
phonestringUnic
roleenumclient · professional · admin
encrypted_passwordstringbcrypt
confirmed_attimestampConfirmare email
discarded_attimestampȘtergere logică

Proprietarul salonului este determinat prin salons.owner_id, nu prin role.

profiles

ColoanăTip
user_idUUID (FK → users)
first_namestring
last_namestring
avatar_urlstring
biotext
localestring

oauth_identities

ColoanăTipDescriere
idUUID (PK)
user_idUUID (FK)→ users.id
providerstring"google" și alții în viitor
uidstringID unic la furnizor (sub)
created_attimestamp
updated_attimestamp

Index unic: provider + uid.


Saloane & Servicii

salons

ColoanăTipDescriere
idUUID (PK)
owner_idUUID (FK)→ users.id
namestring
slugstringPrietenos pentru URL, unic
addressstring
lat, lngdecimalCoordonate
phonestring
statusenumpending · active · suspended
photo_urlstring
reviews_countintegerCache contor
ratingdecimalRating mediu
currencystringISO 4217, implicit MDL
timezonestringIANA, implicit Europe/Chisinau
cancellation_hours_beforeintegerImplicit 24
cancellation_fee_percentdecimalImplicit 0
auto_cancel_after_minintegernullable

salon_services (AR model: Service)

ColoanăTip
idUUID (PK)
salon_idUUID (FK)
namestring
descriptiontext
duration_mininteger
category_idinteger (FK → categories)

Index unic: salon_id + name.

service_master_prices (AR model: ServiceMasterPrice)

ColoanăTip
idUUID (PK)
salon_idUUID (FK)
service_idUUID (FK → salon_services)
master_idUUID (FK → users)
pricedecimal

Index unic: service_id + master_id.

categories

ColoanăTip
idinteger
namestring
slugstring
parent_idinteger (auto-join, nullable)
positioninteger

Membrii & Profiluri maeștri

salon_memberships

ColoanăTipDescriere
idUUID (PK)
salon_idUUID (FK)
user_idUUID (FK)
roleenummaster · receptionist
statusenumpending · active · deactivated
invite_tokenstringPentru acceptarea invitațiilor
invited_attimestamp
accepted_attimestampnullable

Index unic: salon_id + user_id.

master_profiles

ColoanăTip
idUUID (PK)
user_idUUID (FK)
specializationstring
experience_yearsinteger
instagram_urlstring
portfolio_urlstring
reviews_countinteger
ratingdecimal

Programare & Rezervări

working_hours

ColoanăTipDescriere
salon_idUUID (FK)
membership_idUUID (FK → salon_memberships, nullable)null = întreg salonul
day_of_weekinteger0=Dum, 1=Lun ... 6=Sâm
start_timetime
end_timetime

appointments

ColoanăTipDescriere
idUUID (PK)
client_idUUID (FK)→ users.id
salon_idUUID (FK)
master_idUUID (FK)→ users.id
service_idUUID (FK)→ salon_services.id
starts_attimestamp
ends_attimestamp
statusstringAASM: confirmed/in_progress/completed/reviewed/cancelled/no_show
price_snapshotdecimalPrețul la momentul rezervării (înghețat)
duration_min_snapshotintegerDurata la momentul rezervării
total_amountdecimal

Recenzii & Favorite

reviews

ColoanăTip
idUUID (PK)
appointment_idUUID (FK)
client_idUUID (FK)
salon_idUUID (FK)
master_idUUID (FK)
ratinginteger
bodytext

favorites

ColoanăTip
idUUID (PK)
user_idUUID (FK)
salon_idUUID (FK)

Index unic: user_id + salon_id.