REFACTOR ALL APIs

This commit is contained in:
Urtzi Alfaro
2025-10-06 15:27:01 +02:00
parent dc8221bd2f
commit 38fb98bc27
166 changed files with 18454 additions and 13605 deletions

View File

@@ -1,12 +1,10 @@
import React, { useState, useRef } from 'react';
import { Button } from '../../../ui/Button';
import { Input } from '../../../ui/Input';
import { useValidateFileOnly } from '../../../../api/hooks/dataImport';
import { ImportValidationResponse } from '../../../../api/types/dataImport';
import { useCurrentTenant } from '../../../../stores/tenant.store';
import { useCreateIngredient } from '../../../../api/hooks/inventory';
import { useImportFileOnly } from '../../../../api/hooks/dataImport';
import { useClassifyProductsBatch } from '../../../../api/hooks/classification';
import { useCreateIngredient, useClassifyBatch } from '../../../../api/hooks/inventory';
import { useValidateImportFile, useImportSalesData } from '../../../../api/hooks/sales';
import type { ImportValidationResult } from '../../../../api/types/sales';
import { useAuth } from '../../../../contexts/AuthContext';
interface UploadSalesDataStepProps {
@@ -66,10 +64,10 @@ export const UploadSalesDataStep: React.FC<UploadSalesDataStepProps> = ({
const currentTenant = useCurrentTenant();
const { user } = useAuth();
const { validateFile } = useValidateFileOnly();
const validateFileMutation = useValidateImportFile();
const createIngredient = useCreateIngredient();
const { importFile } = useImportFileOnly();
const classifyProducts = useClassifyProductsBatch();
const importMutation = useImportSalesData();
const classifyBatchMutation = useClassifyBatch();
const handleFileSelect = async (event: React.ChangeEvent<HTMLInputElement>) => {
const file = event.target.files?.[0];
@@ -109,25 +107,20 @@ export const UploadSalesDataStep: React.FC<UploadSalesDataStepProps> = ({
try {
// Step 1: Validate the file
const result = await validateFile(
currentTenant.id,
file,
{
onProgress: (stage: string, progress: number, message: string) => {
// Map validation progress to 0-50%
setProgressState({ stage, progress: Math.min(progress * 0.5, 50), message });
}
}
);
const validationResult = await validateFileMutation.mutateAsync({
tenantId: currentTenant.id,
file
});
if (result.success && result.validationResult) {
setValidationResult(result.validationResult);
// The API returns the validation result directly (not wrapped)
if (validationResult && validationResult.is_valid !== undefined) {
setValidationResult(validationResult);
setProgressState({ stage: 'analyzing', progress: 60, message: 'Validación exitosa. Generando sugerencias automáticamente...' });
// Step 2: Automatically trigger classification
await generateInventorySuggestionsAuto(result.validationResult);
await generateInventorySuggestionsAuto(validationResult);
} else {
setError(result.error || 'Error al validar el archivo');
setError('Respuesta de validación inválida del servidor');
setProgressState(null);
setIsValidating(false);
}
@@ -139,7 +132,7 @@ export const UploadSalesDataStep: React.FC<UploadSalesDataStepProps> = ({
};
const generateInventorySuggestionsAuto = async (validationData: ImportValidationResponse) => {
const generateInventorySuggestionsAuto = async (validationData: ImportValidationResult) => {
if (!currentTenant?.id) {
setError('No hay datos de validación disponibles para generar sugerencias');
setIsValidating(false);
@@ -165,15 +158,15 @@ export const UploadSalesDataStep: React.FC<UploadSalesDataStepProps> = ({
setProgressState({ stage: 'classifying', progress: 75, message: 'Clasificando productos con IA...' });
// Call the classification API
const suggestions = await classifyProducts.mutateAsync({
const classificationResponse = await classifyBatchMutation.mutateAsync({
tenantId: currentTenant.id,
batchData: { products }
products
});
setProgressState({ stage: 'preparing', progress: 90, message: 'Preparando sugerencias de inventario...' });
// Convert API response to InventoryItem format - use exact backend structure plus UI fields
const items: InventoryItem[] = suggestions.map(suggestion => {
const items: InventoryItem[] = classificationResponse.suggestions.map(suggestion => {
// Calculate default stock quantity based on sales data
const defaultStock = Math.max(
Math.ceil((suggestion.sales_data?.average_daily_sales || 1) * 7), // 1 week supply
@@ -308,20 +301,10 @@ export const UploadSalesDataStep: React.FC<UploadSalesDataStepProps> = ({
let salesImportResult = null;
try {
if (selectedFile) {
const result = await importFile(
currentTenant.id,
selectedFile,
{
onProgress: (stage, progress, message) => {
console.log(`Import progress: ${stage} - ${progress}% - ${message}`);
setProgressState({
stage: 'importing',
progress,
message: `Importando datos de ventas: ${message}`
});
}
}
);
const result = await importMutation.mutateAsync({
tenantId: currentTenant.id,
file: selectedFile
});
salesImportResult = result;
if (result.success) {