REFACTOR ALL APIs
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user