From 6ebcd19fbc21aa67a4982c28b2eca10bf15408d0 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Wed, 13 Jan 2021 12:49:40 -0800 Subject: [PATCH 01/18] convert lecture to discussion and vice versa on sequence update --- .../course/CourseViewController.java | 28 +++++++++++++++++++ .../ipa/repositories/SectionRepository.java | 7 +++++ .../dss/ipa/services/SectionService.java | 2 ++ .../ipa/services/jpa/JpaSectionService.java | 8 +++++- 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index ead53c890..8aa2e74de 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -233,6 +233,34 @@ public Course updateCourse(@PathVariable long courseId, @RequestBody @Validated authorizer.hasWorkgroupRole(workgroup.getId(), "academicPlanner"); courseDTO.setSchedule(course.getSchedule()); + List sectionIds = new ArrayList<>(); + if(course.getSequencePattern().length() == 3 && courseDTO.getSequencePattern().length() == 1){ + for(SectionGroup sectionGroup : course.getSectionGroups()){ + Long seats = new Long(0); + Section lectureSection = new Section(); + for(Section section : sectionGroup.getSections()){ + seats += section.getSeats(); + sectionService.deleteById(section.getId()); + } + lectureSection.setSectionGroup(sectionGroup); + lectureSection.setSequenceNumber(courseDTO.getSequencePattern()+"01"); + lectureSection.setSeats(seats); + sectionService.save(lectureSection); + } + } else if(course.getSequencePattern().length() == 1 && courseDTO.getSequencePattern().length() == 3){ + for(SectionGroup sectionGroup : course.getSectionGroups()){ + Long seats = new Long(0); + Section lectureSection = new Section(); + for(Section section : sectionGroup.getSections()){ + seats += section.getSeats(); + sectionService.deleteById(section.getId()); + } + lectureSection.setSectionGroup(sectionGroup); + lectureSection.setSequenceNumber(courseDTO.getSequencePattern()); + lectureSection.setSeats(seats); + sectionService.save(lectureSection); + } + } return courseService.update(courseDTO); } diff --git a/src/main/java/edu/ucdavis/dss/ipa/repositories/SectionRepository.java b/src/main/java/edu/ucdavis/dss/ipa/repositories/SectionRepository.java index 43e69f498..fbf087aac 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/repositories/SectionRepository.java +++ b/src/main/java/edu/ucdavis/dss/ipa/repositories/SectionRepository.java @@ -1,10 +1,12 @@ package edu.ucdavis.dss.ipa.repositories; import edu.ucdavis.dss.ipa.entities.Section; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; +import javax.transaction.Transactional; import java.util.List; public interface SectionRepository extends CrudRepository { @@ -53,4 +55,9 @@ Section findBySectionGroupIdAndSequenceNumber( List
findVisibleByWorkgroupIdAndYear( @Param("workgroupId") long workgroupId, @Param("year") long year); + + @Modifying + @Transactional + @Query(value="delete from Section s WHERE s.id = ?1") + void deleteById(long sectionId); } diff --git a/src/main/java/edu/ucdavis/dss/ipa/services/SectionService.java b/src/main/java/edu/ucdavis/dss/ipa/services/SectionService.java index 355eebff3..b187fab3c 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/services/SectionService.java +++ b/src/main/java/edu/ucdavis/dss/ipa/services/SectionService.java @@ -27,4 +27,6 @@ public interface SectionService { List
findVisibleByWorkgroupIdAndYear(long workgroupId, long year); boolean hasValidSequenceNumber (Section section); + + void deleteById(long sectionId); } \ No newline at end of file diff --git a/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionService.java b/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionService.java index 552c59aa9..d3d6054c3 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionService.java +++ b/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionService.java @@ -42,7 +42,7 @@ public Section getOneById(Long id) { public Section updateSequenceNumber(Long sectionId, String newSequencePattern) { Section section = this.getOneById(sectionId); - if (newSequencePattern == null || newSequencePattern.length() == 0) { + if (newSequencePattern == null || newSequencePattern.length() == 0 || section == null) { return null; } @@ -114,4 +114,10 @@ public boolean hasValidSequenceNumber (Section section) { return true; } + + @Override + @Transactional + public void deleteById(long sectionId) { + sectionRepository.deleteById(sectionId); + } } From 115725135a6e0c0519ad91bfcaf2dde33dd39a77 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Thu, 14 Jan 2021 14:27:04 -0800 Subject: [PATCH 02/18] manual enforce cascade deletion --- .../components/course/CourseViewController.java | 6 +++--- .../dss/ipa/repositories/ActivityRepository.java | 7 +++++++ .../ipa/repositories/SyncActionRepository.java | 9 ++++++++- .../ucdavis/dss/ipa/services/SectionService.java | 2 +- .../dss/ipa/services/jpa/JpaSectionService.java | 15 +++++++++++++-- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index 8aa2e74de..7a9067707 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -233,15 +233,15 @@ public Course updateCourse(@PathVariable long courseId, @RequestBody @Validated authorizer.hasWorkgroupRole(workgroup.getId(), "academicPlanner"); courseDTO.setSchedule(course.getSchedule()); - List sectionIds = new ArrayList<>(); if(course.getSequencePattern().length() == 3 && courseDTO.getSequencePattern().length() == 1){ for(SectionGroup sectionGroup : course.getSectionGroups()){ Long seats = new Long(0); Section lectureSection = new Section(); for(Section section : sectionGroup.getSections()){ seats += section.getSeats(); - sectionService.deleteById(section.getId()); + sectionService.deleteWithCascade(section); } + lectureSection.setSectionGroup(sectionGroup); lectureSection.setSequenceNumber(courseDTO.getSequencePattern()+"01"); lectureSection.setSeats(seats); @@ -253,7 +253,7 @@ public Course updateCourse(@PathVariable long courseId, @RequestBody @Validated Section lectureSection = new Section(); for(Section section : sectionGroup.getSections()){ seats += section.getSeats(); - sectionService.deleteById(section.getId()); + sectionService.deleteWithCascade(section); } lectureSection.setSectionGroup(sectionGroup); lectureSection.setSequenceNumber(courseDTO.getSequencePattern()); diff --git a/src/main/java/edu/ucdavis/dss/ipa/repositories/ActivityRepository.java b/src/main/java/edu/ucdavis/dss/ipa/repositories/ActivityRepository.java index b16957b19..323a72819 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/repositories/ActivityRepository.java +++ b/src/main/java/edu/ucdavis/dss/ipa/repositories/ActivityRepository.java @@ -1,10 +1,12 @@ package edu.ucdavis.dss.ipa.repositories; import edu.ucdavis.dss.ipa.entities.Activity; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; +import javax.transaction.Transactional; import java.util.List; public interface ActivityRepository extends CrudRepository { @@ -49,4 +51,9 @@ List findByWorkgroupIdAndYearAndTermCode( @Param("workgroupId") long workgroupId, @Param("year") long year, @Param("termCode") String termCode); + + @Modifying + @Transactional + @Query(value="delete from Activity a WHERE a.id = ?1") + void deleteById(long activityId); } diff --git a/src/main/java/edu/ucdavis/dss/ipa/repositories/SyncActionRepository.java b/src/main/java/edu/ucdavis/dss/ipa/repositories/SyncActionRepository.java index b8531927f..e4688dcb4 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/repositories/SyncActionRepository.java +++ b/src/main/java/edu/ucdavis/dss/ipa/repositories/SyncActionRepository.java @@ -1,8 +1,15 @@ package edu.ucdavis.dss.ipa.repositories; import edu.ucdavis.dss.ipa.entities.SyncAction; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; -public interface SyncActionRepository extends CrudRepository { +import javax.transaction.Transactional; +public interface SyncActionRepository extends CrudRepository { + @Modifying + @Transactional + @Query(value="delete from SyncAction sa WHERE sa.id = ?1") + void deleteById(long syncActionId); } diff --git a/src/main/java/edu/ucdavis/dss/ipa/services/SectionService.java b/src/main/java/edu/ucdavis/dss/ipa/services/SectionService.java index b187fab3c..eeacdbed1 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/services/SectionService.java +++ b/src/main/java/edu/ucdavis/dss/ipa/services/SectionService.java @@ -28,5 +28,5 @@ public interface SectionService { boolean hasValidSequenceNumber (Section section); - void deleteById(long sectionId); + void deleteWithCascade(Section section); } \ No newline at end of file diff --git a/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionService.java b/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionService.java index d3d6054c3..7c5069ff2 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionService.java +++ b/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionService.java @@ -1,7 +1,9 @@ package edu.ucdavis.dss.ipa.services.jpa; import edu.ucdavis.dss.ipa.entities.*; +import edu.ucdavis.dss.ipa.repositories.ActivityRepository; import edu.ucdavis.dss.ipa.repositories.SectionRepository; +import edu.ucdavis.dss.ipa.repositories.SyncActionRepository; import edu.ucdavis.dss.ipa.services.*; import org.springframework.stereotype.Service; @@ -14,6 +16,8 @@ public class JpaSectionService implements SectionService { @Inject SectionRepository sectionRepository; + @Inject SyncActionRepository syncActionRepository; + @Inject ActivityRepository activityRepository; @Override public Section save(@Valid Section section) { @@ -117,7 +121,14 @@ public boolean hasValidSequenceNumber (Section section) { @Override @Transactional - public void deleteById(long sectionId) { - sectionRepository.deleteById(sectionId); + public void deleteWithCascade(Section section) { + for(SyncAction syncAction : section.getSyncActions()){ + sectionRepository.deleteById(syncAction.getId()); + } + for(Activity activity : section.getActivities()){ + System.err.println("Deleting activity " + activity.getId()); + activityRepository.deleteById(activity.getId()); + } + sectionRepository.deleteById(section.getId()); } } From 0a1d0e39b6d47224a60691a1bced592fbd90946f Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Tue, 19 Jan 2021 09:32:21 -0800 Subject: [PATCH 03/18] audit log, pretty print field name --- .../edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java b/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java index 6acb77247..7fcf2720f 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java +++ b/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java @@ -17,6 +17,7 @@ public final class ActivityLogFormatter { // Fields to audit in course view for course HashMap courseViewCourse = new HashMap(); + courseViewCourse.put("sequencePattern", true); courseView.put("Course", courseViewCourse); // Fields to audit in course view for section @@ -685,6 +686,8 @@ public static String getFormattedPropName(String prop){ return "TAs"; case "supportStaffSupportCallReviewOpen": return "Student Review"; + case "sequencePattern": + return "Sequence Pattern"; default: return prop; } From 88670181e08b027f9d90aa608ec214f01653560b Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Tue, 19 Jan 2021 13:38:32 -0800 Subject: [PATCH 04/18] initial copying over of section group costs --- .../course/CourseViewController.java | 28 +++++++++++++++++++ .../SectionGroupCostRepository.java | 17 +++++++++++ .../ipa/services/SectionGroupCostService.java | 2 ++ .../jpa/JpaSectionGroupCostService.java | 12 ++++++++ 4 files changed, 59 insertions(+) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index 7a9067707..efa36987b 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -246,6 +246,20 @@ public Course updateCourse(@PathVariable long courseId, @RequestBody @Validated lectureSection.setSequenceNumber(courseDTO.getSequencePattern()+"01"); lectureSection.setSeats(seats); sectionService.save(lectureSection); + List sectionGroupCosts = sectionGroupCostService.findBySectionGroupDetails( + workgroup.getId(), + course.getYear(), + course.getCourseNumber(), + course.getSequencePattern(), + course.getSubjectCode() + ); + for(SectionGroupCost sectionGroupCost : sectionGroupCosts){ + if(sectionGroupCost.isLiveData()){ + sectionGroupCost.setSequencePattern(courseDTO.getSequencePattern()); + sectionGroupCostService.update(sectionGroupCost); + } + + } } } else if(course.getSequencePattern().length() == 1 && courseDTO.getSequencePattern().length() == 3){ for(SectionGroup sectionGroup : course.getSectionGroups()){ @@ -259,6 +273,20 @@ public Course updateCourse(@PathVariable long courseId, @RequestBody @Validated lectureSection.setSequenceNumber(courseDTO.getSequencePattern()); lectureSection.setSeats(seats); sectionService.save(lectureSection); + List sectionGroupCosts = sectionGroupCostService.findBySectionGroupDetails( + workgroup.getId(), + course.getYear(), + course.getCourseNumber(), + course.getSequencePattern(), + course.getSubjectCode() + ); + for(SectionGroupCost sectionGroupCost : sectionGroupCosts){ + if(sectionGroupCost.isLiveData()){ + sectionGroupCost.setSequencePattern(courseDTO.getSequencePattern()); + sectionGroupCostService.update(sectionGroupCost); + } + + } } } return courseService.update(courseDTO); diff --git a/src/main/java/edu/ucdavis/dss/ipa/repositories/SectionGroupCostRepository.java b/src/main/java/edu/ucdavis/dss/ipa/repositories/SectionGroupCostRepository.java index 1657a9729..f60a259c4 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/repositories/SectionGroupCostRepository.java +++ b/src/main/java/edu/ucdavis/dss/ipa/repositories/SectionGroupCostRepository.java @@ -28,4 +28,21 @@ public interface SectionGroupCostRepository extends CrudRepository findbyWorkgroupIdAndYear(@Param("workgroupId") long workgroupId, @Param("year") long year); SectionGroupCost findBySubjectCodeAndCourseNumberAndSequencePatternAndBudgetScenarioIdAndTermCode(String subjectCode, String courseNumber, String sequencePattern, long id, String termCode); + + @Query( " SELECT DISTINCT sgc" + + " FROM SectionGroupCost sgc, BudgetScenario bs, Budget b, Schedule s" + + " WHERE sgc.budgetScenario = bs" + + " AND bs.budget = b" + + " AND b.schedule = s" + + " AND s.workgroup.id = :workgroupId" + + " AND s.year = :year" + + " AND sgc.courseNumber = :courseNumber" + + " AND sgc.sequencePattern = :sequencePattern" + + " AND sgc.subjectCode = :subjectCode" ) + List findBySectionGroupDetails( + @Param("workgroupId") long workgroupId, + @Param("year") long year, + @Param("courseNumber") String courseNumber, + @Param("sequencePattern") String sequencePattern, + @Param("subjectCode") String subjectCode); } diff --git a/src/main/java/edu/ucdavis/dss/ipa/services/SectionGroupCostService.java b/src/main/java/edu/ucdavis/dss/ipa/services/SectionGroupCostService.java index 35cf95eac..e1bfcf6ed 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/services/SectionGroupCostService.java +++ b/src/main/java/edu/ucdavis/dss/ipa/services/SectionGroupCostService.java @@ -24,4 +24,6 @@ public interface SectionGroupCostService { void delete(Long sectionGroupCostId); SectionGroupCost updateFromSectionGroup(SectionGroup sectionGroup, BudgetScenario liveDataScenario); + + List findBySectionGroupDetails(long workgroupId, long year, String courseNumber, String sequencePattern, String subjectCode); } diff --git a/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionGroupCostService.java b/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionGroupCostService.java index 8e8d65c89..f4c404bfc 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionGroupCostService.java +++ b/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionGroupCostService.java @@ -263,4 +263,16 @@ public SectionGroupCost updateFromSectionGroup(SectionGroup sectionGroup, Budget return sectionGroupCost; } + + @Override + public List findBySectionGroupDetails(long workgroupId, long year, String courseNumber, String sequencePattern, String subjectCode) { + return this.sectionGroupCostRepository.findBySectionGroupDetails( + workgroupId, + year, + courseNumber, + sequencePattern, + subjectCode + ); + } + } From 4ad6fd624b67695e50e2c8c7793dfc209a344337 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Thu, 21 Jan 2021 09:53:50 -0800 Subject: [PATCH 05/18] create new course --- .../course/CourseViewController.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index efa36987b..1af944a17 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -937,4 +937,34 @@ public View downloadExcel(@PathVariable long workgroupId, @PathVariable long yea return null; } } + + @RequestMapping(value = "/api/courseView/workgroups/{workgroupId}/years/{year}/courses/{courseId}/sectionGroups/{sectionGroupId}/convert/{sequencePattern}", method = RequestMethod.POST, produces="application/json") + @ResponseBody + public Course convertCourseOffering(@PathVariable Long workgroupId, @PathVariable Long year, @PathVariable Long courseId, @PathVariable Long sectionGroupId, @PathVariable String sequencePattern, HttpServletResponse httpResponse) { + authorizer.hasWorkgroupRole(workgroupId, "academicPlanner"); + + Schedule schedule = this.scheduleService.findByWorkgroupIdAndYear(workgroupId, year); + + Course existingCourse = courseService.getOneById(courseId); + + Course course = new Course(); + course.setSubjectCode(existingCourse.getSubjectCode()); + course.setCourseNumber(existingCourse.getCourseNumber()); + course.setSequencePattern(sequencePattern); + course.setTitle(existingCourse.getTitle()); + course.setEffectiveTermCode(existingCourse.getEffectiveTermCode()); + course.setSchedule(schedule); + // Need to copy tags + //course.setTags(existingCourse.getTags()); + + Course newCourse = courseService.create(course); + + + if (newCourse != null) { + return newCourse; + } else { + httpResponse.setStatus(HttpStatus.BAD_REQUEST.value()); + return null; + } + } } From e2740cbac2910bf6290ce8d4a38fdcade0af2bf5 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Thu, 21 Jan 2021 11:00:20 -0800 Subject: [PATCH 06/18] creating new offering --- .../course/CourseViewController.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index 1af944a17..b85961ddf 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -938,13 +938,21 @@ public View downloadExcel(@PathVariable long workgroupId, @PathVariable long yea } } - @RequestMapping(value = "/api/courseView/workgroups/{workgroupId}/years/{year}/courses/{courseId}/sectionGroups/{sectionGroupId}/convert/{sequencePattern}", method = RequestMethod.POST, produces="application/json") + @RequestMapping(value = "/api/courseView/workgroups/{workgroupId}/years/{year}/courses/{courseId}/sectionGroups/{sectionGroupId}/convert/{termCode}", method = RequestMethod.POST, produces="application/json") @ResponseBody - public Course convertCourseOffering(@PathVariable Long workgroupId, @PathVariable Long year, @PathVariable Long courseId, @PathVariable Long sectionGroupId, @PathVariable String sequencePattern, HttpServletResponse httpResponse) { + public Course convertCourseOffering(@RequestBody Section section, @PathVariable Long workgroupId, @PathVariable Long year, @PathVariable Long courseId, @PathVariable Long sectionGroupId, @PathVariable String termCode, HttpServletResponse httpResponse) { authorizer.hasWorkgroupRole(workgroupId, "academicPlanner"); Schedule schedule = this.scheduleService.findByWorkgroupIdAndYear(workgroupId, year); + System.err.println("Section seats " + section.getSeats()); + + String sequencePattern = section.getSequenceNumber(); + if(Character.isLetter(sequencePattern.charAt(0)) ){ + sequencePattern = sequencePattern.substring(0,1); + } + System.err.println("Sequence pattern is " + sequencePattern); + Course existingCourse = courseService.getOneById(courseId); Course course = new Course(); @@ -959,6 +967,16 @@ public Course convertCourseOffering(@PathVariable Long workgroupId, @PathVariabl Course newCourse = courseService.create(course); + //System.err.println("new course id " + newCourse.getId()); + //SectionGroup sectionGroup = sectionGroupService.findOrCreateByCourseIdAndTermCode(newCourse.getId(), termCode); + SectionGroup sectionGroup = new SectionGroup(); + sectionGroup.setCourse(newCourse); + sectionGroup.setTermCode(termCode); + sectionGroup.setPlannedSeats(section.getSeats().intValue()); + sectionGroupService.save(sectionGroup); + + section.setSectionGroup(sectionGroup); + sectionService.save(section); if (newCourse != null) { return newCourse; From 3e5ca7e41f2714a695fb5b4c865def9edf0e2f26 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Thu, 21 Jan 2021 12:28:42 -0800 Subject: [PATCH 07/18] return new course and new section group --- .../api/components/course/CourseViewController.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index b85961ddf..28f64b8dd 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -34,6 +34,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.sql.Array; import java.sql.Time; import java.text.ParseException; import java.util.*; @@ -940,18 +941,14 @@ public View downloadExcel(@PathVariable long workgroupId, @PathVariable long yea @RequestMapping(value = "/api/courseView/workgroups/{workgroupId}/years/{year}/courses/{courseId}/sectionGroups/{sectionGroupId}/convert/{termCode}", method = RequestMethod.POST, produces="application/json") @ResponseBody - public Course convertCourseOffering(@RequestBody Section section, @PathVariable Long workgroupId, @PathVariable Long year, @PathVariable Long courseId, @PathVariable Long sectionGroupId, @PathVariable String termCode, HttpServletResponse httpResponse) { + public List convertCourseOffering(@RequestBody Section section, @PathVariable Long workgroupId, @PathVariable Long year, @PathVariable Long courseId, @PathVariable Long sectionGroupId, @PathVariable String termCode, HttpServletResponse httpResponse) { authorizer.hasWorkgroupRole(workgroupId, "academicPlanner"); Schedule schedule = this.scheduleService.findByWorkgroupIdAndYear(workgroupId, year); - - System.err.println("Section seats " + section.getSeats()); - String sequencePattern = section.getSequenceNumber(); if(Character.isLetter(sequencePattern.charAt(0)) ){ sequencePattern = sequencePattern.substring(0,1); } - System.err.println("Sequence pattern is " + sequencePattern); Course existingCourse = courseService.getOneById(courseId); @@ -967,19 +964,17 @@ public Course convertCourseOffering(@RequestBody Section section, @PathVariable Course newCourse = courseService.create(course); - //System.err.println("new course id " + newCourse.getId()); - //SectionGroup sectionGroup = sectionGroupService.findOrCreateByCourseIdAndTermCode(newCourse.getId(), termCode); SectionGroup sectionGroup = new SectionGroup(); sectionGroup.setCourse(newCourse); sectionGroup.setTermCode(termCode); sectionGroup.setPlannedSeats(section.getSeats().intValue()); - sectionGroupService.save(sectionGroup); + SectionGroup newSectionGroup = sectionGroupService.save(sectionGroup); section.setSectionGroup(sectionGroup); sectionService.save(section); if (newCourse != null) { - return newCourse; + return Arrays.asList(newCourse, newSectionGroup); } else { httpResponse.setStatus(HttpStatus.BAD_REQUEST.value()); return null; From 5c884b9e76ec576ef6f5579245668751e4c74619 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Thu, 21 Jan 2021 16:27:27 -0800 Subject: [PATCH 08/18] move section group to new course, delete old sections and update section groups costs --- .../course/CourseViewController.java | 83 ++++++------------- 1 file changed, 25 insertions(+), 58 deletions(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index 28f64b8dd..d9e75c8f6 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -234,62 +234,6 @@ public Course updateCourse(@PathVariable long courseId, @RequestBody @Validated authorizer.hasWorkgroupRole(workgroup.getId(), "academicPlanner"); courseDTO.setSchedule(course.getSchedule()); - if(course.getSequencePattern().length() == 3 && courseDTO.getSequencePattern().length() == 1){ - for(SectionGroup sectionGroup : course.getSectionGroups()){ - Long seats = new Long(0); - Section lectureSection = new Section(); - for(Section section : sectionGroup.getSections()){ - seats += section.getSeats(); - sectionService.deleteWithCascade(section); - } - - lectureSection.setSectionGroup(sectionGroup); - lectureSection.setSequenceNumber(courseDTO.getSequencePattern()+"01"); - lectureSection.setSeats(seats); - sectionService.save(lectureSection); - List sectionGroupCosts = sectionGroupCostService.findBySectionGroupDetails( - workgroup.getId(), - course.getYear(), - course.getCourseNumber(), - course.getSequencePattern(), - course.getSubjectCode() - ); - for(SectionGroupCost sectionGroupCost : sectionGroupCosts){ - if(sectionGroupCost.isLiveData()){ - sectionGroupCost.setSequencePattern(courseDTO.getSequencePattern()); - sectionGroupCostService.update(sectionGroupCost); - } - - } - } - } else if(course.getSequencePattern().length() == 1 && courseDTO.getSequencePattern().length() == 3){ - for(SectionGroup sectionGroup : course.getSectionGroups()){ - Long seats = new Long(0); - Section lectureSection = new Section(); - for(Section section : sectionGroup.getSections()){ - seats += section.getSeats(); - sectionService.deleteWithCascade(section); - } - lectureSection.setSectionGroup(sectionGroup); - lectureSection.setSequenceNumber(courseDTO.getSequencePattern()); - lectureSection.setSeats(seats); - sectionService.save(lectureSection); - List sectionGroupCosts = sectionGroupCostService.findBySectionGroupDetails( - workgroup.getId(), - course.getYear(), - course.getCourseNumber(), - course.getSequencePattern(), - course.getSubjectCode() - ); - for(SectionGroupCost sectionGroupCost : sectionGroupCosts){ - if(sectionGroupCost.isLiveData()){ - sectionGroupCost.setSequencePattern(courseDTO.getSequencePattern()); - sectionGroupCostService.update(sectionGroupCost); - } - - } - } - } return courseService.update(courseDTO); } @@ -959,12 +903,35 @@ public List convertCourseOffering(@RequestBody Section section, @PathVar course.setTitle(existingCourse.getTitle()); course.setEffectiveTermCode(existingCourse.getEffectiveTermCode()); course.setSchedule(schedule); - // Need to copy tags + // Need to copy tags? //course.setTags(existingCourse.getTags()); + // TODO + // do we need Course comments? + // TODO copy over other data such as units Course newCourse = courseService.create(course); - SectionGroup sectionGroup = new SectionGroup(); + SectionGroup sectionGroup = sectionGroupService.getOneById(sectionGroupId); + // Update Live Data + List sectionGroupCosts = sectionGroupCostService.findBySectionGroupDetails( + workgroupId, + existingCourse.getYear(), + existingCourse.getCourseNumber(), + existingCourse.getSequencePattern(), + existingCourse.getSubjectCode() + ); + for(SectionGroupCost sectionGroupCost : sectionGroupCosts){ + if(sectionGroupCost.isLiveData()){ + sectionGroupCost.setSequencePattern(course.getSequencePattern()); + sectionGroupCostService.update(sectionGroupCost); + } + + } + for(Section oldSection : sectionGroup.getSections()){ + sectionService.deleteWithCascade(oldSection); + } + + sectionGroup.setCourse(newCourse); sectionGroup.setTermCode(termCode); sectionGroup.setPlannedSeats(section.getSeats().intValue()); From dae930210fc0d93291038cf793ead68faf0b721c Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Thu, 21 Jan 2021 16:56:11 -0800 Subject: [PATCH 09/18] accept sequence pattern instead of section --- .../course/CourseViewController.java | 20 +++++++++++-------- .../jpa/JpaSectionGroupCostService.java | 4 +++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index d9e75c8f6..70edddaac 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -883,16 +883,12 @@ public View downloadExcel(@PathVariable long workgroupId, @PathVariable long yea } } - @RequestMapping(value = "/api/courseView/workgroups/{workgroupId}/years/{year}/courses/{courseId}/sectionGroups/{sectionGroupId}/convert/{termCode}", method = RequestMethod.POST, produces="application/json") + @RequestMapping(value = "/api/courseView/workgroups/{workgroupId}/years/{year}/courses/{courseId}/sectionGroups/{sectionGroupId}/convert/{sequencePattern}", method = RequestMethod.POST, produces="application/json") @ResponseBody - public List convertCourseOffering(@RequestBody Section section, @PathVariable Long workgroupId, @PathVariable Long year, @PathVariable Long courseId, @PathVariable Long sectionGroupId, @PathVariable String termCode, HttpServletResponse httpResponse) { + public List convertCourseOffering(@PathVariable Long workgroupId, @PathVariable Long year, @PathVariable Long courseId, @PathVariable Long sectionGroupId, @PathVariable String sequencePattern, HttpServletResponse httpResponse) { authorizer.hasWorkgroupRole(workgroupId, "academicPlanner"); Schedule schedule = this.scheduleService.findByWorkgroupIdAndYear(workgroupId, year); - String sequencePattern = section.getSequenceNumber(); - if(Character.isLetter(sequencePattern.charAt(0)) ){ - sequencePattern = sequencePattern.substring(0,1); - } Course existingCourse = courseService.getOneById(courseId); @@ -927,16 +923,24 @@ public List convertCourseOffering(@RequestBody Section section, @PathVar } } + Long seatCount = new Long(0); for(Section oldSection : sectionGroup.getSections()){ + seatCount += oldSection.getSeats(); sectionService.deleteWithCascade(oldSection); } sectionGroup.setCourse(newCourse); - sectionGroup.setTermCode(termCode); - sectionGroup.setPlannedSeats(section.getSeats().intValue()); + sectionGroup.setPlannedSeats(seatCount.intValue()); SectionGroup newSectionGroup = sectionGroupService.save(sectionGroup); + Section section = new Section(); + if(sequencePattern.length() > 1){ + section.setSequenceNumber(sequencePattern); + } else { + section.setSequenceNumber(sequencePattern+"01"); + } + section.setSeats(seatCount); section.setSectionGroup(sectionGroup); sectionService.save(section); diff --git a/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionGroupCostService.java b/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionGroupCostService.java index f4c404bfc..7af7dacb4 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionGroupCostService.java +++ b/src/main/java/edu/ucdavis/dss/ipa/services/jpa/JpaSectionGroupCostService.java @@ -158,7 +158,9 @@ public SectionGroupCost update(SectionGroupCost sectionGroupCostDTO) { originalSectionGroupCost.setInstructor(instructorRepository.findById(sectionGroupCostDTO.getInstructorIdentification())); originalSectionGroupCost.setOriginalInstructor(instructorRepository.findById(sectionGroupCostDTO.getOriginalInstructorIdentification())); - originalSectionGroupCost.setInstructorType(instructorTypeRepository.findById(sectionGroupCostDTO.getInstructorType().getId())); + if(sectionGroupCostDTO.getInstructorType() != null){ + originalSectionGroupCost.setInstructorType(instructorTypeRepository.findById(sectionGroupCostDTO.getInstructorType().getId())); + } if(sectionGroupCostDTO.getReasonCategory() != null){ originalSectionGroupCost.setReasonCategory(reasonCategoryRepository.findById(sectionGroupCostDTO.getReasonCategory().getId())); } From 2c127d2b27d70bf012027a4ee9eac91fee83d4af Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Fri, 22 Jan 2021 16:43:11 -0800 Subject: [PATCH 10/18] dont create if matching course already exists --- .../dss/ipa/api/components/course/CourseViewController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index 70edddaac..b05508fd5 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -905,7 +905,7 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV // do we need Course comments? // TODO copy over other data such as units - Course newCourse = courseService.create(course); + Course newCourse = courseService.findOrCreateByCourse(course); SectionGroup sectionGroup = sectionGroupService.getOneById(sectionGroupId); // Update Live Data From 4c5beefe208de2068e9ed7e60723a46817c81f2e Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Tue, 26 Jan 2021 09:34:27 -0800 Subject: [PATCH 11/18] audit new conversion endpoint --- .../dss/ipa/api/components/course/CourseViewController.java | 5 ----- .../edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java | 6 ++++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index b05508fd5..2f5d13061 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -899,11 +899,6 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV course.setTitle(existingCourse.getTitle()); course.setEffectiveTermCode(existingCourse.getEffectiveTermCode()); course.setSchedule(schedule); - // Need to copy tags? - //course.setTags(existingCourse.getTags()); - // TODO - // do we need Course comments? - // TODO copy over other data such as units Course newCourse = courseService.findOrCreateByCourse(course); diff --git a/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java b/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java index 7fcf2720f..bdc124748 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java +++ b/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java @@ -31,6 +31,7 @@ public final class ActivityLogFormatter { courseViewSectionGroup.put("plannedSeats", true); courseViewSectionGroup.put("readerAppointments", true); courseViewSectionGroup.put("teachingAssistantAppointments", true); + courseViewSectionGroup.put("course", true); courseView.put("SectionGroup", courseViewSectionGroup); HashMap courseViewTeachingAssignment = new HashMap(); @@ -721,6 +722,9 @@ public static String getFormattedPropValue(String propName, Object obj){ } else if (obj instanceof ExpenseItemType) { ExpenseItemType expenseItemType = (ExpenseItemType) obj; return expenseItemType.getDescription(); + } else if (obj instanceof Course){ + Course course = (Course) obj; + return course.getSubjectCode() + " " + course.getCourseNumber() + " - " + course.getSequencePattern(); } else { if(obj != null){ return obj.toString(); @@ -759,6 +763,8 @@ public static Boolean isAudited(String module, String entity, String endpoint){ return true; } else if (entity.equals("TeachingAssignment") && endpoint.equals("courses" )){ return true; + } else if ((entity.equals("SectionGroup") || entity.equals("Course")) && endpoint.equals("convert")){ + return true; } else if (entity.endsWith("y") && (entity.toLowerCase().substring(0, entity.length() - 1) + "ies").equals(endpoint) ) { return true; } From b8afc24be68599689bc1545f6b87db1241300db0 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Tue, 26 Jan 2021 13:16:39 -0800 Subject: [PATCH 12/18] copy units --- .../dss/ipa/api/components/course/CourseViewController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index 2f5d13061..766e8fc3e 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -899,6 +899,8 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV course.setTitle(existingCourse.getTitle()); course.setEffectiveTermCode(existingCourse.getEffectiveTermCode()); course.setSchedule(schedule); + course.setUnitsHigh(existingCourse.getUnitsHigh()); + course.setUnitsLow(existingCourse.getUnitsLow()); Course newCourse = courseService.findOrCreateByCourse(course); From ab654990639d22a0b014118312476a8105d510db Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Tue, 26 Jan 2021 13:35:06 -0800 Subject: [PATCH 13/18] check for existing offering --- .../api/components/course/CourseViewController.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index 766e8fc3e..4448bf1df 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -887,7 +887,6 @@ public View downloadExcel(@PathVariable long workgroupId, @PathVariable long yea @ResponseBody public List convertCourseOffering(@PathVariable Long workgroupId, @PathVariable Long year, @PathVariable Long courseId, @PathVariable Long sectionGroupId, @PathVariable String sequencePattern, HttpServletResponse httpResponse) { authorizer.hasWorkgroupRole(workgroupId, "academicPlanner"); - Schedule schedule = this.scheduleService.findByWorkgroupIdAndYear(workgroupId, year); Course existingCourse = courseService.getOneById(courseId); @@ -905,6 +904,15 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV Course newCourse = courseService.findOrCreateByCourse(course); SectionGroup sectionGroup = sectionGroupService.getOneById(sectionGroupId); + + // Make sure course doesn't already have an offering + for (SectionGroup existingSectionGroup : newCourse.getSectionGroups()){ + if (existingSectionGroup.getTermCode().equals(sectionGroup.getTermCode())){ + httpResponse.setStatus(HttpStatus.BAD_REQUEST.value()); + return null; + } + } + // Update Live Data List sectionGroupCosts = sectionGroupCostService.findBySectionGroupDetails( workgroupId, From f5cebf1d4f5d4a63c6a86e708093356ad1f739b4 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Tue, 26 Jan 2021 15:11:50 -0800 Subject: [PATCH 14/18] remove backend check for existing offering(moving to frontned), convert existing section group costs in non live data --- .../course/CourseViewController.java | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index 4448bf1df..fa89f5502 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -55,6 +55,7 @@ public class CourseViewController { @Inject TermService termService; @Inject TeachingAssignmentService teachingAssignmentService; @Inject InstructorService instructorService; + @Inject BudgetScenarioService budgetScenarioService; @Inject DataWarehouseRepository dwRepository; @Inject Authorizer authorizer; @@ -905,29 +906,33 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV SectionGroup sectionGroup = sectionGroupService.getOneById(sectionGroupId); - // Make sure course doesn't already have an offering - for (SectionGroup existingSectionGroup : newCourse.getSectionGroups()){ - if (existingSectionGroup.getTermCode().equals(sectionGroup.getTermCode())){ - httpResponse.setStatus(HttpStatus.BAD_REQUEST.value()); - return null; - } - } - // Update Live Data - List sectionGroupCosts = sectionGroupCostService.findBySectionGroupDetails( - workgroupId, - existingCourse.getYear(), - existingCourse.getCourseNumber(), - existingCourse.getSequencePattern(), - existingCourse.getSubjectCode() - ); - for(SectionGroupCost sectionGroupCost : sectionGroupCosts){ - if(sectionGroupCost.isLiveData()){ - sectionGroupCost.setSequencePattern(course.getSequencePattern()); - sectionGroupCostService.update(sectionGroupCost); + for(BudgetScenario budgetScenario : budgetScenarioService.findbyWorkgroupIdAndYear(workgroupId, year) ){ + // Do not update budget requests + if(!budgetScenario.getIsBudgetRequest()){ + System.err.println("Updating from " + sectionGroup.getCourse().getSequencePattern() + " to " + sequencePattern); + SectionGroupCost conflictingSectionGroupCost = sectionGroupCostService.findBySubjectCodeAndCourseNumberAndSequencePatternAndBudgetScenarioIdAndTermCode( + existingCourse.getSubjectCode(), + existingCourse.getCourseNumber(), + sequencePattern, + budgetScenario.getId(), + sectionGroup.getTermCode() + ); + if(conflictingSectionGroupCost != null){ + System.err.println("Found a conflicting section group cost id " + conflictingSectionGroupCost.getId()); + sectionGroupCostService.delete(conflictingSectionGroupCost.getId()); + } + SectionGroupCost existingSectionGroupCost = sectionGroupCostService.findBySubjectCodeAndCourseNumberAndSequencePatternAndBudgetScenarioIdAndTermCode( + existingCourse.getSubjectCode(), + existingCourse.getCourseNumber(), + sectionGroup.getCourse().getSequencePattern(), + budgetScenario.getId(), + sectionGroup.getTermCode() + ); + existingSectionGroupCost.setSequencePattern(sequencePattern); } - } + Long seatCount = new Long(0); for(Section oldSection : sectionGroup.getSections()){ seatCount += oldSection.getSeats(); From f5aa8f5612f931660c49e6cd3dcb20a2b081b455 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Tue, 26 Jan 2021 15:16:17 -0800 Subject: [PATCH 15/18] ignore budget scenario if it does not have a matching sectiongroup cost --- .../course/CourseViewController.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index fa89f5502..25e90f196 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -911,17 +911,6 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV // Do not update budget requests if(!budgetScenario.getIsBudgetRequest()){ System.err.println("Updating from " + sectionGroup.getCourse().getSequencePattern() + " to " + sequencePattern); - SectionGroupCost conflictingSectionGroupCost = sectionGroupCostService.findBySubjectCodeAndCourseNumberAndSequencePatternAndBudgetScenarioIdAndTermCode( - existingCourse.getSubjectCode(), - existingCourse.getCourseNumber(), - sequencePattern, - budgetScenario.getId(), - sectionGroup.getTermCode() - ); - if(conflictingSectionGroupCost != null){ - System.err.println("Found a conflicting section group cost id " + conflictingSectionGroupCost.getId()); - sectionGroupCostService.delete(conflictingSectionGroupCost.getId()); - } SectionGroupCost existingSectionGroupCost = sectionGroupCostService.findBySubjectCodeAndCourseNumberAndSequencePatternAndBudgetScenarioIdAndTermCode( existingCourse.getSubjectCode(), existingCourse.getCourseNumber(), @@ -929,7 +918,21 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV budgetScenario.getId(), sectionGroup.getTermCode() ); - existingSectionGroupCost.setSequencePattern(sequencePattern); + if(existingSectionGroupCost != null){ + SectionGroupCost conflictingSectionGroupCost = sectionGroupCostService.findBySubjectCodeAndCourseNumberAndSequencePatternAndBudgetScenarioIdAndTermCode( + existingCourse.getSubjectCode(), + existingCourse.getCourseNumber(), + sequencePattern, + budgetScenario.getId(), + sectionGroup.getTermCode() + ); + if(conflictingSectionGroupCost != null){ + System.err.println("Found a conflicting section group cost id " + conflictingSectionGroupCost.getId()); + sectionGroupCostService.delete(conflictingSectionGroupCost.getId()); + } + existingSectionGroupCost.setSequencePattern(sequencePattern); + sectionGroupCostService.update(existingSectionGroupCost); + } } } From b2af216f88dc2c08157255a7038dc036592c18d3 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Wed, 27 Jan 2021 11:22:48 -0800 Subject: [PATCH 16/18] remove prints, audit budget scenarios affected by conversion --- .../ipa/api/components/course/CourseViewController.java | 2 -- .../ucdavis/dss/ipa/utilities/ActivityLogFormatter.java | 9 ++++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index 25e90f196..f7ec9e083 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -910,7 +910,6 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV for(BudgetScenario budgetScenario : budgetScenarioService.findbyWorkgroupIdAndYear(workgroupId, year) ){ // Do not update budget requests if(!budgetScenario.getIsBudgetRequest()){ - System.err.println("Updating from " + sectionGroup.getCourse().getSequencePattern() + " to " + sequencePattern); SectionGroupCost existingSectionGroupCost = sectionGroupCostService.findBySubjectCodeAndCourseNumberAndSequencePatternAndBudgetScenarioIdAndTermCode( existingCourse.getSubjectCode(), existingCourse.getCourseNumber(), @@ -927,7 +926,6 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV sectionGroup.getTermCode() ); if(conflictingSectionGroupCost != null){ - System.err.println("Found a conflicting section group cost id " + conflictingSectionGroupCost.getId()); sectionGroupCostService.delete(conflictingSectionGroupCost.getId()); } existingSectionGroupCost.setSequencePattern(sequencePattern); diff --git a/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java b/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java index bdc124748..88955cfde 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java +++ b/src/main/java/edu/ucdavis/dss/ipa/utilities/ActivityLogFormatter.java @@ -34,6 +34,11 @@ public final class ActivityLogFormatter { courseViewSectionGroup.put("course", true); courseView.put("SectionGroup", courseViewSectionGroup); + // Fields to audit in course view for sectionGroupCost + HashMap courseViewSectionGroupCost = new HashMap(); + courseViewSectionGroupCost.put("sequencePattern", true); + courseView.put("SectionGroupCost", courseViewSectionGroupCost); + HashMap courseViewTeachingAssignment = new HashMap(); courseView.put("TeachingAssignment", courseViewTeachingAssignment); temp.put("courseViewController", courseView); @@ -275,6 +280,8 @@ public static String getFormattedModule(String moduleNameRaw, Object obj, String return "Support Staff Assignments"; } else if (obj instanceof Schedule && (propName.equals("supportStaffSupportCallReviewOpen") || propName.equals("instructorSupportCallReviewOpen"))) { return "Support Staff Assignments"; + } else if (obj instanceof SectionGroupCost && propName.equals("sequencePattern")){ + return "Budget"; } else { return ActivityLogFormatter.getFormattedModule(moduleNameRaw, obj); } @@ -763,7 +770,7 @@ public static Boolean isAudited(String module, String entity, String endpoint){ return true; } else if (entity.equals("TeachingAssignment") && endpoint.equals("courses" )){ return true; - } else if ((entity.equals("SectionGroup") || entity.equals("Course")) && endpoint.equals("convert")){ + } else if ((entity.equals("SectionGroup") || entity.equals("Course") || entity.equals("SectionGroupCost")) && endpoint.equals("convert")){ return true; } else if (entity.endsWith("y") && (entity.toLowerCase().substring(0, entity.length() - 1) + "ies").equals(endpoint) ) { return true; From 0bc40ea77665f93a621b32fee2db025f1c348618 Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Wed, 27 Jan 2021 12:59:02 -0800 Subject: [PATCH 17/18] ignore budget scenarios with conflicts --- .../ipa/api/components/course/CourseViewController.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index f7ec9e083..af466945d 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -925,11 +925,10 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV budgetScenario.getId(), sectionGroup.getTermCode() ); - if(conflictingSectionGroupCost != null){ - sectionGroupCostService.delete(conflictingSectionGroupCost.getId()); + if(conflictingSectionGroupCost == null){ + existingSectionGroupCost.setSequencePattern(sequencePattern); + sectionGroupCostService.update(existingSectionGroupCost); } - existingSectionGroupCost.setSequencePattern(sequencePattern); - sectionGroupCostService.update(existingSectionGroupCost); } } } From 5800c57e48bfa542fc7bc68a44bf3e39a754c96c Mon Sep 17 00:00:00 2001 From: Edgar Duran-Perez Date: Wed, 27 Jan 2021 13:15:56 -0800 Subject: [PATCH 18/18] account for disabled flag --- .../dss/ipa/api/components/course/CourseViewController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java index af466945d..7296d61dc 100644 --- a/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java +++ b/src/main/java/edu/ucdavis/dss/ipa/api/components/course/CourseViewController.java @@ -926,6 +926,11 @@ public List convertCourseOffering(@PathVariable Long workgroupId, @PathV sectionGroup.getTermCode() ); if(conflictingSectionGroupCost == null){ + existingSectionGroupCost.setSequencePattern(sequencePattern); + existingSectionGroupCost.setDisabled(false); + sectionGroupCostService.update(existingSectionGroupCost); + } else if (conflictingSectionGroupCost.isDisabled()){ + sectionGroupCostService.delete(conflictingSectionGroupCost.getId()); existingSectionGroupCost.setSequencePattern(sequencePattern); sectionGroupCostService.update(existingSectionGroupCost); }