HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/vhost/disk-apps/qas.sports-crowd.com/app/Http/Controllers/WebExperienceController.php
<?php

namespace App\Http\Controllers;

use App\Core\CorporateIdentity\Application\CorporateIdentityService;
use App\Core\Experience\Domain\ValueObjects\ExperiencePaymentStatusEnum;
use App\DataPolicy;
use App\DocumentType;
use App\Services\ExperienceService;
use App\Term;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\DB;

class WebExperienceController extends Controller
{
    protected $experienceService;
    protected $corporateIdentity;
    protected $paginationPerPage = 6;

    public function __construct()
    {
        $this->experienceService = new ExperienceService;
        $this->corporateIdentity = CorporateIdentityService::get();
    }

    public function index(Request $request)
    {
        $paginationPerPage = $this->paginationPerPage;
        if (!$request->has('show_in')) {
            $request->merge(['show_in' => ['all', 'web']]);
        }
        $corporateIdentity = $this->corporateIdentity;
        $experiences = $this->experienceService->getExperienceQuery($request);
        $experiences = $experiences->paginate($paginationPerPage);
        return view('web_experiences.index.index', compact('paginationPerPage', 'corporateIdentity', 'experiences'));
    }

    public function detail(Request $request, $id)
    {
        $request['id'] = $id;
        $corporateIdentity = $this->corporateIdentity;
        $experience = $this->experienceService->detail($request);
        return view('web_experiences.detail.index', compact('corporateIdentity', 'experience'));
    }

    public function previewEnroll(Request $request, $id, $planPriceId, $amount = null)
    {
        $request['id'] = $id;
        $request['plan_price_id'] = $planPriceId;
        $corporateIdentity = $this->corporateIdentity;
        $experience = $this->experienceService->detail($request);
        $experiencePlanPrice = $this->experienceService->findExperiencePlanPrice($planPriceId);
        $documentsTypes = DocumentType::select('id', 'name')->where('active', 1)->whereIn('show_in', ['all', 'adult'])->orderBy('name', 'ASC')->get();
        $terms = Term::select('url')->where('active', true)->where('type', 'app')->first();
        $dataPolicy = DataPolicy::select('url')->where('active', true)->first();
        return view('web_experiences.enroll.index', compact('corporateIdentity', 'experience', 'experiencePlanPrice', 'amount', 'documentsTypes', 'terms', 'dataPolicy'));
    }

    public function enroll(Request $request, $id)
    {
        $planPriceId = $request->input('plan_price_id');
        $experiencePlanPrice = $this->experienceService->findExperiencePlanPrice($planPriceId);
        if (!$experiencePlanPrice) {
            if ($request->ajax()) {
                return response()->json([
                    'errors' => ['error' => ['El plan seleccionado no es válido.']],
                ], 422);
            }

            return redirect()->back()->withErrors(['error' => 'El plan seleccionado no es válido.']);
        }

        $buyerRequest = [
            'first_name'        => $request->input('buyer_first_name'),
            'last_name'         => $request->input('buyer_last_name'),
            'email'             => $request->input('buyer_email'),
            'phone'             => $request->input('buyer_phone'),
            'dial_code'         => $request->input('buyer_dial_code'),
            'country_code'      => $request->input('buyer_country_code'),
            'document_type_id'  => $request->input('buyer_document_type_id'),
            'document'          => $request->input('buyer_document'),
            'birthdate'         => $request->input('buyer_birthdate'),
            'billing_first_name' => $request->input('buyer_first_name'),
            'billing_last_name'  => $request->input('buyer_last_name'),
            'billing_email'      => $request->input('buyer_email'),
            'billing_phone'      => $request->input('buyer_phone'),
            'billing_document_type_id' => $request->input('buyer_document_type_id'),
            'billing_document'   => $request->input('buyer_document'),
            'term_cons'          => true,
            'data_policy'        => true,
            'origin'            => 'web',
            'plan'              => [
                'plan_price_id' => $planPriceId,
                'price'         => $experiencePlanPrice->price,
            ],
            'amount'            => $request->input('amount'),
            'referral_code'     => $request->input('referral_code'),
        ];
        $buyerRequestObject = new Request($buyerRequest);

        DB::beginTransaction();
        try {
            $response = $this->experienceService->enroll($buyerRequestObject);
            $response = json_decode($response->getContent());

            if (!$response->r) {
                DB::rollBack();
                return redirect()->back()->withErrors(['error' => $response->m ?? 'Error al procesar la inscripción.']);
            }
            DB::commit();

            $payment = $response->d;

            // Agregar los acompañantes a la inscripción
            $this->experienceService->addCompanionsToExperiencePayment($payment, $request->all());

            // Cerrar sesión para evitar problemas de sesión
            if (Auth::check()) {
                Auth::logout();
            }

            if ($payment->status == ExperiencePaymentStatusEnum::CONFIRMED) {
                return response()->json(['redirect' => false, 'message' => 'Tu inscripción ha sido exitosa, al correo electrónico se ha enviado un mensaje con las instrucciones para acceder a la experiencia.'], 200);
            }

            if ($request->ajax()) {
                return response()->json(['redirect' => route('payment.gateway.selection', ['type' => 'experience', 'paymentObjectId' => Crypt::encrypt($payment->id)])]);
            }

            return redirect()->route('payment.gateway.selection', [
                'type'              => 'experience',
                'paymentObjectId'   => Crypt::encrypt($payment->id)
            ]);
        } catch (\Throwable $th) {
            DB::rollBack();

            if ($request->ajax()) {
                return response()->json([
                    'errors' => ['error' => [$th->getMessage()]],
                ], 422);
            }

            return redirect()->back()->withErrors(['error' => $th->getMessage()]);
        }
    }

    public function logout(Request $request)
    {
        if (Auth::check()) {
            Auth::logout();
        }

        $request->session()->invalidate();
        $request->session()->regenerateToken();

        return redirect()->back();
    }
}