Skip to content

Commit

Permalink
[FEATURE] Affichage des commentaires auto jury ou commentaires manuel…
Browse files Browse the repository at this point in the history
…s si absents (PIX-10528).

 #8090
  • Loading branch information
pix-service-auto-merge authored Feb 20, 2024
2 parents 8367b08 + 7a30cb3 commit 177b88b
Show file tree
Hide file tree
Showing 41 changed files with 984 additions and 236 deletions.
2 changes: 1 addition & 1 deletion api/db/database-builder/factory/build-assessment-result.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ function buildAssessmentResult({
level = null,
status = AssessmentResult.status.VALIDATED,
emitter = 'PIX-ALGO',
commentByAutoJury = 'Some comment by auto jury',
commentByAutoJury,
commentByJury,
commentForCandidate = 'Some comment for candidate',
commentForOrganization = 'Some comment for organization',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ const getCertificationDetails = async function (request, h, dependencies = { cer

const getJuryCertification = async function (request, h, dependencies = { juryCertificationSerializer }) {
const certificationCourseId = request.params.id;
const translate = request.i18n.__;
const juryCertification = await usecases.getJuryCertification({ certificationCourseId });
return dependencies.juryCertificationSerializer.serialize(juryCertification);

return dependencies.juryCertificationSerializer.serialize(juryCertification, { translate });
};

const update = async function (request, h, dependencies = { certificationSerializer }) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,24 @@ import * as requestResponseUtils from '../../infrastructure/utils/request-respon

const findUserCertifications = async function (request) {
const userId = request.auth.credentials.userId;
const translate = request.i18n.__;

const privateCertificates = await usecases.findUserPrivateCertificates({ userId });
return privateCertificateSerializer.serialize(privateCertificates);
return privateCertificateSerializer.serialize(privateCertificates, { translate });
};

const getCertification = async function (request, h, dependencies = { requestResponseUtils }) {
const userId = request.auth.credentials.userId;
const certificationId = request.params.id;
const translate = request.i18n.__;
const locale = dependencies.requestResponseUtils.extractLocaleFromRequest(request);

const privateCertificate = await usecases.getPrivateCertificate({
userId,
certificationId,
locale,
});
return privateCertificateSerializer.serialize(privateCertificate);
return privateCertificateSerializer.serialize(privateCertificate, { translate });
};

const getCertificationByVerificationCode = async function (request, h, dependencies = { requestResponseUtils }) {
Expand Down
33 changes: 32 additions & 1 deletion api/lib/domain/models/CertificationResult.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import _ from 'lodash';
import { CompetenceMark } from './CompetenceMark.js';
import { ComplementaryCertificationCourseResult } from './ComplementaryCertificationCourseResult.js';
import { JuryComment, JuryCommentContexts } from '../../../src/certification/shared/domain/models/JuryComment.js';

/**
* @readonly
* @enum {string}
*/
const status = {
REJECTED: 'rejected',
VALIDATED: 'validated',
Expand All @@ -10,6 +15,10 @@ const status = {
STARTED: 'started',
};

/**
* @readonly
* @enum {string}
*/
const emitters = {
PIX_ALGO: 'PIX-ALGO',
PIX_ALGO_AUTO_JURY: 'PIX-ALGO-AUTO-JURY',
Expand All @@ -18,6 +27,22 @@ const emitters = {
};

class CertificationResult {
/**
* @param {Object} props
* @param {number} props.id
* @param {string} props.firstName
* @param {string} props.lastName
* @param {string} props.birthplace
* @param {number} props.externalId
* @param {Date} props.createdAt
* @param {number} props.sessionId
* @param {status} props.status
* @param {number} props.pixScore
* @param {string} props.emitter
* @param {JuryComment} props.commentForOrganization
* @param {Array<CompetenceMark>} props.competencesWithMark
* @param {Array<ComplementaryCertificationCourseResult>} props.complementaryCertificationCourseResults
*/
constructor({
id,
firstName,
Expand Down Expand Up @@ -73,6 +98,12 @@ class CertificationResult {
(complementaryCertifCourseResult) => new ComplementaryCertificationCourseResult(complementaryCertifCourseResult),
);

const commentForOrganization = new JuryComment({
fallbackComment: certificationResultDTO.commentForOrganization,
context: JuryCommentContexts.ORGANIZATION,
commentByAutoJury: certificationResultDTO.commentByAutoJury,
});

return new CertificationResult({
id: certificationResultDTO.id,
firstName: certificationResultDTO.firstName,
Expand All @@ -85,7 +116,7 @@ class CertificationResult {
status: certificationStatus,
pixScore: certificationResultDTO.pixScore,
emitter: certificationResultDTO.emitter,
commentForOrganization: certificationResultDTO.commentForOrganization,
commentForOrganization,
competencesWithMark,
complementaryCertificationCourseResults,
});
Expand Down
50 changes: 48 additions & 2 deletions api/lib/domain/models/JuryCertification.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,36 @@
import { CompetenceMark } from './CompetenceMark.js';
import { JuryComment, JuryCommentContexts } from '../../../src/certification/shared/domain/models/JuryComment.js';

class JuryCertification {
/**
* @param {Object} props
* @param {number} props.certificationCourseId
* @param {number} props.sessionId
* @param {number} props.userId
* @param {number} props.assessmentId
* @param {string} props.firstName
* @param {string} props.lastName
* @param {string} props.birthplace
* @param {string} props.birthINSEECode
* @param {string} props.birthCountry
* @param {string} props.birthPostalCode
* @param {Date} props.createdAt
* @param {Date} props.completedAt
* @param {string} props.status
* @param {boolean} props.isCancelled
* @param {boolean} props.isPublished
* @param {boolean} props.isRejectedForFraud
* @param {number} props.juryId
* @param {number} props.pixScore
* @param {Array<CompetenceMark>} props.competenceMarks
* @param {JuryComment} props.commentForCandidate
* @param {JuryComment} props.commentForOrganization
* @param {string} props.commentByJury
* @param {Array<string>} props.certificationIssueReports
* @param {Object} props.complementaryCertificationCourseResultWithExternal
* @param {Object} props.commonComplementaryCertificationCourseResult
* @param {string} props.version
*/
constructor({
certificationCourseId,
sessionId,
Expand Down Expand Up @@ -75,6 +105,22 @@ class JuryCertification {
}),
);

const {
commentByAutoJury,
commentForCandidate: manualCommentForCandidate,
commentForOrganization: manualCommentForOrganization,
} = juryCertificationDTO;
const commentForCandidate = new JuryComment({
commentByAutoJury,
fallbackComment: manualCommentForCandidate,
context: JuryCommentContexts.CANDIDATE,
});
const commentForOrganization = new JuryComment({
commentByAutoJury,
fallbackComment: manualCommentForOrganization,
context: JuryCommentContexts.ORGANIZATION,
});

return new JuryCertification({
certificationCourseId: juryCertificationDTO.certificationCourseId,
sessionId: juryCertificationDTO.sessionId,
Expand All @@ -97,8 +143,8 @@ class JuryCertification {
juryId: juryCertificationDTO.juryId,
pixScore: juryCertificationDTO.pixScore,
competenceMarks,
commentForCandidate: juryCertificationDTO.commentForCandidate,
commentForOrganization: juryCertificationDTO.commentForOrganization,
commentForCandidate,
commentForOrganization,
commentByJury: juryCertificationDTO.commentByJury,
certificationIssueReports,
complementaryCertificationCourseResultWithExternal,
Expand Down
36 changes: 33 additions & 3 deletions api/lib/domain/models/PrivateCertificate.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,38 @@
import { status as assessmentResultStatuses } from '../../../src/shared/domain/models/AssessmentResult.js';
import { JuryComment, JuryCommentContexts } from '../../../src/certification/shared/domain/models/JuryComment.js';

const status = {
/**
* @readonly
* @enum {string}
*/
const status = Object.freeze({
REJECTED: 'rejected',
VALIDATED: 'validated',
ERROR: 'error',
CANCELLED: 'cancelled',
STARTED: 'started',
};
});

class PrivateCertificate {
/**
* @param {Object} props
* @param {number} props.id
* @param {string} props.firstName
* @param {string} props.lastName
* @param {string} props.birthplace
* @param {boolean} props.isPublished
* @param {number} props.userId
* @param {Date} props.date
* @param {Date} props.deliveredAt
* @param {string} props.certificationCenter
* @param {number} props.pixScore
* @param {status} props.status
* @param {JuryComment} props.commentForCandidate
* @param {Array<string>} props.certifiedBadgeImages
* @param {Object} props.resultCompetenceTree
* @param {string} props.verificationCode
* @param {Date} props.maxReachableLevelOnCertificationDate
*/
constructor({
id,
firstName,
Expand Down Expand Up @@ -60,6 +84,7 @@ class PrivateCertificate {
certificationCenter,
pixScore,
commentForCandidate,
commentByAutoJury,
certifiedBadgeImages,
resultCompetenceTree = null,
verificationCode,
Expand All @@ -68,6 +93,11 @@ class PrivateCertificate {
isCancelled,
}) {
const status = _computeStatus(assessmentResultStatus, isCancelled);
const juryComment = new JuryComment({
commentByAutoJury,
fallbackComment: commentForCandidate,
context: JuryCommentContexts.CANDIDATE,
});
return new PrivateCertificate({
id,
firstName,
Expand All @@ -80,7 +110,7 @@ class PrivateCertificate {
deliveredAt,
certificationCenter,
pixScore,
commentForCandidate,
commentForCandidate: juryComment,
certifiedBadgeImages,
resultCompetenceTree,
verificationCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ function _selectPrivateCertificates() {
maxReachableLevelOnCertificationDate: 'certification-courses.maxReachableLevelOnCertificationDate',
pixScore: 'assessment-results.pixScore',
commentForCandidate: 'assessment-results.commentForCandidate',
commentByAutoJury: 'assessment-results.commentByAutoJury',
assessmentResultStatus: 'assessment-results.status',
assessmentResultId: 'assessment-results.id',
competenceMarks: knex.raw(`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ function _selectCertificationResults() {
sessionId: 'certification-courses.sessionId',
pixScore: 'assessment-results.pixScore',
assessmentResultStatus: 'assessment-results.status',
commentByAutoJury: 'assessment-results.commentByAutoJury',
commentForOrganization: 'assessment-results.commentForOrganization',
emitter: 'assessment-results.emitter',
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ function _selectJuryCertifications() {
commentForCandidate: 'assessment-results.commentForCandidate',
commentForOrganization: 'assessment-results.commentForOrganization',
commentByJury: 'assessment-results.commentByJury',
commentByAutoJury: 'assessment-results.commentByAutoJury',
})
.from('certification-courses')
.join('assessments', 'assessments.certificationCourseId', 'certification-courses.id')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ import jsonapiSerializer from 'jsonapi-serializer';

const { Serializer } = jsonapiSerializer;

const serialize = function (juryCertification) {
const serialize = function (juryCertification, { translate }) {
return new Serializer('certifications', {
transform(juryCertification) {
return {
id: juryCertification.certificationCourseId,
...juryCertification,
competencesWithMark: juryCertification.competenceMarks,
commentForOrganization: juryCertification.commentForOrganization.getComment(translate),
commentForCandidate: juryCertification.commentForCandidate.getComment(translate),
};
},
attributes: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,14 @@ const attributes = [
'maxReachableLevelOnCertificationDate',
];

const serialize = function (certificate) {
const serialize = function (certificate, { translate }) {
return new Serializer('certifications', {
transform(privateCertificate) {
return {
...privateCertificate,
commentForCandidate: privateCertificate.commentForCandidate.getComment(translate),
};
},
typeForAttribute,
attributes,
resultCompetenceTree,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class CertificationResultsCsvValues {
return this.getTranslation(CertificationResultsCsvValues.VALUES.REJECTED_AUTOMATICALLY_COMMENT);
}

return certificationResult.commentForOrganization;
return certificationResult.commentForOrganization.getComment(this.translate);
}

getComplementaryCertificationStatus({ certificationResult, sessionComplementaryCertificationsLabel }) {
Expand Down
9 changes: 2 additions & 7 deletions api/src/certification/session/domain/models/Center.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { assertEnumValue } from '../../../../shared/domain/models/asserts.js';
import { CenterTypes } from './CenterTypes.js';

export class Center {
Expand All @@ -8,7 +9,7 @@ export class Center {
* @param {Array<number>} props.habilitations List of complementary certification id
*/
constructor({ id, type, habilitations = [] } = {}) {
Center.#assertType(type);
assertEnumValue(CenterTypes, type);

this.id = id;
this.type = type;
Expand All @@ -18,10 +19,4 @@ export class Center {
get hasBillingMode() {
return this.type !== CenterTypes.SCO;
}

static #assertType(type) {
if (!CenterTypes.contains(type)) {
throw new TypeError('Illegal argument provided');
}
}
}
10 changes: 1 addition & 9 deletions api/src/certification/session/domain/models/CenterTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,8 @@
* @readonly
* @enum {string}
*/
const CENTER_TYPES = {
export const CenterTypes = Object.freeze({
SUP: 'SUP',
SCO: 'SCO',
PRO: 'PRO',
};

export const CenterTypes = Object.freeze({
...CENTER_TYPES,

contains: (value) => {
return Object.keys(CENTER_TYPES).some((key) => CENTER_TYPES[key] === value);
},
});
Loading

0 comments on commit 177b88b

Please sign in to comment.