diff --git a/schemas/casteCertificate.json b/schemas/casteCertificate.json new file mode 100644 index 0000000..f4331ff --- /dev/null +++ b/schemas/casteCertificate.json @@ -0,0 +1,186 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "properties": { + "casteCertificate": { + "$ref": "#/definitions/casteCertificate" + } + }, + "required": ["casteCertificate"], + "title": "Caste Certificate", + "definitions": { + "casteCertificate": { + "$id": "#/properties/casteCertificate", + "type": "object", + "title": "Caste Certificate Schema", + "required": [ + "aadharNumber", + "studentId", + "firstName", + "lastName", + "castName", + "castCategoryNumber", + "dateOfIssuance", + "certificateNumber" + ], + "uniqueIndexFields": ["studentId"], + "properties": { + "aadharNumber": { + "type": "string", + "title": "Aadhar Number" + }, + "familyLeaderBhamashahNumber": { + "type": "string", + "title": "Family Leader Bhamashah Number" + }, + "relationWithApplicant": { + "type": "string", + "title": "Relation with Applicant" + }, + "studentId": { + "type": "string", + "title": "Student Identifier" + }, + "schoolId": { + "type": "string", + "title": "School Identifier" + }, + "firstName": { + "type": "string", + "title": "First Name" + }, + "middleName": { + "type": "string", + "title": "Middle Name" + }, + "lastName": { + "type": "string", + "title": "Last Name" + }, + "castName": { + "type": "string", + "title": "Caste Name" + }, + "castCategoryNumber": { + "type": "string", + "title": "Caste Category Number" + }, + "addressLine1": { + "type": "string", + "title": "Address Line 1" + }, + "addressLine2": { + "type": "string", + "title": "Address Line 2" + }, + "house": { + "type": "string", + "title": "House" + }, + "landmark": { + "type": "string", + "title": "Landmark" + }, + "locality": { + "type": "string", + "title": "Locality" + }, + "vtc": { + "type": "string", + "title": "Village/Town/City" + }, + "district": { + "type": "string", + "title": "District" + }, + "pin": { + "type": "string", + "title": "PIN Code" + }, + "state": { + "type": "string", + "title": "State" + }, + "country": { + "type": "string", + "title": "Country" + }, + "orgName": { + "type": "string", + "title": "Organization Name" + }, + "orgCode": { + "type": "string", + "title": "Organization Code" + }, + "orgType": { + "type": "string", + "title": "Organization Type" + }, + "orgOfficerName": { + "type": "string", + "title": "Officer Name" + }, + "orgOfficerRank": { + "type": "string", + "title": "Officer Rank" + }, + "orgOfficerSign": { + "type": "string", + "title": "Officer Signature" + }, + "orgAddressLine1": { + "type": "string", + "title": "Organization Address Line 1" + }, + "orgAddressLine2": { + "type": "string", + "title": "Organization Address Line 2" + }, + "orgLandmark": { + "type": "string", + "title": "Organization Landmark" + }, + "orgLocality": { + "type": "string", + "title": "Organization Locality" + }, + "orgVtc": { + "type": "string", + "title": "Organization Village/Town/City" + }, + "orgDistrict": { + "type": "string", + "title": "Organization District" + }, + "orgPin": { + "type": "string", + "title": "Organization PIN Code" + }, + "orgState": { + "type": "string", + "title": "Organization State" + }, + "orgCountry": { + "type": "string", + "title": "Organization Country" + }, + "dateOfIssuance": { + "type": "string", + "title": "Date of Issuance" + }, + "certificateId": { + "type": "string", + "title": "Certificate Id" + }, + "certificateNo": { + "type": "string", + "title": "Certificate No" + } + } + } + }, + "_osConfig": { + "inviteRoles": ["anonymous"] + } +} diff --git a/schemas/enrollmentCertificate.json b/schemas/enrollmentCertificate.json new file mode 100644 index 0000000..1db53be --- /dev/null +++ b/schemas/enrollmentCertificate.json @@ -0,0 +1,132 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "properties": { + "enrollmentCertificate": { + "$ref": "#/definitions/enrollmentCertificate" + } + }, + "required": ["enrollmentCertificate"], + "title": "Enrollment Certificate", + "definitions": { + "enrollmentCertificate": { + "$id": "#/properties/enrollmentCertificate", + "type": "object", + "title": "Enrollment Certificate Schema", + "required": [ + "studentId", + "schoolId", + "firstName", + "lastName", + "gradeLevel", + "schoolYear", + "studentStatus", + "schoolName", + "dayMonthYear" + ], + "uniqueIndexFields": ["studentId"], + "properties": { + "studentId": { + "type": "string", + "title": "Student Identifier" + }, + "schoolId": { + "type": "string", + "title": "School Identifier" + }, + "firstName": { + "type": "string", + "title": "First Name" + }, + "middleName": { + "type": "string", + "title": "Middle Name" + }, + "lastName": { + "type": "string", + "title": "Last Name" + }, + "gradeLevel": { + "type": "string", + "title": "Grade Level" + }, + "addressLine1": { + "type": "string", + "title": "Address Line 1" + }, + "addressLine2": { + "type": "string", + "title": "Address Line 2" + }, + "landmark": { + "type": "string", + "title": "Landmark" + }, + "locality": { + "type": "string", + "title": "Locality" + }, + "district": { + "type": "string", + "title": "District" + }, + "pin": { + "type": "string", + "title": "PIN Code" + }, + "state": { + "type": "string", + "title": "State" + }, + "country": { + "type": "string", + "title": "Country" + }, + "schoolYear": { + "type": "string", + "title": "School Year" + }, + "studentStatus": { + "type": "string", + "title": "Student Status" + }, + "schoolName": { + "type": "string", + "title": "School Name" + }, + "schoolRegistrationNumber": { + "type": "string", + "title": "School Registration Number" + }, + "principalName": { + "type": "string", + "title": "Principal Name" + }, + "principalDesignation": { + "type": "string", + "title": "Principal Designation" + }, + "dayMonthYear": { + "type": "string", + "format": "date", + "title": "Day/Month/Year of Issuance" + }, + "learnerReferenceNumber": { + "type": "string", + "title": "Learner Reference Number" + }, + "certificateId": { + "type": "string", + "title": "Certificate Id" + }, + "certificateNo": { + "type": "string", + "title": "Certificate No" + } + } + } + }, + "_osConfig": { + "inviteRoles": ["anonymous"] + } +} diff --git a/schemas/marksheet.json b/schemas/marksheet.json new file mode 100644 index 0000000..b7957d6 --- /dev/null +++ b/schemas/marksheet.json @@ -0,0 +1,113 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "properties": { + "marksheet": { + "$ref": "#/definitions/marksheet" + } + }, + "required": ["marksheet"], + "title": "marksheet", + "definitions": { + "marksheet": { + "$id": "#/properties/marksheet", + "type": "object", + "title": "marksheetSchema", + "required": [ + "studentId", + "firstName", + "schoolId", + "schoolName", + "examDate", + "academicYear", + "issuerName" + ], + "uniqueIndexFields": ["studentId"], + "properties": { + "studentId": { + "type": "string", + "title": "Student Identifier" + }, + "firstName": { + "type": "string", + "title": "First Name" + }, + "middleName": { + "type": "string", + "title": "Middle Name" + }, + "lastName": { + "type": "string", + "title": "Last Name" + }, + "schoolId": { + "type": "string", + "title": "School Identifier" + }, + "schoolName": { + "type": "string", + "title": "School Name" + }, + "class": { + "type": "string", + "title": "class" + }, + "examDate": { + "type": "string", + "title": "Date of Exam" + }, + "cgpa": { + "type": "string", + "title": "Cumulative Grade Point Average" + }, + "cgpaMax": { + "type": "string", + "title": "Maximum Cumulative Grade Point Average" + }, + "grade": { + "type": "string", + "title": "Grade obtained" + }, + "marksMax": { + "type": "string", + "title": "Maximum Marks" + }, + "marksTotal": { + "type": "string", + "title": "Total Marks" + }, + "percentage": { + "type": "string", + "title": "Percentage of Marks" + }, + "result": { + "type": "string", + "title": "Result of Examination" + }, + "academicYear": { + "type": "string", + "title": "Academic Year" + }, + "issuerName": { + "type": "string", + "title": "Name of Issuer" + }, + "issuanceDate": { + "type": "string", + "title": "Issuance Date" + }, + "certificateId": { + "type": "string", + "title": "Certificate Id" + }, + "certificateNo": { + "type": "string", + "title": "Certificate No" + } + } + } + }, + "_osConfig": { + "inviteRoles": ["anonymous"] + } +} diff --git a/src/Helper/CredsConfig.ts b/src/Helper/CredsConfig.ts index 9048695..2d02d72 100644 --- a/src/Helper/CredsConfig.ts +++ b/src/Helper/CredsConfig.ts @@ -1,36 +1,38 @@ export const CredsConfig = { - TenMarksheet: { - schemaName: 'TenMarksheet', - credRCSchemaMapping: { - studentId: 'studentId', - firstName: 'firstName', - lastName: 'lastName', - subjects: 'Subjects', - performance: 'Performance', - }, - credIssuerId: 'did:rcw:bca03eb8-fc0a-4700-8893-708ef74a87e1', - credsSchemaId: 'did:schema:3d0c6923-e5a8-470d-93e8-2c85e367da7a', - transformer: 'marksheetTransformer', + marksheet: { + schemaName: 'marksheet', + credIssuerId: 'did:rcw:61504044-94f3-440e-af7f-3a4a76cfe3b1', + credsSchemaId: 'did:schema:1d6245fc-bbc3-47fb-929f-70d6143b162f', + transformer: 'marksheet', context: - 'https://raw.githubusercontent.com/PSMRI/beneficiary-backend/refs/heads/main/schemas/credentials/TekdiIssued10thCredential.json#TekdiIssued10thCredential', - type: ['VerifiableCredential', 'TekdiIssued10thCredential'], + 'https://raw.githubusercontent.com/PSMRI/beneficiary-backend/refs/heads/main/schemas/credentials/TekdiIssuedMarksheetCredential.json#TekdiIssuedMarksheetCredential', + type: ['VerifiableCredential', 'TekdiIssuedMarksheetCredential'], expirationDate: '2025-02-08T11:56:27.259Z', - credentialSubjectType: 'TekdiIssued10thCredential', - tags: ['education', 'student', 'examResults'], + credentialSubjectType: 'TekdiIssuedMarksheetCredential', + tags: ['dev', 'marksheet-certificate-credential'], }, - EnrollmentCertificate: { - credRCSchemaMapping: { - enrollmentId: 'enrollmentId', - studentId: 'studentId', - firstName: 'firstName', - lastName: 'lastName', - degreeProgram: 'degreeProgram', - enrollmentDate: 'enrollmentDate', - // Add more mappings as necessary... - }, - credIssuerId: 'enrollmentCertificateIssuerId', - credsSchemaId: 'enrollmentCertificateSchemaId', - transformer: 'enrollmentCertificateTransformer', + casteCertificate: { + schemaName: 'casteCertificate', + credIssuerId: 'did:rcw:0da75f8e-e044-4f57-9cbe-dff530684da9', + credsSchemaId: 'did:schema:903fb857-8562-4e7a-89b7-1e611120f88d', + transformer: 'casteCertificate', + context: + 'https://raw.githubusercontent.com/PSMRI/beneficiary-backend/refs/heads/main/schemas/credentials/CasteCertificate.json#CasteCertificate', + type: ['VerifiableCredential', 'CasteCertificate'], + expirationDate: '2025-02-08T11:56:27.259Z', + credentialSubjectType: 'CasteCertificate', + tags: ['dev', 'Caste-certificate-credential'], + }, + enrollmentCertificate: { + schemaName: 'enrollmentCertificate', + credIssuerId: 'did:rcw:3d922d7c-3c31-4059-90e7-d88574e2bd5a', + credsSchemaId: 'did:schema:1b1464da-ef5a-49d9-b91d-c1954d249a2e', + transformer: 'enrollmentCertificate', + context: + 'https://raw.githubusercontent.com/PSMRI/beneficiary-backend/refs/heads/main/schemas/credentials/EnrollmentCertificate.json#EnrollmentCertificate', + type: ['VerifiableCredential', 'EnrollmentCertificate'], + expirationDate: '2025-02-08T11:56:27.259Z', + credentialSubjectType: 'EnrollmentCertificate', + tags: ['dev', 'enrollment-certificate-credential'], }, - // Add more document types as necessary... }; diff --git a/src/Helper/transformers.ts b/src/Helper/transformers.ts index 662499c..9e2fbfb 100644 --- a/src/Helper/transformers.ts +++ b/src/Helper/transformers.ts @@ -1,4 +1,4 @@ -export const marksheetTransformer = (data) => { +export const tenMarksheetTransformer = (data) => { return data.map((record) => { const subjects = record.Subjects.split('|'); const marksMaxPractical = record.marksMaxPractical.split('|'); @@ -38,22 +38,133 @@ export const marksheetTransformer = (data) => { Subjects: subjectsArray, academicYear: record.academicYear, issuerName: record.issuerName, + certificateNo: + record.academicYear.split('-')[1].trim(' ') + + '/' + + record.schoolId.replace(/\s+/g, '').trim(' ') + + '/' + + record.studentId.trim(' '), status: 'pending', }; }); }; +// Marksheet Certificate transformation logic +export const marksheet = (data) => { + return data?.map((record) => { + return { + studentId: record.studentUniqueId, + firstName: record.firstName, + middleName: record.middleName, + lastName: record.lastName, + schoolId: record.schoolId, + schoolName: record.schoolName, + class: record.class, + examDate: record.examDate, + cgpa: record.cgpa, + cgpaMax: record.cgpaMax, + grade: record.grade, + marksMax: record.marksMax, + marksTotal: record.marksTotal, + percentage: record.percentage, + result: record.result, + academicYear: record.academicYear, + issuerName: record.issuerName, + issuanceDate: record.issuanceDate, + certificateNo: + record.academicYear.split('-')[1]?.trim(' ') + + '/' + + record.class.replace(/\s+/g, '')?.trim(' ') + + '/' + + record.studentUniqueId?.trim(' '), + status: 'pending', + }; + }); +}; // Enrollment Certificate transformation logic -export const enrollmentCertificateTransformer = (data) => { +export const enrollmentCertificate = (data) => { return data.map((record) => { return { - enrollmentId: record.enrollmentId, - studentId: record.studentId, + studentId: record.studentUniqueId, + schoolId: record.schoolId, firstName: record.firstName, + middleName: record.middleName, lastName: record.lastName, + gradeLevel: record.gradeLevel, + addressLine1: record.addressLine1, + addressLine2: record.addressLine2, + landmark: record.landmark, + locality: record.locality, + district: record.district, + pin: record.pin, + state: record.state, + country: record.country, + schoolYear: record.schoolYear, + studentStatus: record.studentStatus, schoolName: record.schoolName, - enrollmentDate: record.enrollmentDate, - degreeProgram: record.degreeProgram, + schoolRegistrationNumber: record.schoolRegistrationNumber, + principalName: record.principalName, + principalDesignation: record.principalDesignation, + dayMonthYear: record.dayMonthYear, + learnerReferenceNumber: record.learnerReferenceNumber, + certificateNo: + record.schoolId.split('-')[1]?.trim(' ') + + '/' + + record.pin.replace(/\s+/g, '')?.trim(' ') + + '/' + + record.studentUniqueId?.trim(' '), + status: 'pending', + }; + }); +}; + +export const casteCertificate = (data) => { + return data.map((record) => { + return { + aadharNumber: record.aadharNumber || 'NA', + familyLeaderBhamashahNumber: record.familyLeaderBhamashahNumber, + relationWithApplicant: record.relationWithApplicant, + studentId: record.studentUniqueId, + schoolId: record.schoolId, + firstName: record.firstName, + middleName: record.middleName, + lastName: record.lastName, + castName: record.castName, + castCategoryNumber: record.castCategoryNumber, + addressLine1: record.addressLine1, + addressLine2: record.addressLine2, + house: record.house, + landmark: record.landmark, + locality: record.locality, + vtc: record.vtc, + district: record.district, + pin: record.pin, + state: record.state, + country: record.country, + orgName: record.orgName, + orgCode: record.orgCode, + orgType: record.orgType, + orgOfficerName: record.orgOfficerName, + orgOfficerRank: record.orgOfficerRank, + orgOfficerSign: record.orgOfficerSign, + orgAddressLine1: record.orgAddressLine1, + orgAddressLine2: record.orgAddressLine2, + orgLandmark: record.orgLandmark, + orgLocality: record.orgLocality, + orgVtc: record.orgVtc, + orgDistrict: record.orgDistrict, + orgPin: record.orgPin, + orgState: record.orgState, + orgCountry: record.orgCountry, + dateOfIssuance: record.dateOfIssuance, + certificateNumber: record.certificateNo, + certificateNo: + record.certificateNo || + record.schoolId.split('-')[1]?.trim(' ') + + '/' + + record.pin.replace(/\s+/g, '')?.trim(' ') + + '/' + + record.studentUniqueId?.trim(' '), status: 'pending', }; }); diff --git a/src/inspector/inspector.controller.ts b/src/inspector/inspector.controller.ts index abf1195..1d8f222 100644 --- a/src/inspector/inspector.controller.ts +++ b/src/inspector/inspector.controller.ts @@ -17,6 +17,7 @@ import { Response } from 'express'; import { CredentialsService } from 'src/services/credentials/credentials.service'; import * as path from 'path'; import { createReadStream } from 'fs'; +import { CredsConfig } from '../Helper/CredsConfig'; @Controller('inspector') export class InspectorController { diff --git a/src/inspector/inspector.service.ts b/src/inspector/inspector.service.ts index 9ba106d..c3ece19 100644 --- a/src/inspector/inspector.service.ts +++ b/src/inspector/inspector.service.ts @@ -15,7 +15,7 @@ export class InspectorService { private cerTemplatePath: string = path.join( process.cwd(), 'template', - 'mh.html', + 'marksheet.html', ); private resTemplatePath: string = path.join( process.cwd(), @@ -101,6 +101,7 @@ export class InspectorService { credData.credential.id, studentDetail.osid, authToken, + studentDetail, ); console.log('resultData', resultData); @@ -168,6 +169,7 @@ export class InspectorService { credData.credential.id, studentDetail.osid, authToken, + studentDetail, ); console.log('resultData', resultData); @@ -196,6 +198,7 @@ export class InspectorService { credData.credential.id, studentDetail.osid, authToken, + studentDetail, ); console.log('resultData', resultData); diff --git a/src/services/credentials/credentials.service.ts b/src/services/credentials/credentials.service.ts index 4df3f90..b690f49 100644 --- a/src/services/credentials/credentials.service.ts +++ b/src/services/credentials/credentials.service.ts @@ -155,13 +155,14 @@ export class CredentialsService { } async issueCredential2(studentDetails): Promise { - console.log('studentDetails', studentDetails.DocumentType); + console.log('studentDetails', studentDetails); console.log('issuerId', this.issuerId); console.log('credentialSchemaId', this.credentialSchemaId); const credConfig = CredsConfig[ studentDetails.DocumentType || studentDetails.vctype.split('/')[1] ]; + console.log('------------', studentDetails); const data = { credential: { @@ -174,7 +175,7 @@ export class CredentialsService { issuanceDate: new Date().toISOString(), expirationDate: credConfig.expirationDate, credentialSubject: { - id: `did:rcw:issuance-bbb1-4e5e-b6cc-8671c2b3df1e`, + id: `did:rcw:issuance-uba-bbb1-4e5e-b6cc-8671c2b3df1e`, type: credConfig.credentialSubjectType, ...studentDetails, }, diff --git a/src/services/registry/registry.service.ts b/src/services/registry/registry.service.ts index 69cdd2e..909a376 100644 --- a/src/services/registry/registry.service.ts +++ b/src/services/registry/registry.service.ts @@ -6,6 +6,7 @@ import { } from '@nestjs/common'; import { HttpService } from '@nestjs/axios'; import { lastValueFrom } from 'rxjs'; +import { CredsConfig } from '../../Helper/CredsConfig'; @Injectable() export class RegistryService { @@ -44,9 +45,15 @@ export class RegistryService { certificateId, resultDataId, authToken, + studentDetail, ): Promise { console.log('certificateId', certificateId); console.log('resultDataId', resultDataId); + const credConfig = + CredsConfig[ + studentDetail.DocumentType || studentDetail.vctype.split('/')[1] + ]; + console.log(credConfig); const data = { certificateId: certificateId, @@ -65,7 +72,8 @@ export class RegistryService { try { const response = await lastValueFrom( this.httpService.put( - this.baseUrl + `/registry/api/v1/TenMarksheet/${resultDataId}`, + this.baseUrl + + `/registry/api/v1/${credConfig.schemaName}/${resultDataId}`, JSON.stringify(data), config, ), @@ -145,14 +153,18 @@ export class RegistryService { } async searchResult(certificateNo: string): Promise { - const url = this.baseUrl + '/registry/api/v1/TenMarksheet/search'; + const url = this.baseUrl + '/registry/api/v1/marksheet/search'; const headers = { 'Content-Type': 'application/json', Cookie: 'JSESSIONID=DD3A1308B7B64B9C47B7CEEEECAD4A58', }; const payload = { - filters: {}, + filters: { + certificateNo: { + eq: certificateNo, + }, + }, }; try { diff --git a/template/casteCertificate.html b/template/casteCertificate.html new file mode 100644 index 0000000..c95e552 --- /dev/null +++ b/template/casteCertificate.html @@ -0,0 +1,174 @@ + + + + + + + Caste Certificate + + + + +
+
+

Government of India

+

Caste Certificate

+

Certificate Number: {{certificateNumber}}

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Full Name{{firstName}} {{middleName}} {{lastName}}
Aadhaar Number{{aadharNumber}}
Family Leader Bhamashah Number{{familyLeaderBhamashahNumber}}
Relation{{relationwithApplicant}}
Caste{{castName}}
Category{{castCategoryNumber}}
Residential Address{{addressLine1}}, {{addressLine2}}, {{house}}, {{landmark}}, {{locality}}, {{vtc}}, + {{district}}, {{state}}, {{country}}, {{pin}}
+
+ +
+

Issuing Organization Details

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Organization Name{{orgName}}
Organization Code{{orgCode}}
Organization Type{{orgType}}
Officer Name{{orgOfficerName}}
Officer Rank{{orgOfficerRank}}
Office Address{{addressLine1}}, {{addressLine2}}, {{landmark}}, {{locality}}, {{vtc}}, {{district}}, + {{state}}, {{country}}, {{pin}}
+
+ + +
+ + + \ No newline at end of file diff --git a/template/enrollmentCertificate.html b/template/enrollmentCertificate.html new file mode 100644 index 0000000..83aadd3 --- /dev/null +++ b/template/enrollmentCertificate.html @@ -0,0 +1,155 @@ + + + + + + + Enrollment Certificate + + + + +
+
+

Enrollment Certificate

+

Year: {{schoolYear}}

+

Reference Number: {{learnerReferenceNumber}}

+
+ +
+ + + + + + + + + + + + + + + + + +
Full Name{{firstName}} {{middleName}} {{lastName}}
Grade Level{{gradeLevel}}
Status{{studentStatus}}
Residential Address{{addressLine1}}, {{addressLine2}}, {{landmark}}, {{locality}}, {{district}}, {{state}}, + {{country}}, {{pin}}
+
+ +
+

School Details

+ + + + + + + + + + + + + + + + + +
School Name{{schoolName}}
School Registration Number{{schoolregistrationNumber}}
Principal's Name{{principalName}}
Principal's Designation{{principalDesignation}}
+
+ + +
+ + + \ No newline at end of file diff --git a/template/marksheet.html b/template/marksheet.html new file mode 100644 index 0000000..fc0dff9 --- /dev/null +++ b/template/marksheet.html @@ -0,0 +1,154 @@ + + + + + + Marksheet Certificate + + + + +
+
+

Marksheet Certificate

+

Academic Year: {{academicYear}}

+

{{schoolName}}

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Student ID{{studentId}}
Name{{firstName}} {{middleName}} {{lastName}}
Class{{class}}
Exam Date{{examDate}}
CGPA{{cgpa}} / {{cgpaMax}}
Marks Obtained{{marksTotal}} / {{marksMax}}
Percentage{{percentage}}%
Grade{{grade}}
Result{{result}}
+
+ + +
+ + diff --git a/template/mh.html b/template/mh.html deleted file mode 100644 index dbb3df3..0000000 --- a/template/mh.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Marksheet - - - -
-
-

Maharashtra State Education Board

-

{{schoolName}}

-
-

Certificate of Academic Achievement

-

This is to certify that

-

{{firstName}} {{middleName}} {{lastName}}

-

Student ID: {{studentId}}

- -
-

School Details:

-

School Name: {{schoolName}}

-

Academic Year: {{academicYear}}

-

Exam Date: {{examDate}}

- -

Performance:

-

- CGPA: {{Performance.cgpa}} / {{Performance.cgpaMax}} -

-

Grade: {{Performance.grade}}

-

Percentage: {{Performance.percentage}}%

-

Result: {{Performance.result}}

- -

Subjects:

-
- - - - - - - - - - - - - {{#Subjects}} - - - - - - - - - {{/Subjects}} - -
SubjectTotal MarksTheory MarksPractical MarksMax TheoryMax Practical
{{name}}{{marksTotal}}{{marksTheory}}{{marksPractical}}{{marksMaxTheory}}{{marksMaxPractical}}
-
-
- - - -
-
- Signature -

Signature

-
- QR Code -
-
- -