@extends('layouts.app') @section('title', 'PC Forms') @push('stylesheets') @include('partials.index-datatable-styles') @include('partials.filter-card-styles') @include('workflow.partials.note-sheet-styles') @include('workflow.partials.note-sheet-styles') @include('pc-forms.partials.details-modal-styles') @include('schemes.partials.plan-scheme-selection-surface-styles') @include('partials.pc-type-selection-modal-styles') @endpush @section('contents') @php $isDraftIndexView = strtolower((string) request('state')) === 'draft'; $viewerRoleSlug = strtolower((string) (optional(auth()->user()->role)->slug ?? '')); $isPndRoleViewer = $viewerRoleSlug === 'pnd'; // PnD: Received Date still shown. Column: generate flags, create-meeting flags, or PC approve (view). // Generate still uses can_generate_mws_working_paper_type (PDWP → Can Generate PDWP WP & MoM). // Create-PDWP users still see the column so they can View an already-generated paper. $mwsWpCreateTypes = mws_allowed_scheme_meeting_create_types(); $canCreateAnySchemeMeeting = ! empty($mwsWpCreateTypes['pre_pdwp']) || ! empty($mwsWpCreateTypes['pdwp']) || ! empty($mwsWpCreateTypes['ddwp']); $canGenerateAnyWorkingPaper = can_generate_mws_working_paper_type('pre-pdwp') || can_generate_mws_working_paper_type('pdwp') || can_generate_mws_working_paper_type('ddwp'); $showWorkingPaperColumn = can('pc-forms', 'can_approve') || $canGenerateAnyWorkingPaper || $canCreateAnySchemeMeeting; $canApprovePcFormsForWp = can('pc-forms', 'can_approve'); // Same gates as listing JS typeAllowedToView — View only for types the user may open. $pciWpViewableTypes = [ 'pre-pdwp' => $canApprovePcFormsForWp || can_generate_mws_working_paper_type('pre-pdwp') || can_create_mws_scheme_meeting_type('pre-pdwp'), 'pdwp' => $canApprovePcFormsForWp || can_generate_mws_working_paper_type('pdwp') || can_create_mws_scheme_meeting_type('pdwp'), 'ddwp' => $canApprovePcFormsForWp || can_generate_mws_working_paper_type('ddwp') || can_create_mws_scheme_meeting_type('ddwp'), ]; // Same scheme states as Meeting Workspace subject catalog (eligible for Pre-PDWP / PDWP / DDWP). $pciWpGenerateEligibleStates = [\App\Models\PC\PcForm::STATE_APPROVING]; if (\App\Services\PC\MwsSchemeMeetingWorkflowHelper::userMayScheduleDdwpAsDepartmentApprover(auth()->user())) { $pciWpGenerateEligibleStates[] = \App\Models\PC\PcForm::STATE_DEPARTMENT_APPROVAL_PENDING; } $showReceivedDateColumn = can('pc-forms', 'can_check') || can('pc-forms', 'can_department_approve') || can('pc-forms', 'can_approve') || $isPndRoleViewer; $pcIndexHeaders = ['ADP #', 'UID', 'Schemes']; $pcSortColumns = ['projects.adp_number', 'projects.code', 'projects.name']; if ($showWorkingPaperColumn) { $pcIndexHeaders[] = 'Working paper'; $pcSortColumns[] = null; } $pcIndexHeaders[] = 'Status'; $pcSortColumns[] = 'pc_forms.state'; if (! $isDraftIndexView) { if ($showReceivedDateColumn) { $pcIndexHeaders[] = 'Received Date'; $pcSortColumns[] = 'pc_forms.created_at'; } $pcIndexHeaders[] = 'Submission Date'; $pcSortColumns[] = 'pc_forms.submitted_at'; } $pciPcIndexHeaderAction = ''; if (can('pc-forms', 'add')) { $pciPcIndexHeaderAction = ''; } $pciDeptApproverListingOnly = can('pc-forms', 'can_department_approve') && ! can('pc-forms', 'can_check'); $pciPcIndexHeaderToolbar = $pciDeptApproverListingOnly ? 'You see PCs only after required checker reviews are complete.' : null; @endphp
@include('pc-forms.partials.index-filter-form', [ 'schemeFilterCatalog' => $schemeFilterCatalog ?? [], 'pcFormsFilterRows' => $pcFormsFilterRows ?? [], 'pcFormsFilterPreserveQuery' => $pcFormsFilterPreserveQuery ?? [], ])
{!! $pcForms->appends($pcFormsIndexQueryForLinks ?? [])->links('pc-forms.partials.index-pagination') !!} @foreach ($pcForms as $form) @php $displayState = $form->display_state ?? $form->state; $isSuperAdmin = (bool) (auth()->user()->is_superadmin ?? false); // Linked shadow drafts are gone; rejected main rows are never deletable here. $canDelete = can('pc-forms', 'delete') && ($isSuperAdmin ? in_array($displayState, ['draft'], true) : $displayState === 'draft'); $isDraft = $displayState === 'draft'; $isStandaloneDraft = ($form->is_standalone_draft ?? false) || (string) ($form->state ?? '') === \App\Models\PC\PcForm::STATE_DRAFT; $latestDraft = null; $projectDisplayName = $form->project ? $form->project->name : '—'; $_adpRaw = $form->project ? trim((string) ($form->project->adp_number ?? '')) : ''; $_adpNorm = strtolower(preg_replace('/\s+/u', '', $_adpRaw) ?? ''); $_adpInvalid = $_adpRaw === '' || in_array($_adpNorm, ['nan', 'n/a', 'na', '—', '-'], true) || ! preg_match('/^[0-9]+(\.[0-9]*)?$/', $_adpRaw); $schemeAdpOrderStr = $_adpInvalid ? '999999999999999' : (string) (0 + $_adpRaw); $schemeAdpDisplay = $form->project ? ($form->project->adp_number ?? '—') : '—'; $schemeUidDisplay = $form->project ? ($form->project->code ?? '—') : '—'; $pcListStateLabel = (string) ($form->workflow_state_label ?? match ((string) $displayState) { 'draft' => 'Draft', 'rejected' => 'Deferred', 'requested' => 'Forwarded for Checking', 'department_approval_pending' => 'Forwarded for Approval', 'under approval' => 'Forwarded to P&D', default => ucfirst((string) ($displayState ?? '—')), }); $pcListStatusBadgeLabel = $pcListStateLabel; $pcListStatusBadgeClass = match ((string) $displayState) { 'approved' => 'success', 'rejected' => 'danger', 'draft' => 'secondary', default => 'warning', }; $showPcModifiedLabel = false; $showPcRevisedLabel = false; $pcModifiedLabelTitle = 'Resubmitted after deferral'; $pcRevisedLabel = 'Revised'; $pcRevisedLabelTitle = 'PC revision'; if ((! $isStandaloneDraft && ! $isDraft) || ($form->post_approval_revision_workspace ?? false)) { if ($form->is_modified ?? false) { $showPcModifiedLabel = true; $pcModifiedLabelTitle = $displayState === 'rejected' ? 'Deferred — modified resubmission expected' : 'Resubmitted after deferral'; } if (($form->is_revised ?? false) || ($form->post_approval_revision_workspace ?? false)) { $showPcRevisedLabel = true; if ($form->post_approval_revision_workspace ?? false) { $pcRevisedLabelTitle = 'Post-approval revision workspace'; if ($isDraft) { $pcRevisedLabel = 'Revised'; } } elseif ($form->parent_id) { $chainPos = $form->revision_chain_position ?? null; if ($chainPos !== null) { $pcRevisedLabel = 'Versions ('.$chainPos.')'; $pcRevisedLabelTitle = 'PC versions in chain'; } } } } // For main table records show main record date; for draft-only rows show draft date $displayCreatedAt = $isStandaloneDraft ? $form->created_at : ($latestDraft ? $latestDraft->created_at : $form->created_at); $receivedDateAt = $form->received_date_at ?? null; $submissionDateAt = $form->submission_date_at ?? null; if ($isStandaloneDraft) { $editUrl = route('pc-forms.edit', $form->id); $detailsUrl = route('pc-forms.show', $form->id); $deleteUrl = $canDelete ? route('pc-forms.draft.destroy', $form->id) : null; $useChairRows = false; } else { $pcFormMayEdit = app(\App\Services\PC\PcFormService::class)->userMayEditMainForm($form); $editUrl = $pcFormMayEdit ? route('pc-forms.edit', $form->id) : ''; $deleteUrl = $canDelete ? route('pc-forms.destroy', $form->id) : null; $detailsQuery = []; // Linked PcFormDraft overlay removed; edit the main form only. $chairRows = $form->chairman_pc_index_rows ?? null; $useChairRows = is_array($chairRows) && count($chairRows) > 0; } $hidePcListApproveRejectDataUrls = auth()->check() && strtolower((string) (auth()->user()->role?->slug ?? '')) === 'pnd' && ! can('pc-forms', 'can_approve') && ! $isStandaloneDraft && (string) $displayState === 'under approval'; $isAdvanceCopyViewOnly = ! $isStandaloneDraft && (bool) ($form->advance_copy_view_only ?? false); $advanceCopyPreviewUrl = $isAdvanceCopyViewOnly ? route('pc-forms.advance-copy-preview', $form->id) : null; @endphp @if ($useChairRows) @php // Forwarded-chairman viewers: one consolidated row per PC form (chairmanForwardIndexRowsForPcForm is ordered by review id asc; latest = primary modal context). $chairRowCtx = $chairRows[array_key_last($chairRows)]; $rowDetailsQuery = $detailsQuery; $rowDetailsQuery['chairman_forward_review_id'] = $chairRowCtx['review_id']; $detailsUrl = route('pc-forms.show', $form->id) . '?' . http_build_query($rowDetailsQuery); $chairForwardRowCount = count($chairRows); @endphp {{ $schemeAdpDisplay }} {{ $schemeUidDisplay }} @if (!empty($chairRowCtx['row_label'] ?? ''))
{{ $chairRowCtx['row_label'] }}
@endif @if ($chairForwardRowCount > 1)
{{ $chairForwardRowCount - 1 }} older meeting forward{{ ($chairForwardRowCount - 1) === 1 ? '' : 's' }} · details use latest
@endif
@if($showWorkingPaperColumn) @php $hasWorkpaper = isset($form->workpaper) && trim((string) $form->workpaper) !== ''; $submittedWpList = $form->submitted_working_papers ?? collect(); $hasSubmittedStructuredWp = $submittedWpList->isNotEmpty(); $schemeEligibleForWpGenerate = in_array((string) ($form->state ?? ''), $pciWpGenerateEligibleStates, true); $canGenerateWpForRow = ! empty($canGenerateAnyWorkingPaper) && $schemeEligibleForWpGenerate; $wpViewUrlsForPicker = []; foreach ($submittedWpList as $swp) { $wpType = (string) ($swp['type'] ?? ''); if ($wpType !== '' && ! empty($swp['id'] ?? null) && ! empty($pciWpViewableTypes[$wpType])) { $wpViewUrlsForPicker[$wpType] = route('working-papers.edit', ['type' => $wpType, 'id' => $swp['id']]); } } $hasAccessibleStructuredWp = $wpViewUrlsForPicker !== []; $hasAccessibleLegacyWp = $hasWorkpaper && ! $hasSubmittedStructuredWp && ( ! empty($pciWpViewableTypes['pre-pdwp']) || ! empty($pciWpViewableTypes['pdwp']) || ! empty($pciWpViewableTypes['ddwp']) ); $hasViewableWp = $hasAccessibleStructuredWp || $hasAccessibleLegacyWp; $wpAllowsNewByType = is_array($form->working_paper_allows_new_by_type ?? null) ? $form->working_paper_allows_new_by_type : []; $canCreateNewWpForRow = $canGenerateWpForRow && ! empty($form->working_paper_allows_new); @endphp @if($hasViewableWp) View @elseif($canGenerateWpForRow && $canCreateNewWpForRow) Generate @else — @endif @endif @include('pc-forms.partials.index-listing-state-status-cells') @if(! $isDraftIndexView) @if($showReceivedDateColumn) {{ (!$isDraft && !$isStandaloneDraft) ? ($receivedDateAt?->format('d M Y h:i A') ?? '—') : '—' }} @endif {{ (!$isDraft && !$isStandaloneDraft) ? ($submissionDateAt?->format('d M Y h:i A') ?? '—') : '—' }} @endif @else @php if (!$isStandaloneDraft) { $detailsUrl = route('pc-forms.show', $form->id); if (!empty($detailsQuery)) { $detailsUrl .= '?' . http_build_query($detailsQuery); } } @endphp {{ $schemeAdpDisplay }} {{ $schemeUidDisplay }} @if ($advanceCopyPreviewUrl)
Advance copy preview
@else @endif @if($showWorkingPaperColumn) @if($isStandaloneDraft) — @else @php $hasWorkpaper = isset($form->workpaper) && trim((string) $form->workpaper) !== ''; $submittedWpList = $form->submitted_working_papers ?? collect(); $hasSubmittedStructuredWp = $submittedWpList->isNotEmpty(); $schemeEligibleForWpGenerate = in_array((string) ($form->state ?? ''), $pciWpGenerateEligibleStates, true); $canGenerateWpForRow = ! empty($canGenerateAnyWorkingPaper) && $schemeEligibleForWpGenerate; $wpViewUrlsForPicker = []; foreach ($submittedWpList as $swp) { $wpType = (string) ($swp['type'] ?? ''); if ($wpType !== '' && ! empty($swp['id'] ?? null) && ! empty($pciWpViewableTypes[$wpType])) { $wpViewUrlsForPicker[$wpType] = route('working-papers.edit', ['type' => $wpType, 'id' => $swp['id']]); } } $hasAccessibleStructuredWp = $wpViewUrlsForPicker !== []; $hasAccessibleLegacyWp = $hasWorkpaper && ! $hasSubmittedStructuredWp && ( ! empty($pciWpViewableTypes['pre-pdwp']) || ! empty($pciWpViewableTypes['pdwp']) || ! empty($pciWpViewableTypes['ddwp']) ); $hasViewableWp = $hasAccessibleStructuredWp || $hasAccessibleLegacyWp; $wpAllowsNewByType = is_array($form->working_paper_allows_new_by_type ?? null) ? $form->working_paper_allows_new_by_type : []; $canCreateNewWpForRow = $canGenerateWpForRow && ! empty($form->working_paper_allows_new); @endphp @if($hasViewableWp) View @elseif($canGenerateWpForRow && $canCreateNewWpForRow) Generate @else — @endif @endif @endif @include('pc-forms.partials.index-listing-state-status-cells') @if(! $isDraftIndexView) @if($showReceivedDateColumn) {{ (!$isDraft && !$isStandaloneDraft) ? ($receivedDateAt?->format('d M Y h:i A') ?? '—') : '—' }} @endif {{ (!$isDraft && !$isStandaloneDraft) ? ($submissionDateAt?->format('d M Y h:i A') ?? '—') : '—' }} @endif @endif @endforeach
@include('pc-forms.partials.details-modal-shell') @endsection @push('scripts') @include('workflow.partials.note-sheet-scripts') @if (session()->has('success') || session()->has('warning') || session()->has('error') || request()->query('draft_saved') === '1') @endif @include('partials.index-datatable-scripts') @include('pc-forms.partials.details-modal-scripts') @include('meeting-workspace.partials.mws-schedule-meeting-type-picker-script') @if (can('pc-forms', 'add')) @endif @endpush