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âmp | Ce înseamnă |
|---|---|
base_price | prețul nopții fără reduceri — prețul „vechi”, dacă există o reducere |
price | preț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 |
discount | reducerea inclusă deja în price sau null |
discount este un obiect SiteDiscount:
| Câmp | Ce înseamnă |
|---|---|
name | denumirea reducerii, poate fi afișată pe card |
value_type | percent — procent, fixed — sumă pe noapte |
value | mărimea reducerii (șir) |
ends_on | ultima zi de valabilitate (YYYY-MM-DD) sau null — fără termen |
Cum se afișează pe card:
{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âmp | Ce înseamnă |
|---|---|
available | datele sunt libere și condițiile sunt îndeplinite |
subtotal | totalul înainte de reduceri |
total | totalul după reduceri |
per_night_before | prețul mediu al nopții înainte de reduceri |
per_night | prețul mediu al nopții după reduceri |
violations | de 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âmp | Ce înseamnă |
|---|---|
nights | numărul de nopți |
per_night | lista 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) |
discounts | reducerile 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ă) |
subtotal | totalul înainte de reduceri |
total | totalul de plată |
available | nu 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.
code | Ce să-i arătați vizitatorului |
|---|---|
dates_invalid | datele sunt greșite |
occupied | datele sunt ocupate |
blocked | obiectul este închis pentru aceste date |
min_nights | mai puțin decât termenul minim; minimul — în params |
max_guests | mai mulți oaspeți decât încape obiectul; maximul — în params |
unit_archived | obiectul 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.