Add rate plan calendar screen

This commit is contained in:
androidlover5842
2026-01-29 06:13:05 +05:30
parent 3fe0730f4c
commit 726f07bff4
15 changed files with 1321 additions and 22 deletions

369
AGENTS.md Normal file
View File

@@ -0,0 +1,369 @@
# TrisolarisPMS API Usage
## 1) Booking
### Create booking
POST /properties/{propertyId}/bookings
Auth: ADMIN/MANAGER/STAFF
Body (JSON)
Required:
- expectedCheckInAt (String, ISO-8601, required)
- expectedCheckOutAt (String, ISO-8601, required)
Optional:
- source (String, default "WALKIN")
- transportMode (String enum)
- adultCount (Int)
- totalGuestCount (Int)
- notes (String)
{
"source": "WALKIN",
"expectedCheckInAt": "2026-01-28T12:00:00+05:30",
"expectedCheckOutAt": "2026-01-29T10:00:00+05:30",
"transportMode": "CAR",
"adultCount": 2,
"totalGuestCount": 3,
"notes": "Late arrival"
}
Behavior
If expectedCheckInAt >= now(property timezone) -> booking becomes CHECKED_IN, and checkinAt is set, expected fields are null.
Response
{
"id": "uuid",
"status": "OPEN|CHECKED_IN",
"checkInAt": "2026-01-28T12:00:00+05:30" | null,
"expectedCheckInAt": "..." | null,
"expectedCheckOutAt": "..." | null
}
---
### Check-in (creates RoomStay)
POST /properties/{propertyId}/bookings/{bookingId}/check-in
Auth: ADMIN/MANAGER/STAFF
Body
Required:
- roomIds (List<UUID>)
Optional:
- checkInAt (String)
- transportMode (String enum)
- nightlyRate (Long)
- rateSource (PRESET|NEGOTIATED|OTA)
- ratePlanCode (String)
- currency (String)
- notes (String)
{
"roomIds": ["uuid1","uuid2"],
"checkInAt": "2026-01-28T12:00:00+05:30",
"nightlyRate": 2500,
"rateSource": "NEGOTIATED",
"ratePlanCode": "WEEKEND",
"currency": "INR",
"notes": "Late arrival"
}
---
### Pre-assign room stay
POST /properties/{propertyId}/bookings/{bookingId}/room-stays
Auth: ADMIN/MANAGER/STAFF
Body
Required:
- roomId (UUID)
- fromAt (String)
- toAt (String)
Optional:
- nightlyRate (Long)
- rateSource (PRESET|NEGOTIATED|OTA)
- ratePlanCode (String)
- currency (String)
- notes (String)
{
"roomId": "uuid",
"fromAt": "2026-01-29T12:00:00+05:30",
"toAt": "2026-01-30T10:00:00+05:30",
"nightlyRate": 2800,
"rateSource": "PRESET",
"ratePlanCode": "WEEKEND",
"currency": "INR"
}
---
## 2) Guests
### Create guest + link to booking
POST /properties/{propertyId}/guests
Auth: property member
Body (required):
- phoneE164 (String)
- bookingId (UUID)
Optional:
- name (String)
- nationality (String)
- addressText (String)
{
"phoneE164": "+911111111111",
"bookingId": "uuid",
"name": "John",
"nationality": "IN",
"addressText": "Varanasi"
}
Behavior:
- If phone already exists -> links existing guest to booking and returns it.
- If booking already has a guest -> 409.
Response (GuestResponse)
{
"id": "uuid",
"name": "John",
"phoneE164": "+911111111111",
"nationality": "IN",
"addressText": "Varanasi",
"signatureUrl": "/properties/{propertyId}/guests/{guestId}/signature/file",
"vehicleNumbers": [],
"averageScore": null
}
---
### Add guest vehicle + link to booking
POST /properties/{propertyId}/guests/{guestId}/vehicles
Auth: property member
Body:
{ "vehicleNumber": "UP32AB1234", "bookingId": "uuid" }
---
### Upload signature (SVG only)
POST /properties/{propertyId}/guests/{guestId}/signature
Auth: ADMIN/MANAGER
Multipart:
- file (SVG)
---
### Download signature
GET /properties/{propertyId}/guests/{guestId}/signature/file
Auth: property member
Returns image/svg+xml.
---
## 3) Room Types (default rate + rate resolve)
### Room type create/update
Fields now include defaultRate:
RoomTypeUpsertRequest
{
"code": "DELUX",
"name": "Deluxe",
"baseOccupancy": 2,
"maxOccupancy": 3,
"sqFeet": 150,
"bathroomSqFeet": 30,
"defaultRate": 2500,
"active": true,
"otaAliases": [],
"amenityIds": []
}
### Resolve preset rate for date
GET /properties/{propertyId}/room-types/{roomTypeCode}/rate?date=YYYY-MM-DD&ratePlanCode=optional
Auth: public if no auth, or member
Response
{
"roomTypeCode": "DELUX",
"rateDate": "2026-02-01",
"rate": 2800,
"currency": "INR",
"ratePlanCode": "WEEKEND"
}
---
## 4) Rate Plans + Calendar
### Create rate plan
POST /properties/{propertyId}/rate-plans
Auth: ADMIN/MANAGER
Body
Required:
- code (String)
- name (String)
- roomTypeCode (String)
- baseRate (Long)
Optional:
- currency (String, default property currency)
{ "code":"WEEKEND", "name":"Weekend", "roomTypeCode":"DELUX", "baseRate":2800, "currency":"INR" }
Response RatePlanResponse
### List plans
GET /properties/{propertyId}/rate-plans?roomTypeCode=optional
Auth: member
### Update
PUT /properties/{propertyId}/rate-plans/{ratePlanId}
Body:
{ "name":"Weekend", "baseRate":3000, "currency":"INR" }
### Delete
DELETE /properties/{propertyId}/rate-plans/{ratePlanId}
### Calendar upsert (batch)
POST /properties/{propertyId}/rate-plans/{ratePlanId}/calendar
Body: Array
[
{ "rateDate":"2026-02-01", "rate":3200 },
{ "rateDate":"2026-02-02", "rate":3500 }
]
### Calendar list
GET /properties/{propertyId}/rate-plans/{ratePlanId}/calendar?from=YYYY-MM-DD&to=YYYY-MM-DD
### Calendar delete
DELETE /properties/{propertyId}/rate-plans/{ratePlanId}/calendar/{rateDate}
---
## 5) RoomStay rate change (mid-stay renegotiation)
POST /properties/{propertyId}/room-stays/{roomStayId}/change-rate
Auth: ADMIN/MANAGER
Body
Required:
- effectiveAt (String, ISO-8601)
- nightlyRate (Long)
- rateSource (PRESET|NEGOTIATED|OTA)
Optional:
- ratePlanCode (String)
- currency (String)
{
"effectiveAt": "2026-01-30T12:00:00+05:30",
"nightlyRate": 2000,
"rateSource": "NEGOTIATED",
"currency": "INR"
}
Response
{ "oldRoomStayId":"uuid", "newRoomStayId":"uuid", "effectiveAt":"..." }
---
## 6) Payments + Balance
### Add payment
POST /properties/{propertyId}/bookings/{bookingId}/payments
Auth: ADMIN/MANAGER/STAFF
Body
Required:
- amount (Long)
- method (CASH|CARD|UPI|BANK|ONLINE)
Optional:
- currency (String, default property currency)
- reference (String)
- notes (String)
- receivedAt (String)
{
"amount": 1200,
"method": "CASH",
"currency": "INR",
"reference": "RCP-123",
"notes": "Advance"
}
Response
{
"id":"uuid",
"bookingId":"uuid",
"amount":1200,
"currency":"INR",
"method":"CASH",
"reference":"RCP-123",
"notes":"Advance",
"receivedAt":"2026-01-28T12:00:00+05:30",
"receivedByUserId":"uuid"
}
### List payments
GET /properties/{propertyId}/bookings/{bookingId}/payments
### Booking balance
GET /properties/{propertyId}/bookings/{bookingId}/balance
{ "expectedPay": 2745, "amountCollected": 1200, "pending": 1545 }
---
## 7) Compose Notes
- Use `androidx.compose.foundation.text.KeyboardOptions` for keyboard options imports.