@php $progress = $workOrder->checklistProgress(); $completed = $workOrder->checklistCompleted(); $evidenceRules = is_array($workOrder->evidence_rules) ? $workOrder->evidence_rules : []; $riskFlags = is_array($workOrder->risk_flags) ? $workOrder->risk_flags : []; $changeReasonCodes = \App\Models\WorkOrderChangeRequest::REASON_CODES; $contactEventTypes = \App\Models\WorkOrderContactEvent::EVENT_TYPES; $disputeReasonCodes = \App\Models\Dispute::REASON_CODES; @endphp Print packet
{{ str_replace('_', ' ', $workOrder->status) }}

Buyer: {{ $workOrder->buyer->buyerProfile?->company_name ?? $workOrder->buyer->name }} | Provider: {{ $workOrder->provider->providerProfile?->business_name ?? $workOrder->provider->name }}

Scheduled: {{ $workOrder->scheduled_at?->format('M j, Y g:i A') ?? 'Not set' }}

Window: {{ $workOrder->appointment_window ?: 'Not set' }}

Agreed terms

{{ $workOrder->agreed_terms ?: 'No agreed terms recorded.' }}

Required evidence

{{ $workOrder->required_evidence ?: 'No specific evidence requirements recorded.' }}

@if ($evidenceRules)
@foreach ($evidenceRules as $rule) {{ $rule }} @endforeach
@endif

Scope and support safeguards

Structured scope governs the work order. Supplemental instructions cannot create undefined onsite obligations.

Scope {{ str_replace('_', ' ', $workOrder->scope_clarity_status) }} @if ($workOrder->contactSnapshotValue('contact_certified')) Support certified @else Support not certified @endif
@if ($riskFlags)
@foreach ($riskFlags as $flag) {{ str_replace('_', ' ', $flag) }} @endforeach
@endif
Primary objective
{{ $workOrder->scopeSnapshotValue('primary_objective') ?: $workOrder->jobPost->scope }}
Expected duration
{{ $workOrder->scopeSnapshotValue('expected_duration') ?: 'Not specified' }}
Included work
{{ $workOrder->scopeSnapshotValue('included_work') ?: 'Not specified' }}
Excluded work
{{ $workOrder->scopeSnapshotValue('excluded_work') ?: 'Not specified' }}
Maximum onsite expectations
{{ $workOrder->scopeSnapshotValue('maximum_onsite_expectations') ?: 'Not specified' }}
Closeout conditions
{{ $workOrder->scopeSnapshotValue('closeout_conditions') ?: 'Not specified' }}

Certified contact path

Primary
{{ $workOrder->contactSnapshotValue('primary_contact_name') ?: 'Not set' }}
{{ $workOrder->contactSnapshotValue('primary_contact_phone') }} {{ $workOrder->contactSnapshotValue('primary_contact_email') }}
Backup
{{ $workOrder->contactSnapshotValue('backup_contact_name') ?: 'Not set' }}
{{ $workOrder->contactSnapshotValue('backup_contact_phone') }} {{ $workOrder->contactSnapshotValue('backup_contact_email') }}
Dispatch
{{ $workOrder->contactSnapshotValue('dispatch_contact_name') ?: 'Not set' }}
{{ $workOrder->contactSnapshotValue('dispatch_contact_phone') }} {{ $workOrder->contactSnapshotValue('dispatch_contact_email') }}
Technical bridge
{{ $workOrder->contactSnapshotValue('technical_bridge') ?: 'Not set' }}
Escalation
{{ $workOrder->contactSnapshotValue('escalation_contact') ?: 'Not set' }}
Support window
{{ $workOrder->contactSnapshotValue('support_availability_window') ?: 'Not set' }}
{{ $workOrder->contactSnapshotValue('support_channel') }} {{ $workOrder->contactSnapshotValue('support_expected_response_time') }}
@if (auth()->id() === $workOrder->buyer_id || auth()->user()->hasRole('admin'))

Work-order setup

@csrf @method('PATCH')
@foreach (['Arrival photo', 'Completion photo', 'Signed closeout'] as $rule) @endforeach
Save setup
@endif

Checklist and status

@csrf @method('PATCH')
@forelse ($workOrder->checklistItems() as $item) @empty

No checklist items have been defined yet.

@endforelse
Save status

Evidence and files

Attach photos, closeout forms, notes, screenshots, or other work evidence.

Change requests

@csrf
Record change request
@forelse ($workOrder->changeRequests() as $requestRecord)

{{ $requestRecord['summary'] }}

{{ $requestRecord['requested_by_name'] ?? 'User' }} | {{ $requestRecord['reason_label'] ?? 'Change' }} | {{ $requestRecord['status'] ?? 'open' }} | {{ $requestRecord['requested_at'] ?? '' }}

@if (! empty($requestRecord['details']))

{{ $requestRecord['details'] }}

@endif

Scope: {{ $requestRecord['scope_impact'] ?? 'Not specified' }}

Schedule: {{ $requestRecord['schedule_impact'] ?? 'Not specified' }}

Terms: {{ $requestRecord['terms_impact'] ?? 'Not specified' }}

@if (! empty($requestRecord['id']) && ($requestRecord['status'] ?? 'open') === 'open' && (auth()->id() !== ($requestRecord['requested_by_id'] ?? null) || auth()->user()->hasRole('admin')))
@csrf @method('PATCH') Update
@endif
@empty

No change requests yet.

@endforelse

Contact and support event log

@if (auth()->id() === $workOrder->provider_id || auth()->user()->hasRole('admin'))
@csrf
Log contact/support event @endif
@forelse ($workOrder->contactEvents as $event)

{{ $contactEventTypes[$event->event_type] ?? str_replace('_', ' ', $event->event_type) }}

{{ $event->user->name }} | {{ $event->attempted_at?->format('M j, Y g:i A') ?? $event->created_at->format('M j, Y g:i A') }} | {{ $event->attempted_channel ?: 'No channel' }} | {{ $event->result ?: 'No result' }}

@if ($event->notes)

{{ $event->notes }}

@endif
@empty

No contact/support events have been logged.

@endforelse

Messages

@csrf Send message @foreach ($workOrder->messages as $message)

{{ $message->user->name }} | {{ $message->created_at->diffForHumans() }}

{{ $message->body }}

@endforeach

Reviews

@php $reviewType = auth()->id() === $workOrder->buyer_id ? 'buyer_to_provider' : 'provider_to_buyer'; $definitions = config("reputation.definitions.$reviewType", []); $reviewFields = $reviewType === 'buyer_to_provider' ? [ 'communication_rating' => 'Communication', 'preparedness_rating' => 'Preparedness', 'workmanship_rating' => 'Workmanship', 'timeliness_rating' => 'Timeliness', 'closeout_quality_rating' => 'Closeout quality', 'professionalism_rating' => 'Professionalism', ] : [ 'communication_rating' => 'Communication', 'scope_accuracy_rating' => 'Scope accuracy', 'payment_reliability_rating' => 'Payment reliability', 'contact_availability_rating' => 'Contact availability', 'schedule_reasonableness_rating' => 'Schedule reasonableness', 'support_responsiveness_rating' => 'Support responsiveness', 'closeout_fairness_rating' => 'Closeout fairness', ]; $fieldDefinitionKeys = [ 'communication_rating' => 'communication', 'preparedness_rating' => 'preparedness', 'workmanship_rating' => 'workmanship', 'timeliness_rating' => 'timeliness', 'closeout_quality_rating' => 'closeout_quality', 'professionalism_rating' => 'professionalism', 'scope_accuracy_rating' => 'scope_accuracy', 'payment_reliability_rating' => 'payment_reliability', 'contact_availability_rating' => 'contact_availability', 'schedule_reasonableness_rating' => 'schedule_reasonableness', 'support_responsiveness_rating' => 'support_responsiveness', 'closeout_fairness_rating' => 'closeout_fairness', ]; @endphp

Transparent review rules

{{ $definitions['overall'] ?? 'Reviews stay five-star based and visible. Category scores explain the evidence instead of hiding it behind a platform score.' }}

Reviews can be edited for {{ config('reputation.review_edit_window_hours', 48) }} hours, responded to by the reviewee, and reported for moderation.

@csrf
@foreach ($reviewFields as $field => $label) @php $definitionKey = $fieldDefinitionKeys[$field] ?? null; @endphp
@if ($definitionKey && ! empty($definitions[$definitionKey]))

{{ $definitions[$definitionKey] }}

@endif
@endforeach
Save review @foreach ($workOrder->reviews as $review) @php $isHidden = $review->moderation_status === 'hidden'; $categoryValues = [ 'Communication' => $review->communication_rating, 'Preparedness' => $review->preparedness_rating, 'Scope' => $review->scope_accuracy_rating, 'Payment' => $review->payment_reliability_rating, 'Contact availability' => $review->contact_availability_rating, 'Schedule' => $review->schedule_reasonableness_rating, 'Support' => $review->support_responsiveness_rating, 'Closeout fairness' => $review->closeout_fairness_rating, 'Workmanship' => $review->workmanship_rating, 'Timeliness' => $review->timeliness_rating, 'Closeout quality' => $review->closeout_quality_rating, 'Professionalism' => $review->professionalism_rating, ]; $categoryLine = collect($categoryValues) ->filter(fn ($value) => $value !== null) ->map(fn ($value, $label) => "$label $value") ->implode(' | '); @endphp

{{ $review->reviewer->name }} rated {{ $review->reviewee->name }} {{ $review->rating }}/5

{{ str_replace('_', ' ', $review->review_type) }} | {{ $review->created_at->diffForHumans() }}

@if ($review->moderation_status === 'reported') Reported @elseif ($isHidden) Hidden @else Published @endif @if ($review->editableBy(auth()->user())) Editable @endif
@if ($isHidden && ! auth()->user()->hasRole('admin'))

This review is hidden pending moderation.

@else @if ($categoryLine)

{{ $categoryLine }}

@endif

{{ $review->body }}

@if ($review->response_body)

Response from {{ $review->reviewee->name }}

{{ $review->response_body }}

@elseif (auth()->id() === $review->reviewee_id || auth()->user()->hasRole('admin'))
@csrf Save response @endif @if (in_array(auth()->id(), [$review->reviewer_id, $review->reviewee_id], true) || auth()->user()->hasRole('admin'))
@csrf Report review @endif @endif
@endforeach

Community rating

Disputes / Peer Review

@csrf
Open dispute @foreach ($workOrder->disputes as $dispute) {{ $dispute->summary }} | {{ $dispute->status }} @endforeach