pdv.backend/app/Http/Requests/App/InventoryImportRequest.php
Juan Felipe Zapata Moreno 7f6db1b83c feat: separar stock de importación y validar series
- Elimina gestión de stock inicial en importación (solo catálogo).
- Unifica validación de números de serie en todos los movimientos.
- Restringe controlador de series a lectura y filtra rutas.
2026-02-08 20:24:25 -06:00

82 lines
2.7 KiB
PHP

<?php
namespace App\Http\Requests\App;
use Illuminate\Foundation\Http\FormRequest;
class InventoryImportRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*/
public function rules(): array
{
return [
'file' => [
'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
* Solo valida información del catálogo de productos.
* Para agregar stock, usar movimientos de entrada (POST /movimientos/entrada).
*/
public static function rowRules(): array
{
return [
'nombre' => ['required', 'string', 'max:100'],
'sku' => ['nullable', 'string', 'max:50'],
'codigo_barras' => ['nullable', 'string', 'max:100'],
'categoria' => ['nullable', 'string', 'max:100'],
'precio_venta' => ['required', 'numeric', 'min:0.01'],
'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.max' => 'El SKU no debe exceder los 50 caracteres.',
'codigo_barras.max' => 'El código de barras no debe exceder los 100 caracteres.',
'categoria.max' => 'El nombre de la categoría no debe exceder los 100 caracteres.',
'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 debe ser mayor a 0.',
'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%.',
];
}
}