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'); } }