Skip to content

02Sole Developer

Resort Management System

Resort Operations & Hospitality ERP

Role
Project Lead - Full-Stack Developer / Android App Developer - Sole Developer
Stack
PythonFrappe Framework v15MariaDBRedisReact NativeTypeScriptREST APIWebSocketsFirebase Cloud Messaging
api.cholabeachresort.com/app/availability
RMFront Desk / Availability
FD

Cottage availability · 13 – 19 Oct

‹ PrevNext ›New booking
Checked in Confirmed Cleaning buffer Blocked · maintenance
Cottage
Mon 13
Tue 14
Wed 15
Thu 16
Fri 17
Sat 18
Sun 19
C-01
S. Iyer · 2 guests
Buffer
A. Khan · 3
C-02
R. Nair · 4 guests
C-03
Buffer
M. Das · 2 guests
C-04
P. Rao · 2 guests + extra bed
C-05
Maintenance · AC
C-06
J. Thomas · 2
C-07
L. Pillai · 3
Buffer
+ 7 more cottages
Cottage availability calendar. Representative UI mockup with sample data.

Overview

An end-to-end resort platform covering the full guest lifecycle — booking, check-in, cottage allocation, in-stay services, billing and checkout — for a 14-cottage beach resort running live in production.

Problem

A 14-cottage beach resort needed one platform for the full guest lifecycle — booking, check-in, cottage allocation, in-stay services, billing and checkout — used by Reception, Guest Service, Kitchen, Housekeeping and Management.

Solution

A Frappe v15 backend exposing a versioned REST API (18 modules) with one response envelope, a 39-screen React Native staff app with role-specific workflows, real-time order delivery over WebSockets with FCM push fallback, an immutable folio ledger with GST invoicing, and a secure guest QR portal.

Architecture

    • React Native staff app (TypeScript)
    • Guest QR web portal
  1. REST API /v1 · WebSockets (Socket.IO)
    • Frappe v15 backend — 18 API modules, RBAC, idempotency keys
    • MariaDB
    • Redis
    • Firebase Cloud Messaging

Features

  • Booking
  • Availability
  • Pricing
  • Billing
  • Orders
  • Housekeeping
  • Maintenance
  • Reports
  • 39-screen staff app
  • React Query
  • Zustand
  • Immutable folio ledger
  • GST invoicing
  • WebSocket delivery
  • FCM notifications
  • Bluetooth ESC/POS printing
  • Secure guest QR portal
  • Fine-grained RBAC
  • Idempotency keys
  • Stay lifecycle logic
  • Automated tests

Engineering work

  • Architected a versioned REST API (18 modules: bookings, availability, pricing, billing, orders, service, housekeeping, maintenance, reports) with a single response envelope and error-code taxonomy, so web and mobile clients share one transport layer.
  • Built a React Native staff application (39 screens) with role-specific workflows for Reception, Guest Service, Kitchen, Housekeeping and Management, using React Query, Zustand and TypeScript.
  • Implemented an immutable folio ledger where bills are always computed as the sum of submitted entries and corrections are posted as reversals — a fully auditable billing trail with GST tax invoicing and invoice series.
  • Developed real-time order and notification delivery over WebSockets (Frappe SocketIO) with user-scoped rooms, plus FCM push notifications (OAuth2 / FCM v1 API) for closed apps, with a queued fallback when realtime is down.
  • Built ESC/POS thermal printing via a custom React Native native module (TurboModule) for kitchen order tickets, food bills and consolidated stay bills over Bluetooth.
  • Designed a secure guest QR portal using per-stay access tokens, PIN verification, rate limiting and a mandatory session guard on every endpoint, so guests can view bills, order food and raise service requests without exposing personal or cross-stay data.
  • Implemented fine-grained RBAC across 10 roles using Frappe role permissions, field-level permlevels and permission query conditions, enforced at the API layer rather than the UI.
  • Added idempotency-key handling on all mutating endpoints to make order placement, payments and check-ins safe against retries on unreliable mobile networks.
  • Engineered availability and stay-lifecycle logic including cottage blocking, cleaning buffers, occupancy rules, extra-bed pricing, cancellation slabs and rate-plan/floor-price validation.
  • Created a reproducible deployment pipeline using Frappe fixtures and seed scripts, so a new server can be provisioned with full master data without any database copy.
  • Wrote an automated test suite (Python unit + integration tests, Jest tests for the mobile app) covering billing arithmetic, portal security and permission boundaries.

Engineering decisions

  1. 1Immutable folio ledger: bills are the sum of submitted entries and corrections are posted as reversals, giving an auditable billing trail.
  2. 2A single response envelope and error-code taxonomy so web and mobile clients share one transport layer.
  3. 3Idempotency keys on every mutating endpoint so orders, payments and check-ins are safe to retry.
  4. 4Fine-grained RBAC across 10 roles (role permissions, field-level permlevels, permission query conditions) enforced at the API layer, not the UI.
  5. 5Reproducible deployments from Frappe fixtures and seed scripts instead of database copies.

Code

billing/folio.pypython
def folio_balance(stay: str) -> float:    # A bill is always derived from submitted entries    entries = frappe.get_all("Folio Entry",        filters={"stay": stay, "docstatus": 1}, fields=["amount"])    return sum(e.amount for e in entries)def correct_entry(name: str):    # Never edit a posted entry — post a reversal instead    reversal = frappe.copy_doc(frappe.get_doc("Folio Entry", name))    reversal.amount = -reversal.amount    reversal.reverses = name    reversal.submit()
Simplified sketch of the approach — not production code.

Screens

api.cholabeachresort.com/app/availability
RMFront Desk / Availability
FD

Cottage availability · 13 – 19 Oct

‹ PrevNext ›New booking
Checked in Confirmed Cleaning buffer Blocked · maintenance
Cottage
Mon 13
Tue 14
Wed 15
Thu 16
Fri 17
Sat 18
Sun 19
C-01
S. Iyer · 2 guests
Buffer
A. Khan · 3
C-02
R. Nair · 4 guests
C-03
Buffer
M. Das · 2 guests
C-04
P. Rao · 2 guests + extra bed
C-05
Maintenance · AC
C-06
J. Thomas · 2
C-07
L. Pillai · 3
Buffer
+ 7 more cottages
Cottage availability calendar. Representative UI mockup with sample data.
api.cholabeachresort.com/app/stay/STAY-0231
RMStays / STAY-0231 / Folio
FD

P. Rao In house

C-04 · 13 – 17 Oct · 4 nights · 2 adults + extra bed

Post entryGenerate GST invoice
FolioOrdersService requestsGuest portal

Submitted entries are immutable. Corrections are posted as reversals.

DateEntryReferenceAmount
13 OctRoom tariff — night 1Rate plan: Standard₹6,500
13 OctExtra bedOccupancy rule₹800
13 OctFood orderKOT-1182₹1,240
14 OctRoom tariff — night 2Rate plan: Standard₹6,500
14 OctReversal of KOT-1182 line 2Correction · FE-0457−₹320
14 OctLaundryService request SR-219₹350
Subtotal₹15,070
CGST₹904
SGST₹904
Balance due₹16,878

Invoice series: INV-2024-25

Guest folio with reversal entries and GST. Representative UI mockup with sample data.
Staff app — Kitchen orders (real-time) · Staff app — Housekeeping tasks. Representative UI mockup with sample data.

Challenges

  • Unreliable mobile networks causing retried requests — solved with idempotency keys.
  • Reaching staff whose app is closed — FCM push (OAuth2 / FCM v1) with a queued fallback when realtime is down.
  • Letting guests view bills and order food without exposing personal or cross-stay data — per-stay tokens, PIN verification, rate limiting and a session guard on every endpoint.
  • Printing kitchen tickets and bills from the app — ESC/POS over Bluetooth via a custom TurboModule.

Testing & delivery

Testing
Python unit + integration tests and Jest tests for the mobile app — billing arithmetic, portal security and permission boundaries.
Delivery
New servers provisioned from Frappe fixtures and seed scripts (cottages, tariffs, 100-item menu, service SLAs) — no database copy.

Results

  • Running live in production at a 14-cottage beach resort.
  • Auditable, dispute-proof billing with GST tax invoicing and invoice series.