[ 'required', 'file', 'mimes:xlsx,xls,csv', 'max:10240', // 10MB máximo ], ]; } /** * Get custom messages for validator errors. */ public function messages(): array { return [ 'file.required' => 'Debe seleccionar un archivo para importar.', 'file.file' => 'El archivo no es válido.', 'file.mimes' => 'El archivo debe ser de tipo Excel (.xlsx, .xls) o CSV (.csv).', 'file.max' => 'El archivo no debe superar los 10MB.', ]; } /** * Reglas de validación para cada fila del Excel */ public static function rowRules(): array { return [ 'nombre' => ['required', 'string', 'max:100'], 'sku' => ['nullable', 'string', 'max:50', 'unique:inventories,sku'], 'categoria' => ['nullable', 'string', 'max:100'], 'stock' => ['required', 'integer', 'min:0'], 'costo' => ['required', 'numeric', 'min:0'], 'precio_venta' => ['required', 'numeric', 'min:0'], 'impuesto' => ['nullable', 'numeric', 'min:0', 'max:100'], ]; } /** * Mensajes personalizados de validación para las filas del Excel */ public static function rowMessages(): array { return [ 'nombre.required' => 'El nombre del producto es requerido.', 'nombre.max' => 'El nombre no debe exceder los 100 caracteres.', 'sku.unique' => 'El SKU ya existe en el sistema.', 'sku.max' => 'El SKU no debe exceder los 50 caracteres.', 'stock.required' => 'El stock es requerido.', 'stock.integer' => 'El stock debe ser un número entero.', 'stock.min' => 'El stock no puede ser negativo.', 'costo.required' => 'El costo es requerido.', 'costo.numeric' => 'El costo debe ser un número.', 'costo.min' => 'El costo no puede ser negativo.', 'precio_venta.required' => 'El precio de venta es requerido.', 'precio_venta.numeric' => 'El precio de venta debe ser un número.', 'precio_venta.min' => 'El precio de venta no puede ser negativo.', 'precio_venta.gt' => 'El precio de venta debe ser mayor que el costo.', 'impuesto.numeric' => 'El impuesto debe ser un número.', 'impuesto.min' => 'El impuesto no puede ser negativo.', 'impuesto.max' => 'El impuesto no puede exceder el 100%.', ]; } }