import { z } from 'zod';
export const FinancialMetricsSchema = z.object({
monthly_cost_savings: z.number(),
monthly_time_savings_hours: z.number(),
quality_improvement_value: z.number(),
revenue_uplift: z.number(),
total_monthly_benefit: z.number()
});
export const ROICalculationsSchema = z.object({
total_investment: z.number(),
net_present_value: z.number(),
internal_rate_of_return: z.number(),
payback_period_months: z.number(),
five_year_roi: z.number(),
break_even_date: z.string().datetime()
});
export type FinancialMetrics = z.infer<typeof FinancialMetricsSchema>;
export type ROICalculations = z.infer<typeof ROICalculationsSchema>;
export const ProjectionSchema = z.object({
id: z.string().uuid().optional(),
project_id: z.string().uuid(),
scenario_name: z.string().default('Base Case'),
metadata: z.object({
confidence_level: z.number().min(0).max(1).default(0.95),
assumptions: z.array(z.object({
category: z.string(),
description: z.string(),
impact: z.enum(['low', 'medium', 'high'])
})).default([])
}),
implementation_costs: z.object({
software_licenses: z.number().min(0),
development_hours: z.number().min(0),
training_costs: z.number().min(0),
infrastructure: z.number().min(0),
ongoing_monthly: z.number().min(0)
}),
timeline_months: z.number().min(1),
financial_metrics: z.object({
conservative: FinancialMetricsSchema,
expected: FinancialMetricsSchema,
optimistic: FinancialMetricsSchema
}),
calculations: ROICalculationsSchema,
created_at: z.string().datetime().optional(),
updated_at: z.string().datetime().optional()
});
export type Projection = z.infer<typeof ProjectionSchema>;
export const ProjectionCreateSchema = ProjectionSchema.omit({
id: true,
created_at: true,
updated_at: true
});
export type ProjectionCreate = z.infer<typeof ProjectionCreateSchema>;
// Monte Carlo simulation results
export const MonteCarloResultsSchema = z.object({
projection_id: z.string().uuid(),
simulation_count: z.number(),
run_date: z.string().datetime(),
roi_distribution: z.object({
percentiles: z.object({
p5: z.number(),
p25: z.number(),
p50: z.number(),
p75: z.number(),
p95: z.number()
}),
mean: z.number(),
std_dev: z.number(),
confidence_interval_95: z.tuple([z.number(), z.number()])
}),
payback_distribution: z.object({
percentiles: z.record(z.string(), z.number()),
probability_within_12_months: z.number(),
probability_within_24_months: z.number()
}),
risk_analysis: z.object({
probability_of_loss: z.number(),
value_at_risk_95: z.number(),
key_risk_drivers: z.array(z.object({
factor: z.string(),
impact_percentage: z.number(),
correlation: z.number()
}))
})
});
export type MonteCarloResults = z.infer<typeof MonteCarloResultsSchema>;