ServerSource Պահանջներ User flow-եր Տվյալների մոդել Ճարտարապետություն և API UI/UX նախատիպ

Տվյալների մոդել Փուլ 1

PostgreSQL 16։ Բոլոր աղյուսակները ունեն created_at, իսկ բազմաընկերային մեկուսացումն ապահովվում է company_id FK-ով՝ ստուգվող յուրաքանչյուր հարցման դեպքում։

ERD — հիմնական կապեր

1:N 1:N 1:N 1:1 1:N 1:N companiesընկերություններ usersօգտատերեր notificationsծանուցումներ audit_logաուդիտ (append-only) cargo_listingsբեռների հայտեր offersառաջարկներ vehicle_listingsմեքենաների հայտեր conversationsզրույցներ order_status_historyկարգավիճակների պատմություն ordersպատվերներ order_documentsպատվերի փաստաթղթեր messagesհաղորդագրություններ plansպլաններ ratingsվարկանիշներ subscriptionsբաժանորդագրություններ paymentsվճարումներ (idempotent)

Շարունակական գիծ՝ հիմնական կապ, կետագիծ՝ երկրորդական։ Մնացած կապերը (company→subscription, user→messages և այլն) տրված են FK-ներով ստորև։

Ինքնություն և ընկերություններ

companies

ԴաշտՏիպՆշում
iduuid PK
namevarcharօր․ «Հայ Տրանզիտ» LLC
typeenum(shipper, carrier, both)որոշում է հասանելի դերերը
country / tax_idchar(2) / varcharստուգման համար
statusenum(pending, verified, rejected)միայն պլատֆ. ադմինը փոխում է
ratingnumeric(3,2)materialized միջին՝ ratings-ից
reject_reason, verified_by, verified_attext / uuid FK / timestamptzաուդիտի հետք

users

ԴաշտՏիպՆշում
iduuid PK
company_iduuid FK→companies NULLNULL՝ պլատֆ. ադմինի համար
email / phonecitext UNIQUE / varcharemail-ով մուտք
password_hashvarcharArgon2id
roleenum(shipper, carrier, company_admin, platform_admin)RBAC-ի հիմքը
statusenum(active, blocked)
localevarchar(5) DEFAULT 'hy'hy / ru / en

company_documents

ԴաշտՏիպՆշում
id, company_iduuid PK, FK
typeenum(registration, license, other)
file_keyvarcharփակ S3 բանալի, ոչ հրապարակային URL
statusenum(pending, approved, rejected)ադմինի որոշում

Բորսա

cargo_listings

ԴաշտՏիպՆշում
id, company_id, created_byuuid PK, FK, FKմեկուսացման բանալին՝ company_id
from_country, from_city, to_country, to_citychar(2), varchar ×2որոնման ինդեքս (from,to,load_date)
load_datedateexpires_at՝ load_date + 1 օր
weight_kg, volume_m3int / numericֆիլտրեր
vehicle_typeenum(tent, ref, isotherm, platform, tanker, other)բառարան՝ settings-ում
price, currencynumeric / char(3)
statusenum(active, paused, booked, expired, archived, removed)ժամկետանց՝ job-ով expired

vehicle_listings

ԴաշտՏիպՆշում
id, company_id, created_byuuid PK, FK, FK
from_/to_ country, citychar(2), varcharերթի ուղղություն
available_from, available_todateազատ լինելու պատուհան
vehicle_type, capacity_kg, capacity_m3enum / int / numericհամապատասխանեցման համար (Փ4)
price_hint, currency, statusnumeric / char(3) / enumնույն enum-ը՝ ինչ cargo

Գործարքներ

offers

ԴաշտՏիպՆշում
id, listing_id, listing_typeuuid PK, uuid, enum(cargo, vehicle)պոլիմորֆ FK
from_user_id, from_company_iduuid FK ×2ով է առաջարկում
price, currency, commentnumeric / char(3) / text
statusenum(new, negotiating, accepted, rejected, withdrawn)accepted → order ստեղծում

orders

ԴաշտՏիպՆշում
iduuid PK
numbervarchar UNIQUEORD-2025-0001՝ sequence-ով
offer_iduuid FK→offers UNIQUE1:1, պատվերը առաջարկից
cargo_id / vehicle_iduuid FK NULLկախված listing_type-ից
customer_company_id, carrier_company_iduuid FK ×2երկու կողմերը
agreed_price, currencynumeric / char(3)վերջնական համաձայնեցված գին
statusenum(created, confirmed, in_transit, delivered, completed, cancelled, disputed)անցումները՝ flow №5
created_by, created_at, completed_atuuid FK, timestamptz ×2

order_status_history

ԴաշտՏիպՆշում
id, order_iduuid PK, FKընդունման չափանիշ №5
from_status, to_statusenum ×2from_status NULL՝ ստեղծման դեպքում
changed_by, commentuuid FK / textով և ինչու

order_documents

ԴաշտՏիպՆշում
id, order_id, uploaded_byuuid PK, FK, FK
typeenum(contract, cmr, invoice, customs, other)
file_keyvarcharփակ storage, ստորագրված ժամանակավոր URL
visibilityenum(parties, admin)ընդունման չափանիշ №6

Հաղորդակցություն

conversations / messages

ԴաշտՏիպՆշում
conversations.id, order_id, offer_iduuid PK, FK NULL ×2CHECK․ գոնե մեկը լցված է
conversations.company_a_id, company_b_iduuid FK ×2մասնակիցները
messages.id, conversation_id, sender_iduuid PK, FK, FKINDEX(conversation_id, created_at)
messages.body, attachment_key, read_attext / varchar / timestamptzread receipts

notifications

ԴաշտՏիպՆշում
id, user_iduuid PK, FKINDEX(user_id, is_read)
type, payloadvarchar / jsonboffer_new, order_status, message_new…
is_readbool DEFAULT falsein-app + email ուղարկում՝ worker-ով

Վճարումներ

plans / subscriptions / payments

ԴաշտՏիպՆշում
plans.id, code, price, period, limitsuuid PK, varchar UNIQUE, numeric, enum(month,year), jsonblimits․ {"offers_per_month":null,"users":5,"priority":true}
subscriptions.id, company_id, plan_id, statusuuid PK, FK, FK, enum(active, past_due, cancelled, expired)մեկ ակտիվ subscription ընկերության համար
payments.id, company_id, subscription_iduuid PK, FK, FK NULL
payments.idempotency_keyvarchar UNIQUEընդունման չափանիշ №8՝ կրկնվող հարցումը չի կրկնում գանձումը
payments.provider, provider_payment_idvarchar ×2UNIQUE(provider, provider_payment_id)՝ webhook-ի կրկնակի մշակման պաշտպանություն
payments.amount, currency, statusnumeric / char(3) / enum(pending, succeeded, failed, refunded)

Համակարգ

ratings / audit_log / settings

ԴաշտՏիպՆշում
ratings.id, order_id, from_company_id, to_company_iduuid PK, FK ×3UNIQUE(order_id, from_company_id)՝ մեկ գնահատական կողմից
ratings.score, commentsmallint CHECK 1–5 / textմիջինը materialized է companies.rating-ում
audit_log.idbigserial PKappend-only․ UPDATE/DELETE-ը արգելված է DB մակարդակում
audit_log.actor_user_id, actor_company_id, action, entity_type, entity_id, details, ipuuid FK / varchar / varchar / varchar / jsonb / inetընդունման չափանիշ №9
settings.key, valuevarchar PK / jsonbարժույթներ, լեզուներ, vehicle_type բառարան, commission
Migrations քաղաքականություն․ սխեման կվարվի versioned migrations-ով (Փուլ 2-ից՝ Flyway/Prisma/Alembic ըստ ընտրված stack-ի)՝ 0001_init, 0002_rbac_indexes… Յուրաքանչյուր migration պետք է լինի հետադարձելի (down) և ներառի ինդեքսներ որոնման հարցումների համար։