diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Assignment/service/AssignmentService.java b/backend/pirocheck/src/main/java/backend/pirocheck/Assignment/service/AssignmentService.java index 489d3fa..a1f9a3c 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/Assignment/service/AssignmentService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Assignment/service/AssignmentService.java @@ -13,6 +13,9 @@ import backend.pirocheck.Assignment.entity.AssignmentStatus; import backend.pirocheck.Assignment.repository.AssignmentItemRepository; import backend.pirocheck.Assignment.repository.AssignmentRepository; +import backend.pirocheck.Deposit.entity.Deposit; +import backend.pirocheck.Deposit.repository.DepositRepository; +import backend.pirocheck.Deposit.service.DepositService; import backend.pirocheck.User.entity.Role; import backend.pirocheck.User.entity.User; import backend.pirocheck.User.repository.UserRepository; @@ -33,6 +36,7 @@ public class AssignmentService { private final AssignmentItemRepository assignmentItemRepository; private final AssignmentRepository assignmentRepository; private final UserRepository userRepository; + private final DepositService depositService; public List search(Long userId) { @@ -163,6 +167,9 @@ public AssignmentStatus createAssignmentItem(Long userId, Long assignmentId, Ass assignmentItemRepository.save(assignmentItem); + // 보증금 즉시 재계산 + depositService.recalculateDeposit(userId); + return assignmentItem.getSubmitted(); } @@ -177,10 +184,12 @@ public AssignmentStatus updateAssignmentItem(Long userId, Long assignmentId, Ass AssignmentItem assignmentItem = assignmentItemRepository.findByUserAndAssignment(user, assignment) .orElseThrow(() -> new IllegalArgumentException("해당 유저의 과제 채점 결과가 없습니다.")); - assignmentItem.update(req.getStatus()); // 상태 업데이트 + assignmentItem.update(req.getStatus()); // 상태 업데이트 assignmentItemRepository.save(assignmentItem); // 상태 저장 + // 보증금 즉시 재계산 + depositService.recalculateDeposit(userId); return assignmentItem.getSubmitted(); } } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceRepository.java index 783b90b..938c8af 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceRepository.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceRepository.java @@ -20,4 +20,5 @@ public interface AttendanceRepository extends JpaRepository { // 특정 날짜와 차수에 대한 모든 출석 기록 조회 List findByDateAndOrder(LocalDate date, int order); + } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/service/AttendanceService.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/service/AttendanceService.java index ae0dec4..927411d 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/service/AttendanceService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/service/AttendanceService.java @@ -1,5 +1,8 @@ package backend.pirocheck.Attendance.service; +import backend.pirocheck.Deposit.entity.Deposit; +import backend.pirocheck.Deposit.repository.DepositRepository; +import backend.pirocheck.Deposit.service.DepositService; import backend.pirocheck.User.entity.Role; import backend.pirocheck.User.entity.User; import backend.pirocheck.User.repository.UserRepository; @@ -30,6 +33,7 @@ public class AttendanceService { private final AttendanceRepository attendanceRepository; private final AttendanceCodeRepository attendanceCodeRepository; private final UserRepository userRepository; + private final DepositService depositService; // 출석코드 생성 함수 @Transactional @@ -121,6 +125,7 @@ public String expireAttendanceCode(String code) { attendanceCode.setExpired(true); attendanceCodeRepository.save(attendanceCode); + return "출석 코드가 성공적으로 만료되었습니다"; } @@ -171,6 +176,9 @@ public AttendanceMarkResponse markAttendance(Long userId, String inputCode) { attendance.setStatus(true); attendanceRepository.save(attendance); + //보증금 재계산 + depositService.recalculateDeposit(userId); + return AttendanceMarkResponse.success(); } @@ -223,6 +231,10 @@ public boolean updateAttendanceStatus(Long attendanceId, boolean status) { Attendance attendance = attendanceOpt.get(); attendance.setStatus(status); attendanceRepository.save(attendance); + + // 출석 변경 → 보증금 재계산 + depositService.recalculateDeposit(attendance.getUser().getId()); + return true; } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java index 66eafb1..194dbaf 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java @@ -28,29 +28,40 @@ public DepositResDto getDeposit(Long userId) { .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 유저입니다.")); Deposit deposit = depositRepository.findByUser(user); + calculateAndSave(user, deposit); - // 출석 실패 + return DepositResDto.builder() + .amount(deposit.getAmount()) + .descentAssignment(deposit.getDescentAssignment()) + .descentAttendance(deposit.getDescentAttendance()) + .ascentDefence(deposit.getAscentDefence()) + .build(); + } + + // 보증금 재계산 (내부 로직만 수행) + @Transactional + public void recalculateDeposit(Long userId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 유저입니다.")); + + Deposit deposit = depositRepository.findByUser(user); + calculateAndSave(user, deposit); + } + + // 공통 계산 로직 + private void calculateAndSave(User user, Deposit deposit) { + //출석 int failAttendanceCount = attendanceRepository.countByUserAndStatusFalse(user); int descentAttendance = failAttendanceCount * 10_000; - // 과제 실패 + //과제 int failAssignmentCount = assignmentItemRepository.countByUserAndSubmitted(user, AssignmentStatus.FAILURE); int weakAssignmentCount = assignmentItemRepository.countByUserAndSubmitted(user, AssignmentStatus.INSUFFICIENT); int descentAssignment = failAssignmentCount * 20_000 + weakAssignmentCount * 10_000; - // 방어권 int ascentDefence = deposit.getAscentDefence(); - // 보증금 업데이트 deposit.updateAmounts(descentAssignment, descentAttendance, ascentDefence); depositRepository.save(deposit); - - return DepositResDto.builder() - .amount(deposit.getAmount()) - .descentAssignment(deposit.getDescentAssignment()) - .descentAttendance(deposit.getDescentAttendance()) - .ascentDefence(deposit.getAscentDefence()) - .build(); - } } \ No newline at end of file