Update ShowPromociones.php

This commit is contained in:
lizandrogd
2025-09-02 22:48:43 -05:00
parent 674c03c982
commit 9971109968
+85 -90
View File
@@ -27,6 +27,7 @@ use Jantinnerezo\LivewireAlert\LivewireAlert;
use Intervention\Image\ImageManagerStatic as Img; use Intervention\Image\ImageManagerStatic as Img;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\DB;
use Exception; use Exception;
use Twilio\Rest\Client; use Twilio\Rest\Client;
@@ -217,32 +218,39 @@ class ShowPromociones extends Component
public $n = []; public $n = [];
public $f = []; public $f = [];
public $r = 0; public $r = 0;
public function pagar() public function pagar()
{ {
$maxIntentos = 3; // cantidad de veces que se intentará
$intento = 0;
while ($intento < $maxIntentos) {
DB::beginTransaction();
try {
$intento++;
$this->validate(); $this->validate();
if ($this->cantidad_comprarPromo == 0) { if ($this->cantidad_comprarPromo == 0) {
$this->alert('error', 'La cantidad debe ser mayor a 0', [ $this->alert('error', 'La cantidad debe ser mayor a 0', ['position' => 'top']);
'position' => 'top' DB::rollBack();
]);
return; return;
} }
if (auth()->user()->saldo->valor < $this->precioAhora * $this->cantidad_comprarPromo) { if (auth()->user()->saldo->valor < $this->precioAhora * $this->cantidad_comprarPromo) {
$this->alert('error', 'Saldo insuficiente', [ $this->alert('error', 'Saldo insuficiente', ['position' => 'top']);
'position' => 'top' DB::rollBack();
]);
return; return;
} }
// === Crear o buscar usuario ===
$usuario_existe = User::firstWhere('email', $this->email_comprarPromo)->id ?? null; $usuario_existe = User::firstWhere('email', $this->email_comprarPromo)->id ?? null;
if (is_null($usuario_existe)) { if (is_null($usuario_existe)) {
$usuario = new User; $usuario = new User;
$usuario->name = $this->nombre_comprarPromo; $usuario->name = $this->nombre_comprarPromo;
$usuario->email = $this->email_comprarPromo; $usuario->email = $this->email_comprarPromo;
$usuario->password = '123'; $usuario->password = bcrypt('123'); // ✅ importante: encriptar
$usuario->celular = $this->celular_comprarPromo; $usuario->celular = $this->celular_comprarPromo;
$usuario->save(); $usuario->save();
@@ -251,6 +259,7 @@ class ShowPromociones extends Component
$usuario_id = $usuario_existe; $usuario_id = $usuario_existe;
} }
// === Historial ===
$historial = new Historiale(); $historial = new Historiale();
$historial->fecha_inicio = $this->fechaHoy; $historial->fecha_inicio = $this->fechaHoy;
$historial->fecha_final = $this->fechaFinal; $historial->fecha_final = $this->fechaFinal;
@@ -266,85 +275,71 @@ class ShowPromociones extends Component
$historial->save(); $historial->save();
$utilidad_total = (int) $this->utilidad * (int) $this->cantidad_comprarPromo; $utilidad_total = (int) $this->utilidad * (int) $this->cantidad_comprarPromo;
$this->historial = $historial; $this->historial = $historial;
for ($p = 0; $p < (int) $this->cantidad_comprarPromo; $p++) { // === Asignar cuentas ===
//dd($this->cantidad_comprarPromo);
$this->n = []; $this->n = [];
$this->f = []; $this->f = [];
$this->r = 0;
for ($p = 0; $p < (int) $this->cantidad_comprarPromo; $p++) {
foreach ($this->consulta->tarifas as $tarifa) { foreach ($this->consulta->tarifas as $tarifa) {
$this->r = $this->r + $tarifa->pantallas;
$pantallas_tarifa = $tarifa->pantallas; $pantallas_tarifa = $tarifa->pantallas;
$servicio_id = $tarifa->servicio_id; $servicio_id = $tarifa->servicio_id;
$pantalla_servicio = $tarifa->servicio->pantallas; $pantalla_servicio = $tarifa->servicio->pantallas;
$pantalla_servicio_completa = $tarifa->servicio->completa; $pantalla_servicio_completa = $tarifa->servicio->completa;
$faltante = $pantalla_servicio - $pantallas_tarifa; $faltante = $pantalla_servicio - $pantallas_tarifa;
//dd($tarifa);
if ($pantalla_servicio_completa == $pantallas_tarifa) { if ($pantalla_servicio_completa == $pantallas_tarifa) {
$this->fecha_final_1 = Carbon::now()->addDays($tarifa->dias - 20);
$this->fecha_final_2 = Carbon::now()->addDays($tarifa->dias + 20);
$this->fecha_final_1 = $today = Carbon::now()->addDays($tarifa->dias - 20); $baseQuery = Cuentas::where('servicio_id', $servicio_id)
$this->fecha_final_2 = $today = Carbon::now()->addDays($tarifa->dias + 20);
$baseQuery = Cuentas::select('*')->where('servicio_id', $servicio_id)
->whereDate('inicio', '>=', $this->fecha) ->whereDate('inicio', '>=', $this->fecha)
->whereDate('vencimiento', '>=', $this->fecha_final_1) ->whereDate('vencimiento', '>=', $this->fecha_final_1)
->whereDate('vencimiento', '<=', $this->fecha_final_2) ->whereDate('vencimiento', '<=', $this->fecha_final_2)
->Orderby('inicio', 'ASC')->with('historiales') ->orderBy('inicio', 'ASC')
->withCount('historiales') ->withCount('historiales')
->where('estado', 'pendiente'); ->where('estado', 'pendiente');
$cuenta = Cuentas::fromSub($baseQuery, 'alias') $cuenta = Cuentas::fromSub($baseQuery, 'alias')
->where('historiales_count', '=', 0) ->where('historiales_count', '=', 0)
->orderBy('inicio', 'ASC')
->first(); ->first();
} else { } else {
$baseQuery = Cuentas::select('*')->where('servicio_id', $servicio_id) $baseQuery = Cuentas::where('servicio_id', $servicio_id)
->whereDate('inicio', '>=', $this->fecha) ->whereDate('inicio', '>=', $this->fecha)
->Orderby('inicio', 'ASC') ->orderBy('inicio', 'ASC')
->with('historiales')
->withCount('historiales') ->withCount('historiales')
->where('estado', 'activo'); ->where('estado', 'activo');
$cuenta = Cuentas::fromSub($baseQuery, 'alias') $cuenta = Cuentas::fromSub($baseQuery, 'alias')
->where('historiales_count', '<=', (int) $faltante) ->where('historiales_count', '<=', (int) $faltante)
->orderBy('inicio', 'ASC')
->first(); ->first();
} }
if ($cuenta) {
if (!is_null($cuenta)) {
//$perfil = $cuenta->historiales_count;
$perfil = Historial_cuenta::where('cuenta_id', $cuenta->id)->max('perfil') ?? 0; $perfil = Historial_cuenta::where('cuenta_id', $cuenta->id)->max('perfil') ?? 0;
for ($y = 0; $y < (int) $pantallas_tarifa; $y++) { for ($y = 0; $y < (int) $pantallas_tarifa; $y++) {
$historial_cuenta = new Historial_cuenta(); $historial_cuenta = new Historial_cuenta();
$historial_cuenta->historial_id = $historial->id; $historial_cuenta->historial_id = $historial->id;
$historial_cuenta->cuenta_id = $cuenta->id; $historial_cuenta->cuenta_id = $cuenta->id;
$historial_cuenta->perfil = (int) $perfil + (int) $y + 1; $historial_cuenta->perfil = (int) $perfil + (int) $y + 1;
$historial_cuenta->save(); $historial_cuenta->save();
if (!empty($historial_cuenta->id)) {
array_push($this->n, $historial_cuenta->id); if ($historial_cuenta->id) {
$this->n[] = $historial_cuenta->id;
} }
} }
} else { } else {
array_push($this->f, $servicio_id); $this->f[] = $servicio_id;
$this->alert('warning', 'No hay cuentas disponibles de ' . $tarifa->servicio->nombre, [ $this->alert('warning', 'No hay cuentas disponibles de ' . $tarifa->servicio->nombre, ['position' => 'top']);
'position' => 'top'
]);
}
$cuenta = null;
$this->modalComprarPromo = false;
} }
} }
}
// === Validación de disponibilidad ===
if (count($this->f) > 0) { if (count($this->f) > 0) {
DB::rollBack(); // no se descuenta saldo
$resultados = Servicio::whereIn('id', $this->f)->get(); $resultados = Servicio::whereIn('id', $this->f)->get();
// $eliminar = Historial_cuenta::whereIn('id', $n)->delete();
$message = '';
if ($resultados->count() > 0) { if ($resultados->count() > 0) {
$nombresServicios = $resultados->pluck('nombre')->toArray(); $nombresServicios = $resultados->pluck('nombre')->toArray();
@@ -362,7 +357,6 @@ class ShowPromociones extends Component
'showDenyButton' => true, 'showDenyButton' => true,
'onConfirmed' => 'confirmarCompra', 'onConfirmed' => 'confirmarCompra',
'onDenied' => 'denegarCompra', 'onDenied' => 'denegarCompra',
// 'cancelButtonText' => 'No, abandonar.',
'denyButtonText' => 'No, abandonar.', 'denyButtonText' => 'No, abandonar.',
'confirmButtonText' => 'Sí, comprar.', 'confirmButtonText' => 'Sí, comprar.',
'customClass' => [ 'customClass' => [
@@ -372,80 +366,81 @@ class ShowPromociones extends Component
] ]
]); ]);
} }
} else { return;
}
// === Cobro de saldo ===
$descuento = Saldo::where('usuario_id', Auth::user()->id)->first(); $descuento = Saldo::where('usuario_id', Auth::user()->id)->first();
$saldo_anterior = $descuento->valor; $saldo_anterior = $descuento->valor;
$nuevo_saldo = $saldo_anterior - ($this->precioAhora * $this->cantidad_comprarPromo); $nuevo_saldo = $saldo_anterior - ($this->precioAhora * $this->cantidad_comprarPromo);
$cobro = $descuento->update(['valor' => $nuevo_saldo]);
if ($cobro) { if ($descuento->update(['valor' => $nuevo_saldo])) {
$historial->update(['estado' => 'activo']); $historial->update(['estado' => 'activo']);
$logsGeneral = new Log_general(); // Registrar logs
$logsGeneral->user_id = Auth::user()->id;
$logsGeneral->detalle = 'El usuario ' . Auth::user()->name . ' - ' . Auth::user()->email . ' ha comprado la promocion ' . $this->consulta->nombre . ' - ' . $this->consulta->descripcion . ' cantidad de ' . $this->historial->cantidad . ' por un valor de $' . $this->historial->valor . ', Saldo anterior: $' . $saldo_anterior . ', Nuevo saldo disponible: $' . $nuevo_saldo;
$logsGeneral->tipo = 'compra';
$logsGeneral->historial_id = $historial->id;
$logsGeneral->save();
// Si el campo subvendedor tiene id entonces la utilidad va a su subvendedor padre
if (Auth::user()->subvendedor_id) {
if ($utilidad_total > 0) {
$subvendedorPadre = User::with('saldo')->find(Auth::user()->subvendedor_id);
if ($subvendedorPadre && $subvendedorPadre->saldo) {
// Sumar la utilidad al saldo actual
$nuevoSaldo = $subvendedorPadre->saldo->valor + $utilidad_total;
// Actualizar el saldo
$subvendedorPadre->saldo->update([
'valor' => $nuevoSaldo
]);
// Registrar en el log la utilidad generada
$logsGeneral = new Log_general(); $logsGeneral = new Log_general();
$logsGeneral->user_id = Auth::user()->id; $logsGeneral->user_id = Auth::user()->id;
$logsGeneral->detalle = 'El usuario ' . Auth::user()->name . ' - ' . Auth::user()->email . $logsGeneral->detalle = 'El usuario ' . Auth::user()->name . ' - ' . Auth::user()->email .
' ha comprado la promocion ' . $this->consulta->nombre . ' - ' . $this->consulta->descripcion . ' ha comprado la promoción ' . $this->consulta->nombre . ' - ' . $this->consulta->descripcion .
' cantidad de ' . $this->historial->cantidad .
' por un valor de $' . $this->historial->valor .
', Saldo anterior: $' . $saldo_anterior .
', Nuevo saldo disponible: $' . $nuevo_saldo .
'. Esta compra generó una utilidad de $' . $utilidad_total .
' al usuario padre ' . $subvendedorPadre->name . ' - ' . $subvendedorPadre->email . '.';
$logsGeneral->historial_id = $historial->id;
$logsGeneral->tipo = 'compra';
$logsGeneral->save();
}
}
} else {
// Log sin utilidad al padre
$logsGeneral = new Log_general();
$logsGeneral->user_id = Auth::user()->id;
$logsGeneral->detalle = 'El usuario ' . Auth::user()->name . ' - ' . Auth::user()->email .
' ha comprado la promocion ' . $this->consulta->nombre . ' - ' . $this->consulta->descripcion .
' cantidad de ' . $this->historial->cantidad . ' cantidad de ' . $this->historial->cantidad .
' por un valor de $' . $this->historial->valor . ' por un valor de $' . $this->historial->valor .
', Saldo anterior: $' . $saldo_anterior . ', Saldo anterior: $' . $saldo_anterior .
', Nuevo saldo disponible: $' . $nuevo_saldo; ', Nuevo saldo disponible: $' . $nuevo_saldo;
$logsGeneral->tipo = 'compra';
$logsGeneral->historial_id = $historial->id;
$logsGeneral->save();
// utilidad para el padre
if (Auth::user()->subvendedor_id && $utilidad_total > 0) {
$subvendedorPadre = User::with('saldo')->find(Auth::user()->subvendedor_id);
if ($subvendedorPadre && $subvendedorPadre->saldo) {
$nuevoSaldo = $subvendedorPadre->saldo->valor + $utilidad_total;
$subvendedorPadre->saldo->update(['valor' => $nuevoSaldo]);
$logsGeneral = new Log_general();
$logsGeneral->user_id = Auth::user()->id;
$logsGeneral->detalle = 'Compra generó utilidad de $' . $utilidad_total .
' al usuario padre ' . $subvendedorPadre->name . ' - ' . $subvendedorPadre->email;
$logsGeneral->historial_id = $historial->id; $logsGeneral->historial_id = $historial->id;
$logsGeneral->tipo = 'compra'; $logsGeneral->tipo = 'compra';
$logsGeneral->save(); $logsGeneral->save();
} }
}
$this->modalComprarPromo = false; $this->modalComprarPromo = false;
$this->credenciales($historial); $this->credenciales($historial);
} else {
$eliminar = Historial_cuenta::whereIn('id', $this->n)->delete();
$this->alert('warning', 'Error en el cobro, comuniquese con soporte!', [ DB::commit();
'position' => 'top' break; // ✅ salir del while (ya se completó la compra)
]); } else {
Historial_cuenta::whereIn('id', $this->n)->delete();
DB::rollBack();
$this->alert('warning', 'Error en el cobro, comuníquese con soporte!', ['position' => 'top']);
return;
}
} catch (QueryException $e) {
DB::rollBack();
if ($e->getCode() == '23505') {
if ($intento >= $maxIntentos) {
$this->alert('warning', 'Otra persona tomó la cuenta al mismo tiempo. Intenta nuevamente.', ['position' => 'top']);
return;
}
usleep(200000); // 200ms y reintentar
continue;
}
$this->alert('error', 'Error inesperado en la compra: ' . $e->getMessage(), ['position' => 'top']);
return;
} catch (\Throwable $e) {
DB::rollBack();
$this->alert('error', 'Error inesperado: ' . $e->getMessage(), ['position' => 'top']);
return;
} }
} }
} }
public function confirmarCompra() public function confirmarCompra()
{ {
$descuento = Saldo::where('usuario_id', Auth::user()->id)->first(); $descuento = Saldo::where('usuario_id', Auth::user()->id)->first();