prepare($retained_earnings_sql); $stmt_re->execute([':as_of_date' => $as_of_date]); $retained_earnings = $stmt_re->fetchColumn() ?: 0; // --- 2. Get Balances for Asset, Liability, and Equity Accounts --- $main_sql = <<prepare($main_sql); $stmt_main->execute([':as_of_date' => $as_of_date]); $report_lines = $stmt_main->fetchAll(PDO::FETCH_ASSOC); // --- 3. Structure the report and calculate totals --- $assets_total = 0; $liabilities_total = 0; $equity_total = 0; $assets = []; $liabilities = []; $equity = []; foreach ($report_lines as $line) { switch ($line['account_type']) { case 'asset': $assets[] = $line; $assets_total += $line['balance']; break; case 'liability': $liabilities[] = $line; $liabilities_total += $line['balance']; break; case 'equity': $equity[] = $line; $equity_total += $line['balance']; break; } } // Add retained earnings to equity section $equity_total += $retained_earnings; $total_liabilities_and_equity = $liabilities_total + $equity_total; echo json_encode([ 'success' => true, 'report_name' => 'Balance Sheet', 'generated_at' => date('c'), 'filters' => ['as_of_date' => $as_of_date], 'data' => [ 'assets' => $assets, 'liabilities' => $liabilities, 'equity' => array_merge($equity, [[ 'account_code' => '3999', 'account_name' => 'Retained Earnings', 'account_type' => 'equity', 'balance' => $retained_earnings ]]) ], 'summary' => [ 'total_assets' => $assets_total, 'total_liabilities' => $liabilities_total, 'total_equity' => $equity_total, 'total_liabilities_and_equity' => $total_liabilities_and_equity, 'is_balanced' => abs($assets_total - $total_liabilities_and_equity) < 0.0001 ] ]); } catch (PDOException $e) { http_response_code(500); echo json_encode([ 'success' => false, 'error' => 'Database error: ' . $e->getMessage() ]); }