A booking is a slot on a villa for a customer. It carries two independent statuses: a business
one (HOLD, CONFIRMED, COMPLETED, CANCELLED, EXPIRED) and a financial one (UNPAID,
PARTIALLY_PAID, PAID, REFUNDED). A confirmed booking that is still unpaid is a normal case,
never an anomaly — do not collapse the two into one indicator.
priceAmount, currency and bufferMinutes are copied onto the booking when it is created.
Changing a rate grid or a setting afterwards never rewrites the past.
Every write here goes through the same service the app uses. Availability, buffer, opening hours, pricing and plan limits are enforced once, in one place — the API cannot bypass them.