prepare(" SELECT COALESCE(SUM(CASE WHEN transaction_type = 'income' THEN amount ELSE 0 END), 0) AS income_total, COALESCE(SUM(CASE WHEN transaction_type = 'expense' THEN amount ELSE 0 END), 0) AS expense_total, COALESCE(SUM(CASE WHEN transaction_type = 'card_payment' THEN amount ELSE 0 END), 0) AS card_payment_total FROM transactions WHERE user_id = ? AND transaction_date BETWEEN ? AND ? "); $stmt->execute([$uid, $start, $end]); $summary = $stmt->fetch(); $stmt = $pdo->prepare(" SELECT COALESCE(SUM(CASE WHEN account_type IN ('bank','cash','other') THEN current_balance ELSE 0 END), 0) AS liquid_assets FROM accounts WHERE user_id = ? AND is_active = 1 "); $stmt->execute([$uid]); $assetSummary = $stmt->fetch(); $stmt = $pdo->prepare(" SELECT COALESCE(SUM(t.amount), 0) FROM transactions t JOIN accounts a ON a.id = t.account_id WHERE t.user_id = ? AND t.transaction_type = 'expense' AND a.account_type = 'card' AND a.card_kind = 'credit' AND t.billing_year_month = ? AND COALESCE(t.is_installment, 0) = 0 "); $stmt->execute([$uid, $ym]); $cardDueThisMonth = (float)$stmt->fetchColumn(); $stmt = $pdo->prepare(" SELECT COALESCE(SUM(t.amount), 0) FROM transactions t JOIN accounts a ON a.id = t.account_id WHERE t.user_id = ? AND t.transaction_type = 'expense' AND a.account_type = 'card' AND a.card_kind = 'credit' AND t.billing_year_month = ? AND COALESCE(t.is_installment, 0) = 0 "); $stmt->execute([$uid, $nextYm]); $cardDueNextMonth = (float)$stmt->fetchColumn(); $installmentDueNextMonth = get_installment_due_this_month($uid, $nextYm); $cardTotalDueNextMonth = $cardDueNextMonth + $installmentDueNextMonth; $installmentDueThisMonth = get_installment_due_this_month($uid, $ym); $installmentRemainingPrincipal = get_installment_remaining_principal($uid); $installmentRemainingInterest = get_installment_remaining_interest($uid); $installmentRemainingTotal = get_installment_remaining_total($uid); $cardTotalDueThisMonth = $cardDueThisMonth + $installmentDueThisMonth; $stmt = $pdo->prepare(" SELECT c.name, SUM(t.amount) AS total_amount FROM transactions t JOIN categories c ON t.category_id = c.id WHERE t.user_id = ? AND t.transaction_type = 'expense' AND t.transaction_date BETWEEN ? AND ? GROUP BY c.id, c.name ORDER BY total_amount DESC LIMIT 8 "); $stmt->execute([$uid, $start, $end]); $expenseByCategory = $stmt->fetchAll(); $stmt = $pdo->prepare(" SELECT DATE_FORMAT(transaction_date, '%d') AS day_num, COALESCE(SUM(CASE WHEN transaction_type = 'expense' THEN amount ELSE 0 END), 0) AS daily_expense FROM transactions WHERE user_id = ? AND transaction_date BETWEEN ? AND ? GROUP BY DATE_FORMAT(transaction_date, '%Y-%m-%d'), DATE_FORMAT(transaction_date, '%d') ORDER BY DATE_FORMAT(transaction_date, '%Y-%m-%d') ASC "); $stmt->execute([$uid, $start, $end]); $dailyRows = $stmt->fetchAll(); $stmt = $pdo->prepare(" SELECT * FROM accounts WHERE user_id = ? AND is_active = 1 ORDER BY FIELD(account_type, 'bank', 'card', 'cash', 'other'), id ASC "); $stmt->execute([$uid]); $accounts = $stmt->fetchAll(); $stmt = $pdo->prepare(" SELECT COALESCE(SUM(scheduled_principal), 0) AS due_principal, COALESCE(SUM(scheduled_interest), 0) AS due_interest, COALESCE(SUM(scheduled_total), 0) AS due_total FROM loan_schedules ls JOIN loans l ON l.id = ls.loan_id WHERE l.user_id = ? AND ls.is_paid = 0 AND ls.due_date BETWEEN ? AND ? "); $stmt->execute([$uid, $start, $end]); $loanDue = $stmt->fetch(); $stmt = $pdo->prepare(" SELECT COALESCE(SUM(scheduled_principal), 0) AS overdue_principal, COALESCE(SUM(scheduled_interest), 0) AS overdue_interest, COALESCE(SUM(scheduled_total), 0) AS overdue_total FROM loan_schedules ls JOIN loans l ON l.id = ls.loan_id WHERE l.user_id = ? AND ls.is_paid = 0 AND ls.due_date < ? "); $stmt->execute([$uid, $today]); $loanOverdue = $stmt->fetch(); $stmt = $pdo->prepare(" SELECT COALESCE(SUM(current_principal_balance), 0) AS remaining_principal FROM loans WHERE user_id = ? AND status = 'active' "); $stmt->execute([$uid]); $loanPrincipalRow = $stmt->fetch(); $stmt = $pdo->prepare(" SELECT COALESCE(SUM(CASE WHEN ls.is_paid = 0 THEN ls.scheduled_interest ELSE 0 END), 0) AS remaining_interest, COALESCE(SUM(CASE WHEN ls.is_paid = 0 THEN ls.scheduled_total ELSE 0 END), 0) AS remaining_total FROM loan_schedules ls JOIN loans l ON l.id = ls.loan_id WHERE l.user_id = ? AND l.status = 'active' "); $stmt->execute([$uid]); $loanRemaining = $stmt->fetch(); $stmt = $pdo->prepare(" SELECT DATE_FORMAT(payment_date, '%d') AS day_num, COALESCE(SUM(total_amount), 0) AS daily_loan_payment FROM loan_payments WHERE user_id = ? AND payment_date BETWEEN ? AND ? GROUP BY DATE_FORMAT(payment_date, '%Y-%m-%d'), DATE_FORMAT(payment_date, '%d') ORDER BY DATE_FORMAT(payment_date, '%Y-%m-%d') ASC "); $stmt->execute([$uid, $start, $end]); $loanPaymentRows = $stmt->fetchAll(); $stmt = $pdo->prepare(" SELECT l.loan_name, l.lender_name, ls.due_date, ls.scheduled_principal, ls.scheduled_interest, ls.scheduled_total FROM loan_schedules ls JOIN loans l ON l.id = ls.loan_id WHERE l.user_id = ? AND ls.is_paid = 0 AND ls.due_date BETWEEN ? AND ? ORDER BY ls.due_date ASC, l.id ASC LIMIT 10 "); $stmt->execute([$uid, $start, $end]); $loanUpcoming = $stmt->fetchAll(); $liquidAssets = (float)($assetSummary['liquid_assets'] ?? 0); $incomeTotal = (float)($summary['income_total'] ?? 0); $expenseTotal = (float)($summary['expense_total'] ?? 0); $cardPaymentTotal = (float)($summary['card_payment_total'] ?? 0); $loanDuePrincipal = (float)($loanDue['due_principal'] ?? 0); $loanDueInterest = (float)($loanDue['due_interest'] ?? 0); $loanDueTotal = (float)($loanDue['due_total'] ?? 0); $loanOverduePrincipal = (float)($loanOverdue['overdue_principal'] ?? 0); $loanOverdueInterest = (float)($loanOverdue['overdue_interest'] ?? 0); $loanOverdueTotal = (float)($loanOverdue['overdue_total'] ?? 0); $loanRemainingPrincipal = (float)($loanPrincipalRow['remaining_principal'] ?? 0); $loanRemainingInterest = (float)($loanRemaining['remaining_interest'] ?? 0); $loanRemainingTotal = (float)($loanRemaining['remaining_total'] ?? 0); $netCashFlow = $incomeTotal - $expenseTotal - $loanDueTotal; $categoryLabels = array_map(fn($r) => $r['name'], $expenseByCategory); $categoryValues = array_map(fn($r) => (float)$r['total_amount'], $expenseByCategory); $dayLabels = array_map(fn($r) => $r['day_num'] . '일', $dailyRows); $dayValues = array_map(fn($r) => (float)$r['daily_expense'], $dailyRows); $loanDayLabels = array_map(fn($r) => $r['day_num'] . '일', $loanPaymentRows); $loanDayValues = array_map(fn($r) => (float)$r['daily_loan_payment'], $loanPaymentRows); require __DIR__ . '/../app/views/header.php'; ?>

대시보드

이번 달 수입
이번 달 지출
이번 달 카드 총청구액
일반 · 할부
이번 달 대출 납부 예정액
원금 · 이자
유동자산 합계
다음달 카드 예정액
일반 · 할부
남은 할부 총액
원금 · 이자
대출 미납액
원금 · 이자
남은 대출 원금
남은 대출 이자
이번 달 순현금흐름
수입 - 지출 - 대출예정
/
카테고리별 지출
일자별 지출
일자별 대출 납부
이번 달 대출 납부 예정
대출명 기관 납부일 원금 이자 합계
이번 달 대출 납부 예정이 없습니다.