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