Files
zellyy-finance/src/contexts/budget/utils/budgetCalculation.ts
gpt-engineer-app[bot] 94595ec6c8 Refactor budget calculation logic
Modify budget calculation to use monthly input as the base and adjust tab order.
2025-03-22 11:53:18 +00:00

73 lines
2.6 KiB
TypeScript

import { BudgetData, BudgetPeriod } from '../types';
import { getInitialBudgetData } from './constants';
// 예산 데이터 업데이트 계산
export const calculateUpdatedBudgetData = (
prevBudgetData: BudgetData,
type: BudgetPeriod,
amount: number
): BudgetData => {
console.log(`예산 업데이트 계산 시작: 타입=${type}, 금액=${amount}`);
// 값이 없거나 유효하지 않은 경우 로깅
if (!prevBudgetData) {
console.error('이전 예산 데이터가 없습니다. 기본값 사용.');
prevBudgetData = getInitialBudgetData();
}
// 일일/주간/월간 예산 금액 초기화
let monthlyAmount = 0;
let weeklyAmount = 0;
let dailyAmount = 0;
// 항상 월간 예산을 기준으로 계산 (어떤 타입이 입력되든)
if (type === 'monthly') {
// 월간 예산이 입력된 경우 - 이를 기준으로 주간/일일 계산
monthlyAmount = amount;
} else if (type === 'weekly') {
// 주간 예산이 입력된 경우 - 이를 월간으로 환산 (4.345주/월 기준)
monthlyAmount = Math.round(amount * 4.345);
} else if (type === 'daily') {
// 일일 예산이 입력된 경우 - 이를 월간으로 환산 (30일/월 기준)
monthlyAmount = Math.round(amount * 30);
}
// 월간 예산을 기준으로 주간/일일 예산 계산
weeklyAmount = Math.round(monthlyAmount / 4.345); // 한 달 평균 4.345주
dailyAmount = Math.round(monthlyAmount / 30); // 한 달 평균 30일
console.log(`최종 예산 계산 결과: 월간=${monthlyAmount}원, 주간=${weeklyAmount}원, 일일=${dailyAmount}`);
// 로그에 이전 예산 데이터 출력
console.log("이전 예산 데이터:", JSON.stringify(prevBudgetData));
// 이전 지출 데이터 보존
const dailySpent = prevBudgetData.daily?.spentAmount || 0;
const weeklySpent = prevBudgetData.weekly?.spentAmount || 0;
const monthlySpent = prevBudgetData.monthly?.spentAmount || 0;
// 새 예산 데이터 생성 (spentAmount는 이전 값 유지)
const updatedBudgetData = {
daily: {
targetAmount: dailyAmount,
spentAmount: dailySpent,
remainingAmount: Math.max(0, dailyAmount - dailySpent)
},
weekly: {
targetAmount: weeklyAmount,
spentAmount: weeklySpent,
remainingAmount: Math.max(0, weeklyAmount - weeklySpent)
},
monthly: {
targetAmount: monthlyAmount,
spentAmount: monthlySpent,
remainingAmount: Math.max(0, monthlyAmount - monthlySpent)
}
};
console.log("새 예산 데이터:", JSON.stringify(updatedBudgetData));
return updatedBudgetData;
};