From f74f71a8988c06d59050b9ab430bd73fc8d4b86c Mon Sep 17 00:00:00 2001 From: 5uhwann <106325839+5uhwann@users.noreply.github.com> Date: Sun, 2 Jun 2024 20:00:45 +0900 Subject: [PATCH] =?UTF-8?q?[DEV-9]=20=EB=B3=B5=EC=88=98=EC=A0=84=EA=B3=B5?= =?UTF-8?q?=20=EC=A1=B8=EC=97=85=20=EA=B3=84=EC=82=B0=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EB=B0=8F=20=EC=A1=B0=ED=9A=8C=20API=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?(#266)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: GraduationRequirement - 복수전공생 학점 조정 구현 * refactor: 오타 수정 * refactor: 복수전공 졸업 카테고리 분리 및 UseCase 분리 * refactor: MajorManager - 전공 구분 필드 및 지정 로직 추가 * feat: 복수전공필수 졸업계산 로직 구현 및 전체 졸업 계산 로직 시 복수전공 졸업 계산 로직 추가 * feat: 복수전공선택 졸업계산 로직 구현 * refactor: DetailCategoryResult - 상세 카테고리 명 지정 로직 추가 * feat: 복수학문기초교양 졸업 계산 로직 구현 * refactor: 파라미터 순서 오류 수정 * refactor: MajorExceptionHandler - 현재 계산중인 MajorGraduationCategory 지정 로직 추가 및 OptionalMandatory 생성 로직 수정 * refactor: UserMapper - 누락 필드 추가 * refactor: GraduationResult - totalCredit 총점 계산 로직 수정 * refactor: 경영학과 OptionalMandatory 수정(2024-1) * refactor: totalCredit - 채플 중복학점 누적 로직 제거 * refactor: CompletedCredit 응답 시 totalCredit이 0일 경우 응답X 로직 추가 * refactor:FindBasicAcademicalCulturePort - 복수전공 졸업과목 조회 메서드 파라미터 수정 --- .../api/FindCompletedCreditsController.java | 1 + ...demicalCultureDetailGraduationService.java | 65 +++++++++++ ...icalCultureDetailGraduationUseService.java | 28 ----- ...lElectiveMajorDetailGraduationService.java | 70 ++++++++++++ ...ulateDualMajorDetailGraduationService.java | 27 ----- ...MandatoryMajorDetailGraduationService.java | 70 ++++++++++++ .../service/CalculateGraduationService.java | 50 +++++++-- ...demicalCultureDetailGraduationService.java | 8 +- ...yElectiveMajorDetailGraduationService.java | 9 +- ...MandatoryMajorDetailGraduationService.java | 9 +- ...lElectiveMajorDetailGraduationUseCase.java | 9 ++ ...ulateDualMajorDetailGraduationUseCase.java | 4 - ...MandatoryMajorDetailGraduationUseCase.java | 9 ++ .../DefaultGraduationRequirementType.java | 12 +- .../domain/model/DetailCategoryResult.java | 6 +- .../DualMajorGraduationRequirementType.java | 22 ++-- .../domain/model/GraduationCategory.java | 7 +- .../domain/model/GraduationRequirement.java | 37 +++++-- .../domain/model/GraduationResult.java | 18 +-- .../major/MajorGraduationCategory.java | 10 ++ .../domain/service/major/MajorManager.java | 13 ++- .../service/major/MandatoryMajorManager.java | 11 +- .../exception/MajorExceptionHandler.java | 5 +- .../major/exception/OptionalMandatory.java | 28 +++-- .../exception/OptionalMandatoryHandler.java | 48 +++++--- .../ReplaceMandatoryMajorHandler.java | 19 +++- .../port/FindBasicAcademicalCulturePort.java | 3 +- ...icAcademicalCulturePersistenceAdapter.java | 9 +- .../user/domain/model/User.java | 2 +- .../persistence/mapper/UserMapper.java | 1 + .../FindCompletedCreditsControllerTest.java | 26 +++++ ...teDetailGraduationUseCaseResolverTest.java | 4 +- ...calCultureDetailGraduationServiceTest.java | 67 +++++++++++ ...ctiveMajorDetailGraduationServiceTest.java | 104 ++++++++++++++++++ ...atoryMajorDetailGraduationServiceTest.java | 103 +++++++++++++++++ ...calCultureDetailGraduationServiceTest.java | 4 +- ...lateSingleDetailGraduationServiceTest.java | 4 +- .../model/GraduationRequirementTest.java | 37 ++++++- .../domain/model/GraduationResultTest.java | 4 +- .../major/DataTechnologyMajorTest.java | 5 +- .../major/InternationTradeMajorTest.java | 13 ++- .../ReplaceMandatoryMajorHandlerTest.java | 26 ++--- ...ademicalCulturePersistenceAdapterTest.java | 7 +- 43 files changed, 813 insertions(+), 201 deletions(-) create mode 100644 src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationService.java delete mode 100644 src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationUseService.java create mode 100644 src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualElectiveMajorDetailGraduationService.java delete mode 100644 src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMajorDetailGraduationService.java create mode 100644 src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMandatoryMajorDetailGraduationService.java create mode 100644 src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualElectiveMajorDetailGraduationUseCase.java delete mode 100644 src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualMajorDetailGraduationUseCase.java create mode 100644 src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualMandatoryMajorDetailGraduationUseCase.java create mode 100644 src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorGraduationCategory.java create mode 100644 src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationServiceTest.java create mode 100644 src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualElectiveMajorDetailGraduationServiceTest.java create mode 100644 src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMandatoryMajorDetailGraduationServiceTest.java diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsController.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsController.java index 7531d17f..8795f337 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsController.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsController.java @@ -23,6 +23,7 @@ public class FindCompletedCreditsController implements FindCompletedCreditApiPre @GetMapping() public List getCompletedCredits(@LoginUser Long userId) { return findCompletedCreditUseCase.findCompletedCredits(userId).stream() + .filter(completedCredit -> completedCredit.getTotalCredit() != 0) .map(CompletedCreditResponse::from) .collect(Collectors.toList()); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationService.java new file mode 100644 index 00000000..b2de4ffb --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationService.java @@ -0,0 +1,65 @@ +package com.plzgraduate.myongjigraduatebe.graduation.application.service; + +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_BASIC_ACADEMICAL_CULTURE; + +import java.util.List; +import java.util.Set; + +import org.springframework.transaction.annotation.Transactional; + +import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; +import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDualBasicAcademicalCultureDetailGraduationUseCase; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.GraduationManager; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.basicacademicalculture.BasicAcademicalManager; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.basicacademicalculture.BusinessBasicAcademicalManager; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.basicacademicalculture.DefaultBasicAcademicalManager; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.basicacademicalculture.SocialScienceBasicAcademicManager; +import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindBasicAcademicalCulturePort; +import com.plzgraduate.myongjigraduatebe.lecture.domain.model.BasicAcademicalCultureLecture; +import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +import lombok.RequiredArgsConstructor; + +@UseCase +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class CalculateDualBasicAcademicalCultureDetailGraduationService implements + CalculateDualBasicAcademicalCultureDetailGraduationUseCase { + + private final FindBasicAcademicalCulturePort findBasicAcademicalCulturePort; + + @Override + public boolean supports(GraduationCategory graduationCategory) { + return graduationCategory == DUAL_BASIC_ACADEMICAL_CULTURE; + } + + @Override + public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory, + GraduationRequirement graduationRequirement) { + Set graduationBasicAcademicalCultureLectures = findBasicAcademicalCulturePort.findBasicAcademicalCulture( + user.getDualMajor()); + GraduationManager basicAcademicalCultureGraduationManager = determineBasicAcademicalCultureGraduationManager( + user); + DetailGraduationResult detailGraduationResult = basicAcademicalCultureGraduationManager.createDetailGraduationResult( + user, takenLectureInventory, graduationBasicAcademicalCultureLectures, + graduationRequirement.getDualBasicAcademicalCultureCredit()); + detailGraduationResult.assignGraduationCategory(DUAL_BASIC_ACADEMICAL_CULTURE); + return detailGraduationResult; + } + + private GraduationManager determineBasicAcademicalCultureGraduationManager( + User user) { + List basicAcademicalManagers = List.of( + new BusinessBasicAcademicalManager(), + new SocialScienceBasicAcademicManager()); + + return basicAcademicalManagers.stream() + .filter(basicAcademicalManager -> basicAcademicalManager.isSatisfied(user.getDualMajor())) + .findFirst() + .orElse(new DefaultBasicAcademicalManager()); + } +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationUseService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationUseService.java deleted file mode 100644 index c0088575..00000000 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationUseService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.plzgraduate.myongjigraduatebe.graduation.application.service; - -import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_BASIC_ACADEMICAL_CULTURE; - -import org.springframework.stereotype.Service; - -import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; -import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDualBasicAcademicalCultureDetailGraduationUseCase; -import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; -import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; -import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; -import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; -import com.plzgraduate.myongjigraduatebe.user.domain.model.User; - -@UseCase -public class CalculateDualBasicAcademicalCultureDetailGraduationUseService implements - CalculateDualBasicAcademicalCultureDetailGraduationUseCase { - @Override - public boolean supports(GraduationCategory graduationCategory) { - return graduationCategory == DUAL_BASIC_ACADEMICAL_CULTURE; - } - - @Override - public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory, - GraduationRequirement graduationRequirement) { - return null; - } -} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualElectiveMajorDetailGraduationService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualElectiveMajorDetailGraduationService.java new file mode 100644 index 00000000..bf6879bf --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualElectiveMajorDetailGraduationService.java @@ -0,0 +1,70 @@ +package com.plzgraduate.myongjigraduatebe.graduation.application.service; + +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_ELECTIVE_MAJOR; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.DUAL; + +import java.util.List; +import java.util.Set; + +import org.springframework.transaction.annotation.Transactional; + +import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; +import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDualElectiveMajorDetailGraduationUseCase; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailCategoryResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.GraduationManager; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorManager; +import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindMajorPort; +import com.plzgraduate.myongjigraduatebe.lecture.domain.model.MajorLecture; +import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +import lombok.RequiredArgsConstructor; + +@UseCase +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class CalculateDualElectiveMajorDetailGraduationService + implements CalculateDualElectiveMajorDetailGraduationUseCase { + + private final FindMajorPort findMajorPort; + + @Override + public boolean supports(GraduationCategory graduationCategory) { + return graduationCategory == DUAL_ELECTIVE_MAJOR; + } + + @Override + public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory, + GraduationRequirement graduationRequirement) { + Set graduationMajorLectures = findMajorPort.findMajor(user.getDualMajor()); + GraduationManager majorGraduationManager = new MajorManager(DUAL); + DetailGraduationResult majorDetailGraduationResult = majorGraduationManager.createDetailGraduationResult(user, + takenLectureInventory, graduationMajorLectures, graduationRequirement.getDualMajorCredit()); + + DetailCategoryResult electiveMajorDetailCategoryResult = separateElectiveMajor(majorDetailGraduationResult); + return DetailGraduationResult.create(DUAL_ELECTIVE_MAJOR, electiveMajorDetailCategoryResult.getTotalCredits(), + List.of(electiveMajorDetailCategoryResult)); + } + + @Override + public DetailGraduationResult isolateDualElectiveMajorDetailGraduation( + DetailGraduationResult dualMajorDetailGraduationResult) { + DetailCategoryResult electiveMajorDetailCategoryResult = separateElectiveMajor( + dualMajorDetailGraduationResult); + return DetailGraduationResult.create(DUAL_ELECTIVE_MAJOR, + electiveMajorDetailCategoryResult.getTotalCredits(), List.of(electiveMajorDetailCategoryResult)); + } + + private DetailCategoryResult separateElectiveMajor( + DetailGraduationResult majorDetailGraduationResult) { + DetailCategoryResult dualElectiveMajorDetailCategoryResult = majorDetailGraduationResult.getDetailCategory().stream() + .filter(detailCategoryResult -> detailCategoryResult.getDetailCategoryName().equals("전공선택")) + .findFirst() + .orElseThrow(() -> new RuntimeException("Not Found DetailCategoryResult(전공 선택)")); + dualElectiveMajorDetailCategoryResult.assignDetailCategoryName("복수전공선택"); + return dualElectiveMajorDetailCategoryResult; + } +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMajorDetailGraduationService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMajorDetailGraduationService.java deleted file mode 100644 index a95a3c58..00000000 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMajorDetailGraduationService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.plzgraduate.myongjigraduatebe.graduation.application.service; - -import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_MAJOR; - -import org.springframework.stereotype.Service; - -import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; -import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDualMajorDetailGraduationUseCase; -import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; -import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; -import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; -import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; -import com.plzgraduate.myongjigraduatebe.user.domain.model.User; - -@UseCase -public class CalculateDualMajorDetailGraduationService implements CalculateDualMajorDetailGraduationUseCase { - @Override - public boolean supports(GraduationCategory graduationCategory) { - return graduationCategory == DUAL_MAJOR; - } - - @Override - public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory, - GraduationRequirement graduationRequirement) { - return null; - } -} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMandatoryMajorDetailGraduationService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMandatoryMajorDetailGraduationService.java new file mode 100644 index 00000000..f358e3d1 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMandatoryMajorDetailGraduationService.java @@ -0,0 +1,70 @@ +package com.plzgraduate.myongjigraduatebe.graduation.application.service; + +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_MANDATORY_MAJOR; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.DUAL; + +import java.util.List; +import java.util.Set; + +import org.springframework.transaction.annotation.Transactional; + +import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; +import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDualMandatoryMajorDetailGraduationUseCase; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailCategoryResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.GraduationManager; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorManager; +import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindMajorPort; +import com.plzgraduate.myongjigraduatebe.lecture.domain.model.MajorLecture; +import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +import lombok.RequiredArgsConstructor; + +@UseCase +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class CalculateDualMandatoryMajorDetailGraduationService + implements CalculateDualMandatoryMajorDetailGraduationUseCase { + + private final FindMajorPort findMajorPort; + + @Override + public boolean supports(GraduationCategory graduationCategory) { + return graduationCategory == DUAL_MANDATORY_MAJOR; + } + + @Override + public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory, + GraduationRequirement graduationRequirement) { + Set graduationMajorLectures = findMajorPort.findMajor(user.getDualMajor()); + GraduationManager majorGraduationManager = new MajorManager(DUAL); + DetailGraduationResult majorDetailGraduationResult = majorGraduationManager.createDetailGraduationResult(user, + takenLectureInventory, graduationMajorLectures, graduationRequirement.getDualMajorCredit()); + + DetailCategoryResult mandatoryMajorDetailCategoryResult = separateMandatoryMajor(majorDetailGraduationResult); + return DetailGraduationResult.create(DUAL_MANDATORY_MAJOR, + mandatoryMajorDetailCategoryResult.getTotalCredits(), List.of(mandatoryMajorDetailCategoryResult)); + } + + @Override + public DetailGraduationResult isolateDualMandatoryMajorDetailGraduation( + DetailGraduationResult dualMajorDetailGraduationResult) { + DetailCategoryResult mandatoryMajorDetailCategoryResult = separateMandatoryMajor( + dualMajorDetailGraduationResult); + return DetailGraduationResult.create(DUAL_MANDATORY_MAJOR, + mandatoryMajorDetailCategoryResult.getTotalCredits(), List.of(mandatoryMajorDetailCategoryResult)); + } + + private DetailCategoryResult separateMandatoryMajor( + DetailGraduationResult majorDetailGraduationResult) { + DetailCategoryResult dualMandatoryMajorDetailCategoryResult = majorDetailGraduationResult.getDetailCategory().stream() + .filter(detailCategoryResult -> detailCategoryResult.getDetailCategoryName().equals("전공필수")) + .findFirst() + .orElseThrow(() -> new RuntimeException("Not Found DetailCategoryResult(전공 필수)")); + dualMandatoryMajorDetailCategoryResult.assignDetailCategoryName("복수전공필수"); + return dualMandatoryMajorDetailCategoryResult; + } +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateGraduationService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateGraduationService.java index 80bfc05a..1a6466b3 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateGraduationService.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateGraduationService.java @@ -1,5 +1,8 @@ package com.plzgraduate.myongjigraduatebe.graduation.application.service; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.DUAL; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.PRIMARY; + import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -9,7 +12,11 @@ import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateCommonCultureGraduationUseCase; import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateCoreCultureGraduationUseCase; +import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDualBasicAcademicalCultureDetailGraduationUseCase; +import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDualElectiveMajorDetailGraduationUseCase; +import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDualMandatoryMajorDetailGraduationUseCase; import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateGraduationUseCase; +import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculatePrimaryBasicAcademicalCultureDetailGraduationUseCase; import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculatePrimaryElectiveMajorDetailGraduationUseCase; import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculatePrimaryMandatoryMajorDetailGraduationUseCase; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.ChapelResult; @@ -44,7 +51,10 @@ class CalculateGraduationService implements CalculateGraduationUseCase { private final CalculateCoreCultureGraduationUseCase calculateCoreCultureGraduationUseCase; private final CalculatePrimaryMandatoryMajorDetailGraduationUseCase calculatePrimaryMandatoryMajorDetailGraduationUseCase; private final CalculatePrimaryElectiveMajorDetailGraduationUseCase calculatePrimaryElectiveMajorDetailGraduationUseCase; - private final CalculatePrimaryBasicAcademicalCultureDetailGraduationService calculatePrimaryBasicAcademicalCultureDetailGraduationService; + private final CalculatePrimaryBasicAcademicalCultureDetailGraduationUseCase calculatePrimaryBasicAcademicalCultureDetailGraduationUseCase; + private final CalculateDualMandatoryMajorDetailGraduationUseCase calculateDualMandatoryMajorDetailGraduationUseCase; + private final CalculateDualElectiveMajorDetailGraduationUseCase calculateDualElectiveMajorDetailGraduationUseCase; + private final CalculateDualBasicAcademicalCultureDetailGraduationUseCase calculateDualBasicAcademicalCultureDetailGraduationUseCase; private final UpdateStudentInformationUseCase updateStudentInformationUseCase; @Override @@ -85,9 +95,13 @@ private List generateDetailGraduationResults(User user, generteBasicAcademicalDetailGraduationResult( user, takenLectureInventory, graduationRequirement) )); + detailGraduationResults.addAll( + generatePrimaryMajorDetailGraduations(user, takenLectureInventory, graduationRequirement)); - addPrimaryMajorDetailGraduation(user, takenLectureInventory, graduationRequirement, detailGraduationResults); - + if (user.getStudentCategory() == StudentCategory.DUAL_MAJOR) { + detailGraduationResults.addAll( + generateDualMajorDetailGraduations(user, takenLectureInventory, graduationRequirement)); + } if (user.getStudentCategory() == StudentCategory.SUB_MAJOR) { detailGraduationResults.add( generateSubMajorDetailGraduationResult(user, takenLectureInventory, graduationRequirement)); @@ -110,15 +124,15 @@ private DetailGraduationResult generateCoreCultureDetailGraduationResult(User us private DetailGraduationResult generteBasicAcademicalDetailGraduationResult(User user, TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) { - return calculatePrimaryBasicAcademicalCultureDetailGraduationService.calculateDetailGraduation(user, + return calculatePrimaryBasicAcademicalCultureDetailGraduationUseCase.calculateDetailGraduation(user, takenLectureInventory, graduationRequirement); } - private void addPrimaryMajorDetailGraduation(User user, TakenLectureInventory takenLectureInventory, - GraduationRequirement graduationRequirement, List detailGraduationResults) { + private List generatePrimaryMajorDetailGraduations(User user, + TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) { Set graduationPrimaryMajorLectures = findMajorPort.findMajor(user.getPrimaryMajor()); - MajorManager majorManager = new MajorManager(); + GraduationManager majorManager = new MajorManager(PRIMARY); DetailGraduationResult primaryMajorDetailGraduationResult = majorManager.createDetailGraduationResult(user, takenLectureInventory, graduationPrimaryMajorLectures, graduationRequirement.getPrimaryMajorCredit()); DetailGraduationResult primaryMandatoryMajorDetailGraduationResult = calculatePrimaryMandatoryMajorDetailGraduationUseCase.isolatePrimaryMandatoryMajorDetailGraduation( @@ -126,8 +140,24 @@ private void addPrimaryMajorDetailGraduation(User user, TakenLectureInventory ta DetailGraduationResult primaryElectiveMajorDetailGraduationResult = calculatePrimaryElectiveMajorDetailGraduationUseCase.isolatePrimaryElectiveMajorDetailGraduation( primaryMajorDetailGraduationResult); - detailGraduationResults.addAll( - List.of(primaryMandatoryMajorDetailGraduationResult, primaryElectiveMajorDetailGraduationResult)); + return List.of(primaryMandatoryMajorDetailGraduationResult, primaryElectiveMajorDetailGraduationResult); + } + + private List generateDualMajorDetailGraduations(User user, + TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) { + Set graduationDualMajorLectures = findMajorPort.findMajor(user.getDualMajor()); + + GraduationManager majorManager = new MajorManager(DUAL); + DetailGraduationResult dualMajorDetailGraduationResult = majorManager.createDetailGraduationResult(user, + takenLectureInventory, graduationDualMajorLectures, graduationRequirement.getDualMajorCredit()); + DetailGraduationResult dualMandatoryMajorDetailGraduationResult = calculateDualMandatoryMajorDetailGraduationUseCase.isolateDualMandatoryMajorDetailGraduation( + dualMajorDetailGraduationResult); + DetailGraduationResult dualElectiveMajorDetailGraduationResult = calculateDualElectiveMajorDetailGraduationUseCase.isolateDualElectiveMajorDetailGraduation( + dualMajorDetailGraduationResult); + DetailGraduationResult dualBasicAcademicalCultureDetailGraduationResult = calculateDualBasicAcademicalCultureDetailGraduationUseCase.calculateDetailGraduation( + user, takenLectureInventory, graduationRequirement); + return List.of(dualMandatoryMajorDetailGraduationResult, dualElectiveMajorDetailGraduationResult, + dualBasicAcademicalCultureDetailGraduationResult); } private DetailGraduationResult generateSubMajorDetailGraduationResult(User user, @@ -143,7 +173,7 @@ private GraduationResult generateGraduationResult(ChapelResult chapelResult, GraduationRequirement graduationRequirement) { GraduationResult graduationResult = GraduationResult.create(chapelResult, detailGraduationResults); graduationResult.handleLeftTakenLectures(takenLectureInventory, graduationRequirement); - graduationResult.checkGraduated(); + graduationResult.checkGraduated(graduationRequirement); return graduationResult; } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryBasicAcademicalCultureDetailGraduationService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryBasicAcademicalCultureDetailGraduationService.java index c899b2bb..71c85bbf 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryBasicAcademicalCultureDetailGraduationService.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryBasicAcademicalCultureDetailGraduationService.java @@ -8,7 +8,7 @@ import org.springframework.transaction.annotation.Transactional; import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; -import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDetailGraduationUseCase; +import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculatePrimaryBasicAcademicalCultureDetailGraduationUseCase; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; @@ -28,7 +28,7 @@ @Transactional(readOnly = true) @RequiredArgsConstructor public class CalculatePrimaryBasicAcademicalCultureDetailGraduationService - implements CalculateDetailGraduationUseCase { + implements CalculatePrimaryBasicAcademicalCultureDetailGraduationUseCase { private final FindBasicAcademicalCulturePort findBasicAcademicalCulturePort; @@ -41,12 +41,12 @@ public boolean supports(GraduationCategory graduationCategory) { public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) { Set graduationBasicAcademicalCultureLectures = findBasicAcademicalCulturePort.findBasicAcademicalCulture( - user); + user.getPrimaryMajor()); GraduationManager basicAcademicalCultureGraduationManager = determineBasicAcademicalCultureGraduationManager( user); DetailGraduationResult detailGraduationResult = basicAcademicalCultureGraduationManager.createDetailGraduationResult( user, takenLectureInventory, graduationBasicAcademicalCultureLectures, - graduationRequirement.getPrimaryBasicAcademicalCredit()); + graduationRequirement.getPrimaryBasicAcademicalCultureCredit()); detailGraduationResult.assignGraduationCategory(PRIMARY_BASIC_ACADEMICAL_CULTURE); return detailGraduationResult; } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryElectiveMajorDetailGraduationService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryElectiveMajorDetailGraduationService.java index 30edb262..f898cee5 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryElectiveMajorDetailGraduationService.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryElectiveMajorDetailGraduationService.java @@ -1,6 +1,7 @@ package com.plzgraduate.myongjigraduatebe.graduation.application.service; import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.PRIMARY_ELECTIVE_MAJOR; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.PRIMARY; import java.util.List; import java.util.Set; @@ -39,7 +40,7 @@ public boolean supports(GraduationCategory graduationCategory) { public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) { Set graduationMajorLectures = findMajorPort.findMajor(user.getPrimaryMajor()); - GraduationManager majorGraduationManager = new MajorManager(); + GraduationManager majorGraduationManager = new MajorManager(PRIMARY); DetailGraduationResult majorDetailGraduationResult = majorGraduationManager.createDetailGraduationResult(user, takenLectureInventory, graduationMajorLectures, graduationRequirement.getPrimaryMajorCredit()); @@ -60,10 +61,12 @@ public DetailGraduationResult isolatePrimaryElectiveMajorDetailGraduation( private DetailCategoryResult separateElectiveMajor( DetailGraduationResult majorDetailGraduationResult) { - return majorDetailGraduationResult.getDetailCategory() + DetailCategoryResult primaryElectiveDetailCategoryResult = majorDetailGraduationResult.getDetailCategory() .stream() .filter(detailCategoryResult -> detailCategoryResult.getDetailCategoryName().equals("전공선택")) .findFirst() - .orElseThrow(() -> new IllegalArgumentException("Not Found DetailCategoryResult(전공 선택)")); + .orElseThrow(() -> new RuntimeException("Not Found DetailCategoryResult(전공 선택)")); + primaryElectiveDetailCategoryResult.assignDetailCategoryName("주전공선택"); + return primaryElectiveDetailCategoryResult; } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryMandatoryMajorDetailGraduationService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryMandatoryMajorDetailGraduationService.java index ff16a213..dd23a463 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryMandatoryMajorDetailGraduationService.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryMandatoryMajorDetailGraduationService.java @@ -1,6 +1,7 @@ package com.plzgraduate.myongjigraduatebe.graduation.application.service; import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.PRIMARY_MANDATORY_MAJOR; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.PRIMARY; import java.util.List; import java.util.Set; @@ -39,7 +40,7 @@ public boolean supports(GraduationCategory graduationCategory) { public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) { Set graduationMajorLectures = findMajorPort.findMajor(user.getPrimaryMajor()); - GraduationManager majorGraduationManager = new MajorManager(); + GraduationManager majorGraduationManager = new MajorManager(PRIMARY); DetailGraduationResult majorDetailGraduationResult = majorGraduationManager.createDetailGraduationResult(user, takenLectureInventory, graduationMajorLectures, graduationRequirement.getPrimaryMajorCredit()); @@ -59,9 +60,11 @@ public DetailGraduationResult isolatePrimaryMandatoryMajorDetailGraduation( private DetailCategoryResult separateMandatoryMajor( DetailGraduationResult majorDetailGraduationResult) { - return majorDetailGraduationResult.getDetailCategory().stream() + DetailCategoryResult primaryMandatoryMajorDetailCategoryResult = majorDetailGraduationResult.getDetailCategory().stream() .filter(detailCategoryResult -> detailCategoryResult.getDetailCategoryName().equals("전공필수")) .findFirst() - .orElseThrow(() -> new IllegalArgumentException("Not Found DetailCategoryResult(전공 필수)")); + .orElseThrow(() -> new RuntimeException("Not Found DetailCategoryResult(전공 필수)")); + primaryMandatoryMajorDetailCategoryResult.assignDetailCategoryName("주전공필수"); + return primaryMandatoryMajorDetailCategoryResult; } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualElectiveMajorDetailGraduationUseCase.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualElectiveMajorDetailGraduationUseCase.java new file mode 100644 index 00000000..f5d152f2 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualElectiveMajorDetailGraduationUseCase.java @@ -0,0 +1,9 @@ +package com.plzgraduate.myongjigraduatebe.graduation.application.usecase; + +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; + +public interface CalculateDualElectiveMajorDetailGraduationUseCase extends CalculateDetailGraduationUseCase { + + DetailGraduationResult isolateDualElectiveMajorDetailGraduation( + DetailGraduationResult dualMajorDetailGraduationResult); +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualMajorDetailGraduationUseCase.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualMajorDetailGraduationUseCase.java deleted file mode 100644 index 8af57051..00000000 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualMajorDetailGraduationUseCase.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.plzgraduate.myongjigraduatebe.graduation.application.usecase; - -public interface CalculateDualMajorDetailGraduationUseCase extends CalculateDetailGraduationUseCase { -} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualMandatoryMajorDetailGraduationUseCase.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualMandatoryMajorDetailGraduationUseCase.java new file mode 100644 index 00000000..ff21fa6f --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateDualMandatoryMajorDetailGraduationUseCase.java @@ -0,0 +1,9 @@ +package com.plzgraduate.myongjigraduatebe.graduation.application.usecase; + +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; + +public interface CalculateDualMandatoryMajorDetailGraduationUseCase extends CalculateDetailGraduationUseCase { + + DetailGraduationResult isolateDualMandatoryMajorDetailGraduation( + DetailGraduationResult dualMajorDetailGraduationResult); +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DefaultGraduationRequirementType.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DefaultGraduationRequirementType.java index d11cbfb6..86020402 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DefaultGraduationRequirementType.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DefaultGraduationRequirementType.java @@ -51,8 +51,8 @@ public GraduationRequirement convertToProfitGraduationRequirement(User user) { .primaryMajorCredit(this.majorLectureCredit) .dualMajorCredit(0) .subMajorCredit(0) - .primaryBasicAcademicalCredit(this.basicAcademicalLectureCredit) - .dualBasicAcademicalCredit(0) + .primaryBasicAcademicalCultureCredit(this.basicAcademicalLectureCredit) + .dualBasicAcademicalCultureCredit(0) .commonCultureCredit(this.commonCultureCredit) .coreCultureCredit(this.coreCultureCredit) .normalCultureCredit(this.normalLectureCredit) @@ -71,13 +71,7 @@ private void checkIsEnglishFreeUserAndTransferCredit(User user, GraduationRequir private void checkIsMultiMajorUserAndTransferCredit(User user, GraduationRequirement graduationRequirement) { if (user.getStudentCategory() == StudentCategory.DUAL_MAJOR) { - DualMajorGraduationRequirementType originMajorGraduationRequirementType = DualMajorGraduationRequirementType.findBelongingDualMajorGraduationRequirementType( - College.findBelongingCollege(user.getPrimaryMajor()).getName()); - DualMajorGraduationRequirementType dualMajorGraduationRequirementType = DualMajorGraduationRequirementType.findBelongingDualMajorGraduationRequirementType( - College.findBelongingCollege(user.getDualMajor()).getName()); - - graduationRequirement.modifyCreditForDualMajor(originMajorGraduationRequirementType.getOriginMajorCredit(), - dualMajorGraduationRequirementType.getDualMajorCredit()); + graduationRequirement.modifyCreditForDualMajor(user); } if (user.getStudentCategory() == StudentCategory.SUB_MAJOR) { graduationRequirement.modifyCreditForSubMajor(); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailCategoryResult.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailCategoryResult.java index e322276c..80e096b7 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailCategoryResult.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailCategoryResult.java @@ -14,7 +14,7 @@ @Getter public class DetailCategoryResult { - private final String detailCategoryName; + private String detailCategoryName; private boolean isCompleted; private final boolean isSatisfiedMandatory; private final int totalCredits; @@ -49,6 +49,10 @@ public static DetailCategoryResult create(String detailCategoryName, boolean isS .build(); } + public void assignDetailCategoryName(String detailCategoryName) { + this.detailCategoryName = detailCategoryName; + } + public void calculate(Set taken, Set graduationLectures) { addTakenLectures(taken); calculateLeftCredit(); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DualMajorGraduationRequirementType.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DualMajorGraduationRequirementType.java index 7b3f944a..5a22c6cb 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DualMajorGraduationRequirementType.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DualMajorGraduationRequirementType.java @@ -9,19 +9,21 @@ @RequiredArgsConstructor public enum DualMajorGraduationRequirementType { - HUMANITIES("인문대", 36, 36), - SOCIAL_SCIENCE("사회과학대", 36, 36), - BUSINESS("경영대", 45, 45), - LAW("법대", 36, 36), - ICT("ICT융합대", 42, 42); + HUMANITIES("인문대", 36, 12), + SOCIAL_SCIENCE("사회과학대", 36, 12), + BUSINESS("경영대", 45, 6), + LAW("법대", 36, 9), + ICT("ICT융합대", 42, 18); - private final String name; - private final int originMajorCredit; - private final int dualMajorCredit; + private final String collageName; + private final int majorCredit; + private final int basicAcademicalCultureCredit; - public static DualMajorGraduationRequirementType findBelongingDualMajorGraduationRequirementType(String name) { + public static DualMajorGraduationRequirementType findBelongingDualMajorGraduationRequirementType( + String collageName) { return Arrays.stream(DualMajorGraduationRequirementType.values()) - .filter(dualMajorGraduationRequirementType -> dualMajorGraduationRequirementType.getName().equals(name)) + .filter(dualMajorGraduationRequirementType -> + dualMajorGraduationRequirementType.getCollageName().equals(collageName)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("소속 단과대가 존재하지 않습니다.")); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationCategory.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationCategory.java index f81aa671..a00c9c1c 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationCategory.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationCategory.java @@ -15,10 +15,11 @@ public enum GraduationCategory { CORE_CULTURE("핵심교양"), PRIMARY_MANDATORY_MAJOR("주전공필수"), PRIMARY_ELECTIVE_MAJOR("주전공선택"), - DUAL_MAJOR("복수전공"), + DUAL_MANDATORY_MAJOR("복수전공필수"), + DUAL_ELECTIVE_MAJOR("복수전공선택"), SUB_MAJOR("부전공"), - PRIMARY_BASIC_ACADEMICAL_CULTURE("주 학문기초교양"), - DUAL_BASIC_ACADEMICAL_CULTURE("복수 학문기초교양"), + PRIMARY_BASIC_ACADEMICAL_CULTURE("주학문기초교양"), + DUAL_BASIC_ACADEMICAL_CULTURE("복수학문기초교양"), NORMAL_CULTURE("일반교양"), FREE_ELECTIVE("자유선택"), CHAPEL("채플"); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirement.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirement.java index cdf44c2c..7697901e 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirement.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirement.java @@ -1,7 +1,11 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.model; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.DualMajorGraduationRequirementType.findBelongingDualMajorGraduationRequirementType; import static com.plzgraduate.myongjigraduatebe.lecture.domain.model.CommonCultureCategory.*; +import com.plzgraduate.myongjigraduatebe.user.domain.model.College; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + import lombok.Builder; import lombok.Getter; @@ -12,8 +16,8 @@ public class GraduationRequirement { private int primaryMajorCredit; private int dualMajorCredit; private int subMajorCredit; - private final int primaryBasicAcademicalCredit; - private final int dualBasicAcademicalCredit; + private final int primaryBasicAcademicalCultureCredit; + private int dualBasicAcademicalCultureCredit; private int commonCultureCredit; private final int coreCultureCredit; private int normalCultureCredit; @@ -21,14 +25,15 @@ public class GraduationRequirement { @Builder private GraduationRequirement(int totalCredit, int primaryMajorCredit, int dualMajorCredit, int subMajorCredit, - int primaryBasicAcademicalCredit, int dualBasicAcademicalCredit, int commonCultureCredit, int coreCultureCredit, + int primaryBasicAcademicalCultureCredit, int dualBasicAcademicalCultureCredit, int commonCultureCredit, + int coreCultureCredit, int normalCultureCredit, int freeElectiveCredit) { this.totalCredit = totalCredit; this.primaryMajorCredit = primaryMajorCredit; this.dualMajorCredit = dualMajorCredit; this.subMajorCredit = subMajorCredit; - this.primaryBasicAcademicalCredit = primaryBasicAcademicalCredit; - this.dualBasicAcademicalCredit = dualBasicAcademicalCredit; + this.primaryBasicAcademicalCultureCredit = primaryBasicAcademicalCultureCredit; + this.dualBasicAcademicalCultureCredit = dualBasicAcademicalCultureCredit; this.commonCultureCredit = commonCultureCredit; this.coreCultureCredit = coreCultureCredit; this.normalCultureCredit = normalCultureCredit; @@ -45,7 +50,25 @@ public void modifyCreditForSubMajor() { freeElectiveCredit = 0; } - public void modifyCreditForDualMajor(int primaryMajorCredit, int dualMajorCredit) { - //TODO: 복수 전공의 정확한 졸업요건 체크 후 로직 작성 + public void modifyCreditForDualMajor(User user) { + DualMajorGraduationRequirementType primaryMajorGraduationRequirementType = + findBelongingDualMajorGraduationRequirementType( + College.findBelongingCollege(user.getPrimaryMajor()).getName()); + DualMajorGraduationRequirementType dualMajorGraduationRequirementType = + findBelongingDualMajorGraduationRequirementType( + College.findBelongingCollege(user.getDualMajor()).getName()); + + primaryMajorCredit = primaryMajorGraduationRequirementType.getMajorCredit(); + dualMajorCredit = dualMajorGraduationRequirementType.getMajorCredit(); + dualBasicAcademicalCultureCredit = dualMajorGraduationRequirementType.getBasicAcademicalCultureCredit(); + normalCultureCredit = 0; + freeElectiveCredit = calculateFreeElectiveCreditWithDualMajorStudent(); + } + + private int calculateFreeElectiveCreditWithDualMajorStudent() { + int freeElectiveCredit = + totalCredit - commonCultureCredit - coreCultureCredit - primaryMajorCredit - dualMajorCredit + - primaryBasicAcademicalCultureCredit - dualBasicAcademicalCultureCredit; + return Math.max(freeElectiveCredit, 0); } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResult.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResult.java index 28909058..dd49193d 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResult.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResult.java @@ -1,7 +1,5 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.model; -import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.*; - import java.util.List; import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; @@ -51,8 +49,8 @@ public void handleLeftTakenLectures(TakenLectureInventory takenLectureInventory, handleLeftTakenFreeElective(takenLectureInventory, graduationRequirement); } - public void checkGraduated() { - addUpTotalCredit(); + public void checkGraduated(GraduationRequirement graduationRequirement) { + addUpTotalCredit(graduationRequirement.getTotalCredit()); addUpTakenCredit(); boolean isAllDetailGraduationResultCompleted = detailGraduationResults.stream() @@ -61,12 +59,17 @@ public void checkGraduated() { && normalCultureGraduationResult.isCompleted() && freeElectiveGraduationResult.isCompleted(); } - private void addUpTotalCredit() { - this.totalCredit = detailGraduationResults.stream() + private void addUpTotalCredit(int originTotalCredit) { + int combinedScore = detailGraduationResults.stream() .mapToInt(DetailGraduationResult::getTotalCredit) .sum() + normalCultureGraduationResult.getTotalCredit() + freeElectiveGraduationResult.getTotalCredit(); + if (originTotalCredit < combinedScore) { + this.totalCredit = originTotalCredit; + return; + } + this.totalCredit = combinedScore; } private void addUpTakenCredit() { @@ -74,8 +77,7 @@ private void addUpTakenCredit() { .mapToDouble(DetailGraduationResult::getTakenCredit) .sum() + normalCultureGraduationResult.getTakenCredit() - + freeElectiveGraduationResult.getTakenCredit() - + chapelResult.getTakenChapelCredit(); + + freeElectiveGraduationResult.getTakenCredit(); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorGraduationCategory.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorGraduationCategory.java new file mode 100644 index 00000000..15d82803 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorGraduationCategory.java @@ -0,0 +1,10 @@ +package com.plzgraduate.myongjigraduatebe.graduation.domain.service.major; + +import lombok.Getter; + +@Getter +public enum MajorGraduationCategory { + PRIMARY, + DUAL, + SUB +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorManager.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorManager.java index 6fdb9a47..bbb7ec19 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorManager.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorManager.java @@ -16,8 +16,13 @@ import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; import com.plzgraduate.myongjigraduatebe.user.domain.model.User; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor public class MajorManager implements GraduationManager { + private final MajorGraduationCategory majorGraduationCategory; + /** * * @param user 사용자 @@ -36,13 +41,14 @@ public DetailGraduationResult createDetailGraduationResult(User user, Set mandatoryLectures = filterMandatoryLectures(majorLectures); Set electiveLectures = filterElectiveLectures(majorLectures); - List majorExceptionHandlers = List.of(new OptionalMandatoryHandler(), + List majorExceptionHandlers = List.of( + new OptionalMandatoryHandler(), new ReplaceMandatoryMajorHandler()); MandatoryMajorManager mandatoryMajorManager = new MandatoryMajorManager(majorExceptionHandlers); ElectiveMajorManager electiveMajorManager = new ElectiveMajorManager(); DetailCategoryResult mandantoryDetailCategoryResult = mandatoryMajorManager.createDetailCategoryResult( - user, takenLectureInventory, mandatoryLectures, electiveLectures); + user, takenLectureInventory, mandatoryLectures, electiveLectures, majorGraduationCategory); int electiveMajorTotalCredit = graduationResultTotalCredit - mandantoryDetailCategoryResult.getTotalCredits(); DetailCategoryResult electiveDetailCategoryResult = electiveMajorManager.createDetailCategoryResult( @@ -78,7 +84,8 @@ private Set filterElectiveLectures(Set majorLectures) { * 사용자가 B과목을 들었다면 A,C는 전공과목에서 삭제한다. * B과목만 takenLectures(수강했던 전공과목)에 넣어주면 되고 A,C 과목은 haveToTLectures(들어야하는 전공과목)에 넣어주면 안되기 떄문이다. */ - private void removeDuplicateLectureIfTaken(TakenLectureInventory takenLectureInventory, Set graduationLectures) { + private void removeDuplicateLectureIfTaken(TakenLectureInventory takenLectureInventory, + Set graduationLectures) { Set duplicatedTakenLectures = findDuplicatedTakenLecture(takenLectureInventory); graduationLectures.removeIf(graduationLecture -> duplicatedTakenLectures.stream() diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MandatoryMajorManager.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MandatoryMajorManager.java index aa7e4557..723aae1c 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MandatoryMajorManager.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MandatoryMajorManager.java @@ -18,17 +18,18 @@ public class MandatoryMajorManager { private final List majorExceptionHandlers; - public DetailCategoryResult createDetailCategoryResult(User user, - TakenLectureInventory takenLectureInventory, Set mandatoryLectures, Set electiveLectures) { + public DetailCategoryResult createDetailCategoryResult(User user, TakenLectureInventory takenLectureInventory, + Set mandatoryLectures, Set electiveLectures, + MajorGraduationCategory majorGraduationCategory) { Set takenMandatory = new HashSet<>(); Set finishedTakenLecture = new HashSet<>(); boolean isSatisfiedMandatory = true; int removeMandatoryTotalCredit = 0; for (MajorExceptionHandler majorExceptionHandler : majorExceptionHandlers) { - if (majorExceptionHandler.isSupport(user)) { - isSatisfiedMandatory = majorExceptionHandler.checkMandatoryCondition(user, - takenLectureInventory, mandatoryLectures, electiveLectures); + if (majorExceptionHandler.isSupport(user, majorGraduationCategory)) { + isSatisfiedMandatory = majorExceptionHandler.checkMandatoryCondition(takenLectureInventory, + mandatoryLectures, electiveLectures); removeMandatoryTotalCredit = majorExceptionHandler.getRemovedMandatoryTotalCredit(); } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/MajorExceptionHandler.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/MajorExceptionHandler.java index e78aac70..e4dfd64e 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/MajorExceptionHandler.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/MajorExceptionHandler.java @@ -2,14 +2,15 @@ import java.util.Set; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture; import com.plzgraduate.myongjigraduatebe.user.domain.model.User; import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; public interface MajorExceptionHandler { - boolean isSupport(User user); + boolean isSupport(User user, MajorGraduationCategory majorGraduationCategory); - boolean checkMandatoryCondition(User user, TakenLectureInventory takenLectureInventory, + boolean checkMandatoryCondition(TakenLectureInventory takenLectureInventory, Set mandatoryLectures, Set electiveLectures); int getRemovedMandatoryTotalCredit(); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatory.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatory.java index 2b4f0308..4801477b 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatory.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatory.java @@ -5,7 +5,6 @@ import java.util.Set; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture; -import com.plzgraduate.myongjigraduatebe.user.domain.model.User; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -21,13 +20,19 @@ public enum OptionalMandatory { Lecture.of("HBA01113", "비영리조직", 3, 0, null), Lecture.of("HBA01222", "커뮤니티개발연구", 3, 0, null) )), - BUSINESS("경영학과", 4, Set.of( - Lecture.of("HBX01104", "회계원리", 3, 0, null), - Lecture.of("HBX01113", "인적자원관리", 3, 0, null), - Lecture.of("HBX01106", "마케팅원론", 3, 0, null), - Lecture.of("HBX01105", "재무관리원론", 3, 0, null), - Lecture.of("HBX01114", "생산운영관리", 3, 1, null), - Lecture.of("HBX01143", "운영관리", 3, 0, null) + // 기존 OptionalMandatory + // BUSINESS("경영학과", 4, Set.of( + // Lecture.of("HBX01104", "회계원리", 3, 0, null), + // Lecture.of("HBX01113", "인적자원관리", 3, 0, null), + // Lecture.of("HBX01106", "마케팅원론", 3, 0, null), + // Lecture.of("HBX01105", "재무관리원론", 3, 0, null), + // Lecture.of("HBX01114", "생산운영관리", 3, 1, null), + // Lecture.of("HBX01143", "운영관리", 3, 0, null) + BUSINESS("경영학과", 1, Set.of( + Lecture.of("HBW01201", "국제통산원론", 3, 0, "HBW01201"), + Lecture.of("HBX01127", "국제경영학", 3, 0, "CE224"), + Lecture.of("HBX01125", "경영정보", 3, 0, "KMJ01116"), + Lecture.of("HBY01103", "경영정보", 3, 1, "KMJ01116") )), INTERNATIONAL_TRADE("국제통상학과", 4, Set.of( Lecture.of("HBX01104", "회계원리", 3, 0, null), @@ -40,17 +45,16 @@ public enum OptionalMandatory { MANAGEMENT_INFORMATION("경영정보학과", 2, Set.of( Lecture.of("HBX01113", "인적자원관리", 3, 0, null), Lecture.of("HBX01106", "마케팅원론", 3, 0, null), - Lecture.of("HBX01105", "재무관리원론",3, 0, null) + Lecture.of("HBX01105", "재무관리원론", 3, 0, null) )); private final String department; private final int chooseNumber; private final Set optionalMandatoryLectures; - public static OptionalMandatory from(User user) { + public static OptionalMandatory from(String major) { return Arrays.stream(OptionalMandatory.values()) - .filter(optionalMandatory -> Objects.equals(optionalMandatory.getDepartment(), - user.getPrimaryMajor())) + .filter(optionalMandatory -> Objects.equals(optionalMandatory.getDepartment(), major)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("해당 전공선택필수를 찾을 수 없습니다.")); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatoryHandler.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatoryHandler.java index 2beb3188..192cc1c6 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatoryHandler.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatoryHandler.java @@ -1,15 +1,18 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.exception; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.DUAL; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.PRIMARY; + import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture; import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLecture; -import com.plzgraduate.myongjigraduatebe.user.domain.model.User; - import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; public class OptionalMandatoryHandler implements MajorExceptionHandler { @@ -20,27 +23,32 @@ public class OptionalMandatoryHandler implements MajorExceptionHandler { private static final int CLASS_OF_17 = 17; private static final int CLASS_OF_19 = 19; private int removedMandatoryTotalCredit = 0; + private OptionalMandatory optionalMandatory; - public boolean isSupport(User user) { - if (user.getPrimaryMajor().equals(MANAGEMENT_INFORMATION) && user.getEntryYear() >= CLASS_OF_19) { + public boolean isSupport(User user, MajorGraduationCategory majorGraduationCategory) { + String calculatingMajor = getCalculatingMajor(user, majorGraduationCategory); + if (calculatingMajor.equals(MANAGEMENT_INFORMATION) && user.getEntryYear() >= CLASS_OF_19) { + this.optionalMandatory = OptionalMandatory.from(getCalculatingMajor(user, majorGraduationCategory)); + return true; + } + if (calculatingMajor.equals(ADMINISTRATIONS) && user.getEntryYear() >= CLASS_OF_17) { + this.optionalMandatory = OptionalMandatory.from(getCalculatingMajor(user, majorGraduationCategory)); return true; } - if (user.getPrimaryMajor().equals(ADMINISTRATIONS) && user.getEntryYear() >= CLASS_OF_17) { + if (List.of(BUSINESS, INTERNATIONAL_TRADE).contains(calculatingMajor)) { + this.optionalMandatory = OptionalMandatory.from(getCalculatingMajor(user, majorGraduationCategory)); return true; } - return List.of(BUSINESS, INTERNATIONAL_TRADE).contains(user.getPrimaryMajor()); + return false; } @Override - public boolean checkMandatoryCondition(User user, - TakenLectureInventory takenLectureInventory, Set mandatoryLectures, Set electiveLectures) { - - boolean checkMandatoryCondition = checkCompleteOptionalMandatory(user, takenLectureInventory, - mandatoryLectures, + public boolean checkMandatoryCondition(TakenLectureInventory takenLectureInventory, + Set mandatoryLectures, Set electiveLectures) { + boolean checkMandatoryCondition = checkCompleteOptionalMandatory(takenLectureInventory, mandatoryLectures, electiveLectures); if (!checkMandatoryCondition) { - OptionalMandatory optionalMandatory = OptionalMandatory.from(user); removedMandatoryTotalCredit = optionalMandatory.getTotalOptionalMandatoryCredit(optionalMandatory) - optionalMandatory.getChooseLectureCredit(optionalMandatory); } @@ -52,10 +60,8 @@ public int getRemovedMandatoryTotalCredit() { return removedMandatoryTotalCredit; } - public boolean checkCompleteOptionalMandatory(User user, - TakenLectureInventory takenLectureInventory, Set mandatoryLectures, Set electiveLectures) { - - OptionalMandatory optionalMandatory = OptionalMandatory.from(user); + private boolean checkCompleteOptionalMandatory(TakenLectureInventory takenLectureInventory, + Set mandatoryLectures, Set electiveLectures) { int chooseNum = optionalMandatory.getChooseNumber(); //전공과목Set에서 전공필수과목에 해당되는 과목들을 추출한다. Set optionalMandatoryLectures = mandatoryLectures.stream().filter( @@ -75,4 +81,14 @@ public boolean checkCompleteOptionalMandatory(User user, } return count >= chooseNum; } + + private String getCalculatingMajor(User user, MajorGraduationCategory majorGraduationCategory) { + if (majorGraduationCategory == PRIMARY) { + return user.getPrimaryMajor(); + } + if (majorGraduationCategory == DUAL) { + return user.getDualMajor(); + } + return user.getSubMajor(); + } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandler.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandler.java index 00c2d1b5..b46bc96c 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandler.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandler.java @@ -1,10 +1,13 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.exception; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.*; + import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture; import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLecture; import com.plzgraduate.myongjigraduatebe.user.domain.model.User; @@ -22,13 +25,21 @@ public class ReplaceMandatoryMajorHandler implements MajorExceptionHandler { ); @Override - public boolean isSupport(User user) { - return user.getPrimaryMajor().equals("철학과") && user.getEntryYear() <= 21; + public boolean isSupport(User user, MajorGraduationCategory majorGraduationCategory) { + String major; + if (majorGraduationCategory == PRIMARY) { + major = user.getPrimaryMajor(); + } else if (majorGraduationCategory == DUAL) { + major = user.getDualMajor(); + } else { + major = user.getSubMajor(); + } + return major.equals("철학과") && user.getEntryYear() <= 21; } @Override - public boolean checkMandatoryCondition(User user, - TakenLectureInventory takenLectureInventory, Set mandatoryLectures, Set electiveLectures) { + public boolean checkMandatoryCondition(TakenLectureInventory takenLectureInventory, + Set mandatoryLectures, Set electiveLectures) { boolean checkCondition = checkCompleteReplaceMandatory(takenLectureInventory, mandatoryLectures, electiveLectures); if (!checkCondition) { diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/application/port/FindBasicAcademicalCulturePort.java b/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/application/port/FindBasicAcademicalCulturePort.java index fa31cf39..84c040a4 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/application/port/FindBasicAcademicalCulturePort.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/application/port/FindBasicAcademicalCulturePort.java @@ -3,9 +3,8 @@ import java.util.Set; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.BasicAcademicalCultureLecture; -import com.plzgraduate.myongjigraduatebe.user.domain.model.User; public interface FindBasicAcademicalCulturePort { - Set findBasicAcademicalCulture(User user); + Set findBasicAcademicalCulture(String major); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapter.java b/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapter.java index 674066e3..cf41b493 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapter.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapter.java @@ -4,12 +4,11 @@ import java.util.stream.Collectors; import com.plzgraduate.myongjigraduatebe.core.meta.PersistenceAdapter; -import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.mapper.LectureMapper; -import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.repository.BasicAcademicalCultureRepository; import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindBasicAcademicalCulturePort; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.BasicAcademicalCultureLecture; +import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.mapper.LectureMapper; +import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.repository.BasicAcademicalCultureRepository; import com.plzgraduate.myongjigraduatebe.user.domain.model.College; -import com.plzgraduate.myongjigraduatebe.user.domain.model.User; import lombok.RequiredArgsConstructor; @@ -21,8 +20,8 @@ public class FindBasicAcademicalCulturePersistenceAdapter implements FindBasicAc private final LectureMapper lectureMapper; @Override - public Set findBasicAcademicalCulture(User user) { - College userCollege = College.findBelongingCollege(user.getPrimaryMajor()); + public Set findBasicAcademicalCulture(String major) { + College userCollege = College.findBelongingCollege(major); return basicAcademicalCultureRepository.findAllByCollege(userCollege.getName()).stream() .map(lectureMapper::mapToBasicAcademicalCultureLectureModel) .collect(Collectors.toSet()); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/User.java b/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/User.java index 107461c3..43ac2184 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/User.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/User.java @@ -63,7 +63,7 @@ public static User create(String authId, String password, EnglishLevel englishLe .build(); } - public void updateStudentInformation(String name, String major, String subMajor, String dualMajor, + public void updateStudentInformation(String name, String major, String dualMajor, String subMajor, StudentCategory studentCategory, int totalCredit, double takenCredit, boolean graduate) { this.name = name; this.primaryMajor = major; diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapper.java b/src/main/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapper.java index 2d5a2789..25e16e58 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapper.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapper.java @@ -40,6 +40,7 @@ public UserJpaEntity mapToJpaEntity(User user) { .studentNumber(user.getStudentNumber()) .entryYear(user.getEntryYear()) .major(user.getPrimaryMajor()) + .dualMajor(user.getDualMajor()) .subMajor(user.getSubMajor()) .studentCategory(user.getStudentCategory()) .totalCredit(user.getTotalCredit()) diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsControllerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsControllerTest.java index 987f3d9d..c475517d 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsControllerTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsControllerTest.java @@ -51,4 +51,30 @@ void findCompletedCredits() throws Exception { .andExpect(jsonPath("$[1].completed").value(false)); } + + + @WithMockAuthenticationUser + @DisplayName("유저의 이수 학점을 조회 시 totalCredit이 0인 CompletedCredit은 조회하지 않는다.") + @Test + void findCompletedCreditsWithZeroTotalCredit() throws Exception { + //given + List completedCredits = List.of( + CompletedCredit.builder() + .graduationCategory(GraduationCategory.COMMON_CULTURE) + .totalCredit(0) + .takenCredit(10) + .build(), + CompletedCredit.builder() + .graduationCategory(GraduationCategory.CORE_CULTURE) + .totalCredit(0) + .takenCredit(5) + .build()); + given(findCompletedCreditUseCase.findCompletedCredits(1L)).willReturn(completedCredits); + + //when //then + mockMvc.perform(get("/api/v1/graduations/credits")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.length()").value(0)); + } } diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/api/SingleCalculateDetailGraduationUseCaseResolverTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/api/SingleCalculateDetailGraduationUseCaseResolverTest.java index eb25140c..2d21459e 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/api/SingleCalculateDetailGraduationUseCaseResolverTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/api/SingleCalculateDetailGraduationUseCaseResolverTest.java @@ -22,8 +22,8 @@ class SingleCalculateDetailGraduationUseCaseResolverTest { @DisplayName("졸업 카테고리를 계산할 수 있는 CalculateDetailGraduationUseCaseResolver 반환한다.") @ValueSource(strings = - {"COMMON_CULTURE", "CORE_CULTURE", "PRIMARY_MANDATORY_MAJOR", "PRIMARY_ELECTIVE_MAJOR", "DUAL_MAJOR", - "SUB_MAJOR", "PRIMARY_BASIC_ACADEMICAL_CULTURE", "DUAL_BASIC_ACADEMICAL_CULTURE" + {"COMMON_CULTURE", "CORE_CULTURE", "PRIMARY_MANDATORY_MAJOR", "PRIMARY_ELECTIVE_MAJOR", "DUAL_MANDATORY_MAJOR", + "DUAL_ELECTIVE_MAJOR", "SUB_MAJOR", "PRIMARY_BASIC_ACADEMICAL_CULTURE", "DUAL_BASIC_ACADEMICAL_CULTURE" }) @ParameterizedTest void resolveCalculateDetailGraduationUseCase(String graduationCategoryName) { diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationServiceTest.java new file mode 100644 index 00000000..d6106bb0 --- /dev/null +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualBasicAcademicalCultureDetailGraduationServiceTest.java @@ -0,0 +1,67 @@ +package com.plzgraduate.myongjigraduatebe.graduation.application.service; + +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_BASIC_ACADEMICAL_CULTURE; +import static com.plzgraduate.myongjigraduatebe.user.domain.model.College.ICT; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; + +import java.util.HashSet; +import java.util.Set; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; +import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindBasicAcademicalCulturePort; +import com.plzgraduate.myongjigraduatebe.lecture.domain.model.BasicAcademicalCultureLecture; +import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture; +import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLecture; +import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +@ExtendWith(MockitoExtension.class) +class CalculateDualBasicAcademicalCultureDetailGraduationServiceTest { + + @Mock + private FindBasicAcademicalCulturePort findBasicAcademicalCulturePort; + @InjectMocks + private CalculateDualBasicAcademicalCultureDetailGraduationService calculateDualBasicAcademicalCultureDetailGraduationService; + + @DisplayName("유저의 복수전공 핵심교양 상세 졸업결과를 계산한다.") + @Test + void calculateCoreCulture() { + //given + User user = User.builder() + .id(1L) + .dualMajor("응용소프트웨어전공") + .entryYear(19).build(); + HashSet graduationCoreCultures = new HashSet<>( + Set.of(BasicAcademicalCultureLecture.of(Lecture.from("KMA02128"), ICT.getName()))); + given(findBasicAcademicalCulturePort.findBasicAcademicalCulture(user.getDualMajor())).willReturn(graduationCoreCultures); + + HashSet takenLectures = new HashSet<>( + Set.of( + TakenLecture.builder().lecture(Lecture.builder() + .lectureCode("KMA02128") + .credit(3).build()).build())); + TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); + + GraduationRequirement graduationRequirement = GraduationRequirement.builder() + .dualBasicAcademicalCultureCredit(18).build(); + + //when + DetailGraduationResult detailCoreCultureGraduationResult = calculateDualBasicAcademicalCultureDetailGraduationService.calculateDetailGraduation( + user, takenLectureInventory, graduationRequirement); + + //then + assertThat(detailCoreCultureGraduationResult) + .extracting("graduationCategory", "isCompleted", "totalCredit", "takenCredit") + .contains(DUAL_BASIC_ACADEMICAL_CULTURE, false, 18, 3.0); + } + +} diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualElectiveMajorDetailGraduationServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualElectiveMajorDetailGraduationServiceTest.java new file mode 100644 index 00000000..a57ddf88 --- /dev/null +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualElectiveMajorDetailGraduationServiceTest.java @@ -0,0 +1,104 @@ +package com.plzgraduate.myongjigraduatebe.graduation.application.service; + +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_ELECTIVE_MAJOR; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailCategoryResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; +import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindMajorPort; +import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture; +import com.plzgraduate.myongjigraduatebe.lecture.domain.model.MajorLecture; +import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLecture; +import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +@ExtendWith(MockitoExtension.class) +class CalculateDualElectiveMajorDetailGraduationServiceTest { + + @Mock + private FindMajorPort findMajorPort; + @InjectMocks + private CalculateDualElectiveMajorDetailGraduationService calculateDualElectiveMajorDetailGraduationService; + + @DisplayName("유저의 복수전공선택 졸업결과를 계산한다.") + @Test + void calculateCoreCulture() { + //given + User user = User.builder() + .id(1L) + .dualMajor("응용소프트웨어전공") + .entryYear(19).build(); + HashSet graduationMajorLectures = new HashSet<>( + Set.of( + MajorLecture.of(Lecture.builder().lectureCode("HEC01211").credit(3).build(), "응용소프트웨어전공", 1, 16, 23), + MajorLecture.of(Lecture.builder().lectureCode("HEC01304").credit(3).build(), "응용소프트웨어전공", 0, 16, 23))); + given(findMajorPort.findMajor(user.getDualMajor())).willReturn(graduationMajorLectures); + + HashSet takenLectures = new HashSet<>( + Set.of( + TakenLecture.builder().lecture(Lecture.builder() + .lectureCode("HEC01211") //전공 필수 + .credit(3).build()).build(), + TakenLecture.builder().lecture(Lecture.builder() + .lectureCode("HEC01304") //전공 선택 + .credit(3).build()).build())); + TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); + + GraduationRequirement graduationRequirement = GraduationRequirement.builder() + .dualMajorCredit(70).build(); + + //when + DetailGraduationResult detailDualMandatoryMajorGraduationResult = calculateDualElectiveMajorDetailGraduationService.calculateDetailGraduation( + user, takenLectureInventory, graduationRequirement); + + //then + assertThat(detailDualMandatoryMajorGraduationResult) + .extracting("graduationCategory", "isCompleted", "totalCredit", "takenCredit") + .contains(DUAL_ELECTIVE_MAJOR, false, 67, 3.0); + } + + @DisplayName("복수전공 졸업결과에서 복수전공선택 졸업결과를 분리한다.") + @Test + void isolateDualElectiveMajorDetailGraduation() { + //given + DetailCategoryResult dualMandatoryMajorDetailCategoryResult = DetailCategoryResult.builder() + .detailCategoryName("전공필수") + .totalCredits(18) + .takenCredits(18) + .build(); + DetailCategoryResult dualElectiveMajorDetailCategoryResult = DetailCategoryResult.builder() + .detailCategoryName("전공선택") + .totalCredits(52) + .takenCredits(52) + .build(); + DetailGraduationResult dualMajorDetailGraduationResult = DetailGraduationResult.createNonCategorizedGraduationResult( + 70, List.of(dualMandatoryMajorDetailCategoryResult, dualElectiveMajorDetailCategoryResult)); + + //when + DetailGraduationResult primaryMandatoryMajorDetailGraduationResult = + calculateDualElectiveMajorDetailGraduationService.isolateDualElectiveMajorDetailGraduation( + dualMajorDetailGraduationResult); + + //then + assertThat(primaryMandatoryMajorDetailGraduationResult) + .extracting("graduationCategory", "totalCredit", "takenCredit") + .contains( + DUAL_ELECTIVE_MAJOR, + dualElectiveMajorDetailCategoryResult.getTotalCredits(), + dualElectiveMajorDetailCategoryResult.getTakenCredits()); + } + +} diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMandatoryMajorDetailGraduationServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMandatoryMajorDetailGraduationServiceTest.java new file mode 100644 index 00000000..e6f9bee4 --- /dev/null +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateDualMandatoryMajorDetailGraduationServiceTest.java @@ -0,0 +1,103 @@ +package com.plzgraduate.myongjigraduatebe.graduation.application.service; + +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_MANDATORY_MAJOR; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailCategoryResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; +import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindMajorPort; +import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture; +import com.plzgraduate.myongjigraduatebe.lecture.domain.model.MajorLecture; +import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLecture; +import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +@ExtendWith(MockitoExtension.class) +class CalculateDualMandatoryMajorDetailGraduationServiceTest { + + @Mock + private FindMajorPort findMajorPort; + @InjectMocks + private CalculateDualMandatoryMajorDetailGraduationService calculateDualMandatoryMajorDetailGraduationService; + + @DisplayName("유저의 복수전공필수 졸업결과를 계산한다.") + @Test + void calculateCoreCulture() { + //given + User user = User.builder() + .id(1L) + .dualMajor("응용소프트웨어전공") + .entryYear(19).build(); + HashSet graduationMajorLectures = new HashSet<>( + Set.of( + MajorLecture.of(Lecture.builder().lectureCode("HEC01211").credit(3).build(), "응용소프트웨어전공", 1, 16, 23), + MajorLecture.of(Lecture.builder().lectureCode("HEC01204").credit(3).build(), "응용소프트웨어전공", 1, 16, 23))); + given(findMajorPort.findMajor(user.getDualMajor())).willReturn(graduationMajorLectures); + + HashSet takenLectures = new HashSet<>( + Set.of( + TakenLecture.builder().lecture(Lecture.builder() + .lectureCode("HEC01211") //전공 필수 + .credit(3).build()).build(), + TakenLecture.builder().lecture(Lecture.builder() + .lectureCode("HEC01305") //전공 선택 + .credit(3).build()).build())); + TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); + + GraduationRequirement graduationRequirement = GraduationRequirement.builder() + .dualMajorCredit(70).build(); + + //when + DetailGraduationResult detailDualMandatoryMajorGraduationResult = calculateDualMandatoryMajorDetailGraduationService.calculateDetailGraduation( + user, takenLectureInventory, graduationRequirement); + + //then + assertThat(detailDualMandatoryMajorGraduationResult) + .extracting("graduationCategory", "isCompleted", "totalCredit", "takenCredit") + .contains(DUAL_MANDATORY_MAJOR, false, 6, 3.0); + } + + @DisplayName("복수전공 졸업결과에서 복수전공필수 졸업결과를 분리한다.") + @Test + void isolateDualElectiveMajorDetailGraduation() { + //given + DetailCategoryResult dualMandatoryMajorDetailCategoryResult = DetailCategoryResult.builder() + .detailCategoryName("전공필수") + .totalCredits(18) + .takenCredits(18) + .build(); + DetailCategoryResult dualElectiveMajorDetailCategoryResult = DetailCategoryResult.builder() + .detailCategoryName("전공선택") + .totalCredits(52) + .takenCredits(52) + .build(); + DetailGraduationResult dualMajorDetailGraduationResult = DetailGraduationResult.createNonCategorizedGraduationResult( + 70, List.of(dualMandatoryMajorDetailCategoryResult, dualElectiveMajorDetailCategoryResult)); + + //when + DetailGraduationResult dualMandatoryMajorDetailGraduationResult = calculateDualMandatoryMajorDetailGraduationService.isolateDualMandatoryMajorDetailGraduation( + dualMajorDetailGraduationResult); + + //then + assertThat(dualMandatoryMajorDetailGraduationResult) + .extracting("graduationCategory", "totalCredit", "takenCredit") + .contains( + DUAL_MANDATORY_MAJOR, + dualMandatoryMajorDetailCategoryResult.getTotalCredits(), + dualMandatoryMajorDetailCategoryResult.getTakenCredits()); + } + +} diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryBasicAcademicalCultureDetailGraduationServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryBasicAcademicalCultureDetailGraduationServiceTest.java index 3259f6d6..d0597f36 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryBasicAcademicalCultureDetailGraduationServiceTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculatePrimaryBasicAcademicalCultureDetailGraduationServiceTest.java @@ -42,7 +42,7 @@ void calculateCoreCulture() { .entryYear(19).build(); HashSet graduationCoreCultures = new HashSet<>( Set.of(BasicAcademicalCultureLecture.of(Lecture.from("KMA02128"), ICT.getName()))); - given(findBasicAcademicalCulturePort.findBasicAcademicalCulture(user)).willReturn(graduationCoreCultures); + given(findBasicAcademicalCulturePort.findBasicAcademicalCulture(user.getPrimaryMajor())).willReturn(graduationCoreCultures); HashSet takenLectures = new HashSet<>( Set.of( @@ -52,7 +52,7 @@ void calculateCoreCulture() { TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); GraduationRequirement graduationRequirement = GraduationRequirement.builder() - .primaryBasicAcademicalCredit(18).build(); + .primaryBasicAcademicalCultureCredit(18).build(); //when DetailGraduationResult detailCoreCultureGraduationResult = calculatePrimaryBasicAcademicalCultureDetailGraduationService.calculateDetailGraduation( diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateSingleDetailGraduationServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateSingleDetailGraduationServiceTest.java index 6d642be2..09ef141e 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateSingleDetailGraduationServiceTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateSingleDetailGraduationServiceTest.java @@ -41,8 +41,8 @@ @DisplayName("단일 카테고리 졸업상세결과를 조회한다.") @ValueSource(strings = - {"COMMON_CULTURE", "CORE_CULTURE", "PRIMARY_MANDATORY_MAJOR", "PRIMARY_ELECTIVE_MAJOR", "DUAL_MAJOR", - "SUB_MAJOR", "PRIMARY_BASIC_ACADEMICAL_CULTURE", "DUAL_BASIC_ACADEMICAL_CULTURE" + {"COMMON_CULTURE", "CORE_CULTURE", "PRIMARY_MANDATORY_MAJOR", "PRIMARY_ELECTIVE_MAJOR", "DUAL_MANDATORY_MAJOR", + "DUAL_ELECTIVE_MAJOR", "SUB_MAJOR", "PRIMARY_BASIC_ACADEMICAL_CULTURE", "DUAL_BASIC_ACADEMICAL_CULTURE" }) @ParameterizedTest void calculateSingleDetailGraduation(String graduationCategoryName) { diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirementTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirementTest.java index cdf1f5c8..f2f6264b 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirementTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirementTest.java @@ -1,11 +1,14 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.model; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.DualMajorGraduationRequirementType.*; import static com.plzgraduate.myongjigraduatebe.lecture.domain.model.CommonCultureCategory.*; import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + class GraduationRequirementTest { @DisplayName("공통교양의 영어카테고리 학점(6점)을 일반교양 학점으로 이관한다.") @@ -28,7 +31,39 @@ void transferEnglishCategoryCredit() { .isEqualTo(beforeTransferNormalCultureCredit + ENGLISH.getTotalCredit()); } - @DisplayName("자유선택 졸업 학점을 부전공 졸업학점으로 조정한다.") + @DisplayName("복수전공 학생 - 주전공, 복수전공, 복수학문기초교양, 일반교양, 자유선택 학점을 조정한다.") + @Test + void modifyCreditForDualMajor() { + //given + User user = User.builder() + .primaryMajor("응용소프트웨어전공") + .dualMajor("경영학과") + .build(); + + GraduationRequirement graduationRequirement = GraduationRequirement.builder() + .totalCredit(80) + .commonCultureCredit(10) + .coreCultureCredit(10) + .primaryMajorCredit(10) + .dualMajorCredit(10) + .primaryBasicAcademicalCultureCredit(10) + .dualBasicAcademicalCultureCredit(10) + .normalCultureCredit(10) + .freeElectiveCredit(10).build(); + + //when + graduationRequirement.modifyCreditForDualMajor(user); + + //then + assertThat(graduationRequirement.getPrimaryMajorCredit()).isEqualTo(ICT.getMajorCredit()); + assertThat(graduationRequirement.getDualMajorCredit()).isEqualTo(BUSINESS.getMajorCredit()); + assertThat(graduationRequirement.getDualBasicAcademicalCultureCredit()).isEqualTo( + BUSINESS.getBasicAcademicalCultureCredit()); + assertThat(graduationRequirement.getNormalCultureCredit()).isEqualTo(0); + assertThat(graduationRequirement.getFreeElectiveCredit()).isEqualTo(0); + } + + @DisplayName("부전공 학생 - 자유선택 졸업 학점을 부전공 졸업학점으로 조정한다.") @Test void deleteFreeElectiveCredit() { //given diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResultTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResultTest.java index 18e9cfce..c75c6534 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResultTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResultTest.java @@ -103,7 +103,7 @@ void checkCompletedGraduated() { .freeElectiveGraduationResult(freeElectiveGraduationResult).build(); //when - graduationResult.checkGraduated(); + graduationResult.checkGraduated(GraduationRequirement.builder().totalCredit(134).build()); //then assertThat(graduationResult.isGraduated()).isTrue(); @@ -127,7 +127,7 @@ void checkUnCompletedGraduated(ChapelResult chapelResult, List 데이터테크놀로지_전공 = MajorFixture.데이터테크놀로지_전공(); - MajorManager manager = new MajorManager(); + MajorManager manager = new MajorManager(PRIMARY); //when DetailGraduationResult detailGraduationResult = manager.createDetailGraduationResult(user, @@ -122,7 +123,7 @@ class DataTechnologyMajorTest { ))); TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); Set 데이터테크놀로지_전공 = MajorFixture.데이터테크놀로지_전공(); - MajorManager manager = new MajorManager(); + MajorManager manager = new MajorManager(PRIMARY); //when DetailGraduationResult detailGraduationResult = manager.createDetailGraduationResult(user, diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/InternationTradeMajorTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/InternationTradeMajorTest.java index 24d0d34e..119010ba 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/InternationTradeMajorTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/InternationTradeMajorTest.java @@ -1,5 +1,6 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.major; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.*; import static org.assertj.core.api.Assertions.assertThat; import java.util.HashSet; @@ -59,7 +60,7 @@ class InternationTradeMajorTest { ))); TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); Set 국제통상_전공 = MajorFixture.국제통상_전공(); - MajorManager manager = new MajorManager(); + MajorManager manager = new MajorManager(PRIMARY); //when DetailGraduationResult detailGraduationResult = manager.createDetailGraduationResult(user, @@ -115,7 +116,7 @@ class InternationTradeMajorTest { ))); TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); Set 국제통상_전공 = MajorFixture.국제통상_전공(); - MajorManager manager = new MajorManager(); + MajorManager manager = new MajorManager(PRIMARY); //when DetailGraduationResult detailGraduationResult = manager.createDetailGraduationResult(user, @@ -172,7 +173,7 @@ class InternationTradeMajorTest { ))); TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); Set 국제통상_전공 = MajorFixture.국제통상_전공(); - MajorManager manager = new MajorManager(); + MajorManager manager = new MajorManager(PRIMARY); //when DetailGraduationResult detailGraduationResult = manager.createDetailGraduationResult(user, @@ -226,7 +227,7 @@ class InternationTradeMajorTest { ))); TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); Set 국제통상_전공 = MajorFixture.국제통상_전공(); - MajorManager manager = new MajorManager(); + MajorManager manager = new MajorManager(PRIMARY); //when DetailGraduationResult detailGraduationResult = manager.createDetailGraduationResult(user, @@ -265,7 +266,7 @@ class InternationTradeMajorTest { ))); TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); Set 국제통상_전공 = MajorFixture.국제통상_전공(); - MajorManager manager = new MajorManager(); + MajorManager manager = new MajorManager(PRIMARY); //when DetailGraduationResult detailGraduationResult = manager.createDetailGraduationResult(user, @@ -296,7 +297,7 @@ class InternationTradeMajorTest { ))); TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); Set 국제통상_전공 = MajorFixture.국제통상_전공(); - MajorManager manager = new MajorManager(); + MajorManager manager = new MajorManager(PRIMARY); //when DetailGraduationResult detailGraduationResult = manager.createDetailGraduationResult(user, diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandlerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandlerTest.java index a1f5b60d..b2deda28 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandlerTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandlerTest.java @@ -1,6 +1,6 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.exception; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; import java.util.HashSet; import java.util.Map; @@ -25,7 +25,7 @@ class ReplaceMandatoryMajorHandlerTest { @DisplayName("답사1와 답사2를 수강했을 경우 세부조건을 달성한다.") @Test void 답사과목_수강() { - + //given Set mandatoryLectures = new HashSet<>(Set.of( mockLectureMap.get("HAI01110"), //답사1 @@ -46,10 +46,10 @@ class ReplaceMandatoryMajorHandlerTest { //when MajorExceptionHandler exceptionHandler = new ReplaceMandatoryMajorHandler(); - boolean checkMandatoryCondition = exceptionHandler.checkMandatoryCondition(user, - takenLectureInventory, mandatoryLectures, electiveLectures); + boolean checkMandatoryCondition = exceptionHandler.checkMandatoryCondition(takenLectureInventory, + mandatoryLectures, electiveLectures); int removedMandatoryTotalCredit = exceptionHandler.getRemovedMandatoryTotalCredit(); - + //then assertThat(checkMandatoryCondition).isTrue(); assertThat(removedMandatoryTotalCredit).isZero(); @@ -60,7 +60,7 @@ class ReplaceMandatoryMajorHandlerTest { @DisplayName("답사1,답사2를 수강했을 못했고, 대체과목을 수강했을 경우 세부조건을 달성한다. 이때 나중에 들은 대체과목은 전공선택으로 인정된다.") @Test void 답사과목_미수강_대체과목_수강() { - + //given Set mandatoryLectures = new HashSet<>(Set.of( mockLectureMap.get("HAI01110"), //답사1 @@ -80,10 +80,10 @@ class ReplaceMandatoryMajorHandlerTest { //when MajorExceptionHandler exceptionHandler = new ReplaceMandatoryMajorHandler(); - boolean checkMandatoryCondition = exceptionHandler.checkMandatoryCondition(user, - takenLectureInventory, mandatoryLectures, electiveLectures); + boolean checkMandatoryCondition = exceptionHandler.checkMandatoryCondition(takenLectureInventory, + mandatoryLectures, electiveLectures); int removedMandatoryTotalCredit = exceptionHandler.getRemovedMandatoryTotalCredit(); - + //then assertThat(checkMandatoryCondition).isTrue(); assertThat(removedMandatoryTotalCredit).isZero(); @@ -94,7 +94,7 @@ class ReplaceMandatoryMajorHandlerTest { @DisplayName("답사1,답사2를 수강했을 못했고, 대체과목을 수강하지 못했을 경우 대체과목은 전공필수 과목으로 이동한다.") @Test void 답사_미수강_대체과목_미수강() { - + //given Set mandatoryLectures = new HashSet<>(Set.of( mockLectureMap.get("HAI01110"), //답사1 @@ -110,10 +110,10 @@ class ReplaceMandatoryMajorHandlerTest { //when MajorExceptionHandler exceptionHandler = new ReplaceMandatoryMajorHandler(); - boolean checkMandatoryCondition = exceptionHandler.checkMandatoryCondition(user, - takenLectureInventory, mandatoryLectures, electiveLectures); + boolean checkMandatoryCondition = exceptionHandler.checkMandatoryCondition(takenLectureInventory, + mandatoryLectures, electiveLectures); int removedMandatoryTotalCredit = exceptionHandler.getRemovedMandatoryTotalCredit(); - + //then assertThat(checkMandatoryCondition).isFalse(); assertThat(removedMandatoryTotalCredit).isEqualTo(3); diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapterTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapterTest.java index d2563c97..54c82b30 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapterTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapterTest.java @@ -12,12 +12,11 @@ import org.springframework.beans.factory.annotation.Autowired; import com.plzgraduate.myongjigraduatebe.fixture.UserFixture; -import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.FindBasicAcademicalCulturePersistenceAdapter; +import com.plzgraduate.myongjigraduatebe.lecture.domain.model.BasicAcademicalCultureLecture; import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.entity.BasicAcademicalCultureLectureJpaEntity; import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.entity.LectureJpaEntity; import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.repository.BasicAcademicalCultureRepository; import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.repository.LectureRepository; -import com.plzgraduate.myongjigraduatebe.lecture.domain.model.BasicAcademicalCultureLecture; import com.plzgraduate.myongjigraduatebe.support.PersistenceTestSupport; import com.plzgraduate.myongjigraduatebe.user.domain.model.User; @@ -30,7 +29,7 @@ class FindBasicAcademicalCulturePersistenceAdapterTest extends PersistenceTestSu @Autowired private FindBasicAcademicalCulturePersistenceAdapter basicAcademicalCulturePersistenceAdapter; - @DisplayName("유저의 단과대에 속하는 학문기초교양 과목들을 반환한다.") + @DisplayName("전공학과의 단과대에 속하는 학문기초교양 과목들을 반환한다.") @Test void findBasicAcademicalCulture() { //given @@ -55,7 +54,7 @@ void findBasicAcademicalCulture() { //when Set basicAcademicalCulture = basicAcademicalCulturePersistenceAdapter.findBasicAcademicalCulture( - user); + user.getPrimaryMajor()); //then assertThat(basicAcademicalCulture).hasSize(1) .extracting("college")