La conținut
Type — API pentru site
Secțiuni

Prețuri și reduceri

Prețurile le calculează CRM-ul — site-ul nu trebuie să repete regulile tarifelor, datelor speciale și reducerilor. Sumele vin ca șiruri cu două zecimale după punct ("1250.00") în moneda companiei (currency). Nu le transformați în number pentru calcule — rotunjirea s-ar deosebi de CRM; pentru afișare formatați-le așa cum sunt.

Prețul în catalog: SiteUnit

Fiecare obiect din units() și unit() are trei câmpuri despre prețul nopții:

CâmpCe înseamnă
base_priceprețul nopții fără reduceri — prețul „vechi”, dacă există o reducere
priceprețul nopții „de la”, cu reducerea care se aplică astăzi fără condiții; datele speciale nu se iau în calcul. Fără reducere — egal cu base_price
discountreducerea inclusă deja în price sau null

discount este un obiect SiteDiscount:

CâmpCe înseamnă
namedenumirea reducerii, poate fi afișată pe card
value_typepercent — procent, fixed — sumă pe noapte
valuemărimea reducerii (șir)
ends_onultima zi de valabilitate (YYYY-MM-DD) sau null — fără termen

Cum se afișează pe card:

tsx
{u.discount ? (
  <p>
    <s>{u.base_price}</s> <strong>{u.price} {u.currency}</strong>
    <span>{u.discount.name}</span>
  </p>
) : (
  <p>{u.price} {u.currency}</p>
)}

Prețul din catalog este un reper „de la”. Suma exactă pentru date o luați întotdeauna din quote() sau prices(): în ea sunt incluse datele speciale, condițiile reducerilor și numărul de nopți.

Prețurile tuturor obiectelor pe date: prices()

prices({ check_in, check_out, guests, group_id }) răspunde cu lista units — câte un SitePrice pentru fiecare obiect:

CâmpCe înseamnă
availabledatele sunt libere și condițiile sunt îndeplinite
subtotaltotalul înainte de reduceri
totaltotalul după reduceri
per_night_beforeprețul mediu al nopții înainte de reduceri
per_nightprețul mediu al nopții după reduceri
violationsde ce nu e disponibil (vedeți mai jos)

Dacă datele nu sunt disponibile, sumele sunt null. Așa catalogul arată „2 nopți — 2 400 în loc de 2 600” și ascunde obiectele ocupate.

Calculul pentru un obiect: quote()

quote({ unit_id, check_in, check_out, guests }) — același calcul pe care îl vede managerul în CRM:

CâmpCe înseamnă
nightsnumărul de nopți
per_nightlista nopților Night: date, base (prețul nopții după tarif), price (prețul acestei nopți cu data specială), special_name (denumirea datei speciale sau null)
discountsreducerile aplicate AppliedDiscount: name, amount (cu cât au micșorat totalul), kind (line — pe obiect, deal — pe întreaga rezervare), application (auto — s-a aplicat singură)
subtotaltotalul înainte de reduceri
totaltotalul de plată
availablenu există încălcări blocante — cererea poate fi trimisă
violationsîncălcările

Dacă datele sunt ocupate, răspunsul este tot 200, dar cu available: false și lista violations — nu e o eroare, ci un indiciu pentru formular.

Încălcări: violations

Fiecare încălcare este { code, blocking, params }. La blocking: true cererea nu va fi acceptată (422 rental_unavailable), la false este un avertisment.

codeCe să-i arătați vizitatorului
dates_invaliddatele sunt greșite
occupieddatele sunt ocupate
blockedobiectul este închis pentru aceste date
min_nightsmai puțin decât termenul minim; minimul — în params
max_guestsmai mulți oaspeți decât încape obiectul; maximul — în params
unit_archivedobiectul nu se mai închiriază

Recalculați quote() la fiecare schimbare a datelor și a numărului de oaspeți în formular, iar total nu-l trimiteți în cerere — CRM-ul îl calculează singur și îl întoarce în răspunsul la cerere.