The Scope
When Keshera Industry approached us, they were managing their entire operations across multiple spreadsheets and a disconnected accounting tool. Purchase orders were tracked in Excel. Inventory was a separate workbook. Invoices were generated manually in Word. The biggest problem was not the tools — it was that no one in the business had a real-time view of anything.
We scoped a 16-module ERP covering: Inventory Management, Purchasing, Goods Receipt, Supplier Management, Sales Orders, Customer Management, Invoicing, Payments, Employee Management, Attendance, Payroll, Reporting, Role-Based Access Control, Document Management, Notifications, and an Executive Dashboard.
Technology Stack
Our production ERP stack for this project:
- Frontend: React with Redux for state management, Tailwind CSS for styling
- Backend: Java with Spring Boot, Spring Security for authentication
- Database: PostgreSQL with carefully indexed schema
- Authentication: JWT with role-based access control middleware
- Deployment: Docker containers on a VPS
The Database Schema Decision
The most important decision in any ERP project is the database schema. We chose PostgreSQL for Keshera because the business data is highly relational — a purchase order references a supplier, which references contact records; goods receipt references a purchase order; an invoice references a sales order which references a customer and line items referencing inventory records.
We spent one full week on schema design before writing a single line of application code. That week paid for itself ten times over during development.
-- Example: Purchase Order with full referential integrity
CREATE TABLE purchase_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
po_number VARCHAR(50) UNIQUE NOT NULL,
supplier_id UUID NOT NULL REFERENCES suppliers(id),
status VARCHAR(20) NOT NULL DEFAULT 'draft',
total_amount DECIMAL(12,2) NOT NULL DEFAULT 0,
created_by UUID NOT NULL REFERENCES users(id),
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
Role-Based Access Control
Keshera Industry has distinct user roles: Admin, Warehouse Manager, Purchase Manager, Sales Manager, Accountant, and Employee. Each role sees a different subset of modules and can perform different actions within those modules.
We implemented this with Spring Security at the API level — every endpoint checks the authenticated user's role before processing the request. The frontend mirrors this by rendering only the navigation items and action buttons that the logged-in user's role permits.
What We Would Do Differently
We underestimated the complexity of the payroll module. Indian payroll has significant calculation complexity (PF, ESI, TDS, LOP calculations) that requires careful validation with real payroll practitioners before implementation. We built it correctly but it took 40% longer than estimated. If we build payroll again, we scope it as a separate phase.
The Result
The ERP is live and in daily use across Keshera Industry. The purchase to payment workflow that previously required four people coordinating across spreadsheets now runs through one system with clear status visibility at every stage. That is the measure of a successful ERP delivery.