Add rate plan calendar screen
This commit is contained in:
369
AGENTS.md
Normal file
369
AGENTS.md
Normal 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.
|
||||
Reference in New Issue
Block a user