@extends('layouts.internal') @section('title', $submission->business_name.' · PLOCAL Internal') @section('content') ← Business Submissions

Business Submission · {{ $submission->category_name }}

{{ $submission->business_name }}

{{ $submission->submitted_city_text }}, {{ $submission->submitted_state_text }} · Submitted {{ \Carbon\Carbon::parse($submission->submitted_at)->format('M j, Y · g:i A') }}

{{ str($submission->submission_status)->replace('_', ' ')->title() }}
@if($businessPublicId && $internalUser->isAdministrator() && $internalUser->hasPermission('internal.access'))

Business Portal & Public Profile

Manage the owner's portal invitation, account access, business info corrections, and public Profile visibility for this Business.

Open Business Portal management
@endif @if($hasPayment) @php($money = fn (?int $minor) => $minor === null ? 'Awaiting provider confirmation' : '$'.number_format(intdiv($minor, 100)).'.'.str_pad((string) ($minor % 100), 2, '0', STR_PAD_LEFT))

Evaluation Payment

@if($payment->payment_status === 'paid' && $payment->activation_status === 'active')Paid — Evaluation Active. Payment confirmation activated the 96-hour Evaluation; no Reviewer decision or Award outcome affects payment. @elseif($payment->payment_status === 'paid')Paid — Activation {{ str($payment->activation_status)->replace('_', ' ')->title() }}. Payment succeeded; Evaluation activation requires operational recovery and is not a payment failure. @elseif($payment->payment_status === 'refunded')Provider-confirmed Refunded. This financial state does not automatically alter the Evaluation, Profile, votes, score, or Awards. @elseif($payment->payment_status === 'partially_refunded')Provider-confirmed Partially Refunded. This financial state does not automatically alter the Evaluation or Recognition lifecycle. @elseif($payment->payment_status === 'disputed')Provider-confirmed Disputed. PLOCAL does not automatically unpublish or alter Evaluation/Recognition state from a dispute. @elseif($payment->payment_status === 'failed')Provider-authoritative Payment Failed. Evaluation activation has not started. @else Awaiting/processing payment ({{ str($payment->payment_status)->replace('_', ' ')->title() }}). Evaluation begins only after provider confirmation and successful activation. @endif

Evaluation fee
{{ $money((int) $payment->base_amount_minor) }} {{ strtoupper($payment->currency) }}
Provider-confirmed tax
{{ $money($payment->tax_amount_minor === null ? null : (int) $payment->tax_amount_minor) }}
Provider-confirmed total
{{ $money($payment->total_amount_minor === null ? null : (int) $payment->total_amount_minor) }}
Financial state
{{ str($payment->payment_status)->replace('_', ' ')->title() }}
Activation state
{{ str($payment->activation_status)->replace('_', ' ')->title() }}
Paid at
{{ $payment->paid_at ? \Carbon\Carbon::parse($payment->paid_at)->format('M j, Y · g:i A') : 'Not confirmed' }}
Activated at
{{ $payment->activated_at ? \Carbon\Carbon::parse($payment->activated_at)->format('M j, Y · g:i A') : 'Not active' }}
Refunded amount
{{ $money((int) $payment->refunded_amount_minor) }}
Remaining after refund
{{ $payment->total_amount_minor === null ? 'Awaiting provider total' : $money(max(0, (int) $payment->total_amount_minor - (int) $payment->refunded_amount_minor)) }}
Dispute
{{ $payment->dispute_status ? str($payment->dispute_status)->replace('_', ' ')->title() : 'None reported' }}

Safe Stripe references

Checkout Session
{{ $payment->provider_checkout_session_id ?: 'Not recorded' }}
PaymentIntent
{{ $payment->provider_payment_intent_id ?: 'Not recorded' }}
@if($canRetryActivation)
@csrf

This re-verifies provider-confirmed Paid state and reuses the authoritative idempotent activation service. It cannot mark a payment paid or create another charge.

@endif @if($providerEvents)

Provider event history

@foreach($providerEvents as $event)@endforeach
Safe Stripe event history
EventStripe event referenceProcessingReceived
{{ $event->event_type }}{{ $event->provider_event_id }}{{ str($event->processing_state)->title() }}{{ \Carbon\Carbon::parse($event->received_at)->format('M j, Y · g:i A') }}
@endif @if($financialObservations)

Refund/dispute observations

@endif

Stripe Dashboard remains a valid refund/dispute workspace. The narrow Administrator action below can request an approved full refund through Stripe; there is still no mark-paid, editable amount/currency, arbitrary partial refund, or provider-reference override.

@if($internalUser->isAdministrator() && $internalUser->hasPermission('payments.refund'))

Administrator full-refund operation

Business / Submission
{{ $submission->business_name }} · {{ $submission->public_id }}
Provider-confirmed total
{{ $money($payment->total_amount_minor === null ? null : (int) $payment->total_amount_minor) }} {{ strtoupper($payment->currency) }}
Evaluation lifecycle
{{ $evaluationStarted ? '96-hour Evaluation started' : 'Evaluation not started' }}
Current refund state
{{ str($payment->payment_status)->replace('_', ' ')->title() }} · {{ $money((int) $payment->refunded_amount_minor) }} observed refunded
@if($refundOperation)

Operation {{ $refundOperation->public_id }}: {{ str($refundOperation->operation_status)->replace('_', ' ')->title() }}@if($refundOperation->provider_refund_id) · Stripe Refund {{ $refundOperation->provider_refund_id }}@endif. Signed provider events remain the authority that changes financial state.

@endif @if($canInitiateRefund)
@csrf
Required for duplicate, service-not-provided, legally required and other exceptional grounds. Do not use score, Award or Business dissatisfaction as a reason.
Required for duplicate-charge approval. Do not infer duplication from name, email, card or IP.
@else

No new in-app refund is available for this state. Fully/partially refunded payments and active disputes require Stripe review; a provider-accepted/reconciled operation cannot be submitted again.

@endif @endif
@endif

Business details

DBA / public name
{{ $submission->dba_name ?: 'Not provided' }}
Website
{{ $submission->website_url }}
Service areas
{{ $submission->submitted_service_area_text ?: 'Not provided' }}
Main services
{{ $submission->main_services_text }}
License
{{ $submission->license_number ? $submission->license_number.' ('.$submission->license_state_authority.')' : 'Not provided' }}
Business phone / email
{{ $submission->phone }} · {{ $submission->email }}
Description
{{ $submission->business_description }}
@if(count($onlineProfiles))

Online profiles

@endif @if(count($features))

Business features

{{ collect($features)->map(fn($f) => str($f)->replace('_',' ')->title())->join(', ') }}

@endif

Submitter

Name / role
{{ $submission->submitter_name }} — {{ str($submission->submitter_role)->replace('_',' ')->title() }}
Contact
{{ $submission->submitter_email }} @if($submission->submitter_phone) · {{ $submission->submitter_phone }} @endif
@if($submission->submitter_notes)
Notes
{{ $submission->submitter_notes }}
@endif

Website screenshot

@if($screenshot)Submitted website screenshot for {{ $submission->business_name }}

{{ $screenshot->pixel_width }}×{{ $screenshot->pixel_height }}px · {{ number_format($screenshot->byte_size / 1024, 1) }}KB · JPG

@else

No screenshot on file.

@endif
@if($canClaim)
@csrf
@elseif(!$hasPayment && $review === null)

This is a historical/pre-cutover Submission with no PLOCAL Evaluation payment on file.

@elseif($review)

Review status: {{ str($review->review_status)->replace('_',' ')->title() }}

{{ $hasPayment ? 'Evaluation intake & verification' : 'Eligibility review (legacy)' }}

{{ $hasPayment ? 'The six intake/verification checks are evidence recorded during the already-active, already-paid Evaluation — they never gate or reverse the purchase.' : 'Mirrors the six fixed eligibility checks from the owner submission calculator.' }}

@if($canAct)
@csrf
{{ $hasPayment ? 'Intake / verification checks' : 'Eligibility checks' }} @foreach(['website_live_accessible' => 'Website is live and accessible', 'business_information_complete' => 'Business information is complete', 'category_eligible' => 'Category is eligible', 'location_service_area_clear' => 'Location / service area is clear', 'screenshot_meets_requirements' => 'Screenshot meets requirements', 'no_misleading_fraudulent_information' => 'No misleading or fraudulent information'] as $column => $label) @endforeach
Internal only; never shown publicly or to the submitter.
@if(!$hasPayment) {{-- Legacy, pre-cutover Accept/Reject: only reachable for a genuinely historical Submission with no evaluation_payments row at all. DecideSubmissionReview itself independently fails closed for any Submission with a payment aggregate, regardless of what this view renders. --}}
@csrf
@csrf
@endif @else

This review was already decided{{ $review->reviewed_at ? ' on '.\Carbon\Carbon::parse($review->reviewed_at)->format('M j, Y · g:i A') : '' }}.@if($review->decision_reason) Reason: {{ $review->decision_reason }}@endif

@endif
@endif @endsection