# Royal Enfield Workflow Management System - Configuration Guide ## 📋 Overview All system configurations are centralized in `src/config/system.config.ts` and can be customized via environment variables. ## ⚙️ Configuration Structure ### 1. **Working Hours** Controls when TAT tracking is active. ```env WORK_START_HOUR=9 # 9 AM (default) WORK_END_HOUR=18 # 6 PM (default) TZ=Asia/Kolkata # Timezone ``` **Working Days:** Monday - Friday (hardcoded) --- ### 2. **TAT (Turnaround Time) Settings** ```env TAT_TEST_MODE=false # Enable for testing (1 hour = 1 minute) DEFAULT_EXPRESS_TAT=24 # Express priority default TAT (hours) DEFAULT_STANDARD_TAT=72 # Standard priority default TAT (hours) ``` **TAT Thresholds** (hardcoded): - 50% - Warning notification - 75% - Critical notification - 100% - Breach notification --- ### 3. **File Upload Limits** ```env MAX_FILE_SIZE_MB=10 # Max file size per upload MAX_FILES_PER_REQUEST=10 # Max files per request ALLOWED_FILE_TYPES=pdf,doc,docx,xls,xlsx,ppt,pptx,jpg,jpeg,png,gif,txt ``` --- ### 4. **Workflow Limits** ```env MAX_APPROVAL_LEVELS=10 # Max approval stages MAX_PARTICIPANTS_PER_REQUEST=50 # Max total participants MAX_SPECTATORS=20 # Max spectators ``` --- ### 5. **Work Notes Configuration** ```env MAX_MESSAGE_LENGTH=2000 # Max characters per message MAX_ATTACHMENTS_PER_NOTE=5 # Max files per work note ENABLE_REACTIONS=true # Allow emoji reactions ENABLE_MENTIONS=true # Allow @mentions ``` --- ### 6. **Redis & Queue** ```env REDIS_URL=redis://localhost:6379 # Redis connection string QUEUE_CONCURRENCY=5 # Concurrent job processing RATE_LIMIT_MAX=10 # Max requests per duration RATE_LIMIT_DURATION=1000 # Rate limit window (ms) ``` --- ### 7. **Security & Session** ```env JWT_SECRET=your_secret_min_32_characters # JWT signing key JWT_EXPIRY=8h # Token expiration SESSION_TIMEOUT_MINUTES=480 # 8 hours ENABLE_2FA=false # Two-factor authentication ``` --- ### 8. **Notifications** ```env ENABLE_EMAIL_NOTIFICATIONS=true # Email alerts ENABLE_PUSH_NOTIFICATIONS=true # Browser push NOTIFICATION_BATCH_DELAY=5000 # Batch delay (ms) ``` **Email SMTP** (if email enabled): ```env SMTP_HOST=smtp.gmail.com SMTP_PORT=587 SMTP_USER=your_email@royalenfield.com SMTP_PASSWORD=your_password SMTP_FROM=noreply@royalenfield.com ``` --- ### 9. **Feature Flags** ```env ENABLE_AI_CONCLUSION=true # AI-generated conclusion remarks ENABLE_TEMPLATES=false # Template-based workflows (future) ENABLE_ANALYTICS=true # Dashboard analytics ENABLE_EXPORT=true # Export to CSV/PDF ``` --- ### 10. **Database** ```env DB_HOST=localhost DB_PORT=5432 DB_NAME=re_workflow DB_USER=postgres DB_PASSWORD=your_password DB_SSL=false ``` --- ### 11. **Storage** ```env STORAGE_TYPE=local # Options: local, s3, gcs STORAGE_PATH=./uploads # Local storage path ``` **For S3 (if using cloud storage):** ```env AWS_ACCESS_KEY_ID=your_access_key AWS_SECRET_ACCESS_KEY=your_secret AWS_REGION=ap-south-1 AWS_S3_BUCKET=re-workflow-documents ``` --- ## 🚀 Quick Setup ### Development Environment 1. Copy example configuration: ```bash cp .env.example .env ``` 2. Update critical values: ```env DB_PASSWORD=your_local_postgres_password JWT_SECRET=generate_random_32_char_string REDIS_URL=redis://localhost:6379 ``` 3. Enable test mode for faster TAT testing: ```env TAT_TEST_MODE=true # 1 hour = 1 minute ``` --- ### Production Environment 1. Set environment to production: ```env NODE_ENV=production ``` 2. Configure secure secrets: ```env JWT_SECRET=use_very_strong_secret_here DB_PASSWORD=strong_database_password ``` 3. Disable test mode: ```env TAT_TEST_MODE=false ``` 4. Enable SSL: ```env DB_SSL=true ``` 5. Configure email/push notifications with real credentials --- ## 📊 Configuration API ### GET `/api/v1/config` Returns public (non-sensitive) configuration for frontend. **Response:** ```json { "success": true, "data": { "appName": "Royal Enfield Workflow Management", "appVersion": "1.2.0", "workingHours": { "START_HOUR": 9, "END_HOUR": 18, "START_DAY": 1, "END_DAY": 5, "TIMEZONE": "Asia/Kolkata" }, "tat": { "thresholds": { "warning": 50, "critical": 75, "breach": 100 }, "testMode": false }, "upload": { "maxFileSizeMB": 10, "allowedFileTypes": ["pdf", "doc", "docx", ...], "maxFilesPerRequest": 10 }, "workflow": { "maxApprovalLevels": 10, "maxParticipants": 50, "maxSpectators": 20 }, "workNotes": { "maxMessageLength": 2000, "maxAttachmentsPerNote": 5, "enableReactions": true, "enableMentions": true }, "features": { "ENABLE_AI_CONCLUSION": true, "ENABLE_TEMPLATES": false, "ENABLE_ANALYTICS": true, "ENABLE_EXPORT": true }, "ui": { "DEFAULT_THEME": "light", "DEFAULT_LANGUAGE": "en", "DATE_FORMAT": "DD/MM/YYYY", "TIME_FORMAT": "12h", "CURRENCY": "INR", "CURRENCY_SYMBOL": "₹" } } } ``` --- ## 🎯 Usage in Code ### Backend ```typescript import { SYSTEM_CONFIG } from '@config/system.config'; // Access configuration const maxLevels = SYSTEM_CONFIG.WORKFLOW.MAX_APPROVAL_LEVELS; const workStart = SYSTEM_CONFIG.WORKING_HOURS.START_HOUR; ``` ### Frontend ```typescript import { configService } from '@/services/configService'; // Async usage const config = await configService.getConfig(); const maxFileSize = config.upload.maxFileSizeMB; // Helper functions import { getWorkingHours, getTATThresholds } from '@/services/configService'; const workingHours = await getWorkingHours(); ``` --- ## 🔐 Security Best Practices 1. **Never commit `.env`** with real credentials 2. **Use strong JWT secrets** (min 32 characters) 3. **Rotate secrets regularly** in production 4. **Use environment-specific configs** for dev/staging/prod 5. **Store secrets in secure vaults** (AWS Secrets Manager, Azure Key Vault) --- ## 📝 Configuration Checklist ### Before Deployment - [ ] Set `NODE_ENV=production` - [ ] Configure database with SSL - [ ] Set strong JWT secret - [ ] Disable TAT test mode - [ ] Configure email SMTP - [ ] Set up Redis connection - [ ] Configure file storage (local/S3/GCS) - [ ] Test working hours match business hours - [ ] Verify TAT thresholds are correct - [ ] Enable/disable feature flags as needed --- ## 🛠️ Adding New Configuration 1. Add to `system.config.ts`: ```typescript export const SYSTEM_CONFIG = { // ...existing config MY_NEW_SETTING: { VALUE: process.env.MY_VALUE || 'default', }, }; ``` 2. Add to `getPublicConfig()` if needed on frontend: ```typescript export function getPublicConfig() { return { // ...existing myNewSetting: SYSTEM_CONFIG.MY_NEW_SETTING, }; } ``` 3. Access in code: ```typescript const value = SYSTEM_CONFIG.MY_NEW_SETTING.VALUE; ``` --- ## 📚 Related Files - `src/config/system.config.ts` - Central configuration - `src/config/tat.config.ts` - TAT-specific (re-exports from system.config) - `src/config/constants.ts` - Legacy constants (being migrated) - `src/routes/config.routes.ts` - Configuration API endpoint - Frontend: `src/services/configService.ts` - Configuration fetching service --- ## ✅ Benefits of Centralized Configuration ✅ **Single Source of Truth** - All settings in one place ✅ **Environment-based** - Different configs for dev/staging/prod ✅ **Frontend Sync** - Frontend fetches config from backend ✅ **No Hardcoding** - All values configurable via .env ✅ **Type-Safe** - TypeScript interfaces ensure correctness ✅ **Easy Updates** - Change .env without code changes