Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] Gérer la génération des certificats des sessions V3 (PIX-16444). #11644

Open
wants to merge 4 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import dayjs from 'dayjs';

import { V3CertificationAttestation } from '../domain/models/V3CertificationAttestation.js';
import { usecases } from '../domain/usecases/index.js';
import * as certificationAttestationPdf from '../infrastructure/utils/pdf/certification-attestation-pdf.js';

Expand All @@ -14,6 +15,10 @@ const getPDFAttestation = async function (request, h, dependencies = { certifica
certificationCourseId,
});

if (attestation instanceof V3CertificationAttestation) {
return h.response().code(200);
}

const { buffer, fileName } = await dependencies.certificationAttestationPdf.getCertificationAttestationsPdfBuffer({
certificates: [attestation],
isFrenchDomainExtension,
Expand All @@ -36,6 +41,11 @@ const getCertificationPDFAttestationsForSession = async function (
const attestations = await usecases.getCertificationAttestationsForSession({
sessionId,
});

if (attestations.every((attestation) => attestation instanceof V3CertificationAttestation)) {
return h.response().code(200);
}

const i18n = request.i18n;

const { buffer } = await dependencies.certificationAttestationPdf.getCertificationAttestationsPdfBuffer({
Expand Down Expand Up @@ -65,6 +75,10 @@ const downloadCertificationAttestationsForDivision = async function (
division,
});

if (attestations.every((attestation) => attestation instanceof V3CertificationAttestation)) {
return h.response().code(200);
}

const { buffer } = await dependencies.certificationAttestationPdf.getCertificationAttestationsPdfBuffer({
certificates: attestations,
isFrenchDomainExtension,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const PIX_COUNT_BY_LEVEL = 8;
const COMPETENCE_COUNT = 16;

class V3CertificationAttestation {
constructor({
id,
firstName,
lastName,
birthdate,
birthplace,
certificationCenter,
deliveredAt,
pixScore,
maxReachableLevelOnCertificationDate,
verificationCode,
} = {}) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.birthdate = birthdate;
this.birthplace = birthplace;
this.deliveredAt = deliveredAt;
this.certificationCenter = certificationCenter;
this.pixScore = pixScore;
this.verificationCode = verificationCode;
this.maxReachableScore = maxReachableLevelOnCertificationDate * PIX_COUNT_BY_LEVEL * COMPETENCE_COUNT;
}
}

export { V3CertificationAttestation };
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
import { NotFoundError } from '../../../../shared/domain/errors.js';
import { UnauthorizedError } from '../../../../shared/application/http-errors.js';

const getCertificationAttestation = async function ({ userId, certificationCourseId, certificateRepository }) {
const certificationAttestation = await certificateRepository.getCertificationAttestation({
certificationCourseId,
});
if (certificationAttestation.userId !== userId) {
throw new NotFoundError();
const getCertificationAttestation = async function ({
userId,
certificationCourseId,
certificateRepository,
certificationCourseRepository,
}) {
const certificationCourse = await certificationCourseRepository.get({ id: certificationCourseId });

if (certificationCourse.getUserId() !== userId) {
throw new UnauthorizedError();
}

return certificationAttestation;
return certificateRepository.getCertificationAttestation({
certificationCourseId,
});
};

export { getCertificationAttestation };
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ import {
ResultCompetenceTree,
ShareableCertificate,
} from '../../../../shared/domain/models/index.js';
import { featureToggles } from '../../../../shared/infrastructure/feature-toggles/index.js';
import { SessionVersion } from '../../../shared/domain/models/SessionVersion.js';
import { CertificationAttestation } from '../../domain/models/CertificationAttestation.js';
import { V3CertificationAttestation } from '../../domain/models/V3CertificationAttestation.js';
import { CertifiedBadge } from '../../domain/read-models/CertifiedBadge.js';
import * as competenceTreeRepository from './competence-tree-repository.js';

Expand Down Expand Up @@ -42,12 +45,14 @@ const findByDivisionForScoIsManagingStudentsOrganization = async function ({ org

const mostRecentCertificationsPerOrganizationLearner =
_filterMostRecentCertificationCoursePerOrganizationLearner(certificationCourseDTOs);
return _(mostRecentCertificationsPerOrganizationLearner)
.orderBy(['lastName', 'firstName'], ['asc', 'asc'])
.map((certificationCourseDTO) => {
return _toDomainForCertificationAttestation({ certificationCourseDTO, competenceTree, certifiedBadges: [] });
})
.value();
return Promise.all(
_(mostRecentCertificationsPerOrganizationLearner)
.orderBy(['lastName', 'firstName'], ['asc', 'asc'])
.map((certificationCourseDTO) => {
return _toDomainForCertificationAttestation({ certificationCourseDTO, competenceTree, certifiedBadges: [] });
})
.value(),
);
};

const getCertificationAttestation = async function ({ certificationCourseId }) {
Expand Down Expand Up @@ -250,7 +255,7 @@ function _filterMostRecentCertificationCoursePerOrganizationLearner(DTOs) {
return mostRecent;
}

function _toDomainForCertificationAttestation({ certificationCourseDTO, competenceTree, certifiedBadges }) {
async function _toDomainForCertificationAttestation({ certificationCourseDTO, competenceTree, certifiedBadges }) {
const competenceMarks = _.compact(certificationCourseDTO.competenceMarks).map(
(competenceMark) => new CompetenceMark({ ...competenceMark }),
);
Expand All @@ -262,6 +267,15 @@ function _toDomainForCertificationAttestation({ certificationCourseDTO, competen
assessmentResultId: certificationCourseDTO.assessmentResultId,
});

if (
SessionVersion.isV3(certificationCourseDTO.version) &&
(await featureToggles.get('isV3CertificationAttestationEnabled'))
) {
return new V3CertificationAttestation({
...certificationCourseDTO,
});
}

return new CertificationAttestation({
...certificationCourseDTO,
resultCompetenceTree,
Expand Down
Loading