diff --git a/Modules/ApprovalWorkflow/app/Http/Controllers/ApprovalController.php b/Modules/ApprovalWorkflow/app/Http/Controllers/ApprovalController.php index 3366d95..7a8838c 100644 --- a/Modules/ApprovalWorkflow/app/Http/Controllers/ApprovalController.php +++ b/Modules/ApprovalWorkflow/app/Http/Controllers/ApprovalController.php @@ -122,9 +122,21 @@ class ApprovalController extends Controller $totalCost = $materialsCost + $laborCost + $equipmentCost; } + $chainNotes = $approvalChain->notes + ?? $approvalChain->steps->whereNotNull('notes')->filter(fn ($s) => trim($s->notes) !== '')->last()?->notes + ?? $approvalChain->approvable?->notes + ?? $approvalChain->approvable?->description + ?? $approvalChain->approvable?->remarks + ?? $approvalChain->approvable?->reason + ?? $approvalChain->approvable?->justification; + + if (empty($approvalChain->notes) && $chainNotes) { + $approvalChain->notes = $chainNotes; + } + $breakdownData = [ - 'document_number' => $approvalChain->approvable->document_number - ?? $approvalChain->approvable->po_number + 'document_number' => $approvalChain->approvable?->document_number + ?? $approvalChain->approvable?->po_number ?? ($approvalChain->approvable instanceof \Modules\FinancialManagement\Models\FinancialInvoice ? $approvalChain->approvable->invoice_number : null) ?? ($approvalChain->approvable instanceof \Modules\ProjectManagement\Models\Project ? $approvalChain->approvable->code : null), 'total_cost' => $approvalChain->approvable instanceof \Modules\FinancialManagement\Models\FinancialInvoice @@ -133,9 +145,7 @@ class ApprovalController extends Controller 'retention_amount' => $approvalChain->approvable instanceof \Modules\FinancialManagement\Models\FinancialInvoice ? $approvalChain->approvable->retention_amount : null, - 'notes' => $approvalChain->approvable->notes - ?? ($approvalChain->approvable instanceof \Modules\FinancialManagement\Models\FinancialInvoice ? $approvalChain->approvable->notes : null) - ?? ($approvalChain->approvable instanceof \Modules\ProjectManagement\Models\Project ? $approvalChain->approvable->description : null), + 'notes' => $chainNotes ?? 'None', ]; } diff --git a/Modules/ApprovalWorkflow/resources/js/Components/ApprovableBreakdown.tsx b/Modules/ApprovalWorkflow/resources/js/Components/ApprovableBreakdown.tsx index 1cf50ed..4d28e27 100644 --- a/Modules/ApprovalWorkflow/resources/js/Components/ApprovableBreakdown.tsx +++ b/Modules/ApprovalWorkflow/resources/js/Components/ApprovableBreakdown.tsx @@ -24,7 +24,7 @@ export default function ApprovableBreakdown({ chain, breakdownData }: Props) { details = [ { label: 'Document Number', value: breakdownData.document_number || `REQ-${approvable.id}` }, { label: 'Total Cost', value: breakdownData.total_cost != null ? `₱${parseFloat(breakdownData.total_cost).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : 'N/A' }, - { label: 'Notes', value: breakdownData.notes || 'None' }, + { label: 'Notes', value: breakdownData.notes || chain.notes || 'None' }, ]; break; case 'Modules\\MaterialLogistics\\Models\\PurchaseOrder': @@ -34,7 +34,7 @@ export default function ApprovableBreakdown({ chain, breakdownData }: Props) { details = [ { label: 'PO Number', value: breakdownData.document_number || `PO-${approvable.id}` }, { label: 'Total Amount', value: breakdownData.total_cost != null ? `₱${parseFloat(breakdownData.total_cost).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : 'N/A' }, - { label: 'Notes', value: breakdownData.notes || 'None' }, + { label: 'Notes', value: breakdownData.notes || chain.notes || 'None' }, ]; break; case 'Modules\\ProjectManagement\\Models\\Project': @@ -44,7 +44,7 @@ export default function ApprovableBreakdown({ chain, breakdownData }: Props) { details = [ { label: 'Project Code', value: breakdownData.document_number || approvable.code || 'N/A' }, { label: 'Total Estimated Cost', value: breakdownData.total_cost != null ? `₱${parseFloat(breakdownData.total_cost).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : 'N/A' }, - { label: 'Description', value: breakdownData.notes || 'None' }, + { label: 'Notes / Description', value: breakdownData.notes || chain.notes || 'None' }, ]; break; case 'Modules\\FinancialManagement\\Models\\FinancialInvoice': @@ -55,7 +55,7 @@ export default function ApprovableBreakdown({ chain, breakdownData }: Props) { { label: 'Invoice Number', value: breakdownData.document_number || approvable.invoice_number || 'N/A' }, { label: 'Invoice Total', value: breakdownData.total_cost != null ? `₱${Number(breakdownData.total_cost).toLocaleString(undefined, { minimumFractionDigits: 2 })}` : 'N/A' }, { label: 'Retention Held', value: breakdownData.retention_amount != null ? `₱${Number(breakdownData.retention_amount).toLocaleString(undefined, { minimumFractionDigits: 2 })}` : '₱0.00' }, - { label: 'Notes', value: breakdownData.notes || 'Progress billing invoice' }, + { label: 'Notes', value: breakdownData.notes || chain.notes || 'Progress billing invoice' }, ]; break; default: diff --git a/Modules/ApprovalWorkflow/resources/js/Pages/Approvals/Show.tsx b/Modules/ApprovalWorkflow/resources/js/Pages/Approvals/Show.tsx index 20b4900..f8ea6a9 100644 --- a/Modules/ApprovalWorkflow/resources/js/Pages/Approvals/Show.tsx +++ b/Modules/ApprovalWorkflow/resources/js/Pages/Approvals/Show.tsx @@ -103,12 +103,12 @@ export default function Show({ chain, breakdownData }: Props) { )} - {chain.notes && ( -
Notes
-{chain.notes}
-Notes / Justification
++ {chain.notes || breakdownData?.notes || 'None'} +
+No activities added yet.
} diff --git a/Modules/DailyReports/resources/js/Pages/Show.tsx b/Modules/DailyReports/resources/js/Pages/Show.tsx index cfda0f3..298d7b4 100644 --- a/Modules/DailyReports/resources/js/Pages/Show.tsx +++ b/Modules/DailyReports/resources/js/Pages/Show.tsx @@ -16,6 +16,7 @@ import { } from 'lucide-react'; import { Badge } from '@/Components/ui/badge'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/Components/ui/table"; +import TaskEvidenceUploader from '@/Components/TaskEvidenceUploader'; export default function Show({ report }: any) { const project = report.project; @@ -271,8 +272,20 @@ export default function Show({ report }: any) {Record payment sent to contractor. Contractor must confirm receipt to finalize payment analytics.
+Please verify receipt of {formatCurrency(invoice.total_amount)} and confirm payment receipt to update dashboard totals.
+Progress
{Number(invoice.billed_percentage).toFixed(1)}%
Manage labor records, categories, capability skillsets, and hourly rates
+Manage single labor trade profiles, skill dictionary, and predefined activity crew bundles