From 21a66a211ddbcffc60d58cadf1337b914fe930c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=ED=98=84?= Date: Wed, 19 Aug 2026 11:27:35 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20#177=20=EB=8C=80=EC=8B=9C=EB=B3=B4?= =?UTF-8?q?=EB=93=9C=EC=97=90=20=EC=8B=A4=20=EC=A0=95=EC=82=B0=EC=95=A1(?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=EC=86=8C=EB=93=9D=20=EB=8C=80=EB=B9=84=20?= =?UTF-8?q?=EC=8B=A4=EC=9E=85=EA=B8=88=EC=86=8C=EB=93=9D)=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/DashboardController.java | 8 +--- .../dashboard/response/DashboardResponse.java | 5 +-- .../response/DashboardSettlementResponse.java | 37 +++++++++++++++++++ 3 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 services/bff-service/src/main/java/com/ntropy/bff/dto/dashboard/response/DashboardSettlementResponse.java diff --git a/services/bff-service/src/main/java/com/ntropy/bff/controller/dashboard/DashboardController.java b/services/bff-service/src/main/java/com/ntropy/bff/controller/dashboard/DashboardController.java index 8596b07c..97098167 100644 --- a/services/bff-service/src/main/java/com/ntropy/bff/controller/dashboard/DashboardController.java +++ b/services/bff-service/src/main/java/com/ntropy/bff/controller/dashboard/DashboardController.java @@ -15,6 +15,7 @@ import com.ntropy.bff.dto.dashboard.response.DashboardHoursResponse; import com.ntropy.bff.dto.dashboard.response.DashboardIncomeResponse; import com.ntropy.bff.dto.dashboard.response.DashboardResponse; +import com.ntropy.bff.dto.dashboard.response.DashboardSettlementResponse; import com.ntropy.bff.dto.dashboard.response.JobRecommendationsResponse; import com.ntropy.bff.security.AuthenticatedUserIdResolver; import com.ntropy.common.client.CalendarQueryClient; @@ -34,12 +35,6 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -/** - * 홈 대시보드 조합 엔드포인트. - * realWage(실질 시급)는 계산 공식이 아직 없어서 뺐다. - * 잡별 추천 근무시간(ROI 계산)은 장아연님이 만든 계약(RecommendedWorkHoursQueryClient)을 - * 가져다 /api/dashboard/recommendation-hours로 노출만 한다 — 계산 로직은 work-service에 있다. - */ @Api(tags = "대시보드") @RestController @RequestMapping("/api/dashboard") @@ -79,6 +74,7 @@ public ApiResponse getDashboard(@ApiParam(hidden = true) Auth user.name(), new DashboardHoursResponse(hours.getActualHours(), hours.getPlannedHours()), new DashboardIncomeResponse(incomeAnalysis.getTotalIncome(), hours.getTargetAmount()), + DashboardSettlementResponse.from(incomeAnalysis.getEarnedDepositComparisons()), fatigueScore ); return ApiResponse.success(response); diff --git a/services/bff-service/src/main/java/com/ntropy/bff/dto/dashboard/response/DashboardResponse.java b/services/bff-service/src/main/java/com/ntropy/bff/dto/dashboard/response/DashboardResponse.java index 72c57504..efb9a331 100644 --- a/services/bff-service/src/main/java/com/ntropy/bff/dto/dashboard/response/DashboardResponse.java +++ b/services/bff-service/src/main/java/com/ntropy/bff/dto/dashboard/response/DashboardResponse.java @@ -3,10 +3,6 @@ import lombok.AllArgsConstructor; import lombok.Getter; -/** - * 홈 대시보드 응답. realWage(실질 시급)는 계산 공식이 아직 정의되지 않아 제외한다. - * jobRecommendations(ROI 추천)는 AI-service의 별도 엔드포인트(/api/dashboard/recommendation-hours) 몫이라 여기 없다. - */ @Getter @AllArgsConstructor public class DashboardResponse { @@ -14,5 +10,6 @@ public class DashboardResponse { private String greetingName; private DashboardHoursResponse goalHours; private DashboardIncomeResponse goalIncome; + private DashboardSettlementResponse settlement; private Integer fatigueScore; } diff --git a/services/bff-service/src/main/java/com/ntropy/bff/dto/dashboard/response/DashboardSettlementResponse.java b/services/bff-service/src/main/java/com/ntropy/bff/dto/dashboard/response/DashboardSettlementResponse.java new file mode 100644 index 00000000..280d0aa8 --- /dev/null +++ b/services/bff-service/src/main/java/com/ntropy/bff/dto/dashboard/response/DashboardSettlementResponse.java @@ -0,0 +1,37 @@ +package com.ntropy.bff.dto.dashboard.response; + +import java.util.List; + +import com.ntropy.common.dto.work.summary.EarnedDepositComparison; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 이번 달 발생소득 대비 실입금소득. + * earned는 확정 근무일지 기준 발생소득, deposited는 매칭된 입금 거래 기준 실입금소득이다. + */ +@Getter +@AllArgsConstructor +public class DashboardSettlementResponse { + + private Long deposited; + private Long earned; + + public static DashboardSettlementResponse from(List comparisons) { + if (comparisons == null || comparisons.isEmpty()) { + return new DashboardSettlementResponse(0L, 0L); + } + long deposited = comparisons.stream() + .mapToLong(comparison -> nullToZero(comparison.getDepositedIncome())) + .sum(); + long earned = comparisons.stream() + .mapToLong(comparison -> nullToZero(comparison.getEarnedIncome())) + .sum(); + return new DashboardSettlementResponse(deposited, earned); + } + + private static long nullToZero(Long value) { + return value == null ? 0L : value; + } +}