Robust financial data handling with automatic fallback to realistic simulated data
The FinGuard API now includes a sophisticated fallback mechanism that automatically switches to simulated financial data when the backend API is unavailable. This ensures:
- ✅ Continuous Operation - App never shows broken UI or blank states
- ✅ Realistic Data - Generated data follows actual financial patterns
- ✅ Seamless Experience - Users are notified of fallback mode with clear warning
- ✅ Development Ready - Perfect for demos, testing, and development environments
User Request
↓
API Call (lib/api.ts)
↓
[Try Real API]
├─ Success? → Return Real Data + Clear Fallback Flag
└─ Failure? → Log Error + Switch to Fallback
↓
Import Mock Data Generator (lib/mockData.ts)
↓
Generate Realistic Simulated Data
↓
Return Data + Set Fallback Flag (isApiInFallback() = true)
↓
FallbackBanner Component Displays Warning
Generates realistic financial data across all domains:
// Financial State
generateMockFinancialState(): FinancialState
- Returns current cash balance, runway, burn rate, etc.
- Randomized within business parameters
// 30-Day Forecast
generateMockForecast(): Forecast
- Monte Carlo-style cash flow simulation
- Confidence intervals (P10, P50, P90)
- Daily balance projections
// Transactions
generateMockTransactions(count): Transaction[]
- 50 simulated transactions (default)
- Multiple vendors, sources, dates
- Realistic amounts and confidence scores
// Invoices
generateMockInvoices(count): Invoice[]
- 20 simulated invoices (default)
- Mix of paid/pending statuses
- Match confidence scoring
// Payment Decisions
generateMockDecisions(count): Decision[]
- 10 obligation rankings (default)
- TOPSIS scores, delay probabilities
- Model contribution explanations
// AI Action Drafts
generateMockActionDraft(vendor, amount, tone): ActionDraft
- Formal/friendly/strict tone options
- Vendor-specific communication
- Ready-to-send templatesNew fallback-aware API wrapper:
// Check current state
isApiInFallback(): boolean // Is API unavailable?
getLastApiError(): string | null // What was the error?
// New fallback-enabled fetch
fetchJsonWithFallback<T>(
path: string,
fallbackFn: () => T,
init?: RequestInit
): Promise<T>
// Updated endpoints (all now with fallback):
- getHealth()
- getFinancialState()
- getForecast()
- getTransactions()
- getReconcileSummary()
- getInvoices()
- getInvoiceSummary()
- getDecisionRanking()
- getScenarios()
- generateActionDraft()
- getLLMStatus()User-facing warning component:
- Displays prominent yellow warning when API unavailable
- Shows error details in collapsible section
- Auto-hides when API recovers
- Non-intrusive but informative
- Includes recovery instructions
Python-level mock data generation:
generate_mock_financial_state() # Financial metrics
generate_mock_forecast_data() # 30-day forecast
generate_mock_transactions(count) # Transaction history
generate_mock_invoices(count) # Invoice data
generate_mock_decisions(count) # Payment rankings
generate_mock_action_draft() # AI communication draftsNo action required! The fallback system is automatic:
-
Normal Operation:
- Backend running → Real data displayed
- No warning shown
-
Backend Down:
- API request fails
- Automatically switches to simulated data
- Yellow banner appears with warning
- App continues functioning normally
-
Recovery:
- Backend comes back online
- Next API request succeeds
- Banner disappears automatically
- Real data resumes
// Manually trigger fallback for specific endpoint
const data = await fetchJsonWithFallback(
'/api/forecast/',
() => generateMockForecastResponse(),
// optional: init parameters
);import { isApiInFallback, getLastApiError } from './lib/api';
if (isApiInFallback()) {
console.log('Using fallback data');
console.log('Error was:', getLastApiError());
}from mock_data import generate_mock_financial_state, generate_mock_forecast_data
# In development or tests
state = generate_mock_financial_state()
forecast = generate_mock_forecast_data()All generated data respects realistic business constraints:
Financial State:
- Cash balance: $2.5M ± $500K
- Monthly burn: $250K ± $100K
- Working capital: balance - payables
- Days to zero: 45-75 days
Forecast:
- Based on daily random inflows/outflows
- P10/P50/P90 bands represent confidence
- Volatility: 2-7% daily
- Realistic balance trajectory
Transactions:
- Vendors: 8 realistic company names
- Amounts: $10K - $510K per transaction
- Sources: UPI, Bank Transfer, Card, Cheque, Cash
- Confidence: 60-95% accuracy simulation
- Dates: Spread across 90-day history
Invoices:
- 20 invoices (50% paid, 50% pending)
- Issue-to-due: 30 days standard
- Match confidence: 65-95%
- Mix of vendors and amounts
Decisions:
- 10 obligations ranked by TOPSIS score
- Delay probability: 0-40% per vendor
- Relationship damage scoring
- Feature contributions with SHAP-like explanations
Action Drafts:
- Three tone options (formal/friendly/strict)
- Vendor and amount-specific messaging
- Professional communication templates
No additional configuration needed! The fallback system works out of the box.
Optional: Control fallback behavior via environment variable
# Force using fallback data (useful for demos/training)
FORCE_MOCK_DATA=false # Default: false (use real API)
# API timeout before switching to fallback
API_TIMEOUT_MS=5000 # Default: 5000msThe mock data generation has minimal dependencies:
- Built-in Python libraries only (datetime, random, typing)
- Zero external packages required
- ~200 lines of pure Python
When fallback activates, detailed logs appear:
⚠️ API Request Failed [/api/forecast/]: API 503: Service Unavailable
📊 Using simulated data for: /api/forecast/
FallbackBanner shows:
- Clear warning about API connection issue
- Current error message (expandable)
- Recovery instructions
- Dismissable (but re-appears if error persists)
- Simulated at request time (not persistent)
- Does not reflect actual financial state
- Should not be used for real decision-making
- Regenerated on each request (new values each time)
✅ Good for:
- Development and testing
- Demos and presentations
- Learning the interface
- Testing UI with various data ranges
- Ensuring app never shows broken state
❌ Not for:
- Production financial decisions
- Reporting actual business metrics
- Auditing or compliance
- Historical data analysis
- Persistent data storage
A: Only if the backend genuinely goes down. In normal operation with backend running, zero UI changes.
A: No. Each request generates fresh random data. This is intentional—prevents stale data assumptions.
A: Yes! Edit lib/mockData.ts (frontend) or mock_data.py (backend) to adjust ranges, vendors, and parameters.
A: No. It's faster than waiting for API timeout. Data generation is instant (<10ms).
A: Yes, set FORCE_MOCK_DATA=true environment variable, or manually call fetchJsonWithFallback().
- Persistent fallback cache (localStorage)
- Configurable mock data scenarios
- Historical fallback data replay
- A/B testing with fallback vs. real data
- Fallback data export for offline use
Documentation Version: 2.4.0
Last Updated: 2026-03-26
Maintainer: FinGuard Development Team