From 354ade3898a2e8fbcc5dfd39effad4d103540380 Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Tue, 20 May 2025 09:35:56 +0900 Subject: [PATCH 01/11] fix: id.string bug --- .../settlement/settlement-detail.jsx | 110 +++++++++--------- .../pages/Settlement/SettlementDetailPage.jsx | 42 +++---- 2 files changed, 78 insertions(+), 74 deletions(-) diff --git a/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx b/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx index bd3e2d8d..9d11a031 100644 --- a/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx +++ b/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx @@ -1,13 +1,13 @@ "use client" -import { useState } from "react" -import { useNavigate } from "react-router-dom" -import { formatDate, formatCurrency } from "../../lib/utils" -import { StatusBadge } from "../common/StatusBadge" -import { UserProfile } from "../common/UserProfile" -import { SettlementActions } from "../common/SettlementActions" +import {useState} from "react" +import {useNavigate} from "react-router-dom" +import {formatCurrency, formatDate} from "../../lib/utils" +import {StatusBadge} from "../common/StatusBadge" +import {UserProfile} from "../common/UserProfile" +import {SettlementActions} from "../common/SettlementActions" -export function SettlementDetail({ settlement: initialSettlement }) { +export function SettlementDetail({settlement: initialSettlement}) { const navigate = useNavigate() const [settlement, setSettlement] = useState(initialSettlement) @@ -20,63 +20,67 @@ export function SettlementDetail({ settlement: initialSettlement }) { } return ( -
-
-
-

정산 #{settlement.id.substring(0, 8)}

- -
-
-
-
-
- - +
+
+
+

정산 #{String(settlement.id).substring(0, + 8)}

+
- -
-
-

연관 지출

-

{settlement.expense?.title || "알 수 없음"}

- {settlement.expense && ( -

- {formatDate(settlement.expense.date)} · {formatCurrency(settlement.expense.amount)} -

- )} +
+
+
+
+ +
-
-

정산 금액

-

{formatCurrency(settlement.amount)}

+
+
+

연관 지출

+

{settlement.expense + || "알 수 없음"}

+ {settlement.expense && ( +

+ {formatDate(settlement.expense.date)} · {formatCurrency( + settlement.expense.amount)} +

+ )} +
+ +
+

정산 금액

+

{formatCurrency( + settlement.amount)}

+
-
-
-

정산 정보

-
-
-

생성일

-

{formatDate(settlement.createdAt)}

-
-
-

수정일

-

{formatDate(settlement.updatedAt)}

+
+

정산 정보

+
+
+

생성일

+

{formatDate(settlement.createdAt)}

+
+
+

수정일

+

{formatDate(settlement.updatedAt)}

+
-
-
- -
- - +
+ + +
-
) } diff --git a/Frontend/luckeyseven/src/pages/Settlement/SettlementDetailPage.jsx b/Frontend/luckeyseven/src/pages/Settlement/SettlementDetailPage.jsx index c6010c3c..8104cbec 100644 --- a/Frontend/luckeyseven/src/pages/Settlement/SettlementDetailPage.jsx +++ b/Frontend/luckeyseven/src/pages/Settlement/SettlementDetailPage.jsx @@ -1,14 +1,14 @@ "use client" -import { useState, useEffect } from "react" -import { useParams } from "react-router-dom" -import { SettlementDetail } from "../../components/settlement/settlement-detail" -import { getSettlementById } from "../../service/settlementService" -import { useToast } from "../../context/ToastContext" +import {useEffect, useState} from "react" +import {useParams} from "react-router-dom" +import {SettlementDetail} from "../../components/settlement/settlement-detail" +import {getSettlementById} from "../../service/settlementService" +import {useToast} from "../../context/ToastContext" export function SettlementDetailPage() { - const { settlementId } = useParams() - const { addToast } = useToast() + const {settlementId} = useParams() + const {addToast} = useToast() const [settlement, setSettlement] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) @@ -37,29 +37,29 @@ export function SettlementDetailPage() { if (isLoading) { return ( -
-
-

로딩 중...

+
+
+

로딩 중...

+
-
) } if (error || !settlement) { return ( -
-
-

오류가 발생했습니다.

-

{error || "정산 내역을 찾을 수 없습니다."}

+
+
+

오류가 발생했습니다.

+

{error || "정산 내역을 찾을 수 없습니다."}

+
-
) } return ( -
-

정산 상세 내역

- -
+
+

정산 상세 내역

+ +
) -} +} \ No newline at end of file From f6afafd5ca65c99838e13d12f9488e2357d69673 Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Tue, 20 May 2025 09:58:00 +0900 Subject: [PATCH 02/11] =?UTF-8?q?refactor:=20settlementResponse=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=EC=97=90=20=EC=97=B0=EA=B4=80=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/settlements/app/SettlementService.java | 2 +- .../backend/domain/settlements/dto/SettlementResponse.java | 6 +++++- .../backend/domain/settlements/entity/Settlement.java | 4 ++-- .../backend/domain/settlements/util/SettlementMapper.java | 4 ++++ .../domain/settlements/app/SettlementServiceTest.java | 2 +- .../domain/settlements/dao/SettlementRepositoryTest.java | 2 +- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Backend/src/main/java/com/luckyseven/backend/domain/settlements/app/SettlementService.java b/Backend/src/main/java/com/luckyseven/backend/domain/settlements/app/SettlementService.java index 419fe52c..1ef7f8e2 100644 --- a/Backend/src/main/java/com/luckyseven/backend/domain/settlements/app/SettlementService.java +++ b/Backend/src/main/java/com/luckyseven/backend/domain/settlements/app/SettlementService.java @@ -137,7 +137,7 @@ private Expense getExpense(SettlementUpdateRequest request) { @Transactional public SettlementResponse settleSettlement(Long id) { Settlement settlement = findSettlementOrThrow(id); - settlement.setSettled(); + settlement.convertSettled(); return SettlementMapper.toSettlementResponse(settlementRepository.save(settlement)); } diff --git a/Backend/src/main/java/com/luckyseven/backend/domain/settlements/dto/SettlementResponse.java b/Backend/src/main/java/com/luckyseven/backend/domain/settlements/dto/SettlementResponse.java index 1f3e6f63..6cd4bd85 100644 --- a/Backend/src/main/java/com/luckyseven/backend/domain/settlements/dto/SettlementResponse.java +++ b/Backend/src/main/java/com/luckyseven/backend/domain/settlements/dto/SettlementResponse.java @@ -16,8 +16,12 @@ public record SettlementResponse( BigDecimal amount, Boolean isSettled, Long settlerId, + String settlerNickname, Long payerId, - Long expenseId + String payerNickname, + Long expenseId, + String expenseDescription, + Long teamId ) { } \ No newline at end of file diff --git a/Backend/src/main/java/com/luckyseven/backend/domain/settlements/entity/Settlement.java b/Backend/src/main/java/com/luckyseven/backend/domain/settlements/entity/Settlement.java index 6beee9bd..55ef6e83 100644 --- a/Backend/src/main/java/com/luckyseven/backend/domain/settlements/entity/Settlement.java +++ b/Backend/src/main/java/com/luckyseven/backend/domain/settlements/entity/Settlement.java @@ -81,7 +81,7 @@ public void update(BigDecimal amount, Member settler, Member payer, Expense expe } } - public void setSettled() { - this.isSettled = true; + public void convertSettled() { + this.isSettled = !this.isSettled; } } diff --git a/Backend/src/main/java/com/luckyseven/backend/domain/settlements/util/SettlementMapper.java b/Backend/src/main/java/com/luckyseven/backend/domain/settlements/util/SettlementMapper.java index 82d56858..f04a3aef 100644 --- a/Backend/src/main/java/com/luckyseven/backend/domain/settlements/util/SettlementMapper.java +++ b/Backend/src/main/java/com/luckyseven/backend/domain/settlements/util/SettlementMapper.java @@ -20,8 +20,12 @@ public static SettlementResponse toSettlementResponse(Settlement settlement) { .updatedAt(settlement.getUpdatedAt()) .isSettled(settlement.getIsSettled()) .settlerId(settlement.getSettler().getId()) + .settlerNickname(settlement.getSettler().getNickname()) .payerId(settlement.getPayer().getId()) + .payerNickname(settlement.getPayer().getNickname()) .expenseId(settlement.getExpense().getId()) + .expenseDescription(settlement.getExpense().getDescription()) + .teamId(settlement.getExpense().getTeam().getId()) .build(); } diff --git a/Backend/src/test/java/com/luckyseven/backend/domain/settlements/app/SettlementServiceTest.java b/Backend/src/test/java/com/luckyseven/backend/domain/settlements/app/SettlementServiceTest.java index 5d3e969f..1ac8feca 100644 --- a/Backend/src/test/java/com/luckyseven/backend/domain/settlements/app/SettlementServiceTest.java +++ b/Backend/src/test/java/com/luckyseven/backend/domain/settlements/app/SettlementServiceTest.java @@ -100,7 +100,7 @@ void createSettlement_ShouldSaveSettlement() { @Test @DisplayName("정산롼료") - void setSettled_ShouldUpdateSettlementStatus() { + void convertSettled_ShouldUpdateSettlementStatus() { //given when(settlementRepository.findWithSettlerAndPayerById(anyLong())).thenReturn( Optional.of(settlement)); diff --git a/Backend/src/test/java/com/luckyseven/backend/domain/settlements/dao/SettlementRepositoryTest.java b/Backend/src/test/java/com/luckyseven/backend/domain/settlements/dao/SettlementRepositoryTest.java index 4d1e34d2..623e30b9 100644 --- a/Backend/src/test/java/com/luckyseven/backend/domain/settlements/dao/SettlementRepositoryTest.java +++ b/Backend/src/test/java/com/luckyseven/backend/domain/settlements/dao/SettlementRepositoryTest.java @@ -150,7 +150,7 @@ void setUp() { .expense(i < 15 ? expense1 : expense2) .build(); if (i % 2 == 0) { - settlement.setSettled(); + settlement.convertSettled(); } settlementRepository.save(settlement); } From b777cc3d1b3e5ad5f89f58410df7abc14ba55288 Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Tue, 20 May 2025 10:30:48 +0900 Subject: [PATCH 03/11] =?UTF-8?q?fix:=20=EA=B2=BD=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Frontend/luckeyseven/src/App.jsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Frontend/luckeyseven/src/App.jsx b/Frontend/luckeyseven/src/App.jsx index 31cb6bc2..54921733 100644 --- a/Frontend/luckeyseven/src/App.jsx +++ b/Frontend/luckeyseven/src/App.jsx @@ -19,8 +19,6 @@ import {getCurrentUser} from "./service/AuthService" import TeamDashBoard from "./pages/TeamDashBoard"; import TeamSetup from "./pages/TeamSetup" import {ToastProvider} from "./context/ToastContext" -import SettlementPage from "./pages/SettlementPage"; -import ExpensesPage from "./pages/ExpensesPage"; // 보호된 라우트 컴포넌트 const ProtectedRoute = ({children}) => { @@ -51,7 +49,7 @@ function App() { } /> }/> - + {/* Settlement 관련 라우트 */} @@ -86,7 +84,7 @@ function App() { } /> From 87805641a9fcfb7fb91731147c2b7d0f6ceb017c Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Tue, 20 May 2025 10:31:01 +0900 Subject: [PATCH 04/11] =?UTF-8?q?fix:=20=EC=83=81=EC=84=B8=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/UserProfile.jsx | 28 ++++++++++--------- .../settlement/settlement-detail.jsx | 7 +++-- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Frontend/luckeyseven/src/components/common/UserProfile.jsx b/Frontend/luckeyseven/src/components/common/UserProfile.jsx index 49d9b7bd..709faa39 100644 --- a/Frontend/luckeyseven/src/components/common/UserProfile.jsx +++ b/Frontend/luckeyseven/src/components/common/UserProfile.jsx @@ -1,17 +1,19 @@ -export function UserProfile({ user, label }) { +export function UserProfile({nickname, label}) { return ( -
-

{label}

-
- {user?.avatar ? ( - {user.name} - ) : ( -
- {user?.name.charAt(0) || "?"} -
- )} - {user?.name || "알 수 없음"} +
+

{label}

+
+ {nickname ? ( + {nickname} + ) : ( +
+ {nickname.charAt(0) || "?"} +
+ )} + {nickname || "알 수 없음"} +
-
) } diff --git a/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx b/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx index 9d11a031..6cbad0f2 100644 --- a/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx +++ b/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx @@ -31,14 +31,15 @@ export function SettlementDetail({settlement: initialSettlement}) {
- - + +

연관 지출

-

{settlement.expense +

{settlement.expenseDescription || "알 수 없음"}

{settlement.expense && (

From ac0f10c59abf668ec03321bda4e37e594151b192 Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Tue, 20 May 2025 10:31:18 +0900 Subject: [PATCH 05/11] =?UTF-8?q?fix:=20=EC=A0=95=EC=82=B0=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../settlement/settlement-filter.jsx | 180 +++++++++--------- .../components/settlement/settlement-list.jsx | 112 ++++++----- .../pages/Settlement/TeamSettlementsPage.jsx | 17 +- .../src/service/settlementService.js | 1 - 4 files changed, 160 insertions(+), 150 deletions(-) diff --git a/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx b/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx index 9f75fc0e..67e84ee9 100644 --- a/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx +++ b/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx @@ -1,11 +1,12 @@ "use client" -import { useState } from "react" -import { useNavigate, useLocation } from "react-router-dom" +import {useState} from "react" +import {useLocation, useNavigate} from "react-router-dom" -export function SettlementFilter({ users, expenses, initialFilters, teamId }) { +export function SettlementFilter({users, expenses, initialFilters, teamId}) { const navigate = useNavigate() const location = useLocation() + console.info("필터", users, expenses, initialFilters, teamId, location.search,) const [filters, setFilters] = useState({ payerId: initialFilters.payerId || "", @@ -15,7 +16,7 @@ export function SettlementFilter({ users, expenses, initialFilters, teamId }) { }) const handleFilterChange = (key, value) => { - setFilters((prev) => ({ ...prev, [key]: value })) + setFilters((prev) => ({...prev, [key]: value})) } const applyFilters = () => { @@ -44,98 +45,99 @@ export function SettlementFilter({ users, expenses, initialFilters, teamId }) { const hasActiveFilters = Object.values(filters).some((value) => value !== "") return ( -

-
-
-
- - -
+
+
+
+
+ + +
-
- - -
+
+ + +
-
- - -
+
+ + +
-
- - +
+ + +
-
-
- {hasActiveFilters && ( - + )} + - )} - +
-
) } diff --git a/Frontend/luckeyseven/src/components/settlement/settlement-list.jsx b/Frontend/luckeyseven/src/components/settlement/settlement-list.jsx index 6e7dae35..332a1da3 100644 --- a/Frontend/luckeyseven/src/components/settlement/settlement-list.jsx +++ b/Frontend/luckeyseven/src/components/settlement/settlement-list.jsx @@ -1,77 +1,89 @@ "use client" -import { useState } from "react" -import { Link } from "react-router-dom" -import { formatDate, formatCurrency } from "../../lib/utils" -import { StatusBadge } from "../common/StatusBadge" -import { SettlementActions } from "../common/SettlementActions" +import {useState} from "react" +import {Link} from "react-router-dom" +import {formatCurrency, formatDate} from "../../lib/utils" +import {StatusBadge} from "../common/StatusBadge" +import {SettlementActions} from "../common/SettlementActions" -export function SettlementList({ settlements: initialSettlements }) { +export function SettlementList({settlements: initialSettlements}) { const [settlements, setSettlements] = useState(initialSettlements) const handleUpdate = (updatedSettlement) => { setSettlements((prevSettlements) => - prevSettlements.map((settlement) => (settlement.id === updatedSettlement.id ? updatedSettlement : settlement)), + prevSettlements.map( + (settlement) => (settlement.id === updatedSettlement.id + ? updatedSettlement : settlement)), ) } if (settlements.length === 0) { return ( -
-
-

조회된 정산 내역이 없습니다.

-

필터를 변경하거나 새로운 정산을 추가해보세요.

+
+
+

조회된 정산 내역이 없습니다.

+

필터를 변경하거나 새로운 정산을 추가해보세요.

+
-
) } return ( -
- {settlements.map((settlement) => ( - -
-
-
-
-
-

정산 #{settlement.id.substring(0, 8)}

- -
+
+ {settlements.map((settlement) => ( + +
+
+
+
+
+

정산 #{String( + settlement.id).substring(0, 8)}

+ +
-
- 생성일: {formatDate(settlement.createdAt)} -
+
+ 생성일: {formatDate(settlement.createdAt)} +
-
-
-

결제자

-

{settlement.payer?.name || "알 수 없음"}

-
-
-

정산자

-

{settlement.settler?.name || "알 수 없음"}

-
-
-

지출 항목

-

{settlement.expense?.title || "알 수 없음"}

+
+
+

결제자

+

{settlement.payerNickname + || "알 수 없음"}

+
+
+

정산자

+

{settlement.settlerNickname + || "알 수 없음"}

+
+
+

지출 항목

+

{settlement.expenseDescription + || "알 수 없음"}

+
+
-
-
-
-

{formatCurrency(settlement.amount)}

+
+

{formatCurrency( + settlement.amount)}

-
- - +
+ + +
+
-
-
- - ))} -
+ + ))} +
) } diff --git a/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx b/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx index ddfec78b..697a6cd0 100644 --- a/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx +++ b/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx @@ -57,16 +57,13 @@ export function TeamSettlementsPage() { const fetchData = async () => { try { setIsLoading(true) - - // 페이징 처리된 데이터 로드 - const settlements = await getListSettlements(teamId, page, size, sort, - filters) - const users = await getUsers(teamId) - const expenses = await getAllExpense(teamId) - - setSettlements(settlements.content) - setUsers(users.data) - setExpenses(expenses) + const settlementResponse = await getListSettlements(teamId, page, size, + sort, filters) + setSettlements(settlementResponse.content) + const usersResponse = await getUsers(teamId) + setUsers(usersResponse) + const expensesResponse = await getAllExpense(teamId) + setExpenses(expensesResponse) // 페이징 메타데이터 설정 setTotalPages(settlements.totalPages) diff --git a/Frontend/luckeyseven/src/service/settlementService.js b/Frontend/luckeyseven/src/service/settlementService.js index f18cff82..0feca38f 100644 --- a/Frontend/luckeyseven/src/service/settlementService.js +++ b/Frontend/luckeyseven/src/service/settlementService.js @@ -1,6 +1,5 @@ import {privateApi} from "./ApiService"; -// 모든 정산 내역 조회 export const getListSettlements = async (teamId, page = 0, size = 10, sort = 'createdAt,DESC', filters = {}) => { try { From 4afffaf109cc086e633bf43c9cb7db8e74b74d2f Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Tue, 20 May 2025 10:32:17 +0900 Subject: [PATCH 06/11] =?UTF-8?q?fix:=20=EC=A0=95=EC=82=B0=20=ED=8F=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/settlement/settlement-form.jsx | 258 ++++++++++-------- 1 file changed, 138 insertions(+), 120 deletions(-) diff --git a/Frontend/luckeyseven/src/components/settlement/settlement-form.jsx b/Frontend/luckeyseven/src/components/settlement/settlement-form.jsx index 4534947c..518b274a 100644 --- a/Frontend/luckeyseven/src/components/settlement/settlement-form.jsx +++ b/Frontend/luckeyseven/src/components/settlement/settlement-form.jsx @@ -1,14 +1,22 @@ "use client" -import { useState, useEffect } from "react" -import { useNavigate } from "react-router-dom" -import { useToast } from "../../context/ToastContext" -import { formatCurrency } from "../../lib/utils" -import { createSettlement, updateSettlement } from "../../service/settlementService" - -export function SettlementForm({ settlement, users, expenses, isEditing = false }) { +import {useEffect, useState} from "react" +import {useNavigate} from "react-router-dom" +import {useToast} from "../../context/ToastContext" +import {formatCurrency} from "../../lib/utils" +import { + createSettlement, + updateSettlement +} from "../../service/settlementService" + +export function SettlementForm({ + settlement, + users, + expenses, + isEditing = false +}) { const navigate = useNavigate() - const { addToast } = useToast() + const {addToast} = useToast() const [isLoading, setIsLoading] = useState(false) const [formData, setFormData] = useState({ @@ -44,7 +52,8 @@ export function SettlementForm({ settlement, users, expenses, isEditing = false // 지출 항목이 변경되면 금액도 자동으로 업데이트 if (expenseId) { - const selectedExpense = expenses.find((expense) => expense.id === expenseId) + const selectedExpense = expenses.find( + (expense) => expense.id === expenseId) if (selectedExpense) { // 기본적으로 지출 금액의 절반으로 설정 const defaultAmount = Math.floor(selectedExpense.amount / 2) @@ -56,7 +65,8 @@ export function SettlementForm({ settlement, users, expenses, isEditing = false const handleSubmit = async (e) => { e.preventDefault() - if (!formData.payerId || !formData.settlerId || !formData.expenseId || !formData.amount) { + if (!formData.payerId || !formData.settlerId || !formData.expenseId + || !formData.amount) { addToast({ title: "입력 오류", description: "모든 필수 항목을 입력해주세요.", @@ -91,7 +101,8 @@ export function SettlementForm({ settlement, users, expenses, isEditing = false addToast({ title: isEditing ? "정산 수정 완료" : "정산 생성 완료", - description: isEditing ? "정산 내역이 성공적으로 수정되었습니다." : "새로운 정산 내역이 생성되었습니다.", + description: isEditing ? "정산 내역이 성공적으로 수정되었습니다." + : "새로운 정산 내역이 생성되었습니다.", }) // 수정 완료 후 상세 페이지로 이동 @@ -109,127 +120,134 @@ export function SettlementForm({ settlement, users, expenses, isEditing = false } // 선택된 지출 항목 정보 - const selectedExpense = formData.expenseId ? expenses.find((expense) => expense.id === formData.expenseId) : null + const selectedExpense = formData.expenseId ? expenses.find( + (expense) => expense.id === formData.expenseId) : null return ( -
-
-
-
-
-
- - -
+ +
+
+
+
+
+ + +
-
- -
- - +
+ +
+ + +
-
-
-
- - - -
- {selectedExpense ? ( -

총 지출 금액: {formatCurrency(selectedExpense.amount)}

- ) : ( -

총 지출 금액: ₩0

- )} -
+
+
+ + + +
+ {selectedExpense ? ( +

총 지출 + 금액: {formatCurrency(selectedExpense.amount)}

+ ) : ( +

총 지출 금액: ₩0

+ )} +
-
+
-
- - handleChange("amount", e.target.value)} - placeholder="정산 금액 입력" - disabled={isLoading} - /> -
+
+ + handleChange("amount", e.target.value)} + placeholder="정산 금액 입력" + disabled={isLoading} + /> +
-
- handleChange("isSettled", e.target.checked)} - disabled={isLoading} - /> - +
+ handleChange("isSettled", + e.target.checked)} + disabled={isLoading} + /> + +
-
-
- - +
+ + +
-
- + ) } From f11f4d15ec88ea0a3c8c655c036cdad8156535a7 Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Tue, 20 May 2025 10:35:26 +0900 Subject: [PATCH 07/11] fix: updateSettlement --- Frontend/luckeyseven/src/service/settlementService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Frontend/luckeyseven/src/service/settlementService.js b/Frontend/luckeyseven/src/service/settlementService.js index 0feca38f..fdf354aa 100644 --- a/Frontend/luckeyseven/src/service/settlementService.js +++ b/Frontend/luckeyseven/src/service/settlementService.js @@ -47,7 +47,7 @@ export const updateSettlement = async (id, settlementData, try { // settledOnly가 true인 경우 정산 완료 처리만 수행 if (settledOnly) { - const response = await privateApi.patch(`/api/settlements/${id}`, + const response = await privateApi.patch(`/api/settlements/${id}`, {}, {params: {settledOnly: true}}); return response.data; } else { From 8db73f6ff67a4fe091fba19d51b2d4d60db90eb7 Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Tue, 20 May 2025 11:22:48 +0900 Subject: [PATCH 08/11] fix: edit page, list page --- .../components/common/SettlementActions.jsx | 45 +++++++++++-------- .../settlement/settlement-detail.jsx | 3 +- .../settlement/settlement-filter.jsx | 1 - .../components/settlement/settlement-form.jsx | 11 +++-- .../pages/Settlement/TeamSettlementsPage.jsx | 5 ++- .../src/service/settlementService.js | 2 +- 6 files changed, 37 insertions(+), 30 deletions(-) diff --git a/Frontend/luckeyseven/src/components/common/SettlementActions.jsx b/Frontend/luckeyseven/src/components/common/SettlementActions.jsx index 682c010e..5a207ad5 100644 --- a/Frontend/luckeyseven/src/components/common/SettlementActions.jsx +++ b/Frontend/luckeyseven/src/components/common/SettlementActions.jsx @@ -1,11 +1,11 @@ "use client" -import { useState } from "react" -import { updateSettlement } from "../../service/settlementService" -import { useToast } from "../../context/ToastContext" +import {useState} from "react" +import {updateSettlement} from "../../service/settlementService" +import {useToast} from "../../context/ToastContext" -export function SettlementActions({ settlement, onUpdate, inline = false }) { - const { addToast } = useToast() +export function SettlementActions({settlement, onUpdate, inline = false}) { + const {addToast} = useToast() const [isLoading, setIsLoading] = useState(false) const handleMarkAsSettled = async (e) => { @@ -14,7 +14,9 @@ export function SettlementActions({ settlement, onUpdate, inline = false }) { e.stopPropagation() } - if (settlement.isSettled) return + if (settlement.isSettled) { + return + } try { setIsLoading(true) @@ -50,11 +52,14 @@ export function SettlementActions({ settlement, onUpdate, inline = false }) { e.stopPropagation() } - if (!settlement.isSettled) return + if (!settlement.isSettled) { + return + } try { setIsLoading(true) - const updatedSettlement = await updateSettlement(settlement.id, { isSettled: false }) + const updatedSettlement = await updateSettlement(settlement.id, + {}, true) addToast({ title: "정산 완료 취소", @@ -83,16 +88,18 @@ export function SettlementActions({ settlement, onUpdate, inline = false }) { const btnClass = inline ? "btn-sm" : "" return ( -
- {settlement.isSettled ? ( - - ) : ( - - )} -
+
+ {settlement.isSettled ? ( + + ) : ( + + )} +
) } diff --git a/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx b/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx index 6cbad0f2..2f498916 100644 --- a/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx +++ b/Frontend/luckeyseven/src/components/settlement/settlement-detail.jsx @@ -16,8 +16,9 @@ export function SettlementDetail({settlement: initialSettlement}) { } const handleEdit = () => { - navigate(`/settlements/${settlement.id}/edit`) + navigate(`/teams/${settlement.teamId}/settlements/${settlement.id}/edit`) } + console.info("팀아이디", settlement.teamId) return (
diff --git a/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx b/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx index 67e84ee9..e60b7d75 100644 --- a/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx +++ b/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx @@ -6,7 +6,6 @@ import {useLocation, useNavigate} from "react-router-dom" export function SettlementFilter({users, expenses, initialFilters, teamId}) { const navigate = useNavigate() const location = useLocation() - console.info("필터", users, expenses, initialFilters, teamId, location.search,) const [filters, setFilters] = useState({ payerId: initialFilters.payerId || "", diff --git a/Frontend/luckeyseven/src/components/settlement/settlement-form.jsx b/Frontend/luckeyseven/src/components/settlement/settlement-form.jsx index 518b274a..e1e06f35 100644 --- a/Frontend/luckeyseven/src/components/settlement/settlement-form.jsx +++ b/Frontend/luckeyseven/src/components/settlement/settlement-form.jsx @@ -20,11 +20,11 @@ export function SettlementForm({ const [isLoading, setIsLoading] = useState(false) const [formData, setFormData] = useState({ - payerId: "", - settlerId: "", - expenseId: "", - amount: "", - isSettled: false, + payerId: isEditing ? settlement.payerId : "", + settlerId: isEditing ? settlement.settlerId : "", + expenseId: isEditing ? settlement.expenseId : "", + amount: isEditing ? settlement.amount.toString() : "", + isSettled: isEditing ? settlement.isSettled : false }) // 수정 모드일 경우 초기 데이터 설정 @@ -64,7 +64,6 @@ export function SettlementForm({ const handleSubmit = async (e) => { e.preventDefault() - if (!formData.payerId || !formData.settlerId || !formData.expenseId || !formData.amount) { addToast({ diff --git a/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx b/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx index 697a6cd0..18690a05 100644 --- a/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx +++ b/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx @@ -59,7 +59,7 @@ export function TeamSettlementsPage() { setIsLoading(true) const settlementResponse = await getListSettlements(teamId, page, size, sort, filters) - setSettlements(settlementResponse.content) + setSettlements(settlementResponse) const usersResponse = await getUsers(teamId) setUsers(usersResponse) const expensesResponse = await getAllExpense(teamId) @@ -68,6 +68,7 @@ export function TeamSettlementsPage() { // 페이징 메타데이터 설정 setTotalPages(settlements.totalPages) setTotalElements(settlements.totalElements) + console.info(settlements) } catch (error) { console.error("팀 정산 내역 조회 오류:", error) setError(error.message) @@ -119,7 +120,7 @@ export function TeamSettlementsPage() { initialFilters={filters} teamId={teamId}/>
- + {/* 페이지네이션 컴포넌트 */}
diff --git a/Frontend/luckeyseven/src/service/settlementService.js b/Frontend/luckeyseven/src/service/settlementService.js index fdf354aa..36f7f6c0 100644 --- a/Frontend/luckeyseven/src/service/settlementService.js +++ b/Frontend/luckeyseven/src/service/settlementService.js @@ -52,7 +52,7 @@ export const updateSettlement = async (id, settlementData, return response.data; } else { // 전체 정산 정보 업데이트 - const response = await privateApi.put(`/api/settlements/${id}`, + const response = await privateApi.patch(`/api/settlements/${id}`, settlementData); return response.data; } From 0ef20749ae494a1eca53a0613210d1b8f643dcce Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Tue, 20 May 2025 11:41:58 +0900 Subject: [PATCH 09/11] fix: init pagination metadata --- .../src/components/settlement/settlement-filter.jsx | 2 +- .../luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx b/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx index e60b7d75..906b14fa 100644 --- a/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx +++ b/Frontend/luckeyseven/src/components/settlement/settlement-filter.jsx @@ -3,7 +3,7 @@ import {useState} from "react" import {useLocation, useNavigate} from "react-router-dom" -export function SettlementFilter({users, expenses, initialFilters, teamId}) { +export function SettlementFilter({users, expenses, initialFilters}) { const navigate = useNavigate() const location = useLocation() diff --git a/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx b/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx index 18690a05..7eabb3f5 100644 --- a/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx +++ b/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx @@ -66,8 +66,8 @@ export function TeamSettlementsPage() { setExpenses(expensesResponse) // 페이징 메타데이터 설정 - setTotalPages(settlements.totalPages) - setTotalElements(settlements.totalElements) + setTotalPages(settlementResponse.totalPages) + setTotalElements(settlementResponse.totalElements) console.info(settlements) } catch (error) { console.error("팀 정산 내역 조회 오류:", error) From 99c9339d0a0fd6a0370f63d08c8477eb1c446c01 Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Tue, 20 May 2025 11:41:58 +0900 Subject: [PATCH 10/11] fix: init pagination metadata --- Frontend/luckeyseven/src/App.jsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Frontend/luckeyseven/src/App.jsx b/Frontend/luckeyseven/src/App.jsx index 54921733..6ffc8953 100644 --- a/Frontend/luckeyseven/src/App.jsx +++ b/Frontend/luckeyseven/src/App.jsx @@ -8,7 +8,6 @@ import { import Login from "./pages/Login/Login" import Signup from "./pages/Login/Signup" import Home from "./pages/Home" -import {HomePage as SettlementHomePage} from "./pages/Settlement/HomePage" import {TeamSettlementsPage} from "./pages/Settlement/TeamSettlementsPage" import {SettlementNewPage} from "./pages/Settlement/SettlementNewPage" import {SettlementEditPage} from "./pages/Settlement/SettlementEditPage" @@ -51,14 +50,6 @@ function App() { }/> {/* Settlement 관련 라우트 */} - - - - } - /> Date: Tue, 20 May 2025 12:06:31 +0900 Subject: [PATCH 11/11] refactor: use recoilTeamId --- .../luckeyseven/src/pages/Settlement/SettlementEditPage.jsx | 6 +++++- .../luckeyseven/src/pages/Settlement/SettlementNewPage.jsx | 6 +++++- .../src/pages/Settlement/TeamSettlementsPage.jsx | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Frontend/luckeyseven/src/pages/Settlement/SettlementEditPage.jsx b/Frontend/luckeyseven/src/pages/Settlement/SettlementEditPage.jsx index 8aad020d..7753ab40 100644 --- a/Frontend/luckeyseven/src/pages/Settlement/SettlementEditPage.jsx +++ b/Frontend/luckeyseven/src/pages/Settlement/SettlementEditPage.jsx @@ -6,9 +6,13 @@ import {SettlementForm} from "../../components/settlement/settlement-form" import {getSettlementById, getUsers} from "../../service/settlementService" import {useToast} from "../../context/ToastContext" import {getAllExpense} from "../../service/ExpenseService"; +import {useRecoilValue} from "recoil"; +import {currentTeamIdState} from "../../recoil/atoms/teamAtoms"; export function SettlementEditPage() { - const {teamId} = useParams() + const recoilTeamId = useRecoilValue(currentTeamIdState) + const paramTeamId = useParams().teamId + const teamId = recoilTeamId || paramTeamId const {settlementId} = useParams() const {addToast} = useToast() const [settlement, setSettlement] = useState(null) diff --git a/Frontend/luckeyseven/src/pages/Settlement/SettlementNewPage.jsx b/Frontend/luckeyseven/src/pages/Settlement/SettlementNewPage.jsx index 89ae9369..b8f4513b 100644 --- a/Frontend/luckeyseven/src/pages/Settlement/SettlementNewPage.jsx +++ b/Frontend/luckeyseven/src/pages/Settlement/SettlementNewPage.jsx @@ -6,9 +6,13 @@ import {getUsers} from "../../service/settlementService" import {useToast} from "../../context/ToastContext" import {getAllExpense} from "../../service/ExpenseService"; import {useParams} from "react-router-dom"; +import {useRecoilValue} from "recoil"; +import {currentTeamIdState} from "../../recoil/atoms/teamAtoms"; export function SettlementNewPage() { - const {teamId} = useParams() + const recoilTeamId = useRecoilValue(currentTeamIdState) + const paramTeamId = useParams().teamId + const teamId = recoilTeamId || paramTeamId const {addToast} = useToast() const [users, setUsers] = useState([]) const [expenses, setExpenses] = useState([]) diff --git a/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx b/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx index 7eabb3f5..87a43c84 100644 --- a/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx +++ b/Frontend/luckeyseven/src/pages/Settlement/TeamSettlementsPage.jsx @@ -7,9 +7,13 @@ import {SettlementFilter} from "../../components/settlement/settlement-filter" import {getListSettlements, getUsers} from "../../service/settlementService" import {useToast} from "../../context/ToastContext" import {getAllExpense} from "../../service/ExpenseService"; +import {useRecoilValue} from "recoil"; +import {currentTeamIdState} from "../../recoil/atoms/teamAtoms"; export function TeamSettlementsPage() { - const {teamId} = useParams() + const recoilTeamId = useRecoilValue(currentTeamIdState) + const paramTeamId = useParams().teamId + const teamId = recoilTeamId || paramTeamId const location = useLocation() const navigate = useNavigate() const {addToast} = useToast()