From 9066229e3a31eb9c374f27df4686d2ea1e09c0d1 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 18 Jun 2026 12:56:20 -0500 Subject: [PATCH] up --- app/Http/Controllers/MenuController.php | 5 + app/Http/Livewire/ReversarCompra.php | 129 ++++++++++++++++++ resources/views/layouts/navigation.blade.php | 6 + .../views/livewire/reversar-compra.blade.php | 86 ++++++++++++ .../views/menu/reversar-compra.blade.php | 3 + routes/web.php | 1 + 6 files changed, 230 insertions(+) create mode 100644 app/Http/Livewire/ReversarCompra.php create mode 100644 resources/views/livewire/reversar-compra.blade.php create mode 100644 resources/views/menu/reversar-compra.blade.php diff --git a/app/Http/Controllers/MenuController.php b/app/Http/Controllers/MenuController.php index f3dd03a..f265c73 100755 --- a/app/Http/Controllers/MenuController.php +++ b/app/Http/Controllers/MenuController.php @@ -107,6 +107,11 @@ class MenuController extends Controller { return view('menu/log_general'); } + public function showReversarCompra() + { + return view('menu/reversar-compra'); + } + public function showLogHistorial() { return view('menu/log_historial'); diff --git a/app/Http/Livewire/ReversarCompra.php b/app/Http/Livewire/ReversarCompra.php new file mode 100644 index 0000000..f1a3e62 --- /dev/null +++ b/app/Http/Livewire/ReversarCompra.php @@ -0,0 +1,129 @@ +where('estado', 'activo') + ->orderBy('id', 'DESC') + ->when(!empty($this->buscar), function ($query) { + $query->where(function ($q) { + $q->where('id', 'ILIKE', '%' . $this->buscar . '%') + ->orWhere('nombre_cliente', 'ILIKE', '%' . $this->buscar . '%') + ->orWhereHas('vendedor', function ($sub) { + $sub->where('name', 'ILIKE', '%' . $this->buscar . '%') + ->orWhere('email', 'ILIKE', '%' . $this->buscar . '%'); + }) + ->orWhereHas('cliente', function ($sub) { + $sub->where('name', 'ILIKE', '%' . $this->buscar . '%') + ->orWhere('email', 'ILIKE', '%' . $this->buscar . '%'); + }) + ->orWhereHas('cuentas', function ($sub) { + $sub->where('correo', 'ILIKE', '%' . $this->buscar . '%'); + }); + }); + }) + ->take(200) + ->paginate(20); + + $consulta->setCollection($consulta->getCollection()->values()); + + return view('livewire.reversar-compra', ['historiales' => $consulta]); + } + + public function confirmar($id) + { + $this->confirmando_id = $id; + } + + public function cancelarConfirmacion() + { + $this->confirmando_id = null; + } + + public function reversar($id) + { + DB::beginTransaction(); + try { + $historial = Historiale::with('vendedor.saldo', 'tarifa', 'promocion')->findOrFail($id); + + if ($historial->estado !== 'activo') { + $this->alert('error', 'Solo se pueden reversar compras activas.'); + DB::rollBack(); + return; + } + + $vendedor = $historial->vendedor; + $total_valor = $historial->valor; + $utilidad_total = $historial->utilidad ?? 0; + + // 1. Restaurar saldo al vendedor + $nuevo_saldo = $vendedor->saldo->valor + $total_valor; + Saldo::where('usuario_id', $vendedor->id)->update(['valor' => $nuevo_saldo]); + + // 2. Si el vendedor tiene subvendedor padre, restar la utilidad que se le había dado + if ($vendedor->subvendedor_id && $utilidad_total > 0) { + $subvendedorPadre = User::with('saldo')->find($vendedor->subvendedor_id); + if ($subvendedorPadre && $subvendedorPadre->saldo) { + $saldoPadre = $subvendedorPadre->saldo->valor - $utilidad_total; + $subvendedorPadre->saldo->update(['valor' => max($saldoPadre, 0)]); + } + } + + // 3. Eliminar registros de cuentas asignadas (las libera) + Historial_cuenta::where('historial_id', $historial->id)->delete(); + + // 4. Eliminar datos de compatibilidad DGO si existen + if ($historial->compatibilidadDgo) { + $historial->compatibilidadDgo->delete(); + } + + // 5. Marcar historial como cancelado + $historial->estado = 'cancelado'; + $historial->save(); + + // 6. Actualizar logs + Log_general::where('historial_id', $historial->id) + ->where('tipo', 'compra') + ->update(['tipo' => 'revertida']); + + Log_general::create([ + 'user_id' => auth()->id(), + 'historial_id' => $historial->id, + 'tipo' => 'reversion', + 'detalle' => 'Reversión manual por ' . auth()->user()->name . ' - Historial #' . $historial->id . + ' - Valor: $' . $total_valor . ' - Vendedor: ' . $vendedor->name . + ' - Saldo restaurado: $' . $nuevo_saldo, + ]); + + DB::commit(); + + $this->confirmando_id = null; + + $this->alert('success', 'Compra #' . $historial->id . ' revertida correctamente. Saldo restaurado: $' . number_format($total_valor)); + + } catch (\Exception $e) { + DB::rollBack(); + $this->alert('error', 'Error al revertir: ' . $e->getMessage()); + } + } +} diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index c897823..2843a9c 100755 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -180,6 +180,12 @@ Log Cuentas + + + + + Reversar Compras + @if (auth()->user()->rol->nombre == 'super') diff --git a/resources/views/livewire/reversar-compra.blade.php b/resources/views/livewire/reversar-compra.blade.php new file mode 100644 index 0000000..b27c375 --- /dev/null +++ b/resources/views/livewire/reversar-compra.blade.php @@ -0,0 +1,86 @@ +
+
+

Reversar Compras

+ +
+ +
+ + + + + + + + + + + + + + + @forelse ($historiales as $item) + + + + + + + + + + + @empty + + + + @endforelse + +
IDFechaVendedorClienteServicioValorCuentas AsignadasAcción
#{{ $item->id }}{{ \Carbon\Carbon::parse($item->created_at)->format('d/m/Y h:i a') }}{{ $item->vendedor->name ?? 'N/A' }}
{{ $item->vendedor->email ?? '' }}
{{ $item->nombre_cliente ?? $item->cliente->name ?? 'N/A' }}
{{ $item->cliente->email ?? '' }}
+ @if ($item->promocion) + {{ $item->promocion->nombre ?? 'Promoción' }} + @elseif($item->tarifa && $item->tarifa->servicio) + {{ $item->tarifa->servicio->nombre }} + @if (!$item->tarifa->servicio->por_tiempo) + - {{ $item->tarifa->pantallas }}P + @endif + - {{ $item->tarifa->dias }}d + @else + N/A + @endif + ${{ number_format($item->valor) }} + @forelse ($item->cuentas->unique() as $cuenta) +
{{ $cuenta->correo }} - {{ $cuenta->password }}
+ @empty + Sin cuentas + @endforelse +
+ @if ($confirmando_id === $item->id) +
+

¿Revertir compra #{{ $item->id }}?

+

Se devolverá ${{ number_format($item->valor) }} al vendedor

+
+ + +
+
+ @else + + @endif +
No hay compras activas para mostrar
+
+ +
+ {{ $historiales->links() }} +
+
diff --git a/resources/views/menu/reversar-compra.blade.php b/resources/views/menu/reversar-compra.blade.php new file mode 100644 index 0000000..d2c6ea8 --- /dev/null +++ b/resources/views/menu/reversar-compra.blade.php @@ -0,0 +1,3 @@ + + + diff --git a/routes/web.php b/routes/web.php index 337784d..20ed613 100755 --- a/routes/web.php +++ b/routes/web.php @@ -80,6 +80,7 @@ Route::middleware(["auth", "solo_usuario_administrador"])->group(function () { Route::any('/log-general', [MenuController::class, 'showLogGeneral'])->name('logGeneral'); Route::any('/log-historial', [MenuController::class, 'showLogHistorial'])->name('logHistorial'); Route::get('/diagnostico', [MenuController::class, 'showDiagnostico'])->name('diagnostico'); Route::get('/utilidades', [MenuController::class, 'showutilidad'])->name('utilidades'); Route::get('/mantenimiento', [MenuController::class, 'mantenimiento'])->name('mantenimiento'); + Route::get('/reversar', [MenuController::class, 'showReversarCompra'])->name('reversar'); Route::get('/rank-management', [MenuController::class, 'showgestionrangos'])->name('gestion-rangos'); // Módulo WhatsApp