From b8a970bcd65ff31dd9f2b5ed515872522c358a89 Mon Sep 17 00:00:00 2001 From: fewolee Date: Sun, 29 Dec 2024 15:43:07 +0900 Subject: [PATCH 1/8] =?UTF-8?q?[Bug]=20security=20=EA=B6=8C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/expense/controller/ExpenseController.java | 4 ++-- .../global/config/security/CorsConfig.java | 1 - .../global/config/security/SecurityConfig.java | 11 +++++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java b/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java index b9a87c2..0f0455e 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java @@ -79,8 +79,8 @@ public ResponseDTO getExpensesByTrip(@PathVariable("tripId") @GetMapping("/{tripId}/expense/{expenseId}") public ResponseDTO> getExpenseById( - @PathVariable Long tripId, - @PathVariable Long expenseId) { + @PathVariable("tripId") Long tripId, + @PathVariable("tripId") Long expenseId) { try { Map expenseDetails = expenseService.getExpenseById(tripId, expenseId); diff --git a/src/main/java/com/Dodutch_Server/global/config/security/CorsConfig.java b/src/main/java/com/Dodutch_Server/global/config/security/CorsConfig.java index 0a37c0f..7865e3c 100644 --- a/src/main/java/com/Dodutch_Server/global/config/security/CorsConfig.java +++ b/src/main/java/com/Dodutch_Server/global/config/security/CorsConfig.java @@ -16,7 +16,6 @@ public class CorsConfig implements WebMvcConfigurer { public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:3000") - .allowedOrigins("http://localhost:8080") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS","PATCH") .allowedHeaders("*") .allowCredentials(true); diff --git a/src/main/java/com/Dodutch_Server/global/config/security/SecurityConfig.java b/src/main/java/com/Dodutch_Server/global/config/security/SecurityConfig.java index 22ac54d..b570104 100644 --- a/src/main/java/com/Dodutch_Server/global/config/security/SecurityConfig.java +++ b/src/main/java/com/Dodutch_Server/global/config/security/SecurityConfig.java @@ -60,17 +60,16 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.cors(corsCustomizer -> corsCustomizer.configurationSource(request -> { CorsConfiguration config = new CorsConfiguration(); - config.setAllowedOrigins(Collections.singletonList("*")); - config.setAllowedMethods(Collections.singletonList("*")); - config.setAllowCredentials(true); - config.setAllowedHeaders(Collections.singletonList("*")); - config.setMaxAge(3600L); + config.setAllowedOrigins(Collections.singletonList("http://localhost:3000")); // 허용할 도메인 + config.setAllowedMethods(Collections.singletonList("*")); // 모든 메서드 허용 + config.setAllowCredentials(true); // 인증 정보 허용 + config.setAllowedHeaders(Collections.singletonList("*")); // 모든 헤더 허용 + config.setMaxAge(3600L); // Preflight 요청 캐싱 시간 (초 단위) return config; })); - /* 테스트 전 까지 JWT필터 주석처리 */ From 17359d73089cb1498a7d546a4737f68279f54f0b Mon Sep 17 00:00:00 2001 From: fewolee Date: Sun, 29 Dec 2024 17:05:42 +0900 Subject: [PATCH 2/8] =?UTF-8?q?[Refac]=20=EC=A7=80=EC=B6=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dodutch_Server/domain/dutch/controller/DutchController.java | 2 +- .../java/com/Dodutch_Server/domain/expense/entity/Expense.java | 1 + .../Dodutch_Server/domain/expense/service/ExpenseService.java | 2 +- .../Dodutch_Server/domain/trip/controller/TripController.java | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java b/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java index 28bcf6e..8906b8d 100644 --- a/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java +++ b/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java @@ -106,7 +106,7 @@ public ResponseEntity markDutchAsCompleted(@PathVariable Long tripId, @PathVa } @PostMapping("/trip/{tripId}/dutch/calculate") - public ResponseEntity calculateDutch(@PathVariable Long tripId) { + public ResponseEntity calculateDutch(@PathVariable("tripId") Long tripId) { if (!isValidTrip(tripId)) { return ResponseEntity.status(404).body( new ApiResponse<>(false, "404", "해당 여행이 존재하지 않습니다", null) diff --git a/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java b/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java index 29a9d39..08abaf3 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java @@ -30,6 +30,7 @@ public class Expense extends BaseEntity { private LocalDate expenseDate; private String memo; private String expenseImageUrl; + private Long payerId; @ManyToOne @JoinColumn(name = "payer", nullable = true) diff --git a/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java b/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java index 6ceb5e5..31a0de2 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java @@ -85,7 +85,7 @@ public void addExpense(Long tripId, Long payerId,ExpenseRequestDTO request, Mult .amount(request.getAmount()) .expenseDate(request.getExpenseDate()) .memo(request.getMemo()) - //.payer(payer) + .payerId(payerId) .trip(trip) .expenseImageUrl(expenseImageUrl) .build(); diff --git a/src/main/java/com/Dodutch_Server/domain/trip/controller/TripController.java b/src/main/java/com/Dodutch_Server/domain/trip/controller/TripController.java index 5150112..0d09fda 100644 --- a/src/main/java/com/Dodutch_Server/domain/trip/controller/TripController.java +++ b/src/main/java/com/Dodutch_Server/domain/trip/controller/TripController.java @@ -83,7 +83,7 @@ public ApiResponse getShareTrip(@PathVariable("tripId") Lo @io.swagger.v3.oas.annotations.responses.ApiResponses({ @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공") }) - public ApiResponse updateTrip(@PathVariable Long tripId, @RequestBody TripUpdateRequestDTO request) { + public ApiResponse updateTrip(@PathVariable("tripId") Long tripId, @RequestBody TripUpdateRequestDTO request) { tripService.updateTrip(tripId, request); From ccd49d017a280bc3d81a67ac081b4cd1aaca4469 Mon Sep 17 00:00:00 2001 From: fewolee Date: Sun, 29 Dec 2024 17:10:43 +0900 Subject: [PATCH 3/8] =?UTF-8?q?[Refac]=20=EC=A7=80=EC=B6=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/Dodutch_Server/domain/expense/entity/Expense.java | 1 - .../Dodutch_Server/domain/expense/service/ExpenseService.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java b/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java index 08abaf3..29a9d39 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java @@ -30,7 +30,6 @@ public class Expense extends BaseEntity { private LocalDate expenseDate; private String memo; private String expenseImageUrl; - private Long payerId; @ManyToOne @JoinColumn(name = "payer", nullable = true) diff --git a/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java b/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java index 31a0de2..d65c6a3 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java @@ -85,7 +85,7 @@ public void addExpense(Long tripId, Long payerId,ExpenseRequestDTO request, Mult .amount(request.getAmount()) .expenseDate(request.getExpenseDate()) .memo(request.getMemo()) - .payerId(payerId) + .payer(payer) .trip(trip) .expenseImageUrl(expenseImageUrl) .build(); From 0cb6d874f40bb7867931eb59a98e4b3750ac9d06 Mon Sep 17 00:00:00 2001 From: optiprime27 Date: Sun, 29 Dec 2024 17:20:32 +0900 Subject: [PATCH 4/8] =?UTF-8?q?[Refac]=20=EC=97=AC=ED=96=89=EB=B3=84=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=20=EC=A7=80=EC=B6=9C=20=EC=A1=B0=ED=9A=8C=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 --- .../expense/controller/ExpenseController.java | 1 + .../domain/expense/entity/Expense.java | 1 + .../expense/service/ExpenseService.java | 45 ++++++++++--------- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java b/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java index 0f0455e..e98b53a 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java @@ -71,6 +71,7 @@ public ResponseDTO>> getExpensesByDate(@PathVariable Lo public ResponseDTO getExpensesByTrip(@PathVariable("tripId") Long tripId) { try { ExpenseResponseDTO responseData = expenseService.getExpensesByTrip(tripId); + return createSuccessResponse("200", "성공이요", responseData); } catch (IllegalArgumentException e) { return createErrorResponse("400", e.getMessage()); diff --git a/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java b/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java index 29a9d39..010fdbd 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java @@ -25,6 +25,7 @@ public class Expense extends BaseEntity { private Long id; private String title; private int amount; + @Enumerated(EnumType.STRING) private ExpenseCategory expenseCategory; private LocalDate expenseDate; diff --git a/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java b/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java index d65c6a3..531ffab 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java @@ -174,39 +174,40 @@ public ExpenseResponseDTO getExpensesByTrip(Long tripId) { Trip trip = tripRepository.findById(tripId) .orElseThrow(() -> new IllegalArgumentException("해당 여행이 존재하지 않습니다: " + tripId)); - // 남은 비용 계산 + List expenses = expenseRepository.findByTripId(tripId); + + Map categoryCosts = new HashMap<>(); + for (Expense expense : expenses) { + categoryCosts.put(expense.getExpenseCategory(), + categoryCosts.getOrDefault(expense.getExpenseCategory(), 0) + expense.getAmount()); + } + int remainingCost = (trip.getBudget() != null ? trip.getBudget() : 0) - (trip.getTotalCost() != null ? trip.getTotalCost() : 0); - // 카테고리별 비용 계산 - List categories = expenseRepository.findCategoryCostsByTripId(tripId) - .stream() - .map(result -> { - ExpenseResponseDTO.CategoryCostDTO dto = new ExpenseResponseDTO.CategoryCostDTO(); - dto.setExpenseCategory((ExpenseCategory) result.get("category")); - dto.setCost(((Number) result.get("cost")).intValue()); - return dto; - }) - .collect(Collectors.toList()); - - // 멤버 정보 조회 + List categories = categoryCosts.entrySet().stream() + .map(entry -> { + ExpenseResponseDTO.CategoryCostDTO categoryCostDTO = new ExpenseResponseDTO.CategoryCostDTO(); + categoryCostDTO.setExpenseCategory(entry.getKey()); + categoryCostDTO.setCost(entry.getValue()); + return categoryCostDTO; + }).collect(Collectors.toList()); + List members = tripMemberRepository.findByTripId(tripId).stream() .map(tripMember -> { ExpenseResponseDTO.MemberDTO memberDTO = new ExpenseResponseDTO.MemberDTO(); memberDTO.setMemberId(tripMember.getMember().getId()); memberDTO.setNickName(tripMember.getMember().getNickName()); return memberDTO; - }) - .collect(Collectors.toList()); - - ExpenseResponseDTO response = new ExpenseResponseDTO(); - response.setRemainingCost(remainingCost); - response.setCategories(categories); - response.setMembers(members); - response.setBudget(trip.getBudget()); //budget 추가함 + }).collect(Collectors.toList()); + ExpenseResponseDTO responseDTO = new ExpenseResponseDTO(); + responseDTO.setBudget(trip.getBudget()); + responseDTO.setRemainingCost(remainingCost); + responseDTO.setCategories(categories); + responseDTO.setMembers(members); - return response; + return responseDTO; } public List> getExpensesByDate(Long tripId) { From d82635d3523a83823646097b313569d27d50b835 Mon Sep 17 00:00:00 2001 From: fewolee Date: Sun, 29 Dec 2024 17:28:48 +0900 Subject: [PATCH 5/8] =?UTF-8?q?[Refac]=20=EC=97=AC=ED=96=89=EB=B3=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/trip/dto/response/TripInfoResponseDto.java | 7 ++++++- .../Dodutch_Server/domain/trip/service/TripService.java | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripInfoResponseDto.java b/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripInfoResponseDto.java index 28ba8c1..2f69809 100644 --- a/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripInfoResponseDto.java +++ b/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripInfoResponseDto.java @@ -1,6 +1,7 @@ package com.Dodutch_Server.domain.trip.dto.response; import lombok.*; +import org.joda.time.DateTime; import java.time.LocalDate; import java.util.List; @@ -34,5 +35,9 @@ public static class MemberDTO { @Setter public static class PhotoDTO { private String photoUrl; + private LocalDate expenseDate; + private String title; + private Integer amount; + private String memo; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Dodutch_Server/domain/trip/service/TripService.java b/src/main/java/com/Dodutch_Server/domain/trip/service/TripService.java index a5699ad..249edca 100644 --- a/src/main/java/com/Dodutch_Server/domain/trip/service/TripService.java +++ b/src/main/java/com/Dodutch_Server/domain/trip/service/TripService.java @@ -171,6 +171,10 @@ public TripInfoResponseDto convertToTripInfoResponse(Trip trip) { .map(expense -> { TripInfoResponseDto.PhotoDTO photoDTO = new TripInfoResponseDto.PhotoDTO(); photoDTO.setPhotoUrl(expense.getExpenseImageUrl()); + photoDTO.setExpenseDate(expense.getExpenseDate()); + photoDTO.setTitle(expense.getTitle()); + photoDTO.setAmount(expense.getAmount()); + photoDTO.setMemo(expense.getMemo()); return photoDTO; }) .collect(Collectors.toList()); From 935c01657627b022e5298664eb49927a02e53bc3 Mon Sep 17 00:00:00 2001 From: optiprime27 Date: Sun, 29 Dec 2024 17:56:16 +0900 Subject: [PATCH 6/8] =?UTF-8?q?[Refac]=20=EC=97=AC=ED=96=89=20=EB=A9=94?= =?UTF-8?q?=EB=AA=A8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dodutch_Server/domain/trip/dto/response/TripResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripResponse.java b/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripResponse.java index c06c772..8715198 100644 --- a/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripResponse.java +++ b/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripResponse.java @@ -16,7 +16,7 @@ public class TripResponse { private String place; // 장소 private Long budget; // 예산 private Integer totalCost; // 추가함 - private String memo; + //private String memo; private List members; // 멤버 리스트 추가 From d1653d6b02cf3b0099ad03d3d52ab603a29f7e0e Mon Sep 17 00:00:00 2001 From: yeobi Date: Sun, 29 Dec 2024 18:00:43 +0900 Subject: [PATCH 7/8] =?UTF-8?q?[Refactor]=20Dutch=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C,=20=EA=B7=BC=EB=8D=B0=20=EC=9D=B4=EC=A0=9C?= =?UTF-8?q?=20memberId=20filtering=EC=9D=84=20=EA=B3=81=EB=93=A4=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dutch/controller/DutchController.java | 20 +++++++++++++++---- .../dutch/repository/DutchRepository.java | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java b/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java index 8906b8d..f9c3dd2 100644 --- a/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java +++ b/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java @@ -1,5 +1,6 @@ package com.Dodutch_Server.domain.dutch.controller; +import com.Dodutch_Server.domain.auth.util.SecurityUtil; import com.Dodutch_Server.domain.dutch.dto.DutchDTO; import com.Dodutch_Server.domain.dutch.entity.Dutch; import com.Dodutch_Server.domain.dutch.repository.DutchRepository; @@ -34,8 +35,11 @@ private boolean isValidTrip(Long tripId) { @GetMapping("/dutch") public ResponseEntity getAllDutchList() { - List responseDTOs = dutchRepository.findAll(Sort.by(Sort.Order.desc("createdAt"))) - .stream() + Long memberId = SecurityUtil.getCurrentUserId(); + + List dutchList = dutchRepository.findByPayerIdOrPayeeId(memberId, memberId); + + List responseDTOs = dutchList.stream() .map(DutchResponseDTO::fromEntity) .collect(Collectors.toList()); return ResponseEntity.ok().body( @@ -51,8 +55,15 @@ public ResponseEntity getDutchList(@PathVariable Long tripId) { ); } - List responseDTOs = dutchRepository.findByTripId(tripId) - .stream() + Long memberId = SecurityUtil.getCurrentUserId(); + + List dutchList = dutchRepository.findByTripId(tripId).stream() + .filter(dutch -> dutch.getPayer().getId().equals(memberId) || + dutch.getPayee().getId().equals(memberId)) + .collect(Collectors.toList()); + + + List responseDTOs = dutchList.stream() .map(DutchResponseDTO::fromEntity) .collect(Collectors.toList()); return ResponseEntity.ok().body( @@ -69,6 +80,7 @@ public ResponseEntity getDutchDetail(@PathVariable Long tripId, @PathVariable } Optional dutch = dutchRepository.findByTripIdAndId(tripId, dutchId); + if (dutch.isPresent()) { DutchResponseDTO responseDTO = DutchResponseDTO.fromEntity(dutch.get()); return ResponseEntity.ok().body( diff --git a/src/main/java/com/Dodutch_Server/domain/dutch/repository/DutchRepository.java b/src/main/java/com/Dodutch_Server/domain/dutch/repository/DutchRepository.java index 6172e64..72d63b2 100644 --- a/src/main/java/com/Dodutch_Server/domain/dutch/repository/DutchRepository.java +++ b/src/main/java/com/Dodutch_Server/domain/dutch/repository/DutchRepository.java @@ -11,4 +11,5 @@ public interface DutchRepository extends JpaRepository { List findByTripId(Long tripId); Optional findByTripIdAndId(Long tripId, Long id); boolean existsByTripIdAndPayerIdAndPayeeIdAndPerCost(Long tripId, Long payerId, Long payeeId, Integer perCost); + List findByPayerIdOrPayeeId(Long payerId, Long payeeId); } From f94ac362e7e9f7039edaa6b20d3c15512be299d7 Mon Sep 17 00:00:00 2001 From: yeobi Date: Sun, 29 Dec 2024 19:16:32 +0900 Subject: [PATCH 8/8] =?UTF-8?q?[Fix]=20=EC=A0=95=EC=82=B0=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/Dodutch_Server/domain/dutch/service/DutchService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/Dodutch_Server/domain/dutch/service/DutchService.java b/src/main/java/com/Dodutch_Server/domain/dutch/service/DutchService.java index 1d85f1a..e5397d8 100644 --- a/src/main/java/com/Dodutch_Server/domain/dutch/service/DutchService.java +++ b/src/main/java/com/Dodutch_Server/domain/dutch/service/DutchService.java @@ -116,6 +116,8 @@ public List calculateSettlement(Long tripId) { // 잔액 갱신 payeeBalance -= amountToPay; + payerBalance += amountToPay; + memberBalances.put(payee, payeeBalance); memberBalances.put(payer, payerBalance); }