'required|string|max:100', 'cashback' => 'required|numeric|min:0', 'bono_equipo' => 'required|numeric|min:0', 'tope_bono_equipo' => 'required|numeric|min:0', 'compra_personal_min' => 'required|numeric|min:0', 'directos_activos_min' => 'required|integer|min:0', 'niveles_min' => 'required|integer|min:0', 'volumen_equipo_min' => 'required|numeric|min:0', 'volumen_por_nivel_min' => 'required|numeric|min:0', 'logo' => 'nullable|image|max:2048', ]; protected $messages = [ 'nombre.required' => 'El nombre del rango es obligatorio.', 'nombre.string' => 'El nombre debe ser una cadena de texto válida.', 'nombre.max' => 'El nombre no puede tener más de 100 caracteres.', 'cashback.required' => 'El porcentaje de cashback es obligatorio.', 'cashback.numeric' => 'El cashback debe ser un valor numérico.', 'cashback.min' => 'El cashback no puede ser menor a 0.', 'bono_equipo.required' => 'El porcentaje de bono de equipo es obligatorio.', 'bono_equipo.numeric' => 'El bono de equipo debe ser un valor numérico.', 'bono_equipo.min' => 'El bono de equipo no puede ser menor a 0.', 'tope_bono_equipo.required' => 'El tope del bono de equipo es obligatorio.', 'tope_bono_equipo.numeric' => 'El tope del bono de equipo debe ser un valor numérico.', 'tope_bono_equipo.min' => 'El tope del bono de equipo no puede ser menor a 0.', 'compra_personal_min.required' => 'La compra personal mínima es obligatoria.', 'compra_personal_min.numeric' => 'La compra personal mínima debe ser un número.', 'compra_personal_min.min' => 'La compra personal mínima no puede ser menor a 0.', 'directos_activos_min.required' => 'El número de directos activos mínimos es obligatorio.', 'directos_activos_min.integer' => 'Los directos activos deben ser un número entero.', 'directos_activos_min.min' => 'Los directos activos no pueden ser menores a 0.', 'niveles_min.required' => 'El número de niveles mínimos es obligatorio.', 'niveles_min.integer' => 'Los niveles mínimos deben ser un número entero.', 'niveles_min.min' => 'Los niveles mínimos no pueden ser menores a 0.', 'volumen_equipo_min.required' => 'El volumen mínimo de equipo es obligatorio.', 'volumen_equipo_min.numeric' => 'El volumen mínimo de equipo debe ser un número.', 'volumen_equipo_min.min' => 'El volumen mínimo de equipo no puede ser menor a 0.', 'volumen_por_nivel_min.required' => 'El volumen por nivel mínimo es obligatorio.', 'volumen_por_nivel_min.numeric' => 'El volumen por nivel mínimo debe ser un número.', 'volumen_por_nivel_min.min' => 'El volumen por nivel mínimo no puede ser menor a 0.', 'logo.image' => 'El archivo del logo debe ser una imagen válida (JPG, PNG, etc.).', 'logo.max' => 'El logo no puede superar los 2 MB.', ]; public function render() { $this->ranks = Rank::orderBy('volumen_equipo_min')->get(); return view('livewire.show-gestion-rangos'); } public function crear() { $this->resetExcept('ranks'); $this->modal = true; } public function editar($id) { $rank = Rank::findOrFail($id); $this->fill($rank->toArray()); $this->rank_id = $rank->id; $this->modal = true; } public function guardar() { $this->validate(); $rutaLogo = null; if ($this->logo) { $rutaLogo = $this->logo->store('photos'); } Rank::updateOrCreate( ['id' => $this->rank_id], [ 'nombre' => $this->nombre, 'cashback' => $this->cashback, 'bono_equipo' => $this->bono_equipo, 'tope_bono_equipo' => $this->tope_bono_equipo, 'compra_personal_min' => $this->compra_personal_min, 'directos_activos_min' => $this->directos_activos_min, 'niveles_min' => $this->niveles_min, 'volumen_equipo_min' => $this->volumen_equipo_min, 'volumen_por_nivel_min' => $this->volumen_por_nivel_min, 'logo' => $rutaLogo ?? $this->logo_url, ] ); $this->modal = false; $this->resetExcept('ranks'); } public function eliminar($id) { Rank::findOrFail($id)->delete(); } }