# Property Valuation Portal - Architecture Overview
## System Architecture Diagram
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLIENT LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ β
β β Desktop Browser β β Mobile Browser (PWA) β β
β β - Chrome, Firefox, β β - Android, iOS β β
β β Safari, Edge β β - Offline Support β β
β β - React SPA β β - Service Worker β β
β ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ β
β β β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β β
β β HTTPS β
ββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CDN / CLOUDFLARE LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β - Static Assets Delivery (JS, CSS, Images) β
β - SSL/TLS Termination β
β - DDoS Protection β
β - Caching β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β API GATEWAY LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β - Rate Limiting β
β - JWT Token Validation β
β - Request Logging β
β - Load Balancing β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β APPLICATION LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Fastify Backend (Node.js) β β
β β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β Auth β β Valuation β β Document β β β
β β β Service β β Service β β Service β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β Photo β β Workflow β β Report β β β
β β β Service β β Service β β Service β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β User β β Admin β β Notificationβ β β
β β β Service β β Service β β Service β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
βββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATA LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ β
β β PostgreSQL 18+ DB β β Object Storage β β
β β + PostGIS Extension β β (S3-compatible) β β
β β β β β β
β β - Valuations β β - Documents (PDF, DOC) β β
β β - Properties β β - Photos (JPG, PNG) β β
β β - Users & Roles β β - Generated Reports β β
β β - Workflow States β β β β
β β - Audit Logs β β Signed URLs β β
β β - GeoSpatial Data β β CDN Delivery β β
β β (Boundaries, Points) β β β β
β ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β EXTERNAL INTEGRATIONS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Google Maps β β Email/SMS β β Bank APIs β β
β β API β β Gateway β β (Future) β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
---
## Component Architecture
### Frontend Architecture (React SPA)
```
src/
βββ components/ # Reusable UI components
β βββ common/ # Common components (Button, Input, Card)
β βββ layout/ # Layout components (Header, Sidebar, Footer)
β βββ forms/ # Form components (ValuationForm, etc.)
β βββ maps/ # Map components (MapView, BoundaryDrawer)
β βββ charts/ # Chart components (Dashboard charts)
β
βββ pages/ # Page components (one per screen)
β βββ Dashboard/
β βββ Valuations/
β β βββ ValuationList.tsx
β β βββ CreateValuation.tsx
β β βββ BasicInformation.tsx
β β βββ PropertyDetails.tsx
β β βββ SiteMap.tsx
β β βββ ValuationCalculation.tsx
β βββ Documents/
β βββ Photos/
β βββ Review/
β βββ Approval/
β βββ Reports/
β βββ Admin/
β
βββ hooks/ # Custom React hooks
β βββ useAuth.ts
β βββ useValuation.ts
β βββ useWorkflow.ts
β βββ useMap.ts
β
βββ services/ # API service layer
β βββ api.ts # Base API client (Axios/Fetch)
β βββ authService.ts
β βββ valuationService.ts
β βββ documentService.ts
β βββ photoService.ts
β βββ adminService.ts
β
βββ stores/ # State management (Context API or Zustand)
β βββ authStore.ts
β βββ valuationStore.ts
β βββ uiStore.ts
β
βββ types/ # TypeScript type definitions
β βββ valuation.types.ts
β βββ user.types.ts
β βββ workflow.types.ts
β βββ api.types.ts
β
βββ utils/ # Utility functions
β βββ validators.ts # Form validation functions
β βββ formatters.ts # Data formatters
β βββ calculations.ts # Valuation calculations
β βββ helpers.ts # Helper functions
β
βββ constants/ # Constants and enums
β βββ workflow.constants.ts
β βββ validation.constants.ts
β βββ routes.constants.ts
β
βββ App.tsx # Main app component
```
---
### Backend Architecture (Fastify)
```
src/
βββ modules/ # Feature modules
β βββ auth/
β β βββ auth.controller.ts
β β βββ auth.service.ts
β β βββ auth.routes.ts
β β βββ auth.schema.ts # Zod validation schemas
β β
β βββ valuations/
β β βββ valuations.controller.ts
β β βββ valuations.service.ts
β β βββ valuations.routes.ts
β β βββ valuations.schema.ts
β β
β βββ documents/
β βββ photos/
β βββ workflow/
β βββ reports/
β βββ users/
β βββ admin/
β
βββ database/ # Database layer
β βββ client.ts # Database client (Prisma/Drizzle)
β βββ migrations/ # Database migrations
β βββ seeds/ # Seed data
β βββ schema/ # Database schema definitions
β
βββ middleware/ # Middleware functions
β βββ auth.middleware.ts # JWT validation
β βββ rbac.middleware.ts # Role-based access control
β βββ logging.middleware.ts # Request logging
β βββ error.middleware.ts # Error handling
β
βββ services/ # Shared services
β βββ storage.service.ts # File storage (S3)
β βββ email.service.ts # Email notifications
β βββ sms.service.ts # SMS notifications
β βββ maps.service.ts # Google Maps integration
β
βββ utils/ # Utility functions
β βββ validators.ts
β βββ calculations.ts
β βββ formatters.ts
β βββ helpers.ts
β
βββ types/ # TypeScript type definitions
β βββ index.ts
β
βββ config/ # Configuration
β βββ database.config.ts
β βββ storage.config.ts
β βββ env.config.ts
β
βββ index.ts # Application entry point
```
---
## Database Schema Overview
### Core Tables
```
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β VALUATIONS (Main entity) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β id (UUID, PK) β
β valuation_number (Text, Unique, Indexed) β
β bank_id (FK β banks) β
β property_type (Enum: plot/independent_house/apartment) β
β status (Enum: draft/survey/submitted/review/approval/approved) β
β priority (Enum: high/medium/low) β
β created_by (FK β users) β
β assigned_surveyor (FK β users) β
β assigned_keyin (FK β users) β
β assigned_reviewer (FK β users) β
β assigned_approver (FK β users) β
β created_at (Timestamp) β
β updated_at (Timestamp) β
β submitted_at (Timestamp) β
β approved_at (Timestamp) β
β ... (workflow timestamps) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββ 1:1 ββββ
β β
βΌ βΌ
ββββββββββββββββββββββββ ββββββββββββββββββββββββ
β PROPERTIES β β APPLICANTS β
ββββββββββββββββββββββββ€ ββββββββββββββββββββββββ€
β id (UUID, PK) β β id (UUID, PK) β
β valuation_id (FK) β β valuation_id (FK) β
β address β β applicant_name β
β state_id (FK) β β co_applicant_name β
β district_id (FK) β β owner_name β
β mandal_id (FK) β β contact_mobile β
β village_id (FK) β β contact_email β
β pincode β β representative_name β
β latitude β β ... β
β longitude β ββββββββββββββββββββββββ
β survey_number β
β plot_number β
β house_number β
β ... (location data) β
ββββββββββββββββββββββββ
β
ββββ 1:1 ββββ
β β
βΌ βΌ
ββββββββββββββββββββββββ ββββββββββββββββββββββββ
β PROPERTY_DETAILS β β BOUNDARIES β
ββββββββββββββββββββββββ€ ββββββββββββββββββββββββ€
β id (UUID, PK) β β id (UUID, PK) β
β property_id (FK) β β property_id (FK) β
β shape_of_site β β boundary_polygon β
β level β β (PostGIS Geometry)β
β development_status β β boundary_geojson β
β infrastructure β β (JSON) β
β locality_class β β north_as_per_doc β
β locality_type β β south_as_per_doc β
β ... β β east_as_per_doc β
β (site characteristics) β west_as_per_doc β
ββββββββββββββββββββββββ β north_actual β
β south_actual β
β east_actual β
β west_actual β
β ... β
ββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β VALUATION_DATA β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β id (UUID, PK) β
β valuation_id (FK β valuations) β
β valuation_method (Enum: land_and_building/composite) β
β land_unit (Enum: acres_guntas/acres_cents/sqmtrs/sqyds/sqft) β
β land_area_document (Decimal) β
β land_area_plan (Decimal) β
β land_area_actual (Decimal) β
β land_area_adopted (Decimal) β
β road_effected_area (Decimal) β
β nala_effected_area (Decimal) β
β splay_area (Decimal) β
β buffer_area (Decimal) β
β net_land_area (Decimal) β
β land_rate_type (Enum: guideline/market) β
β land_rate (Decimal) β
β land_value (Decimal) -- calculated β
β building_area_plan (Decimal) β
β building_area_actual (Decimal) β
β building_area_adopted (Decimal) β
β building_rate (Decimal) β
β building_age (Integer) β
β depreciation_percentage (Decimal) β
β building_value (Decimal) -- calculated β
β total_property_value (Decimal) -- calculated β
β distress_sale_value (Decimal) -- calculated β
β forced_sale_value (Decimal) -- calculated β
β realizable_value (Decimal) -- calculated β
β created_at (Timestamp) β
β updated_at (Timestamp) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
### Supporting Tables
```
ββββββββββββββββββββββββ ββββββββββββββββββββββββ
β DOCUMENTS β β PHOTOS β
ββββββββββββββββββββββββ€ ββββββββββββββββββββββββ€
β id (UUID, PK) β β id (UUID, PK) β
β valuation_id (FK) β β valuation_id (FK) β
β document_type_id(FK)β β category β
β document_name β β caption β
β file_name β β file_name β
β file_path (S3 URL) β β file_path (S3 URL) β
β file_size β β thumbnail_path β
β version_number β β latitude β
β parent_document_id β β longitude β
β uploaded_by (FK) β β gps_accuracy β
β uploaded_at β β exif_data (JSON) β
β status β β annotations (JSON) β
β ... β β uploaded_by (FK) β
ββββββββββββββββββββββββ β uploaded_at β
ββββββββββββββββββββββββ
ββββββββββββββββββββββββ ββββββββββββββββββββββββ
β COMMENTS β β ACTIVITY_LOGS β
ββββββββββββββββββββββββ€ ββββββββββββββββββββββββ€
β id (UUID, PK) β β id (UUID, PK) β
β valuation_id (FK) β β valuation_id (FK) β
β parent_comment_id β β user_id (FK) β
β comment_text β β action_type β
β comment_type β β action_description β
β created_by (FK) β β entity_type β
β created_at β β entity_id β
β ... β β old_value (JSON) β
ββββββββββββββββββββββββ β new_value (JSON) β
β ip_address β
β user_agent β
β created_at β
ββββββββββββββββββββββββ
```
### Reference Tables
```
ββββββββββββββββββββββββ ββββββββββββββββββββββββ
β BANKS β β USERS β
ββββββββββββββββββββββββ€ ββββββββββββββββββββββββ€
β id (UUID, PK) β β id (UUID, PK) β
β bank_name β β employee_id (Unique)β
β bank_code (Unique) β β email (Unique) β
β logo_url β β password_hash β
β sla_days β β first_name β
β multi_level_approvalβ β last_name β
β contact_person β β mobile β
β email β β primary_role_id(FK) β
β status β β team_id (FK) β
β ... β β status β
ββββββββββββββββββββββββ β last_login_at β
β ... β
ββββββββββββββββββββββββ ββββββββββββββββββββββββ
β BANK_CONFIGS β β
ββββββββββββββββββββββββ€ β M:M
β id (UUID, PK) β βΌ
β bank_id (FK) β ββββββββββββββββββββββββ
β config_type β β USER_ROLES β
β config_data (JSON) β ββββββββββββββββββββββββ€
β ... β β user_id (FK) β
ββββββββββββββββββββββββ β role_id (FK) β
ββββββββββββββββββββββββ
ββββββββββββββββββββββββ β
β LOCATIONS β βΌ
ββββββββββββββββββββββββ€ ββββββββββββββββββββββββ
β id (UUID, PK) β β ROLES β
β location_type β ββββββββββββββββββββββββ€
β parent_id (FK) β β id (UUID, PK) β
β location_name β β role_name β
β location_code β β role_description β
β status β β permissions (JSON) β
β ... β β ... β
ββββββββββββββββββββββββ ββββββββββββββββββββββββ
ββββββββββββββββββββββββ ββββββββββββββββββββββββ
β RATES β β LOOKUP_VALUES β
ββββββββββββββββββββββββ€ ββββββββββββββββββββββββ€
β id (UUID, PK) β β id (UUID, PK) β
β location_id (FK) β β category β
β rate_type β β value β
β rate_per_unit β β display_order β
β unit β β parent_id (FK) β
β effective_from β β status β
β effective_to β β ... β
β ... β ββββββββββββββββββββββββ
ββββββββββββββββββββββββ
```
---
## API Endpoints Overview
### Authentication
```
POST /api/v1/auth/login # User login
POST /api/v1/auth/logout # User logout
POST /api/v1/auth/refresh # Refresh JWT token
POST /api/v1/auth/forgot-password # Forgot password
POST /api/v1/auth/reset-password # Reset password
GET /api/v1/auth/me # Get current user info
```
### Valuations
```
GET /api/v1/valuations # List valuations (filtered)
POST /api/v1/valuations # Create new valuation
GET /api/v1/valuations/:id # Get valuation details
PUT /api/v1/valuations/:id # Update valuation
DELETE /api/v1/valuations/:id # Delete valuation (soft)
POST /api/v1/valuations/:id/submit # Submit for next stage
POST /api/v1/valuations/:id/clone # Clone valuation
GET /api/v1/valuations/:id/history # Get change history
GET /api/v1/valuations/my-queue # Get user's work queue
```
### Property Details
```
GET /api/v1/valuations/:id/property # Get property details
PUT /api/v1/valuations/:id/property # Update property details
GET /api/v1/valuations/:id/boundaries # Get boundary data
PUT /api/v1/valuations/:id/boundaries # Update boundary data
POST /api/v1/valuations/:id/calculate # Calculate valuation
```
### Documents
```
GET /api/v1/valuations/:id/documents # List documents
POST /api/v1/valuations/:id/documents # Upload document
GET /api/v1/documents/:docId # Get document details
GET /api/v1/documents/:docId/download # Download document
PUT /api/v1/documents/:docId # Update document metadata
DELETE /api/v1/documents/:docId # Delete document
GET /api/v1/documents/:docId/versions # Get version history
```
### Photos
```
GET /api/v1/valuations/:id/photos # List photos
POST /api/v1/valuations/:id/photos # Upload photo
GET /api/v1/photos/:photoId # Get photo details
PUT /api/v1/photos/:photoId # Update photo metadata
DELETE /api/v1/photos/:photoId # Delete photo
PUT /api/v1/photos/:photoId/annotations # Save annotations
```
### Workflow
```
GET /api/v1/workflow/stages # Get workflow stages
POST /api/v1/valuations/:id/review # Submit review
POST /api/v1/valuations/:id/approve # Approve valuation
POST /api/v1/valuations/:id/reject # Reject valuation
POST /api/v1/valuations/:id/query # Raise query
POST /api/v1/valuations/:id/reassign # Reassign valuation
GET /api/v1/workflow/pending-reviews # Get pending reviews
GET /api/v1/workflow/pending-approvals # Get pending approvals
```
### Reports
```
GET /api/v1/reports/dashboard # Get dashboard data
POST /api/v1/reports/generate # Generate custom report
GET /api/v1/reports/templates # List report templates
GET /api/v1/reports/saved # List saved reports
POST /api/v1/reports/export # Export report (PDF/Excel)
```
### Users & Admin
```
GET /api/v1/users # List users
POST /api/v1/users # Create user
GET /api/v1/users/:id # Get user details
PUT /api/v1/users/:id # Update user
DELETE /api/v1/users/:id # Deactivate user
GET /api/v1/roles # List roles
GET /api/v1/roles/:id/permissions # Get role permissions
PUT /api/v1/roles/:id/permissions # Update permissions
```
### Reference Data
```
GET /api/v1/banks # List banks
GET /api/v1/locations # List locations (hierarchical)
GET /api/v1/rates # List rates
GET /api/v1/lookups/:category # Get lookup values
GET /api/v1/config/system # Get system config
PUT /api/v1/config/system # Update system config
```
---
## Security Architecture
### Authentication Flow
```
1. User Login
ββ POST /api/v1/auth/login {email, password}
ββ Backend validates credentials
ββ Generate JWT token (access + refresh)
ββ Return tokens + user info
2. Authenticated Request
ββ Client adds JWT token in Authorization header
ββ API Gateway validates token
ββ Decode token β Extract user ID + role
ββ RBAC middleware checks permissions
ββ Allow/Deny request
3. Token Refresh
ββ Access token expires (30 min)
ββ Client uses refresh token
ββ POST /api/v1/auth/refresh {refresh_token}
ββ Backend issues new access token
4. Two-Factor Authentication (Optional)
ββ After login, require 2FA code
ββ Send OTP via SMS/Email/Authenticator
ββ Validate OTP
ββ Issue final JWT tokens
```
### Role-Based Access Control (RBAC)
```
Permission Check:
ββ Extract user role from JWT token
ββ Check route permissions from roles table
ββ Check resource ownership (if applicable)
β Example: Can user edit this valuation?
β ββ Is user Creator AND status = Draft? β Allow
β ββ Is user Surveyor AND status = Survey? β Allow
β ββ Otherwise? β Deny
ββ Return 403 Forbidden if unauthorized
```
---
## Deployment Architecture
### Production Deployment
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLOUDFLARE / DNS β
β - Domain: valuations.jr-solutions.com β
β - SSL/TLS Certificate β
β - CDN for static assets β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββ΄βββββββββ
β β
βΌ βΌ
ββββββββββββββββββββ ββββββββββββββββββββ
β Frontend Server β β API Server β
β (Cloudflare β β (Cloud VM/ β
β Pages) β β Container) β
β β β β
β - React SPA β β - Fastify β
β - Static Assets β β - Node.js 20+ β
β - Service Workerβ β - PM2 Process β
β β β Manager β
ββββββββββββββββββββ ββββββββββ¬ββββββββββ
β
ββββββββββββ΄βββββββββββ
β β
βΌ βΌ
βββββββββββββββββββ βββββββββββββββββββ
β PostgreSQL DB β β Object Storage β
β + PostGIS β β (S3/R2) β
β β β β
β - Primary DB β β - Documents β
β - Replica (RO) β β - Photos β
βββββββββββββββββββ βββββββββββββββββββ
```
### Development Environment
```
Local Machine:
ββ Frontend: npm run dev (Vite dev server on :5173)
ββ Backend: npm run dev (Fastify on :3000)
ββ Database: PostgreSQL Docker container on :5432
ββ Storage: MinIO Docker container on :9000 (S3-compatible)
```
---
## Performance Optimization Strategies
### Frontend
- **Code Splitting**: Lazy load routes and components
- **Tree Shaking**: Remove unused code
- **Image Optimization**: WebP format, lazy loading, responsive images
- **Caching**: Service Worker for offline support, Cache API
- **Bundle Size**: < 500 KB gzipped for initial load
- **Virtual Scrolling**: For large lists (1000+ items)
- **Debounced Search**: 300ms delay to reduce API calls
### Backend
- **Database Indexing**: Index frequently queried columns
- **Query Optimization**: Use EXPLAIN ANALYZE, avoid N+1 queries
- **Caching Layer**: Redis for session/lookup data (future)
- **Connection Pooling**: Reuse database connections
- **Pagination**: Limit query results to 25-100 items
- **Async Operations**: Background jobs for heavy tasks (report generation)
### Database
- **PostGIS Spatial Indexing**: GIST indexes on geometry columns
- **Partial Indexes**: Index only active records
- **Materialized Views**: For complex report queries
- **Table Partitioning**: Partition by date (if data grows large)
---
## Scalability Considerations
### Horizontal Scaling
- **API Servers**: Load balance across multiple instances
- **Database**: Read replicas for read-heavy operations
- **File Storage**: Object storage auto-scales
### Vertical Scaling
- **Database**: Increase CPU/RAM as data grows
- **API Server**: Increase resources per instance
### Caching Strategy (Future)
- **Redis**: Session storage, lookup data, frequently accessed data
- **CDN**: Static assets, photos, documents
---
**END OF ARCHITECTURE OVERVIEW**