['required', 'string', 'max:255'], 'sku' => ['required', 'string', 'max:50', 'unique:bundles,sku'], 'barcode' => ['nullable', 'string', 'unique:bundles,barcode'], // Componentes del kit (mínimo 2 productos) 'items' => ['required', 'array', 'min:2'], 'items.*.inventory_id' => ['required', 'exists:inventories,id'], 'items.*.quantity' => ['required', 'integer', 'min:1'], // Precio (opcional, se calcula automáticamente si no se provee) 'retail_price' => ['nullable', 'numeric', 'min:0'], 'tax' => ['nullable', 'numeric', 'min:0'], ]; } /** * Custom validation messages */ public function messages(): array { return [ 'name.required' => 'El nombre del bundle es obligatorio.', 'sku.required' => 'El SKU es obligatorio.', 'sku.unique' => 'Este SKU ya está en uso.', 'items.required' => 'Debes agregar productos al bundle.', 'items.min' => 'Un bundle debe tener al menos 2 productos.', 'items.*.inventory_id.required' => 'Cada producto debe tener un ID válido.', 'items.*.inventory_id.exists' => 'Uno de los productos no existe.', 'items.*.quantity.required' => 'La cantidad es obligatoria.', 'items.*.quantity.min' => 'La cantidad debe ser al menos 1.', ]; } /** * Validación adicional */ public function withValidator($validator) { $validator->after(function ($validator) { // Validar que no haya productos duplicados $inventoryIds = collect($this->items)->pluck('inventory_id')->toArray(); if (count($inventoryIds) !== count(array_unique($inventoryIds))) { $validator->errors()->add( 'items', 'No se pueden agregar productos duplicados al bundle.' ); } }); } }