diff --git a/src/components/BudgetTabContent.tsx b/src/components/BudgetTabContent.tsx index 5a455f9..7dc7ff3 100644 --- a/src/components/BudgetTabContent.tsx +++ b/src/components/BudgetTabContent.tsx @@ -1,8 +1,11 @@ + import React, { useState, useEffect } from 'react'; import { CirclePlus, Save, Check } from 'lucide-react'; import BudgetInputCard from './BudgetInputCard'; import { Button } from '@/components/ui/button'; import CategoryBudgetInputs from './CategoryBudgetInputs'; +import { EXPENSE_CATEGORIES } from '@/constants/categoryIcons'; + interface BudgetData { targetAmount: number; spentAmount: number; @@ -42,6 +45,7 @@ const BudgetTabContent: React.FC = ({ // 남은 예산 또는 초과 예산 텍스트 및 금액 const budgetStatusText = isOverBudget ? '예산 초과: ' : '남은 예산: '; const budgetAmount = isOverBudget ? formatCurrency(Math.abs(targetAmount - spentAmount)) : formatCurrency(Math.max(0, targetAmount - spentAmount)); + const handleCategoryInputChange = (value: string, category: string) => { const numValue = parseInt(value, 10) || 0; setCategoryBudgets(prev => ({ @@ -52,18 +56,29 @@ const BudgetTabContent: React.FC = ({ // 카테고리별 예산 합계 계산 const calculateTotalBudget = () => { - const total = Object.values(categoryBudgets).reduce((sum, value) => sum + value, 0); + // 모든 EXPENSE_CATEGORIES에 있는 카테고리 포함해서 합계 계산 + let total = 0; + EXPENSE_CATEGORIES.forEach(category => { + total += categoryBudgets[category] || 0; + }); console.log('카테고리 예산 총합:', total, categoryBudgets); return total; }; // 카테고리 예산 저장 const handleSaveCategoryBudgets = () => { + // 카테고리 예산 기본값 설정 - 모든 카테고리 포함 + const updatedCategoryBudgets: Record = {}; + EXPENSE_CATEGORIES.forEach(category => { + updatedCategoryBudgets[category] = categoryBudgets[category] || 0; + }); + const totalBudget = calculateTotalBudget(); - console.log('카테고리 예산 저장 및 총 예산 설정:', totalBudget, categoryBudgets); + console.log('카테고리 예산 저장 및 총 예산 설정:', totalBudget, updatedCategoryBudgets); + // 총액이 0이 아닐 때만 저장 처리 if (totalBudget > 0) { - onSaveBudget(totalBudget, categoryBudgets); + onSaveBudget(totalBudget, updatedCategoryBudgets); setShowBudgetInput(false); } else { alert('예산을 입력해주세요.'); diff --git a/src/components/CategoryBudgetInputs.tsx b/src/components/CategoryBudgetInputs.tsx index de6f21a..2322ad0 100644 --- a/src/components/CategoryBudgetInputs.tsx +++ b/src/components/CategoryBudgetInputs.tsx @@ -32,9 +32,9 @@ const CategoryBudgetInputs: React.FC = ({ try { const amount = parseInt(numericValue, 10) || 0; markSingleCategoryBudgetAsModified(category, amount); - console.log(`[예산 추적] 카테고리 '${category}' 예산 변경 추적: ${amount}원`); + console.log(`카테고리 '${category}' 예산을 ${amount}원으로 수정 완료, 타임스탬프: ${new Date().toISOString()}`); } catch (error) { - console.error(`[예산 추적] 카테고리 '${category}' 예산 변경 추적 실패:`, error); + console.error(`카테고리 '${category}' 예산 변경 추적 실패:`, error); } // 사용자에게 시각적 피드백 제공 diff --git a/src/constants/categoryIcons.tsx b/src/constants/categoryIcons.tsx index 3bf288c..50598c2 100644 --- a/src/constants/categoryIcons.tsx +++ b/src/constants/categoryIcons.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { ShoppingBag, Coffee, Bus, Landmark, MoreHorizontal } from 'lucide-react'; -// 지출 카테고리 정의 +// 지출 카테고리 정의 - 교통비를 교통으로 통일 export const EXPENSE_CATEGORIES = [ '음식', '쇼핑', diff --git a/src/contexts/budget/budgetUtils.ts b/src/contexts/budget/budgetUtils.ts index d3d8cc4..8debc51 100644 --- a/src/contexts/budget/budgetUtils.ts +++ b/src/contexts/budget/budgetUtils.ts @@ -6,7 +6,6 @@ import { EXPENSE_CATEGORIES } from '@/constants/categoryIcons'; export const DEFAULT_CATEGORY_BUDGETS: Record = { 음식: 0, 쇼핑: 0, - 교통비: 0, 교통: 0, 기타: 0 }; @@ -23,7 +22,7 @@ export const calculateCategorySpending = ( // 모든 카테고리에 대해 초기값 0 설정 Object.keys(categoryBudgets).forEach(category => { - // 3개 카테고리만 유지 + // 정의된 카테고리만 유지 if (EXPENSE_CATEGORIES.includes(category)) { categorySpending[category] = 0; } @@ -42,9 +41,12 @@ export const calculateCategorySpending = ( } else if (EXPENSE_CATEGORIES.includes(t.category)) { // 지원되는 카테고리이지만 초기화되지 않은 경우 categorySpending[t.category] = t.amount; + } else if (t.category === '교통비') { + // 예전 카테고리명 '교통비'를 '교통'으로 매핑 + categorySpending['교통'] = (categorySpending['교통'] || 0) + t.amount; } else { - // 지원되지 않는 카테고리는 '쇼핑'으로 집계 - categorySpending['쇼핑'] = (categorySpending['쇼핑'] || 0) + t.amount; + // 지원되지 않는 카테고리는 '기타'로 집계 + categorySpending['기타'] = (categorySpending['기타'] || 0) + t.amount; } }); diff --git a/src/contexts/budget/hooks/useExtendedBudgetUpdate.ts b/src/contexts/budget/hooks/useExtendedBudgetUpdate.ts index 3247408..f574288 100644 --- a/src/contexts/budget/hooks/useExtendedBudgetUpdate.ts +++ b/src/contexts/budget/hooks/useExtendedBudgetUpdate.ts @@ -20,19 +20,20 @@ export const useExtendedBudgetUpdate = ( // 카테고리 예산이 제공된 경우 업데이트 if (newCategoryBudgets) { + // 카테고리 예산 저장 updateCategoryBudgets(newCategoryBudgets); // 총액 계산 const totalAmount = Object.values(newCategoryBudgets).reduce((sum, val) => sum + val, 0); console.log('카테고리 총액:', totalAmount); - // 예산 데이터 업데이트를 위해 월간 금액으로 처리 (type은 'monthly'로 설정) + // 월간 예산 금액으로 예산 데이터 업데이트 (type에 관계없이 월간으로 처리) handleBudgetGoalUpdate('monthly', totalAmount); } else { - // 카테고리 예산이 없는 경우, 기존 로직 사용 + // 카테고리 예산이 없는 경우, 선택된 기간 유형에 따라 예산 설정 handleBudgetGoalUpdate(type, amount); } - }, [budgetData, categoryBudgets, handleBudgetGoalUpdate, updateCategoryBudgets]); + }, [categoryBudgets, handleBudgetGoalUpdate, updateCategoryBudgets]); return { extendedBudgetGoalUpdate }; }; diff --git a/src/contexts/budget/storage/categoryStorage.ts b/src/contexts/budget/storage/categoryStorage.ts index 767b7c6..46ec1a4 100644 --- a/src/contexts/budget/storage/categoryStorage.ts +++ b/src/contexts/budget/storage/categoryStorage.ts @@ -20,8 +20,8 @@ export const loadCategoryBudgetsFromStorage = (): Record => { // 이전 카테고리명이 있을 경우 새 카테고리명으로 값 이전 if (category === '음식' && parsed['식비'] !== undefined) { filteredBudgets[category] = parsed['식비']; - } else if (category === '쇼핑' && parsed['생활비'] !== undefined) { - filteredBudgets[category] = parsed['생활비']; + } else if (category === '교통' && parsed['교통비'] !== undefined) { + filteredBudgets[category] = parsed['교통비']; } else { filteredBudgets[category] = parsed[category] || 0; } @@ -42,8 +42,8 @@ export const loadCategoryBudgetsFromStorage = (): Record => { // 이전 카테고리명이 있을 경우 새 카테고리명으로 값 이전 if (category === '음식' && parsedBackup['식비'] !== undefined) { filteredBudgets[category] = parsedBackup['식비']; - } else if (category === '쇼핑' && parsedBackup['생활비'] !== undefined) { - filteredBudgets[category] = parsedBackup['생활비']; + } else if (category === '교통' && parsedBackup['교통비'] !== undefined) { + filteredBudgets[category] = parsedBackup['교통비']; } else { filteredBudgets[category] = parsedBackup[category] || 0; }