@php $editorMode = $editorMode ?? request()->query('editor') === 'fullscreen'; if ($editorMode) { $pageConfigs = ['myLayout' => 'blank']; } @endphp @extends('layouts/layoutMaster') @section('title', 'Editar anuncio') @section('vendor-style') @vite(['resources/assets/vendor/libs/bs-stepper/bs-stepper.scss']) @endsection @section('page-style') @endsection @section('vendor-script') @vite(['resources/assets/vendor/libs/bs-stepper/bs-stepper.js']) @endsection @section('page-script') @include('partials.epayco-inline-checkout') @vite(['resources/assets/js/mariachi-listing-wizard.js']) @if($editorMode) @vite(['resources/assets/js/mariachi-listing-editor-shell.js']) @endif @endsection @section('content') @php $selectedEventTypeIds = $listing->eventTypes->pluck('id')->all(); $selectedServiceTypeIds = $listing->serviceTypes->pluck('id')->all(); $selectedGroupSizeIds = $listing->groupSizeOptions->pluck('id')->all(); $selectedBudgetIds = $listing->budgetRanges->pluck('id')->all(); $selectedZoneIds = $listing->serviceAreas->pluck('marketplace_zone_id')->filter()->map(fn ($id) => (int) $id)->all(); $selectedCityId = (int) old('marketplace_city_id', $listing->marketplace_city_id); $primaryZoneId = (int) old('primary_marketplace_zone_id', $selectedZoneIds[0] ?? 0); $formSelectedZoneIds = collect(old('zone_ids', $selectedZoneIds)) ->map(fn ($id) => (int) $id) ->filter(fn ($id) => $id > 0 && $id !== $primaryZoneId) ->values() ->all(); $displayCityName = old('city_name', $listing->city_name); $displayZoneName = old('zone_name', $listing->zone_name ?: ($listing->serviceAreas->first()?->city_name ?? '')); $pendingCityApproval = old('city_name', $pendingCityApproval ? $pendingCityLabel : null) && ! $selectedCityId; $pendingCityLabel = old('city_name', $pendingCityLabel); $googlePayload = old('google_location_payload', $listing->google_location_payload ? json_encode($listing->google_location_payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : ''); $decodedGooglePayload = is_string($googlePayload) && $googlePayload !== '' ? json_decode($googlePayload, true) : []; $decodedGooglePayload = is_array($decodedGooglePayload) ? $decodedGooglePayload : []; $extractPayloadComponent = function (array $payload, array $candidateTypes): string { $components = $payload['address_components'] ?? null; if (! is_array($components)) { return ''; } foreach ($candidateTypes as $candidateType) { foreach ($components as $component) { if (! is_array($component)) { continue; } $types = $component['types'] ?? []; if (is_array($types) && in_array($candidateType, $types, true)) { return trim((string) ($component['long_name'] ?? '')); } } } return ''; }; $displayNeighborhood = $extractPayloadComponent($decodedGooglePayload, ['neighborhood']) ?: $extractPayloadComponent($decodedGooglePayload, ['sublocality_level_2']) ?: $extractPayloadComponent($decodedGooglePayload, ['administrative_area_level_5']); $pendingLocalityName = old('suggest_zone', ($selectedCityId > 0 && $displayZoneName !== '' && ! $primaryZoneId ? $displayZoneName : '')); $faqAi = is_array($faqAi ?? null) ? $faqAi : []; $persistedSystemFaqRows = $listing->systemFaqRows()->values(); $oldSystemFaqQuestions = old('system_faq_question'); $oldSystemFaqAnswers = old('system_faq_answer'); $systemFaqRows = collect(range(0, 2))->map(function ($index) use ($persistedSystemFaqRows, $oldSystemFaqQuestions, $oldSystemFaqAnswers) { $fallback = $persistedSystemFaqRows->get($index) ?? ['question' => '', 'answer' => '']; return [ 'question' => is_array($oldSystemFaqQuestions) ? ($oldSystemFaqQuestions[$index] ?? $fallback['question']) : $fallback['question'], 'answer' => is_array($oldSystemFaqAnswers) ? ($oldSystemFaqAnswers[$index] ?? $fallback['answer']) : $fallback['answer'], ]; }); $faqRows = is_array(old('faq_question')) ? collect(old('faq_question'))->map(function ($question, $index) { return ['question' => $question, 'answer' => old('faq_answer')[$index] ?? '']; }) : $listing->customFaqRows(true)->map(fn ($faq) => ['question' => $faq['question'], 'answer' => $faq['answer']]); if ($faqRows->isEmpty()) { $faqRows = collect([['question' => '', 'answer' => '']]); } $systemFaqGenerationEligible = (bool) ($faqAi['can_generate_system'] ?? false); $listingHasPersistedSystemFaqs = (bool) ($faqAi['has_persisted_system'] ?? false); $hasOldSystemFaqInput = is_array($oldSystemFaqQuestions); $shouldAutoGenerateSystemFaqs = ! $hasOldSystemFaqInput && ! $listingHasPersistedSystemFaqs; $systemFaqGenerateUrl = $faqAi['system_generate_url'] ?? route('mariachi.listings.faqs.ai.generate-system', ['listing' => $listing->id]); $singleFaqGenerateUrl = $faqAi['single_generate_url'] ?? route('mariachi.listings.faqs.ai.generate-one', ['listing' => $listing->id]); $basePriceValue = old('base_price', $listing->base_price); $basePriceValue = filled($basePriceValue) ? (int) round((float) $basePriceValue) : null; $editorDescription = app(\App\Support\ListingDescriptionSanitizer::class)->sanitize( old('description', $editorDescription ?? $listing->description) ) ?? ''; $reviewMap = [ \App\Models\MariachiListing::REVIEW_DRAFT => ['label' => 'Borrador de revision', 'class' => 'secondary'], \App\Models\MariachiListing::REVIEW_PENDING => ['label' => 'En revision', 'class' => 'warning'], \App\Models\MariachiListing::REVIEW_APPROVED => ['label' => 'Aprobado', 'class' => 'success'], \App\Models\MariachiListing::REVIEW_REJECTED => ['label' => 'Rechazado', 'class' => 'danger'], ]; $paymentMap = [ \App\Models\MariachiListing::PAYMENT_NONE => ['label' => 'Sin pago', 'class' => 'secondary'], \App\Models\MariachiListing::PAYMENT_PENDING => ['label' => 'Pago pendiente', 'class' => 'warning'], \App\Models\MariachiListing::PAYMENT_APPROVED => ['label' => 'Pago aprobado', 'class' => 'success'], \App\Models\MariachiListing::PAYMENT_REJECTED => ['label' => 'Pago rechazado', 'class' => 'danger'], ]; $reviewMeta = $reviewMap[$listing->review_status] ?? ['label' => $listing->reviewStatusLabel(), 'class' => 'secondary']; $paymentMeta = $paymentMap[$listing->payment_status] ?? ['label' => $listing->paymentStatusLabel(), 'class' => 'secondary']; $selectedPlan = $listing->selected_plan_code ? ($plans[$listing->selected_plan_code] ?? null) : null; $defaultPlan = $selectedPlan ?: (count($plans) ? reset($plans) : null); $planDurationOptions = $defaultPlan ? array_values($defaultPlan['terms'] ?? []) : []; $selectedTermMonths = (int) old('term_months', $listing->plan_duration_months ?: ($defaultPlan['default_term_months'] ?? ($planDurationOptions[0]['months'] ?? 1))); $defaultPlanTerm = $defaultPlan && isset($defaultPlan['terms'][$selectedTermMonths]) ? $defaultPlan['terms'][$selectedTermMonths] : ($defaultPlan ? reset($defaultPlan['terms']) : null); $latestPayment = $listing->latestPayment; $canSubmitForReview = $listing->canBeSubmittedForReview(); $submitForReviewLabel = $listing->review_status === \App\Models\MariachiListing::REVIEW_REJECTED ? 'Reenviar a revisión' : 'Enviar a revisión'; $maxPhotos = (int) ($capabilities['max_photos_per_listing'] ?? 0); $maxVideos = (int) ($capabilities['max_videos_per_listing'] ?? 0); $maxZones = (int) ($capabilities['max_zones_covered'] ?? 0); $maxEventTypes = (int) ($capabilities['max_event_types'] ?? 0); $maxServiceTypes = (int) ($capabilities['max_service_types'] ?? 0); $maxGroupSizes = (int) ($capabilities['max_group_sizes'] ?? 0); $maxBudgetRanges = (int) ($capabilities['max_budget_ranges'] ?? 0); $photoCount = $listing->photos->count(); $videoCount = $listing->videos->count(); $canAddMorePhotos = $photoCount < $maxPhotos; $canAddMoreVideos = $videoCount < $maxVideos; $canAddCoverageExtras = $maxZones > 1; $canPauseListing = $listing->canOwnerPause(); $canResumeListing = $listing->canOwnerResume(); $showReviewCta = $canSubmitForReview && $listingIssues === [] && $planIssues === []; $usesDraftPlaceholders = trim((string) $listing->title) === 'Nuevo anuncio' || trim((string) $listing->short_description) === 'Completa la informacion del anuncio' || $basePriceValue === null; $forcedInitialStep = session('force_listing_step'); $requestedInitialStep = request()->query('step'); $initialWizardStep = is_string($forcedInitialStep) && $forcedInitialStep !== '' ? $forcedInitialStep : (is_string($requestedInitialStep) && in_array($requestedInitialStep, ['basic', 'location', 'filters', 'contact', 'faqs', 'photos', 'videos', 'final', 'details', 'media'], true) ? $requestedInitialStep : ($listing->isPaymentPending() ? 'final' : '')); @endphp @if($editorMode)