vueloenglobo.mx/app/Http/Controllers/CotizacionController.php

389 lines
15 KiB
PHP

<?php
namespace App\Http\Controllers;
use Http;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Http as FacadesHttp;
class CotizacionController extends Controller
{
protected static $sitio_web_id = 2; // ID fijo para globopuerto
/**
* Summary of crearCotizacionYPosibleCompraErp
* @param array $datos
* @return array{error: string, exito: int|array{exito: int, folio: string, id_cotizacion: int}}
*/
public static function crearCotizacionYPosibleCompraErp(array $datos)
{
try {
DB::beginTransaction();
$ultimoId = DB::table('cotizaciones')->max('id_cotizacion') + 1;
$folio = 'COT' . str_pad($ultimoId, 7, '0', STR_PAD_LEFT);
$id_cotizacion = DB::table('cotizaciones')->insertGetId([
'folio' => $folio,
'nombre' => $datos['nombre'],
'apellidos' => $datos['apellidos'],
'mail' => $datos['email'],
'telefono' => $datos['telefono'],
'total' => $datos['total_compra'],
'subtotal' => $datos['total_compra'],
'id_sitio_web' => self::$sitio_web_id,
'id_user_alta' => 98,
'fecha_alta' => Carbon::now(),
]);
DB::table('posibles_compras')->insert([
'id_cotizacion' => $id_cotizacion,
'id_sitio_web' => self::$sitio_web_id,
'total_reservado' => $datos['total_compra'],
'total_reserva' => $datos['total_a_pagar'],
'fecha_alta' => Carbon::now(),
]);
DB::commit();
return [
'exito' => 1,
'id_cotizacion' => $id_cotizacion,
'folio' => $folio
];
} catch (\Exception $e) {
DB::rollBack();
return [
'exito' => 0,
'error' => $e->getMessage()
];
}
}
public function crearCotizacionCompleta(array $data)
{
try {
DB::beginTransaction();
// 1. Generar folio
$ultimoId = (DB::table('cotizaciones')->max('id_cotizacion') ?? 0) + 1;
$folio = "COT" . str_pad($ultimoId, 7, "0", STR_PAD_LEFT);
$vuelo = DB::table('vuelos')->where('id_vuelo', $data['id_vuelo'])->first();
// 2. Insertar cotización principal
$id_cotizacion = DB::table('cotizaciones')->insertGetId([
'folio' => $folio,
'nombre' => $data['nombre_reserva'],
'apellidos' => $data['apellido_reserva'],
'mail' => $data['email_reserva'],
'telefono' => $data['tel_reserva'],
'iso_country_id_primary_phone' => $data['Lada'],
'subtotal' => $data['total_compra'],
'total' => $data['total_compra'],
'total_con_iva' => $data['total_compra'],
'total_neto' => $data['total_compra'],
'id_sitio_web' => self::$sitio_web_id,
'observaciones' => 'Cotizacion desde www.vueloenglobo.mx',
'id_user_alta' => 98,
'fecha_alta' => now(),
'fecha_vuelo' => $data['fecha_vuelo'] ?? null,
]);
// 3. Insertar vuelo principal
DB::table('vuelos_cotizaciones')->insert([
'id_cotizacion' => $id_cotizacion,
'id_vuelo' => $data['id_vuelo'],
'id_unidad' => $data['id_unidad'],
'cantidades' => $data['pasajeros'],
'precio_vendido_p_pax_vuelo' => $vuelo->precio_publico,
'precio_especial' => $vuelo->precio_publico,
'id_estatus' => 1,
'id_user_alta' => 98,
'fecha_alta' => now(),
]);
DB::table('pedidos')->insert([
'id_cotizacion' => $id_cotizacion,
'foto_comprobante' => null,
'cantidad_pagada' => $data['total_compra'],
'pago_confirmado' => 1,
'fecha_pago' => date('Y-m-d'),
'observaciones' => 'Transacción realizada vía Clip PAGO CON TARJETA desde vueloenglobo.mx | ' . $data['nombre_reserva'] . ' ' . $data['apellido_reserva'] . ' - ID Cotizacion:' . $id_cotizacion,
'observaciones_logistica' => 'Transacción realizada vía Clip PAGO CON TARJETA desde vueloenglobo.mx | ' . $data['nombre_reserva'] . ' ' . $data['apellido_reserva'] . ' - ID Cotizacion:' . $id_cotizacion,
'ultimos_digitos' => null,
'id_cuenta_bancaria' => 1,
'id_metodo_pago_cuenta_bancaria' => 9,
'id_banco' => 0,
'id_estatus' => 1,
'id_user_alta' => 98,
'fecha_alta' => now(),
]);
DB::table('pases_de_abordar')->insert([
'id_cotizacion' => $id_cotizacion,
'id_lugar_cita' => 12,
'hora_cita' => '06:00',
'id_recibo' => 0,
'id_estatus' => 1,
'id_user_alta' => 98,
'fecha_alta' => now(),
]);
// 4. Pasajeros adicionales
if (!empty($data['num_pax_adicionales']) && $data['num_pax_adicionales'] > 0) {
DB::table('vuelos_cotizaciones')->insert([
'id_cotizacion' => $id_cotizacion,
'id_vuelo' => $data['id_vuelo'],
'id_unidad' => $data['id_unidad_adicionales'],
'cantidades' => $data['num_pax_adicionales'],
'precio_vendido_p_pax_vuelo' => $data['precio_adicional'],
'pasajero_adicional' => 1,
'id_estatus' => 1,
'id_user_alta' => 98,
'fecha_alta' => now(),
]);
}
// 5. Servicios adicionales
if (!empty($data['servicios_adicionales'])) {
$servicios = is_string($data['servicios_adicionales'])
? json_decode($data['servicios_adicionales'], true)
: $data['servicios_adicionales'];
foreach ($servicios as $servicio) {
DB::table('servicios_adicionales_cotizaciones')->insert([
'id_cotizacion' => $id_cotizacion,
'id_servicio_adicional' => $servicio['id_servicio'],
'cantidades' => $servicio['cantidad_solicitada'],
'precio_vendido' => $servicio['precio'],
'id_estatus' => 1,
'id_user_alta' => 98,
'fecha_alta' => now(),
]);
}
}
$url = url('https://erp.skyballoons.mx/enviar-pase/2/' . $id_cotizacion);
FacadesHttp::get($url);
DB::commit();
return [
'success' => true,
'id_cotizacion' => $id_cotizacion,
'folio' => $folio
];
} catch (\Exception $e) {
DB::rollBack();
return [
'success' => false,
'error' => $e->getMessage()
];
}
}
public function generaCot(Request $request)
{
$data = [
// Datos del cliente
'nombre_reserva' => $request->responsable['nombres'],
'apellido_reserva' => $request->responsable['apellidos'],
'email_reserva' => $request->responsable['email'],
'tel_reserva' => preg_replace('/\D/', '', $request->responsable['telefono']),
'Lada' => 52, // o extraerla dinámicamente
'fecha_vuelo' => $request->fecha,
// Datos del vuelo
'id_vuelo' => $request->id_vuelo,
'id_unidad' => 1, // obtener según tu lógica de negocio
'pasajeros' => ($request->adultos ?? 0) + ($request->ninios ?? 0),
'precio_publico' => $request->total,
// Totales
'total_compra' => $request->total,
// Pasajeros adicionales
'num_pax_adicionales' => 0,
'id_unidad_adicionales' => null,
'precio_adicional' => 0,
// Servicios adicionales
'servicios_adicionales' => collect($request->servicios ?? [])
->map(function ($servicio) {
return [
'id_servicio' => $servicio['id_servicio'],
'cantidad_solicitada' => $servicio['cantidad'] ?? 1,
'precio' => $servicio['precio'] ?? 0,
];
})
->toArray(),
];
$resultado = $this->crearCotizacionCompleta($data);
return response()->json($resultado);
}
/* public function detalleCotizacionChatbot(Request $request, $cotizacion)
{
$pedidos = DB::table('pedidos')
->where('id_cotizacion', $cotizacion)
->first() ?? null;
if ($pedidos) {
return response()->json(['error' => 'La cotización ya ha sido pagada.']);
}
// return $pago!=null? response()->json(['error' => 'La cotización ya ha sido pagada.']) : '';
$cotizacion = DB::table('cotizaciones')
->where('id_cotizacion', $cotizacion)
->first();
$vueloCotizado = DB::table('vuelos_cotizaciones')
->where('id_cotizacion', $cotizacion->id_cotizacion)
->first();
$vuelo = DB::table('vuelos')
->where('id_vuelo', $vueloCotizado->id_vuelo)
->first();
$resultado = [
'folio' => $cotizacion->folio,
'cliente' => $cotizacion->nombre . ' ' . $cotizacion->apellidos,
'email' => $cotizacion->mail,
'telefono' => $cotizacion->telefono,
'fecha_vuelo' => $cotizacion->fecha_vuelo,
'total' => $cotizacion->total,
'moneda' => $cotizacion->tipo_moneda,
'vuelo' => [
'id_vuelo_cotizacion' => $vueloCotizado->id_vuelo_cotizacion,
'cantidad_pax' => $vueloCotizado->cantidades,
'precio_unitario' => $vueloCotizado->precio_vendido_p_pax_vuelo,
'precio_especial' => $vueloCotizado->precio_especial,
]
];
$adicionalesCotizados = DB::table('servicios_adicionales_cotizaciones')
->where('id_cotizacion', $cotizacion->id_cotizacion)
->get();
return $adicionalesCotizados;
$datosPago = [
'total' => $cotizacion->total_neto ?? 0,
'moneda' => $cotizacion->moneda ?? 'MXN',
'simbolo' => ($cotizacion->moneda ?? 'MXN') === 'USD' ? 'US$' : '$',
'descripcionPago' => $cotizacion->folio ?? 'Vuelo cotizado',
'id_cotizacion' => $cotizacion->id_cotizacion,
'vuelo' => $cotizacion->folio,
'adicionales' => $adicionalesCotizados,
'responsable' => [
'nombres' => $cotizacion->nombre ?? '',
'apellidos' => $cotizacion->apellidos ?? '',
'email' => $cotizacion->mail ?? '',
'telefono' => $cotizacion->telefono ?? '',
],
'fecha_vuelo' => $cotizacion->fecha_vuelo ?? null,
'adultos' => $cotizacion->adultos ?? 1,
'ninios' => $cotizacion->ninios ?? 0,
'isSpanish' => app()->getLocale() === 'es',
];
// return $vuelo;
return view('cotizacion.chatbot.checkout', compact('datosPago', 'vueloCotizado', 'adicionalesCotizados', 'vuelo'));
} */
public function detalleCotizacionChatbot(Request $request, $cotizacion)
{
// Verificar si ya está pagada
$pedidos = DB::table('pedidos')
->where('id_cotizacion', $cotizacion)
->first();
if ($pedidos) {
return response()->json(['error' => 'La cotización ya ha sido pagada.']);
}
// Obtener cotización
$cotizacion = DB::table('cotizaciones')
->where('id_cotizacion', $cotizacion)
->first();
if (!$cotizacion) {
return response()->json(['error' => 'Cotización no encontrada']);
}
// Obtener vuelo cotizado
$vueloCotizado = DB::table('vuelos_cotizaciones')
->where('id_cotizacion', $cotizacion->id_cotizacion)
->first();
$vuelo = null;
if ($vueloCotizado) {
$vuelo = DB::table('vuelos')
->where('id_vuelo', $vueloCotizado->id_vuelo)
->first();
}
// Obtener adicionales
$adicionalesCotizados = DB::table('servicios_adicionales_cotizaciones')
->where('id_cotizacion', $cotizacion->id_cotizacion)
->get();
// Preparar array datosPago
$datosPago = [
'total' => $cotizacion->total ?? 0,
'moneda' => $cotizacion->tipo_moneda ?? 'MXN',
'simbolo' => ($cotizacion->tipo_moneda ?? 'MXN') === 'USD' ? 'US$' : '$',
'descripcionPago' => $cotizacion->folio ?? 'Vuelo cotizado',
'id_cotizacion' => $cotizacion->id_cotizacion,
'vuelo_folio' => $cotizacion->folio,
'adicionales' => $adicionalesCotizados,
'responsable' => [
'nombres' => $cotizacion->nombre ?? '',
'apellidos' => $cotizacion->apellidos ?? '',
'email' => $cotizacion->mail ?? '',
'telefono' => $cotizacion->telefono ?? '',
],
'fecha_vuelo' => $cotizacion->fecha_vuelo ?? null,
'adultos' => $cotizacion->adultos ?? 1,
'ninios' => $cotizacion->ninios ?? 0,
'isSpanish' => app()->getLocale() === 'es',
// Información del vuelo
'nombre_vuelo' => $vuelo->nombre_vuelo ?? 'Vuelo sin nombre',
'json_incluye' => isset($vuelo->json_incluye) ? json_decode($vuelo->json_incluye, true) : [],
'cantidad_pax' => $vueloCotizado->cantidades ?? 0,
'precio_unitario' => $vueloCotizado->precio_vendido_p_pax_vuelo ?? 0,
];
return view('cotizacion.chatbot.checkout', compact('datosPago', 'vueloCotizado', 'adicionalesCotizados', 'vuelo'));
}
public function compraFinalizada(Request $request)
{
$objCotizacion = null;
if (isset($request->cotizacion)) {
$objCotizacion = DB::table('cotizaciones')
->where('id_cotizacion', decrypt($request->cotizacion))
->first();
}
return view('cotizacion.chatbot.success');
}
}