diff --git a/frontend/src/api/hooks/useData.ts b/frontend/src/api/hooks/useData.ts index 9a6a26d4..b5c93230 100644 --- a/frontend/src/api/hooks/useData.ts +++ b/frontend/src/api/hooks/useData.ts @@ -7,6 +7,7 @@ import { useState, useCallback } from 'react'; import { dataService } from '../services'; import type { SalesData, + SalesValidationResult, SalesDataQuery, SalesImportResult, DashboardStats, @@ -52,7 +53,7 @@ export const useData = () => { const validateSalesData = useCallback(async ( tenantId: string, file: File - ): Promise => { + ): Promise => { try { setIsLoading(true); setError(null); diff --git a/frontend/src/api/services/data.service.ts b/frontend/src/api/services/data.service.ts index f238f53c..c5b7eb11 100644 --- a/frontend/src/api/services/data.service.ts +++ b/frontend/src/api/services/data.service.ts @@ -8,6 +8,7 @@ import { apiClient } from '../client'; import { RequestTimeouts } from '../client/config'; import type { SalesData, + SalesValidationResult, SalesDataQuery, SalesDataImport, SalesImportResult, @@ -60,7 +61,7 @@ export class DataService { async validateSalesData( tenantId: string, file: File - ): Promise { + ): Promise { const fileName = file.name.toLowerCase(); let fileFormat: string; @@ -75,11 +76,12 @@ export class DataService { } return apiClient.upload( - `/tenants/${tenantId}/sales/validate`, + `/tenants/${tenantId}/sales/import/validate`, file, { file_format: fileFormat, validate_only: true, + source: 'onboarding_upload', }, { timeout: RequestTimeouts.MEDIUM, diff --git a/frontend/src/api/types/data.ts b/frontend/src/api/types/data.ts index e3583a63..cb16d3b9 100644 --- a/frontend/src/api/types/data.ts +++ b/frontend/src/api/types/data.ts @@ -18,6 +18,16 @@ export interface SalesData { external_factors?: ExternalFactors; } +export interface SalesValidationResult { + is_valid: boolean; + total_records: number; + valid_records: number; + invalid_records: number; + errors: ValidationError[]; + warnings: ValidationError[]; + summary: Record; +} + export interface ExternalFactors { weather_temperature?: number; weather_precipitation?: number; diff --git a/frontend/src/pages/onboarding/OnboardingPage.tsx b/frontend/src/pages/onboarding/OnboardingPage.tsx index fb97021a..6901bd30 100644 --- a/frontend/src/pages/onboarding/OnboardingPage.tsx +++ b/frontend/src/pages/onboarding/OnboardingPage.tsx @@ -125,15 +125,14 @@ const OnboardingPage: React.FC = ({ user, onComplete }) => try { // Step 2.1: First validate the CSV data toast.loading('Validando datos del archivo CSV...', { id: 'csv-validation' }); - - const validationResult = await validateSalesData(tenantId, bakeryData.csvFile); - - toast.dismiss('csv-validation'); - + // Check validation result - if (!validationResult.success) { + const validationResult = await validateSalesData(tenantId, bakeryData.csvFile); + + // Check validation result using the correct field names + if (!validationResult.is_valid) { // ← Changed from .success to .is_valid // Validation failed - show errors but let user decide - const errorMessages = validationResult.errors?.slice(0, 3).join(', ') || 'Errores de validación'; + const errorMessages = validationResult.errors?.slice(0, 3).map(e => e.message || 'Unknown error').join(', ') || 'Errores de validación'; const hasMoreErrors = validationResult.errors && validationResult.errors.length > 3; toast.error( @@ -145,13 +144,13 @@ const OnboardingPage: React.FC = ({ user, onComplete }) => // Don't proceed with upload if validation fails throw new Error('Validación del CSV falló'); } - + // Validation passed - show summary and proceed if (validationResult.warnings && validationResult.warnings.length > 0) { toast.warn(`CSV validado con ${validationResult.warnings.length} advertencias. Continuando con la subida...`); console.warn('CSV validation warnings:', validationResult.warnings); } else { - toast.success('CSV validado correctamente. Procediendo con la subida...'); + toast.success(`CSV validado correctamente. ${validationResult.valid_records} de ${validationResult.total_records} registros válidos.`); } // Step 2.2: Now upload the validated CSV