diff --git a/src/modules/certificate/repositories/certificate.repository.js b/src/modules/certificate/repositories/certificate.repository.js index e3c3c37..8834309 100644 --- a/src/modules/certificate/repositories/certificate.repository.js +++ b/src/modules/certificate/repositories/certificate.repository.js @@ -107,6 +107,24 @@ class CertificateRepository { }); } + async maxSequenceByProject(id_project) { + const certificates = await prisma.certificate.findMany({ + // Menyebabkan collision certificate pada setiap projek, jadinya generate sertifikat sementara bersifat global [Kemas] + // where: { id_project: parseInt(id_project) }, + select: { certificate_no: true }, + }); + + if (certificates.length === 0) return 0; + + const sequences = certificates.map((c) => { + const parts = c.certificate_no.split('/'); + const last = parseInt(parts[parts.length - 1]); + return isNaN(last) ? 0 : last; + }); + + return Math.max(...sequences); + } + async updateProjectTemplate(id_project, templatePath) { return prisma.project.update({ where: { id: parseInt(id_project) }, diff --git a/src/modules/certificate/services/certificate.service.js b/src/modules/certificate/services/certificate.service.js index 0d3d69a..b384990 100644 --- a/src/modules/certificate/services/certificate.service.js +++ b/src/modules/certificate/services/certificate.service.js @@ -57,15 +57,16 @@ class CertificateService { ); } - // Generate certificate number berdsarkan format ini: CERT/YYYYMMDD/{count} [Rafi 12/07/2026 14:32] + // Generate certificate number berdsarkan format ini: No.{year}/SPI3/CERT/{dateString}/{count} [Rafi 12/07/2026 14:32] const now = new Date(); - const year = String(now.getFullYear()).slice(-2); + const fullYear = now.getFullYear(); + const year = String(fullYear).slice(-2); const day = String(now.getDate()).padStart(2, '0'); const month = String(now.getMonth() + 1).padStart(2, '0'); const dateString = `${year}${day}${month}`; - const count = await certificateRepository.countByProject(id_project); - const certificateNo = `CERT/${dateString}/${count + 1}`; + const count = await certificateRepository.maxSequenceByProject(id_project); + const certificateNo = `No.${fullYear}/SPI3/CERT/${dateString}/${count + 1}`; const certificateData = { id_project: parseInt(id_project), @@ -151,16 +152,17 @@ class CertificateService { const generatedCertificates = []; const now = new Date(); - const year = String(now.getFullYear()).slice(-2); + const fullYear = now.getFullYear(); + const year = String(fullYear).slice(-2); const day = String(now.getDate()).padStart(2, '0'); const month = String(now.getMonth() + 1).padStart(2, '0'); const dateString = `${year}${day}${month}`; - let currentCount = await certificateRepository.countByProject(id_project); + let currentCount = await certificateRepository.maxSequenceByProject(id_project); for (const userId of validatedUsers) { currentCount++; - const certificateNo = `CERT/${dateString}/${currentCount}`; + const certificateNo = `No.${fullYear}/SPI3/CERT/${dateString}/${currentCount}`; const certificateData = { id_project: parseInt(id_project), id_user: parseInt(userId),