// frontend/src/api/services/forecasting.service.ts /** * Forecasting Service * Handles forecast operations and predictions */ import { apiClient } from '../client'; import { RequestTimeouts } from '../client/config'; import type { SingleForecastRequest, BatchForecastRequest, ForecastResponse, BatchForecastResponse, ForecastAlert, QuickForecast, PaginatedResponse, BaseQueryParams, } from '../types'; export class ForecastingService { /** * Create Single Product Forecast */ async createSingleForecast( tenantId: string, request: SingleForecastRequest ): Promise { return apiClient.post( `/tenants/${tenantId}/forecasts/single`, request, { timeout: RequestTimeouts.MEDIUM, } ); } /** * Create Batch Forecast */ async createBatchForecast( tenantId: string, request: BatchForecastRequest ): Promise { return apiClient.post( `/tenants/${tenantId}/forecasts/batch`, request, { timeout: RequestTimeouts.LONG, } ); } /** * Get Forecast by ID */ async getForecast(tenantId: string, forecastId: string): Promise { return apiClient.get(`/tenants/${tenantId}/forecasts/${forecastId}`); } /** * Get Forecasts */ async getForecasts( tenantId: string, params?: BaseQueryParams & { product_name?: string; start_date?: string; end_date?: string; model_id?: string; } ): Promise> { return apiClient.get(`/tenants/${tenantId}/forecasts`, { params }); } /** * Get Batch Forecast Status */ async getBatchForecastStatus( tenantId: string, batchId: string ): Promise { return apiClient.get(`/tenants/${tenantId}/forecasts/batch/${batchId}/status`); } /** * Get Batch Forecasts */ async getBatchForecasts( tenantId: string, params?: BaseQueryParams & { status?: string; start_date?: string; end_date?: string; } ): Promise> { return apiClient.get(`/tenants/${tenantId}/forecasts/batch`, { params }); } /** * Cancel Batch Forecast */ async cancelBatchForecast(tenantId: string, batchId: string): Promise<{ message: string }> { return apiClient.post(`/tenants/${tenantId}/forecasts/batch/${batchId}/cancel`); } /** * Get Quick Forecasts for Dashboard */ async getQuickForecasts(tenantId: string, limit?: number): Promise { return apiClient.get(`/tenants/${tenantId}/forecasts/quick`, { params: { limit }, }); } /** * Get Forecast Alerts */ async getForecastAlerts( tenantId: string, params?: BaseQueryParams & { is_active?: boolean; severity?: string; alert_type?: string; } ): Promise> { return apiClient.get(`/tenants/${tenantId}/forecasts/alerts`, { params }); } /** * Acknowledge Forecast Alert */ async acknowledgeForecastAlert( tenantId: string, alertId: string ): Promise { return apiClient.post(`/tenants/${tenantId}/forecasts/alerts/${alertId}/acknowledge`); } /** * Delete Forecast */ async deleteForecast(tenantId: string, forecastId: string): Promise<{ message: string }> { return apiClient.delete(`/tenants/${tenantId}/forecasts/${forecastId}`); } /** * Export Forecasts */ async exportForecasts( tenantId: string, format: 'csv' | 'excel' | 'json', params?: { product_name?: string; start_date?: string; end_date?: string; } ): Promise { const response = await apiClient.request(`/tenants/${tenantId}/forecasts/export`, { method: 'GET', params: { ...params, format }, headers: { 'Accept': format === 'csv' ? 'text/csv' : format === 'excel' ? 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' : 'application/json', }, }); return new Blob([response], { type: format === 'csv' ? 'text/csv' : format === 'excel' ? 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' : 'application/json', }); } /** * Get Forecast Accuracy Metrics */ async getForecastAccuracy( tenantId: string, params?: { product_name?: string; model_id?: string; start_date?: string; end_date?: string; } ): Promise<{ overall_accuracy: number; product_accuracy: Array<{ product_name: string; accuracy: number; sample_size: number; }>; }> { return apiClient.get(`/tenants/${tenantId}/forecasts/accuracy`, { params }); } } export const forecastingService = new ForecastingService();