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
Staff app
Kitchen
C-07 · Guest portal
- Veg fried rice ×1
- Lime soda ×2
C-02 · Guest service
- Fish curry meals ×2
- Chapati ×4
Restaurant · T-3
- Masala dosa ×2
Printer: ESC/POS thermal · connected
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
- 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
- 1Immutable folio ledger: bills are the sum of submitted entries and corrections are posted as reversals, giving an auditable billing trail.
- 2A single response envelope and error-code taxonomy so web and mobile clients share one transport layer.
- 3Idempotency keys on every mutating endpoint so orders, payments and check-ins are safe to retry.
- 4Fine-grained RBAC across 10 roles (role permissions, field-level permlevels, permission query conditions) enforced at the API layer, not the UI.
- 5Reproducible deployments from Frappe fixtures and seed scripts instead of database copies.
Code
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()Screens
Staff app
Kitchen
C-07 · Guest portal
- Veg fried rice ×1
- Lime soda ×2
C-02 · Guest service
- Fish curry meals ×2
- Chapati ×4
Restaurant · T-3
- Masala dosa ×2
Printer: ESC/POS thermal · connected
Staff app
Housekeeping
Checkout cleaning
Due 11:30 · before next arrival
Extra towels
Guest request via QR portal
Turn-down service
Due 19:00
Buffer cleaning
Blocks C-01 until done
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.