Skip to content
This repository was archived by the owner on Apr 22, 2025. It is now read-only.

Commit 0ae7446

Browse files
Merge pull request #20 from decoded-cipher/dev
Version 3.2
2 parents 8dbb235 + d38ca40 commit 0ae7446

File tree

13 files changed

+444
-337
lines changed

13 files changed

+444
-337
lines changed

.gitignore

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
node_modules
22
.env
33

4-
public/screenshots
5-
public/secure_pdfs
6-
public/analytics
7-
public/data
8-
public/xlsx
9-
public/graphs
4+
public/screenshots/**
5+
public/secure_pdfs/**
6+
public/analytics/**
7+
public/data/**
8+
public/xlsx/**
9+
public/graphs/**
10+
11+
# keep the folder structure
12+
!public/screenshots/.gitkeep
13+
!public/secure_pdfs/.gitkeep
14+
!public/analytics/.gitkeep
15+
!public/xlsx/.gitkeep
16+
!public/graphs/.gitkeep

helpers/analytics.js

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ module.exports = {
2424
let subjectPassFailCount = await getSubjectPassFailCount(exam_id, programme);
2525
let subjectToppers = await getAllSubjectToppers(exam_id, programme);
2626

27-
2827
const workbook = new ExcelJS.Workbook();
2928
const worksheet = workbook.addWorksheet('Analysis', {
3029
pageSetup: {
@@ -180,52 +179,59 @@ module.exports = {
180179
// ------------------------------ Subject-wise Toppers Table ------------------------------ //
181180

182181

182+
let extraRows = 0;
183+
data.subjects.length > classTop5.length ? extraRows = data.subjects.length : extraRows = classTop5.length;
183184

184-
worksheet.mergeCells('A' + (15 + data.subjects.length + classTop5.length) + ':M' + (15 + data.subjects.length + classTop5.length));
185-
worksheet.getCell('A' + (15 + data.subjects.length + classTop5.length)).value = 'Subject-wise Toppers List';
185+
extraRows = 9 + extraRows + data.subjects.length + 5;
186186

187-
worksheet.mergeCells('A' + (16 + data.subjects.length + classTop5.length) + ':E' + (16 + data.subjects.length + classTop5.length));
188-
worksheet.getCell('A' + (16 + data.subjects.length + classTop5.length)).value = 'Subjects';
187+
worksheet.mergeCells('A' + extraRows + ':M' + extraRows);
188+
worksheet.getCell('A' + extraRows).value = 'Subject-wise Toppers List';
189189

190-
worksheet.mergeCells('F' + (16 + data.subjects.length + classTop5.length) + ':H' + (16 + data.subjects.length + classTop5.length));
191-
worksheet.getCell('F' + (16 + data.subjects.length + classTop5.length)).value = 'Name of the Student';
190+
extraRows += 1;
192191

193-
worksheet.getCell('I' + (16 + data.subjects.length + classTop5.length)).value = 'Marks';
194-
worksheet.getCell('J' + (16 + data.subjects.length + classTop5.length)).value = 'Grade';
192+
worksheet.mergeCells('A' + extraRows + ':E' + extraRows);
193+
worksheet.getCell('A' + extraRows).value = 'Subjects';
195194

196-
worksheet.mergeCells('K' + (16 + data.subjects.length + classTop5.length) + ':M' + (16 + data.subjects.length + classTop5.length));
197-
worksheet.getCell('K' + (16 + data.subjects.length + classTop5.length)).value = 'Name of the Teacher';
195+
worksheet.mergeCells('F' + extraRows + ':H' + extraRows);
196+
worksheet.getCell('F' + extraRows).value = 'Name of the Student';
198197

199-
let startRow, endRow, extraRows = 0;
198+
worksheet.getCell('I' + extraRows).value = 'Marks';
199+
worksheet.getCell('J' + extraRows).value = 'Grade';
200200

201-
for (let i = 0; i < subjectToppers.length; i++) {
201+
worksheet.mergeCells('K' + extraRows + ':M' + extraRows);
202+
worksheet.getCell('K' + extraRows).value = 'Name of the Teacher';
202203

203-
startRow = 17 + data.subjects.length + classTop5.length + i;
204-
endRow = 17 + data.subjects.length + classTop5.length + i;
204+
extraRows += 1;
205+
206+
let startRow = endRow = extraRows;
205207

206-
startRow = 17 + data.subjects.length + classTop5.length + i + extraRows;
207-
extraRows += subjectToppers[i].count - 1;
208-
endRow = 17 + data.subjects.length + classTop5.length + i + extraRows;
209208

210-
worksheet.mergeCells('A' + (startRow) + ':E' + (endRow));
211-
worksheet.getCell('A' + (startRow)).value = subjectToppers[i].course;
209+
for (let i = 0; i < subjectToppers.length; i++) {
212210

213211
for (let j = 0; j < subjectToppers[i].toppers.length; j++) {
214212
worksheet.mergeCells('F' + (startRow + j) + ':H' + (startRow + j));
215213
worksheet.getCell('F' + (startRow + j)).value = subjectToppers[i].toppers[j].name;
214+
215+
endRow = startRow + j;
216+
// break;
216217
}
217-
218-
worksheet.mergeCells('I' + (startRow) + ':I' + (endRow));
219-
worksheet.getCell('I' + (startRow)).value = subjectToppers[i].marks;
220-
221-
worksheet.mergeCells('J' + (startRow) + ':J' + (endRow));
222-
worksheet.getCell('J' + (startRow)).value = subjectToppers[i].grade;
223-
224-
worksheet.mergeCells('K' + (startRow) + ':M' + (endRow));
225-
worksheet.getCell('K' + (startRow)).value = "Not Available";
226-
218+
219+
worksheet.mergeCells('A' + (startRow) + ':E' + (endRow));
220+
worksheet.getCell('A' + (startRow)).value = subjectToppers[i].course_name;
221+
222+
worksheet.mergeCells('I' + startRow + ':I' + endRow);
223+
worksheet.getCell('I' + startRow).value = subjectToppers[i].total;
224+
225+
worksheet.mergeCells('J' + startRow + ':J' + endRow);
226+
worksheet.getCell('J' + startRow).value = subjectToppers[i].grade;
227+
228+
worksheet.mergeCells('K' + startRow + ':M' + endRow);
229+
worksheet.getCell('K' + startRow).value = "Not Available";
230+
231+
startRow = endRow + 1;
232+
// break;
227233
}
228-
234+
229235

230236

231237
// ------------------------------ Styling ------------------------------ //

helpers/cons_sheet_xlsx.js

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -182,21 +182,31 @@ module.exports = {
182182
});
183183
}
184184

185-
});
185+
// if any subject was skipped, then highlight the row
186+
for(let i = 0; i < resultStats.subjects.length; i++) {
187+
if(resultStats.subjects[i].skip.index.includes(rowNumber - 6)) {
188+
189+
let cell_1 = String.fromCharCode(67 + (i * 2));
190+
let cell_2 = String.fromCharCode(68 + (i * 2));
191+
192+
row.getCell(cell_1).fill = {
193+
type: 'pattern',
194+
pattern: 'solid',
195+
fgColor: { argb: 'FFF0F0F0' },
196+
bgColor: { argb: 'FFF0F0F0' }
197+
}
198+
row.getCell(cell_2).fill = {
199+
type: 'pattern',
200+
pattern: 'solid',
201+
fgColor: { argb: 'FFF0F0F0' },
202+
bgColor: { argb: 'FFF0F0F0' }
203+
}
186204

205+
}
206+
}
187207

188-
// save resultStats to a file
189-
// fs.writeFileSync(path.join(__dirname, '../public/xlsx/analytics.json'), JSON.stringify(resultStats, null, 4), (err) => {
190-
// if (err) {
191-
// console.log("--- [xlsx - generate_XLSX] --- Error in writing resultStats to file: " + err);
192-
// reject({
193-
// status: "error",
194-
// message: "Error in writing resultStats to file: ",
195-
// error: err
196-
// });
197-
// }
198-
// });
199208

209+
});
200210

201211

202212
// Write data to XLSX file
@@ -319,6 +329,8 @@ module.exports = {
319329

320330
let subject = {
321331
marks : [],
332+
isa : [],
333+
esa : [],
322334
grade : [],
323335
};
324336

@@ -332,6 +344,11 @@ module.exports = {
332344
index : [],
333345
names : [],
334346
},
347+
skip : {
348+
count : 0,
349+
index : [],
350+
names : [],
351+
},
335352
grades: {
336353
"S" : 0,
337354
"A+" : 0,
@@ -347,7 +364,10 @@ module.exports = {
347364
for(let j = 0; j < data.length; j++) {
348365

349366
let markHolder = data[j].data.result.subjects[i].total;
367+
let isaHolder = data[j].data.result.subjects[i].internal.isa;
368+
let esaHolder = data[j].data.result.subjects[i].external.esa;
350369
let gradeHolder = data[j].data.result.subjects[i].grade;
370+
let maxHolder = data[j].data.result.subjects[i].max;
351371

352372
// Count the subject wise grades
353373
switch(gradeHolder) {
@@ -373,25 +393,41 @@ module.exports = {
373393
resultStats.subjects[i].grades["D"]++;
374394
break;
375395
default:
376-
resultStats.subjects[i].grades["F"]++;
396+
397+
if(markHolder === null && maxHolder !== null) {
398+
resultStats.subjects[i].grades["F"]++;
399+
}
377400
}
378401

379402
resultStats.subjects[i].name = data[j].data.result.subjects[i].course;
380403

381404
// Count the subject wise pass and fail
382405
if(markHolder === null) {
383-
resultStats.subjects[i].fail.index.push(j);
384-
resultStats.subjects[i].fail.names.push(data[j].data.name);
385-
resultStats.subjects[i].fail.count++;
406+
407+
if(maxHolder === null) {
408+
resultStats.subjects[i].skip.index.push(j);
409+
resultStats.subjects[i].skip.names.push(data[j].data.name);
410+
resultStats.subjects[i].skip.count++;
411+
} else {
412+
resultStats.subjects[i].fail.index.push(j);
413+
resultStats.subjects[i].fail.names.push(data[j].data.name);
414+
resultStats.subjects[i].fail.count++;
415+
}
416+
386417
} else {
387418
resultStats.subjects[i].pass.count++;
388419
}
389420

390421
// Handling null values in the data with "-" and "F"
391422
markHolder === null ? markHolder = "-" : markHolder = markHolder;
392-
gradeHolder === null ? gradeHolder = "F" : gradeHolder = gradeHolder;
423+
isaHolder === null ? isaHolder = "-" : isaHolder = isaHolder;
424+
esaHolder === null ? esaHolder = "-" : esaHolder = esaHolder;
425+
426+
gradeHolder === null ? (maxHolder === null ? gradeHolder = "-" : gradeHolder = "F") : gradeHolder = gradeHolder;
393427

394428
subject.marks.push(markHolder);
429+
subject.isa.push(isaHolder);
430+
subject.esa.push(esaHolder);
395431
subject.grade.push(gradeHolder);
396432

397433
}

0 commit comments

Comments
 (0)