Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<AssignmentWeekRes> search(Long userId) {

Expand Down Expand Up @@ -163,6 +167,9 @@ public AssignmentStatus createAssignmentItem(Long userId, Long assignmentId, Ass

assignmentItemRepository.save(assignmentItem);

// 보증금 즉시 재계산
depositService.recalculateDeposit(userId);

return assignmentItem.getSubmitted();
}

Expand All @@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ public interface AttendanceRepository extends JpaRepository<Attendance, Long> {

// 특정 날짜와 차수에 대한 모든 출석 기록 조회
List<Attendance> findByDateAndOrder(LocalDate date, int order);

}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -30,6 +33,7 @@ public class AttendanceService {
private final AttendanceRepository attendanceRepository;
private final AttendanceCodeRepository attendanceCodeRepository;
private final UserRepository userRepository;
private final DepositService depositService;

// 출석코드 생성 함수
@Transactional
Expand Down Expand Up @@ -121,6 +125,7 @@ public String expireAttendanceCode(String code) {
attendanceCode.setExpired(true);
attendanceCodeRepository.save(attendanceCode);


return "출석 코드가 성공적으로 만료되었습니다";
}

Expand Down Expand Up @@ -171,6 +176,9 @@ public AttendanceMarkResponse markAttendance(Long userId, String inputCode) {
attendance.setStatus(true);
attendanceRepository.save(attendance);

//보증금 재계산
depositService.recalculateDeposit(userId);

return AttendanceMarkResponse.success();
}

Expand Down Expand Up @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();

}
}