Skip to content

Commit

Permalink
feat: 복수전공 - 학문기초교양 중복과목 수강 처리 로직 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
5uhwann committed Jun 3, 2024
1 parent 3966f4c commit 7068ade
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorGraduationCategory.PRIMARY;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

Expand All @@ -27,7 +28,9 @@
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.GraduationManager;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.major.MajorManager;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.submajor.SubMajorManager;
import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindBasicAcademicalCulturePort;
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.application.usecase.find.FindTakenLectureUseCase;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
Expand All @@ -45,6 +48,7 @@
class CalculateGraduationService implements CalculateGraduationUseCase {

private final FindMajorPort findMajorPort;
private final FindBasicAcademicalCulturePort findBasicAcademicalCulturePort;

private final FindTakenLectureUseCase findTakenLectureUseCase;
private final CalculateCommonCultureGraduationUseCase calculateCommonCultureGraduationUseCase;
Expand All @@ -68,10 +72,21 @@ public GraduationResult calculateGraduation(User user) {

GraduationResult graduationResult = generateGraduationResult(chapelResult, detailGraduationResults,
takenLectureInventory, graduationRequirement);
handleDuplicatedTakenCredit(user, graduationResult);
updateUserGraduationInformation(user, graduationResult);
return graduationResult;
}

private void handleDuplicatedTakenCredit(User user, GraduationResult graduationResult) {
if (user.getStudentCategory() == StudentCategory.DUAL_MAJOR) {
int duplicatedBasicAcademicalCultureCredit =
findBasicAcademicalCulturePort.findDuplicatedLecturesBetweenMajors(user).stream()
.mapToInt(basicAcademicalCulture -> basicAcademicalCulture.getLecture().getCredit())
.sum();
graduationResult.deductDuplicatedCredit(duplicatedBasicAcademicalCultureCredit);
}
}

private GraduationRequirement determineGraduationRequirement(User user) {
College userCollage = College.findBelongingCollege(user.getPrimaryMajor());
DefaultGraduationRequirementType defaultGraduationRequirement = DefaultGraduationRequirementType.determineGraduationRequirement(
Expand All @@ -91,13 +106,12 @@ private List<DetailGraduationResult> generateDetailGraduationResults(User user,
generateCommonCultureDetailGraduationResult(
user, takenLectureInventory, graduationRequirement),
generateCoreCultureDetailGraduationResult(
user, takenLectureInventory, graduationRequirement),
generteBasicAcademicalDetailGraduationResult(
user, takenLectureInventory, graduationRequirement)
));
detailGraduationResults.addAll(
generatePrimaryMajorDetailGraduations(user, takenLectureInventory, graduationRequirement));

detailGraduationResults.addAll(generateBasicAcademicalDetailGraduationResult(
user, takenLectureInventory, graduationRequirement));
if (user.getStudentCategory() == StudentCategory.DUAL_MAJOR) {
detailGraduationResults.addAll(
generateDualMajorDetailGraduations(user, takenLectureInventory, graduationRequirement));
Expand All @@ -122,10 +136,39 @@ private DetailGraduationResult generateCoreCultureDetailGraduationResult(User us
graduationRequirement);
}

private DetailGraduationResult generteBasicAcademicalDetailGraduationResult(User user,
private List<DetailGraduationResult> generateBasicAcademicalDetailGraduationResult(User user,
TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) {
return calculatePrimaryBasicAcademicalCultureDetailGraduationUseCase.calculateDetailGraduation(user,
takenLectureInventory, graduationRequirement);
if (user.getStudentCategory() == StudentCategory.DUAL_MAJOR) {
TakenLectureInventory copiedTakenLectureForPrimaryBasicAcademicalCulture = takenLectureInventory.copy();
TakenLectureInventory copiedTakenLectureForDualBasicAcademicalCulture = takenLectureInventory.copy();
DetailGraduationResult primaryBasicAcademicalCultureDetailGraduationResult = calculatePrimaryBasicAcademicalCultureDetailGraduationUseCase.calculateDetailGraduation(
user, copiedTakenLectureForPrimaryBasicAcademicalCulture, graduationRequirement);
DetailGraduationResult dualBasicAcademicalCultureDetailGraduationResult = calculateDualBasicAcademicalCultureDetailGraduationUseCase.calculateDetailGraduation(
user, copiedTakenLectureForDualBasicAcademicalCulture, graduationRequirement);
syncOriginalTakenLectureInventory(takenLectureInventory,
primaryBasicAcademicalCultureDetailGraduationResult,
dualBasicAcademicalCultureDetailGraduationResult);
return List.of(primaryBasicAcademicalCultureDetailGraduationResult,
dualBasicAcademicalCultureDetailGraduationResult);
}
DetailGraduationResult primaryBasicAcademicalCultureGraduationResult = calculatePrimaryBasicAcademicalCultureDetailGraduationUseCase.calculateDetailGraduation(
user, takenLectureInventory, graduationRequirement);
return List.of(primaryBasicAcademicalCultureGraduationResult);
}

private void syncOriginalTakenLectureInventory(TakenLectureInventory originalTakenLectureInventory,
DetailGraduationResult primaryBasicAcademicalCultureDetailGraduationResult,
DetailGraduationResult dualBasicAcademicalCultureDetailGraduationResult) {
List<Lecture> primaryBasicAcademicalCultureTakenLectures = primaryBasicAcademicalCultureDetailGraduationResult.getDetailCategory()
.get(0)
.getTakenLectures();
List<Lecture> dualBasicAcademicalCultureTakenLectures = dualBasicAcademicalCultureDetailGraduationResult.getDetailCategory()
.get(0)
.getTakenLectures();
Set<Lecture> basicAcademicalCultureTakenLectures = new HashSet<>();
basicAcademicalCultureTakenLectures.addAll(primaryBasicAcademicalCultureTakenLectures);
basicAcademicalCultureTakenLectures.addAll(dualBasicAcademicalCultureTakenLectures);
originalTakenLectureInventory.handleFinishedLectures(basicAcademicalCultureTakenLectures);
}

private List<DetailGraduationResult> generatePrimaryMajorDetailGraduations(User user,
Expand Down Expand Up @@ -154,10 +197,8 @@ private List<DetailGraduationResult> generateDualMajorDetailGraduations(User use
dualMajorDetailGraduationResult);
DetailGraduationResult dualElectiveMajorDetailGraduationResult = calculateDualElectiveMajorDetailGraduationUseCase.isolateDualElectiveMajorDetailGraduation(
dualMajorDetailGraduationResult);
DetailGraduationResult dualBasicAcademicalCultureDetailGraduationResult = calculateDualBasicAcademicalCultureDetailGraduationUseCase.calculateDetailGraduation(
user, takenLectureInventory, graduationRequirement);
return List.of(dualMandatoryMajorDetailGraduationResult, dualElectiveMajorDetailGraduationResult,
dualBasicAcademicalCultureDetailGraduationResult);

return List.of(dualMandatoryMajorDetailGraduationResult, dualElectiveMajorDetailGraduationResult);
}

private DetailGraduationResult generateSubMajorDetailGraduationResult(User user,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ public void checkGraduated(GraduationRequirement graduationRequirement) {
&& normalCultureGraduationResult.isCompleted() && freeElectiveGraduationResult.isCompleted();
}

public void deductDuplicatedCredit(int duplicatedCredit) {
this.takenCredit -= duplicatedCredit;
}

private void addUpTotalCredit(int originTotalCredit) {
int combinedScore = detailGraduationResults.stream()
.mapToInt(DetailGraduationResult::getTotalCredit)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.plzgraduate.myongjigraduatebe.takenlecture.domain.model;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture;

import lombok.Builder;

public class TakenLectureInventory {
Expand All @@ -19,6 +22,10 @@ public Set<TakenLecture> getTakenLectures() {
return Collections.unmodifiableSet(takenLecture);
}

public TakenLectureInventory copy() {
return TakenLectureInventory.from(new HashSet<>(takenLecture));
}

public Set<TakenLecture> getCultureLectures() {
return takenLecture.stream()
.filter(taken -> taken.getLecture().isCulture())
Expand All @@ -35,12 +42,20 @@ public void handleFinishedTakenLectures(Set<TakenLecture> finishedTakenLecture)
takenLecture.removeAll(finishedTakenLecture);
}

public void handleFinishedLectures(Set<Lecture> finishedBasicAcademicalCultureLecture) {
takenLecture.removeAll(
takenLecture.stream()
.filter(taken -> finishedBasicAcademicalCultureLecture.contains(taken.getLecture()))
.collect(Collectors.toSet())
);
}

public int calculateTotalCredit() {
int totalCredit = this.takenLecture
.stream()
.mapToInt(takenLecture -> takenLecture.getLecture().getCredit())
.sum();
if(checkChapelCountIsFour(this.takenLecture)) {
if (checkChapelCountIsFour(this.takenLecture)) {
totalCredit += 2;
}
return totalCredit;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.plzgraduate.myongjigraduatebe.takenlecture.domain.model;

import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;

import java.util.HashSet;
import java.util.Map;
Expand All @@ -18,36 +18,23 @@ class TakenLectureInventoryTest {

private final User user = UserFixture.경영학과_19학번_ENG34();
private final Map<String, Lecture> mockLectureMap = LectureFixture.getMockLectureMap();
private final TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(new HashSet<>(Set.of(
TakenLecture.of(user, mockLectureMap.get("KMA00101"), 2019, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02102"), 2019, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02122"), 2019, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02104"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02141"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02106"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02107"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02123"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02124"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02108"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02109"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02125"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02126"), 2023, Semester.FIRST)
)));

@DisplayName("수강과목 목록에서 교양 수강과목 목록을 반환한다.")
@Test
void getTakenCultureLectures() {
//given //when
TakenLectureInventory takenLectureInventory = getTakenLectureInventory();
Set<TakenLecture> cultureLectures = takenLectureInventory.getCultureLectures();

//then
assertThat(cultureLectures).hasSize(takenLectureInventory.getTakenLectures().size());
}

@DisplayName("수강과목 목록에서 처리 완료된 과목을 제거한다.")
@DisplayName("수강과목 목록에서 처리 완료된 수강과목들을 제거한다.")
@Test
void handleFinishedTakenLectures() {
//given
TakenLectureInventory takenLectureInventory = getTakenLectureInventory();
int beforeHandleSize = takenLectureInventory.getTakenLectures().size();
Set<TakenLecture> finishedTakenLecture = new HashSet<>(Set.of(
TakenLecture.of(user, mockLectureMap.get("KMA00101"), 2019, Semester.FIRST),
Expand Down Expand Up @@ -84,4 +71,41 @@ void calculateTotalCredit() {
//then
assertThat(calculatedCredit).isEqualTo(4);
}

@DisplayName("수강과목 목록에서 처리 완료된 과목을 제거한다.")
@Test
void handleFinishedLectures() {
//given
TakenLectureInventory takenLectureInventory = getTakenLectureInventory();
int beforeHandleSize = takenLectureInventory.getTakenLectures().size();
Set<Lecture> finishedLectures = new HashSet<>(Set.of(
mockLectureMap.get("KMA00101"),
mockLectureMap.get("KMA02102")
));

//when
takenLectureInventory.handleFinishedLectures(finishedLectures);

//then
assertThat(takenLectureInventory.getTakenLectures())
.hasSize(beforeHandleSize - finishedLectures.size());
}

private TakenLectureInventory getTakenLectureInventory() {
return TakenLectureInventory.from(new HashSet<>(Set.of(
TakenLecture.of(user, mockLectureMap.get("KMA00101"), 2019, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02102"), 2019, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02122"), 2019, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02104"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02141"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02106"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02107"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02123"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02124"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02108"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02109"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02125"), 2023, Semester.FIRST),
TakenLecture.of(user, mockLectureMap.get("KMA02126"), 2023, Semester.FIRST)
)));
}
}

0 comments on commit 7068ade

Please sign in to comment.