diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java index e9554081..7f74816b 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java @@ -74,18 +74,16 @@ public ResponseEntity graduateStudentNew(@PathVariable String @Operation(summary = "Get Report data from graduation by student pen", description = "Get Report data from graduation by student pen", tags = { "Graduation Data" }) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) public ResponseEntity reportDataByPen(@PathVariable @NotNull String pen, @RequestParam(required = false) String type) { - LOGGER.debug("Report Data By Student Pen: {}", pen); return response.GET(gradService.prepareReportData(pen, type)); } @GetMapping(EducGraduationApiConstants.GRADUATE_TRANSCRIPT_REPORT) @PreAuthorize(PermissionsContants.GRADUATE_TRANSCRIPT) - @Operation(summary = "Get Transcript binary from graduation by student pen", description = "Get Transcript binary from graduation by student pen", tags = { "Graduation Data" }) + @Operation(summary = "Get Transcript encoded binary from graduation by student pen", description = "Get Transcript encoded binary from graduation by student pen", tags = { "Graduation Data" }) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) public ResponseEntity reportTranscriptByPen(@PathVariable @NotNull String pen, @RequestParam(required = false) String interim, @RequestParam(required = false) String preview) { - LOGGER.debug("Report Data By Student Pen: {}", pen); byte[] resultBinary = gradService.prepareTranscriptReport(pen, interim, preview); if(resultBinary == null || resultBinary.length == 0) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); @@ -94,6 +92,17 @@ public ResponseEntity reportTranscriptByPen(@PathVariable @NotNull Strin return handleBinaryResponse(encoded, String.format("%sTranscript%sReport.pdfencoded", pen, interim), MediaType.TEXT_PLAIN); } + @GetMapping(EducGraduationApiConstants.GRADUATE_TRANSCRIPT_PDF_REPORT) + @PreAuthorize(PermissionsContants.GRADUATE_TRANSCRIPT) + @Operation(summary = "Get Transcript binary from graduation by student pen", description = "Get Transcript binary from graduation by student pen", tags = { "Graduation Data" }) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + public ResponseEntity reportTranscriptPdfByPen(@PathVariable @NotNull String pen, + @RequestParam(required = false) String interim, + @RequestParam(required = false) String preview) { + byte[] resultBinary = gradService.prepareTranscriptReport(pen, interim, preview); + return handleBinaryResponse(resultBinary, String.format("%sTranscript%sReport.pdf", pen, interim), MediaType.APPLICATION_PDF); + } + @PostMapping(EducGraduationApiConstants.GRADUATE_REPORT_DATA) @PreAuthorize(PermissionsContants.GRADUATE_DATA) @Operation(summary = "Adapt graduation data for reporting", description = "Adapt graduation data for reporting", tags = { "Graduation Data" }) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/model/report/TranscriptResult.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/model/report/TranscriptResult.java index 4eb73b18..b5da80e6 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/model/report/TranscriptResult.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/model/report/TranscriptResult.java @@ -1,7 +1,12 @@ package ca.bc.gov.educ.api.graduation.model.report; +import ca.bc.gov.educ.api.graduation.util.EducGraduationApiUtils; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import java.util.Date; import java.util.Objects; public class TranscriptResult { @@ -62,8 +67,19 @@ public void setUsedForGrad(String value) { this.usedForGrad = value; } + @JsonIgnore public Double getCompletedPercentage() { - return this.mark != null? this.mark.getCompletedCoursePercentage() : null; + return this.mark != null ? this.mark.getCompletedCoursePercentage() : null; + } + + @JsonIgnore + public Double getInterimPercentage() { + return this.mark != null && NumberUtils.isDigits(this.mark.getInterimPercent()) ? NumberUtils.createDouble(this.mark.getInterimPercent()) : 0d; + } + + @JsonIgnore + public Date getSessionDate() { + return this.course != null && StringUtils.isNotBlank(this.course.getSessionDate()) ? EducGraduationApiUtils.parsingCourseTraxDate(this.course.getSessionDate()) : null; } @Override diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java index 13b912d7..7e6237f0 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java @@ -295,7 +295,7 @@ private void createCourseListForTranscript(List studentCourseList } result.setUsedForGrad(sc.getCreditsUsedForGrad() != null ? sc.getCreditsUsedForGrad().toString() : ""); result.setEquivalency(sc.getSpecialCase() != null && sc.getSpecialCase().compareTo("C") == 0 ? "C" : equivOrChallenge); - addIntoTranscriptList(result, tList); + addIntoTranscriptList(result, tList, xml); } } } @@ -320,18 +320,28 @@ private boolean isValidCutOffCourse(List studentCourseList, Stude } @Generated - private void addIntoTranscriptList(TranscriptResult transcriptResult, List tList) { + private void addIntoTranscriptList(TranscriptResult transcriptResult, List tList, boolean xml) { List dups = tList.stream().filter(tr -> tr.getCourse().isDuplicate(transcriptResult.getCourse()) && !tr.getCourse().equals(transcriptResult.getCourse()) - ).sorted(Comparator.comparing(TranscriptResult::getCompletedPercentage, Comparator.nullsLast(Double::compareTo)).reversed()).toList(); + ).sorted( + Comparator.comparing(TranscriptResult::getCompletedPercentage, Comparator.nullsLast(Double::compareTo)).reversed() + ).toList(); // Handling duplicates if (!dups.isEmpty()) { - TranscriptResult tr = dups.get(0); + TranscriptResult duplicatedTranscriptResult = dups.get(0); // GRAD2-2394: only if a course taken previously was not used for grad(= requirementMet is blank), then the highest course will be taken - if (StringUtils.isBlank(tr.getRequirement()) && tr.getCompletedPercentage() < transcriptResult.getCompletedPercentage()) { + if (StringUtils.isBlank(duplicatedTranscriptResult.getRequirement()) && duplicatedTranscriptResult.getCompletedPercentage() < transcriptResult.getCompletedPercentage()) { // replace - tList.remove(tr); + tList.remove(duplicatedTranscriptResult); + tList.add(transcriptResult); + return; + } + if (xml && + (duplicatedTranscriptResult.getCompletedPercentage() < transcriptResult.getInterimPercentage()) && + transcriptResult.getInterimPercentage() > 49) { + // replace + tList.remove(duplicatedTranscriptResult); tList.add(transcriptResult); return; } diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/util/EducGraduationApiConstants.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/util/EducGraduationApiConstants.java index cd95174c..d627e42b 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/util/EducGraduationApiConstants.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/util/EducGraduationApiConstants.java @@ -22,6 +22,7 @@ public class EducGraduationApiConstants { public static final String GRADUATE_REPORT_DATA_BY_PEN = "/report/data/{pen}"; public static final String GRADUATE_REPORT_DATA = "/report/data"; public static final String GRADUATE_TRANSCRIPT_REPORT = "/report/transcript/{pen}"; + public static final String GRADUATE_TRANSCRIPT_PDF_REPORT = "/report/transcriptpdf/{pen}"; public static final String GRADUATE_CERTIFICATE_REPORT = "/report/certificate/{pen}"; public static final String GRADUATE_ACHIEVEMENT_REPORT = "/report/achievement/{pen}"; public static final String SCHOOL_REPORTS = "/report/school"; diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/util/EducGraduationApiUtils.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/util/EducGraduationApiUtils.java index f53baf8c..ec36ae68 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/util/EducGraduationApiUtils.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/util/EducGraduationApiUtils.java @@ -164,6 +164,15 @@ public static Date parsingTraxDate(String sessionDate) { return toLastDayOfMonth(EducGraduationApiUtils.parseDate(sDates, EducGraduationApiConstants.DEFAULT_DATE_FORMAT)); } + public static Date parsingCourseTraxDate(String sessionDate) { + int countMatches = StringUtils.countMatches(sessionDate, "/"); + if (countMatches == 0) { + StringBuilder sb = new StringBuilder(sessionDate); + sessionDate = sb.insert(4, '/').toString(); + } + return parsingTraxDate(sessionDate); + } + public static LocalDate parsingTraxDateLocalDate(String sessionDate) { return DateUtils.toLocalDate(parsingTraxDate(sessionDate)); } diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java index bee21e08..a176a52f 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java @@ -98,6 +98,14 @@ void testReportTranscriptByPen() { Mockito.verify(graduationService).prepareTranscriptReport("12312312312","Interim",null); } + @Test + void testReportTranscriptPdfByPen() { + byte[] bytesSAR = "Any String you want".getBytes(); + Mockito.when(graduationService.prepareTranscriptReport("12312312312","Interim", null)).thenReturn(bytesSAR); + graduationController.reportTranscriptPdfByPen("12312312312","Interim",null); + Mockito.verify(graduationService).prepareTranscriptReport("12312312312","Interim",null); + } + @Test void testReportTranscriptByPen_empty() { byte[] bytesSAR = new byte[0];