import { z } from 'zod';
export const MetricDataPointSchema = z.object({
timestamp: z.string().datetime(),
value: z.number(),
confidence: z.number().min(0).max(1).default(1),
source: z.string().optional()
});
export const ActualMetricsSchema = z.object({
id: z.string().uuid().optional(),
projection_id: z.string().uuid(),
period: z.string(), // e.g., "2024-01", "2024-Q1"
metrics: z.object({
cost_savings: z.number(),
time_savings_hours: z.number(),
revenue_increase: z.number(),
quality_improvements: z.object({
error_rate_reduction: z.number(),
customer_satisfaction_increase: z.number().optional(),
process_efficiency_gain: z.number().optional()
}),
user_adoption: z.number().min(0).max(1)
}),
evidence: z.array(z.object({
source: z.string(),
metric: z.string(),
value: z.number(),
confidence: z.number().min(0).max(1),
notes: z.string().optional()
})).default([]),
tracked_at: z.string().datetime().optional()
});
export type ActualMetrics = z.infer<typeof ActualMetricsSchema>;
export const TrackingUpdateSchema = z.object({
projection_id: z.string().uuid(),
period: z.string(),
actual_metrics: ActualMetricsSchema.shape.metrics,
evidence: ActualMetricsSchema.shape.evidence.optional()
});
export type TrackingUpdate = z.infer<typeof TrackingUpdateSchema>;
// Variance analysis
export const VarianceAnalysisSchema = z.object({
overall_variance_percentage: z.number(),
metric_variances: z.object({
cost_savings: z.object({
expected: z.number(),
actual: z.number(),
variance_percentage: z.number(),
variance_reason: z.string().optional()
}),
time_savings: z.object({
expected: z.number(),
actual: z.number(),
variance_percentage: z.number(),
variance_reason: z.string().optional()
}),
roi: z.object({
expected: z.number(),
actual: z.number(),
variance_percentage: z.number(),
variance_reason: z.string().optional()
})
}),
insights: z.array(z.string()),
recommended_actions: z.array(z.string())
});
export type VarianceAnalysis = z.infer<typeof VarianceAnalysisSchema>;