[ 'required', 'exists:units_of_measurement,id', Rule::unique('unit_equivalences')->where(function ($query) { return $query->where('inventory_id', $this->route('inventory')->id); }), ], 'conversion_factor' => ['required', 'numeric', 'min:0.001'], 'retail_price' => ['nullable', 'numeric', 'min:0'], 'is_active' => ['boolean'], ]; } public function withValidator($validator): void { $validator->after(function ($validator) { $inventory = $this->route('inventory'); if ($inventory->track_serials) { $validator->errors()->add( 'unit_of_measure_id', 'No se pueden crear equivalencias para productos con rastreo de seriales.' ); } if ($this->unit_of_measure_id == $inventory->unit_of_measure_id) { $validator->errors()->add( 'unit_of_measure_id', 'No se puede crear una equivalencia con la unidad base del producto.' ); } }); } public function messages(): array { return [ 'unit_of_measure_id.required' => 'La unidad de medida es obligatoria.', 'unit_of_measure_id.exists' => 'La unidad de medida seleccionada no existe.', 'unit_of_measure_id.unique' => 'Ya existe una equivalencia para esta unidad en este producto.', 'conversion_factor.required' => 'El factor de conversión es obligatorio.', 'conversion_factor.numeric' => 'El factor de conversión debe ser un número.', 'conversion_factor.min' => 'El factor de conversión debe ser mayor a 0.', 'retail_price.numeric' => 'El precio de venta debe ser un número.', 'retail_price.min' => 'El precio de venta no puede ser negativo.', ]; } }