From 145079de901ab9018e993638d2252d2a017e6413 Mon Sep 17 00:00:00 2001 From: Jarkko Pesonen <435495+jrkkp@users.noreply.github.com> Date: Thu, 28 Nov 2024 15:19:15 +0200 Subject: [PATCH] VKT(Frontend & Backend): Various fixes, added audit logs, new demo data, fixed enrollment statuses --- backend/vkt/db/4_init.sql | 62 +++++++++++++++++-- .../ExaminerEnrollmentController.java | 2 +- .../java/fi/oph/vkt/audit/AuditService.java | 4 ++ .../java/fi/oph/vkt/audit/VktOperation.java | 6 ++ .../type/EnrollmentAppointmentStatus.java | 1 + .../EnrollmentAppointmentRepository.java | 26 ++++++-- .../vkt/service/ExaminerDetailsService.java | 44 ++++++------- .../service/ExaminerEnrollmentService.java | 19 ++++-- ...lerkEnrollmentAppointmentDetailsFields.tsx | 2 +- .../appointment/EnrollmentSkillsListTable.tsx | 20 +++--- .../overview/ExaminerExamEventDetails.tsx | 10 --- frontend/packages/vkt/src/enums/app.ts | 8 ++- 12 files changed, 142 insertions(+), 62 deletions(-) diff --git a/backend/vkt/db/4_init.sql b/backend/vkt/db/4_init.sql index 18769a20c..43446d6c7 100644 --- a/backend/vkt/db/4_init.sql +++ b/backend/vkt/db/4_init.sql @@ -436,6 +436,34 @@ VALUES ( 'tammerkosken silta' ); +-- insert past examiner_exam_event +INSERT INTO examiner_exam_event(version, date, language, examiner_id, is_hidden, registration_closes, max_participants, municipality_id, location) +VALUES ( + 1, + NOW() - INTERVAL '2 weeks', + 'FI', + 1, + false, + NOW() - INTERVAL '1 weeks', + 10, + 2, + 'Testimaa' +); + +-- insert past examiner_exam_event +INSERT INTO examiner_exam_event(version, date, language, examiner_id, is_hidden, registration_closes, max_participants, municipality_id, location) +VALUES ( + 1, + NOW() - INTERVAL '3 weeks', + 'FI', + 1, + false, + NOW() - INTERVAL '2 weeks', + 10, + 2, + 'Mordor' +); + -- Insert enrollment appointment INSERT INTO enrollment_appointment(person_id, examiner_id, skill_oral, skill_textual, skill_understanding, @@ -465,7 +493,7 @@ VALUES (1, 1, 1, 'Teppo', 'Testinen', '922c2089-83a8-4163-8180-d8b675ff5337', NOW() + INTERVAL '3 days', NOW()); --- Insert enrollment appointment +-- Insert multiple enrollment appointments for person 2 INSERT INTO enrollment_appointment(person_id, examiner_id, examiner_exam_event_id, skill_oral, skill_textual, skill_understanding, partial_exam_speaking, partial_exam_speech_comprehension, partial_exam_writing, partial_exam_reading_comprehension, @@ -485,25 +513,47 @@ VALUES (2, null, 51400, '78b29334-a283-11ef-88a1-bf672bd574b1', '7676156682', 'https://pay.paytrail.com/pay/78b29334-a283-11ef-88a1-bf672bd574b1', 'OK', null, 3); +-- Insert multiple enrollment appointments for person 2 INSERT INTO enrollment_appointment(person_id, examiner_id, examiner_exam_event_id, skill_oral, skill_textual, skill_understanding, partial_exam_speaking, partial_exam_speech_comprehension, partial_exam_writing, partial_exam_reading_comprehension, status, digital_certificate_consent, email, phone_number, street, postal_code, town, country, first_name, last_name, auth_hash, auth_hash_expires, auth_hash_sent, created_at) -VALUES (2, 1, 1, - false, true, false, - false, false, false, true, +VALUES (2, 1, 3, + true, true, true, + true, true, true, true, 'COMPLETED', false, 'test@test.invalid', '0401234504', null, null, null, null, 'Anneli', 'Annikkinen', - '22223089-83a8-4163-8180-d8b675ff5337', NOW() - INTERVAL '13 days', NOW() - INTERVAL '16 days', + '55523089-83a8-4163-8180-d8b675ff5337', NOW() - INTERVAL '13 days', NOW() - INTERVAL '16 days', NOW() - INTERVAL '17 days'); INSERT INTO payment(version, enrollment_id, amount, transaction_id, reference, payment_url, payment_status, refunded_at, enrollment_appointment_id) VALUES (3, null, 51400, '12345634-a283-11ef-88a1-bf672bd574b1', '9676156682', 'https://pay.paytrail.com/pay/12345634-a283-11ef-88a1-bf672bd574b1', 'OK', - null, 3); + null, 4); + +-- Insert multiple enrollment appointments for person 2 +INSERT INTO enrollment_appointment(person_id, examiner_id, examiner_exam_event_id, + skill_oral, skill_textual, skill_understanding, + partial_exam_speaking, partial_exam_speech_comprehension, partial_exam_writing, partial_exam_reading_comprehension, + status, digital_certificate_consent, email, phone_number, street, postal_code, town, country, first_name, last_name, + auth_hash, auth_hash_expires, auth_hash_sent, created_at) +VALUES (2, 1, 4, + false, true, false, + false, false, false, true, + 'COMPLETED', false, + 'test@test.invalid', '0401234504', null, null, null, null, + 'Anneli', 'Annikkinen', + '44423089-83a8-4163-8180-d8b675ff5337', NOW() - INTERVAL '13 days', NOW() - INTERVAL '16 days', + NOW() - INTERVAL '23 days'); + +INSERT INTO payment(version, enrollment_id, amount, transaction_id, reference, payment_url, + payment_status, refunded_at, enrollment_appointment_id) +VALUES (3, null, 51400, '99995634-a283-11ef-88a1-bf672bd574b1', '0006156682', + 'https://pay.paytrail.com/pay/99945634-a283-11ef-88a1-bf672bd574b1', 'OK', + null, 5); -- Insert enrollment appointment INSERT INTO enrollment_appointment(person_id, examiner_id, examiner_exam_event_id, diff --git a/backend/vkt/src/main/java/fi/oph/vkt/api/examiner/ExaminerEnrollmentController.java b/backend/vkt/src/main/java/fi/oph/vkt/api/examiner/ExaminerEnrollmentController.java index 7120ed4bc..9bac623b0 100644 --- a/backend/vkt/src/main/java/fi/oph/vkt/api/examiner/ExaminerEnrollmentController.java +++ b/backend/vkt/src/main/java/fi/oph/vkt/api/examiner/ExaminerEnrollmentController.java @@ -65,7 +65,7 @@ public void deleteEnrollmentContactRequest( @PostMapping(path = "/contact/{enrollmentContactId:\\d+}/convertToAppointment", consumes = ALL_VALUE) @Operation(tags = TAG_ENROLLMENT, summary = "Convert enrollment contact request to enrollment appointment") public ExaminerEnrollmentAppointmentDTO enrollmentContactRequestToAppointment( - @PathVariable String oid, + @PathVariable final String oid, @PathVariable final long enrollmentContactId ) { return examinerEnrollmentService.convertToAppointment(oid, enrollmentContactId); diff --git a/backend/vkt/src/main/java/fi/oph/vkt/audit/AuditService.java b/backend/vkt/src/main/java/fi/oph/vkt/audit/AuditService.java index d1d01c839..66ccee241 100644 --- a/backend/vkt/src/main/java/fi/oph/vkt/audit/AuditService.java +++ b/backend/vkt/src/main/java/fi/oph/vkt/audit/AuditService.java @@ -31,6 +31,10 @@ public void logById(final VktOperation operation, final long id) { log(operation, new Target.Builder().setField("id", Long.toString(id)).build(), Changes.EMPTY); } + public void logById(final VktOperation operation, final String id) { + log(operation, new Target.Builder().setField("id", id).build(), Changes.EMPTY); + } + public void logUpdate(final VktOperation operation, final long id, final T dtoBefore, final T dtoAfter) { log( operation, diff --git a/backend/vkt/src/main/java/fi/oph/vkt/audit/VktOperation.java b/backend/vkt/src/main/java/fi/oph/vkt/audit/VktOperation.java index acca194a6..e9fc0798e 100644 --- a/backend/vkt/src/main/java/fi/oph/vkt/audit/VktOperation.java +++ b/backend/vkt/src/main/java/fi/oph/vkt/audit/VktOperation.java @@ -13,4 +13,10 @@ public enum VktOperation implements Operation { UPDATE_ENROLLMENT_PAYMENT_LINK, MOVE_ENROLLMENT, REFUND_PAYMENT, + LIST_EXAMINER_DETAILS, + GET_EXAMINER_INITIAL_DETAILS, + VIEW_EXAMINER_CONTACT_REQUEST, + VIEW_EXAMINER_ENROLLMENT, + DELETE_EXAMINER_CONTACT_REQUEST, + VIEW_EXAMINER_ENROLLMENT_HISTORY, } diff --git a/backend/vkt/src/main/java/fi/oph/vkt/model/type/EnrollmentAppointmentStatus.java b/backend/vkt/src/main/java/fi/oph/vkt/model/type/EnrollmentAppointmentStatus.java index 8d8d24d39..507d302b9 100644 --- a/backend/vkt/src/main/java/fi/oph/vkt/model/type/EnrollmentAppointmentStatus.java +++ b/backend/vkt/src/main/java/fi/oph/vkt/model/type/EnrollmentAppointmentStatus.java @@ -7,5 +7,6 @@ public enum EnrollmentAppointmentStatus { EXPECTING_PAYMENT, WAITING_AUTHENTICATION, CANCELED_PAYMENT, + ENROLLMENT_CREATED, CONTACT_CREATED, } diff --git a/backend/vkt/src/main/java/fi/oph/vkt/repository/EnrollmentAppointmentRepository.java b/backend/vkt/src/main/java/fi/oph/vkt/repository/EnrollmentAppointmentRepository.java index c982359d9..d0fb0430f 100644 --- a/backend/vkt/src/main/java/fi/oph/vkt/repository/EnrollmentAppointmentRepository.java +++ b/backend/vkt/src/main/java/fi/oph/vkt/repository/EnrollmentAppointmentRepository.java @@ -6,14 +6,30 @@ import fi.oph.vkt.model.type.EnrollmentAppointmentStatus; import java.util.List; import java.util.Optional; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @Repository public interface EnrollmentAppointmentRepository extends BaseRepository { Optional findByIdAndAuthHashAndDeletedAtIsNull(final long id, final String paymentLinkHash); - List findByExaminerAndStatusAndDeletedAtIsNull( - final Examiner examiner, - final EnrollmentAppointmentStatus status - ); - List findByPersonAndDeletedAtIsNull(final Person person); + + @Query( + "SELECT e" + + " FROM EnrollmentAppointment e" + + " WHERE e.examiner = ?1" + + " AND e.status IN (fi.oph.vkt.model.type.EnrollmentAppointmentStatus.CONTACT_CREATED, fi.oph.vkt.model.type.EnrollmentAppointmentStatus.WAITING_AUTHENTICATION)" + + " AND e.deletedAt IS NULL" + + " ORDER BY e.createdAt DESC" + ) + List findExaminerContactRequests(final Examiner examiner); + + @Query( + "SELECT e" + + " FROM EnrollmentAppointment e" + + " WHERE e.person = ?1" + + " AND e.status IN (fi.oph.vkt.model.type.EnrollmentAppointmentStatus.COMPLETED)" + + " AND e.deletedAt IS NULL" + + " ORDER BY e.createdAt DESC" + ) + List findPersonEnrollmentHistory(final Person person); } diff --git a/backend/vkt/src/main/java/fi/oph/vkt/service/ExaminerDetailsService.java b/backend/vkt/src/main/java/fi/oph/vkt/service/ExaminerDetailsService.java index aac850477..5455705f6 100644 --- a/backend/vkt/src/main/java/fi/oph/vkt/service/ExaminerDetailsService.java +++ b/backend/vkt/src/main/java/fi/oph/vkt/service/ExaminerDetailsService.java @@ -4,6 +4,7 @@ import fi.oph.vkt.api.dto.examiner.ExaminerDetailsInitDTO; import fi.oph.vkt.api.dto.examiner.ExaminerDetailsUpsertDTO; import fi.oph.vkt.audit.AuditService; +import fi.oph.vkt.audit.VktOperation; import fi.oph.vkt.model.EnrollmentAppointment; import fi.oph.vkt.model.Examiner; import fi.oph.vkt.model.type.EnrollmentAppointmentStatus; @@ -41,14 +42,16 @@ private PersonalData getOnrPersonalData(final String oid) { @Transactional(readOnly = true) public ExaminerDetailsInitDTO getInitialExaminerPersonalData(final String oid) { - // TODO Audit log entry if (examinerRepository.findByOid(oid).isPresent()) { throw new APIException(APIExceptionType.EXAMINER_ALREADY_INITIALIZED); } - PersonalData personalData = this.getOnrPersonalData(oid); + final PersonalData personalData = this.getOnrPersonalData(oid); if (personalData == null) { throw new APIException(APIExceptionType.EXAMINER_ONR_NOT_FOUND); } + + auditService.logById(VktOperation.GET_EXAMINER_INITIAL_DETAILS, oid); + return ExaminerDetailsInitDTO .builder() .oid(oid) @@ -60,21 +63,19 @@ public ExaminerDetailsInitDTO getInitialExaminerPersonalData(final String oid) { @Transactional public ExaminerDetailsDTO upsertExaminer(final String oid, ExaminerDetailsUpsertDTO examinerDetailsUpsertDTO) { // TODO Audit log entry - Optional existing = examinerRepository.findByOid(oid); - Examiner examiner; - if (existing.isPresent()) { - examiner = existing.get(); - } else { - examiner = new Examiner(); - examiner.setOid(oid); - PersonalData personalData = this.getOnrPersonalData(oid); - if (personalData == null) { - throw new APIException(APIExceptionType.EXAMINER_ONR_NOT_FOUND); - } - examiner.setLastName(personalData.getLastName()); - examiner.setFirstName(personalData.getFirstName()); - examiner.setNickname(personalData.getNickname()); + final Optional existing = examinerRepository.findByOid(oid); + final Examiner examiner = existing.orElse(new Examiner()); + + examiner.setOid(oid); + + final PersonalData personalData = this.getOnrPersonalData(oid); + if (personalData == null) { + throw new APIException(APIExceptionType.EXAMINER_ONR_NOT_FOUND); } + + examiner.setLastName(personalData.getLastName()); + examiner.setFirstName(personalData.getFirstName()); + examiner.setNickname(personalData.getNickname()); examiner.setEmail(examinerDetailsUpsertDTO.email()); examiner.setPhoneNumber(examinerDetailsUpsertDTO.phoneNumber()); examiner.setMunicipalities( @@ -95,15 +96,16 @@ public ExaminerDetailsDTO upsertExaminer(final String oid, ExaminerDetailsUpsert @Transactional(readOnly = true) public ExaminerDetailsDTO getExaminer(final String oid) { - // TODO Audit log entry final Examiner examiner = examinerRepository.getByOid(oid); if (examiner == null) { throw new APIException(APIExceptionType.EXAMINER_NOT_FOUND); } + + auditService.logById(VktOperation.LIST_EXAMINER_DETAILS, oid); + final String baseUrlAPI = environment.getRequiredProperty("app.base-url.api"); - final List enrollmentAppointments = enrollmentAppointmentRepository.findByExaminerAndStatusAndDeletedAtIsNull( - examiner, - EnrollmentAppointmentStatus.CONTACT_CREATED + final List enrollmentAppointments = enrollmentAppointmentRepository.findExaminerContactRequests( + examiner ); return ExaminerUtil.toExaminerDetailsDTO(examiner, enrollmentAppointments, baseUrlAPI); @@ -114,7 +116,7 @@ public void updateStoredPersonalData() { final List onrIds = examinerRepository.listExistingOnrIds(); final Map oidToPersonalData = onrService.getOnrPersonalData(onrIds); oidToPersonalData.forEach((k, v) -> { - Examiner examiner = examinerRepository.getByOid(k); + final Examiner examiner = examinerRepository.getByOid(k); examiner.setLastName(v.getLastName()); examiner.setFirstName(v.getFirstName()); examiner.setNickname(v.getNickname()); diff --git a/backend/vkt/src/main/java/fi/oph/vkt/service/ExaminerEnrollmentService.java b/backend/vkt/src/main/java/fi/oph/vkt/service/ExaminerEnrollmentService.java index 20bc21bf5..b41b611c0 100644 --- a/backend/vkt/src/main/java/fi/oph/vkt/service/ExaminerEnrollmentService.java +++ b/backend/vkt/src/main/java/fi/oph/vkt/service/ExaminerEnrollmentService.java @@ -1,17 +1,17 @@ package fi.oph.vkt.service; -import fi.oph.vkt.api.dto.EnrollmentGradeDTO; import fi.oph.vkt.api.dto.clerk.ClerkEnrollmentContactRequestDTO; import fi.oph.vkt.api.dto.examiner.ExaminerEnrollmentAppointmentDTO; import fi.oph.vkt.api.dto.examiner.ExaminerEnrollmentAppointmentHistoryDTO; import fi.oph.vkt.api.dto.examiner.ExaminerEnrollmentAppointmentUpdateDTO; import fi.oph.vkt.api.dto.examiner.ExaminerEnrollmentGradesDTO; +import fi.oph.vkt.audit.AuditService; +import fi.oph.vkt.audit.VktOperation; import fi.oph.vkt.model.EnrollmentAppointment; import fi.oph.vkt.model.EnrollmentGrade; import fi.oph.vkt.model.ExaminerExamEvent; import fi.oph.vkt.model.Person; import fi.oph.vkt.model.type.EnrollmentAppointmentStatus; -import fi.oph.vkt.model.type.EnrollmentGradeType; import fi.oph.vkt.repository.EnrollmentAppointmentRepository; import fi.oph.vkt.repository.EnrollmentGradesRepository; import fi.oph.vkt.repository.ExaminerExamEventRepository; @@ -40,6 +40,7 @@ public class ExaminerEnrollmentService extends AbstractEnrollmentService { private final Environment environment; private final UUIDSource uuidSource; private final ExaminerEnrollmentEmailService examinerEnrollmentEmailService; + private final AuditService auditService; private static void checkExaminerOid(EnrollmentAppointment enrollmentAppointment, String oid) { if (!enrollmentAppointment.getExaminer().getOid().equals(oid)) { @@ -53,6 +54,7 @@ public ExaminerEnrollmentAppointmentDTO updateAppointment( final Long id, final ExaminerEnrollmentAppointmentUpdateDTO dto ) { + // TODO Audit log entry if (!Objects.equals(id, dto.id())) { throw new APIException(APIExceptionType.EXAMINER_APPOINTMENT_ID_MISMATCH); } @@ -83,6 +85,8 @@ public ClerkEnrollmentContactRequestDTO getEnrollmentContactRequest( ); checkExaminerOid(enrollmentAppointment, oid); + auditService.logById(VktOperation.VIEW_EXAMINER_CONTACT_REQUEST, enrollmentContactId); + return ClerkEnrollmentUtil.createClerkEnrollmentContactDTO(enrollmentAppointment); } @@ -95,7 +99,7 @@ public ExaminerEnrollmentAppointmentDTO convertToAppointment(final String oid, f final String baseUrlAPI = environment.getRequiredProperty("app.base-url.api"); - enrollmentAppointment.setStatus(EnrollmentAppointmentStatus.WAITING_AUTHENTICATION); + enrollmentAppointment.setStatus(EnrollmentAppointmentStatus.ENROLLMENT_CREATED); if (enrollmentAppointment.getAuthHash() == null) { enrollmentAppointment.setAuthHash(uuidSource.getRandomNonce()); @@ -134,6 +138,8 @@ public ExaminerEnrollmentAppointmentDTO getEnrollmentAppointment( checkExaminerOid(enrollmentAppointment, oid); + auditService.logById(VktOperation.VIEW_EXAMINER_ENROLLMENT, enrollmentAppointmentId); + final String baseUrlAPI = environment.getRequiredProperty("app.base-url.api"); return ClerkEnrollmentUtil.createClerkEnrollmentAppointmentDTO(enrollmentAppointment, baseUrlAPI); @@ -211,6 +217,7 @@ public ExaminerEnrollmentAppointmentDTO sendEnrollmentAppointmentLink( enrollmentAppointment.setExpiresAt(LocalDateTime.now().plusDays(3)); enrollmentAppointment.setSentAt(LocalDateTime.now()); + enrollmentAppointment.setStatus(EnrollmentAppointmentStatus.WAITING_AUTHENTICATION); examinerEnrollmentEmailService.sendEnrollmentAppointmentAuthLink(enrollmentAppointment); @@ -227,6 +234,8 @@ public void deleteEnrollmentContactRequest(final String oid, final long enrollme checkExaminerOid(enrollmentAppointment, oid); + auditService.logById(VktOperation.DELETE_EXAMINER_CONTACT_REQUEST, enrollmentContactId); + enrollmentAppointment.setDeletedAt(LocalDateTime.now()); enrollmentAppointmentRepository.flush(); @@ -261,7 +270,9 @@ public List getEnrollmentAppointmentHis return List.of(); } - final List enrollmentAppointments = enrollmentAppointmentRepository.findByPersonAndDeletedAtIsNull( + auditService.logById(VktOperation.VIEW_EXAMINER_ENROLLMENT_HISTORY, enrollmentAppointmentId); + + final List enrollmentAppointments = enrollmentAppointmentRepository.findPersonEnrollmentHistory( person ); diff --git a/frontend/packages/vkt/src/components/clerkEnrollment/appointment/ClerkEnrollmentAppointmentDetailsFields.tsx b/frontend/packages/vkt/src/components/clerkEnrollment/appointment/ClerkEnrollmentAppointmentDetailsFields.tsx index 3707c09e7..290971708 100644 --- a/frontend/packages/vkt/src/components/clerkEnrollment/appointment/ClerkEnrollmentAppointmentDetailsFields.tsx +++ b/frontend/packages/vkt/src/components/clerkEnrollment/appointment/ClerkEnrollmentAppointmentDetailsFields.tsx @@ -402,7 +402,7 @@ export const ClerkEnrollmentAppointmentDetailsFields = ({ const displayPaymentInformation = [ EnrollmentAppointmentStatus.COMPLETED, - EnrollmentAppointmentStatus.EXPECTING_PAYMENT_UNFINISHED_ENROLLMENT, + EnrollmentAppointmentStatus.AWAITING_PAYMENT, ].includes(enrollment.status) || enrollment.payments.length > 0; const displayPaymentHistory = enrollment.payments.length > 1; diff --git a/frontend/packages/vkt/src/components/clerkEnrollment/appointment/EnrollmentSkillsListTable.tsx b/frontend/packages/vkt/src/components/clerkEnrollment/appointment/EnrollmentSkillsListTable.tsx index 503417c04..41d13c5a9 100644 --- a/frontend/packages/vkt/src/components/clerkEnrollment/appointment/EnrollmentSkillsListTable.tsx +++ b/frontend/packages/vkt/src/components/clerkEnrollment/appointment/EnrollmentSkillsListTable.tsx @@ -2,13 +2,11 @@ import { Fragment } from 'react'; import { H3, Text } from 'shared/components'; import { useClerkTranslation, useCommonTranslation } from 'configs/i18n'; -import { ClerkEnrollmentAppointmentGrades } from 'interfaces/clerkEnrollment'; import { - PartialExams, - PartialExamsAndSkills, -} from 'interfaces/common/enrollment'; - -interface GradedPartialExams extends Omit {} + ClerkEnrollmentAppointmentGrades, + GradedExams, +} from 'interfaces/clerkEnrollment'; +import { PartialExamsAndSkills } from 'interfaces/common/enrollment'; export const EnrollmentSkillsListTable = ({ enrollment, @@ -25,15 +23,15 @@ export const EnrollmentSkillsListTable = ({ const partialTextualExams = [ 'writingPartialExam', 'readingComprehensionPartialExam', - ].filter((exam) => !!enrollment[exam as keyof GradedPartialExams]) as Array< - keyof GradedPartialExams + ].filter((exam) => !!enrollment[exam as keyof GradedExams]) as Array< + keyof GradedExams >; const partialOralExams = [ 'speakingPartialExam', 'speechComprehensionPartialExam', - ].filter((exam) => !!enrollment[exam as keyof GradedPartialExams]) as Array< - keyof GradedPartialExams + ].filter((exam) => !!enrollment[exam as keyof GradedExams]) as Array< + keyof GradedExams >; const renderGrade = (grade: string) => @@ -41,7 +39,7 @@ export const EnrollmentSkillsListTable = ({ const renderComment = (comment: string) => comment && comment !== '' ? comment : '-'; - const partialExamsRow = (exams: Array) => { + const partialExamsRow = (exams: Array) => { return exams.map((exam, idx) => ( {idx > 0 &&
} diff --git a/frontend/packages/vkt/src/components/examinerExamEvent/overview/ExaminerExamEventDetails.tsx b/frontend/packages/vkt/src/components/examinerExamEvent/overview/ExaminerExamEventDetails.tsx index 2161da1a8..a6c40e43e 100644 --- a/frontend/packages/vkt/src/components/examinerExamEvent/overview/ExaminerExamEventDetails.tsx +++ b/frontend/packages/vkt/src/components/examinerExamEvent/overview/ExaminerExamEventDetails.tsx @@ -125,12 +125,6 @@ export const ExaminerExamEventDetails = () => { enrollments={enrollments} status={EnrollmentAppointmentStatus.AWAITING_PAYMENT} /> - { enrollments={enrollments} status={EnrollmentAppointmentStatus.CANCELED} /> - {enrollments.length > 0 && (