[], 'payments' => [], 'invoice_map' => [], 'summary' => [ 'invoices_count' => 0, 'total_amount' => 0.0, 'paid_amount' => 0.0, 'balance' => 0.0, 'positive_unpaid_balance' => 0.0, 'credit_balance' => 0.0, ], ]; } $invRows = DB::table('invoices') ->select('id', 'parent_id', 'invoice_number', 'status', 'total_amount', 'paid_amount', 'balance', 'issue_date', 'due_date') ->whereIn('parent_id', $parentIds) ->when($schoolYear !== '', fn ($query) => $query->where('school_year', $schoolYear)) ->orderBy('issue_date', 'DESC') ->get() ->map(fn ($r) => (array) $r) ->all(); $invoiceMap = []; $summary = [ 'invoices_count' => 0, 'total_amount' => 0.0, 'paid_amount' => 0.0, 'balance' => 0.0, 'positive_unpaid_balance' => 0.0, 'credit_balance' => 0.0, ]; foreach ($invRows as $ir) { $invoiceMap[(int) ($ir['id'] ?? 0)] = (string) ($ir['invoice_number'] ?? ''); $balance = (float) ($ir['balance'] ?? 0); $summary['invoices_count']++; $summary['total_amount'] += (float) ($ir['total_amount'] ?? 0); $summary['paid_amount'] += (float) ($ir['paid_amount'] ?? 0); $summary['balance'] += $balance; if ($balance > 0) { $summary['positive_unpaid_balance'] += $balance; } elseif ($balance < 0) { $summary['credit_balance'] += abs($balance); } } $payRows = DB::table('payments as p') ->join('invoices as i', 'i.id', '=', 'p.invoice_id') ->select('p.id', 'p.parent_id', 'p.invoice_id', 'p.paid_amount', 'p.balance', 'p.payment_method', 'p.payment_date', 'p.status') ->whereIn('p.parent_id', $parentIds) ->when($schoolYear !== '', fn ($query) => $query->where('i.school_year', $schoolYear)) ->orderBy('p.payment_date', 'DESC') ->limit($paymentLimit) ->get() ->map(fn ($r) => (array) $r) ->all(); return [ 'invoices' => $invRows, 'payments' => $payRows, 'invoice_map' => $invoiceMap, 'summary' => $summary, ]; } }