389 lines
15 KiB
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');
|
|
}
|
|
}
|