input('date', date('Y-m-d')); $transactions = DailyFundTransaction::forTenant($tenantId) ->where('transaction_date', $date) ->orderBy('time') ->get() ->map(function ($tx) { return [ 'id' => $tx->id, 'type' => $tx->type, 'time' => $tx->time, 'accountId' => $tx->account_id, 'accountName' => $tx->account_name, 'description' => $tx->description, 'amount' => $tx->amount, 'category' => $tx->category, 'note' => $tx->note, ]; }); $income = $transactions->where('type', 'income')->values(); $expense = $transactions->where('type', 'expense')->values(); // 메모 $memoRecord = DailyFundMemo::forTenant($tenantId) ->where('memo_date', $date) ->first(); // 전일 잔액 계산: 해당 날짜 이전 모든 거래의 합 $previousBalance = DailyFundTransaction::forTenant($tenantId) ->where('transaction_date', '<', $date) ->selectRaw(" COALESCE(SUM(CASE WHEN type = 'income' THEN amount ELSE 0 END), 0) - COALESCE(SUM(CASE WHEN type = 'expense' THEN amount ELSE 0 END), 0) as balance ") ->value('balance') ?? 0; return response()->json([ 'success' => true, 'data' => [ 'income' => $income, 'expense' => $expense, 'previousBalance' => (int) $previousBalance, 'memo' => $memoRecord?->memo ?? '', 'author' => $memoRecord?->author ?? '', 'updatedAt' => $memoRecord?->updated_at?->format('Y-m-d H:i') ?? '', ], ]); } public function store(Request $request): JsonResponse { $request->validate([ 'transactionDate' => 'required|date', 'type' => 'required|in:income,expense', 'description' => 'required|string|max:200', 'amount' => 'required|integer|min:1', ]); $tenantId = session('selected_tenant_id', 1); $tx = DailyFundTransaction::create([ 'tenant_id' => $tenantId, 'transaction_date' => $request->input('transactionDate'), 'type' => $request->input('type'), 'time' => $request->input('time'), 'account_id' => $request->input('accountId'), 'account_name' => $request->input('accountName'), 'description' => $request->input('description'), 'amount' => $request->input('amount'), 'category' => $request->input('category'), 'note' => $request->input('note'), ]); return response()->json([ 'success' => true, 'message' => '거래가 등록되었습니다.', 'data' => ['id' => $tx->id], ]); } public function update(Request $request, int $id): JsonResponse { $tenantId = session('selected_tenant_id', 1); $tx = DailyFundTransaction::forTenant($tenantId)->findOrFail($id); $request->validate([ 'description' => 'required|string|max:200', 'amount' => 'required|integer|min:1', ]); $tx->update([ 'type' => $request->input('type', $tx->type), 'time' => $request->input('time'), 'account_id' => $request->input('accountId'), 'account_name' => $request->input('accountName'), 'description' => $request->input('description'), 'amount' => $request->input('amount'), 'category' => $request->input('category'), 'note' => $request->input('note'), ]); return response()->json([ 'success' => true, 'message' => '거래가 수정되었습니다.', ]); } public function destroy(int $id): JsonResponse { $tenantId = session('selected_tenant_id', 1); $tx = DailyFundTransaction::forTenant($tenantId)->findOrFail($id); $tx->delete(); return response()->json([ 'success' => true, 'message' => '거래가 삭제되었습니다.', ]); } public function saveMemo(Request $request): JsonResponse { $tenantId = session('selected_tenant_id', 1); $request->validate([ 'date' => 'required|date', ]); $memo = DailyFundMemo::updateOrCreate( ['tenant_id' => $tenantId, 'memo_date' => $request->input('date')], [ 'memo' => $request->input('memo', ''), 'author' => $request->input('author', ''), ] ); return response()->json([ 'success' => true, 'message' => '메모가 저장되었습니다.', 'data' => [ 'updatedAt' => $memo->updated_at->format('Y-m-d H:i'), ], ]); } }