04Sole Developer
POS
Point of Sale System — Restaurant Management Platform
- Role
- Full-Stack Developer - Sole Developer
- Stack
- PythonFrappe FrameworkERPNext ConceptsMariaDBJavaScript
- Links
- Private / internal
Overview
A custom point-of-sale system built on the Frappe Framework for small restaurant operations, covering orders, invoices, menu, inventory and customer management with real-time billing.
Problem
A small restaurant needed order taking, billing, inventory and daily revenue tracking in one system.
Solution
A custom POS on the Frappe Framework with DocTypes for orders, invoices, menu items, inventory and customers; real-time order and billing workflows for dine-in and takeaway; and Frappe dashboards and reports for staff and management.
Architecture
- Frappe Desk — POS screen, forms, dashboards, reports
- Frappe controllers (Python)
- Orders · Invoices · Menu · Inventory · Customers
- MariaDB
Features
- Restaurant POS
- Orders
- Invoices
- Menu
- Inventory
- Customer management
- Real-time billing
- Payment processing
- Frappe controllers
- Dashboards
- Reports
- RBAC
Engineering work
- Built and customized DocTypes (data models) for orders, invoices, menu items, inventory, and customer management.
- Implemented real-time order and billing workflows supporting dine-in, takeaway, and payment processing.
- Developed server-side business logic using Frappe controllers and Python, ensuring accurate billing and transaction handling.
- Customized Frappe UI forms, dashboards, and reports for efficient staff operations and management insights.
- Integrated role-based access control (RBAC) using Frappe's permission system for admin and staff users.
- Implemented inventory management with stock updates and validations, reducing manual tracking errors.
- Built sales reports and analytics dashboards using Frappe reporting tools for daily revenue tracking.
Engineering decisions
- 1Billing and transaction logic kept server-side in Frappe controllers.
- 2Frappe's permission system used for admin and staff roles.
- 3Stock updated and validated as part of the order workflow.
Code
pos/doctype/pos_order.pypython
class POSOrder(Document): def validate(self): for item in self.items: in_stock = get_stock_qty(item.menu_item) if item.qty > in_stock: frappe.throw(f"Only {in_stock} left: {item.menu_item}") self.grand_total = sum(i.qty * i.rate for i in self.items)Screens
Challenges
- Accurate billing and transaction handling across dine-in, takeaway and payment flows.
Results
- Inventory updates and validations reduced manual tracking errors.
- Daily revenue tracked through sales reports and analytics dashboards.