lms-sync 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,1337 @@
1
+ const db = require('../models')
2
+ const logger = require('../utils/logger')
3
+ const api = require('../apiConnections/apiConnects')
4
+ const moment = require('moment')
5
+ const {
6
+ AcademicDepartments,
7
+ AcademicYears,
8
+ Campuses,
9
+ Colleges,
10
+ Courses,
11
+ EnrolledStudents,
12
+ Instructors,
13
+ Rooms,
14
+ Sections,
15
+ Students,
16
+ Subjects,
17
+ Schedules,
18
+ Users,
19
+ Semesters
20
+
21
+ } = db
22
+
23
+ const server = {
24
+
25
+ async Campus(){
26
+ try {
27
+ console.log("");
28
+ console.log("########################################################")
29
+ console.log(" Campuses Migration ")
30
+ console.log("########################################################")
31
+ console.log("");
32
+
33
+ const campusApi = await api.Campus()
34
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
35
+
36
+ let createdCounter = 0
37
+ let errorCounter = 0
38
+ let uniqueErrors = new Set()
39
+
40
+ for (let i = 0; i < campusApi.length; i++){
41
+ try {
42
+
43
+ let _campus = campusApi[i]
44
+
45
+ let modifiedById = userMail._id
46
+ let createdById = userMail._id
47
+
48
+ let [record, created] = await Campuses.findOrCreate({
49
+ where:{
50
+ name: _campus?.name,
51
+ code: _campus?.code
52
+ },
53
+ defaults:{
54
+ email: _campus?.email,
55
+ address: _campus?.address,
56
+ modifiedById,
57
+ createdById
58
+ }
59
+ })
60
+ if (created){
61
+ logger.info(`New campus record created ${createdCounter + 1}/${createdCounter}: [${record.code}] - ${record.name} `)
62
+ createdCounter++;
63
+ }
64
+ else {
65
+ const errorMsg = `Record campus already exists [${record.code}] - ${record.name} `;
66
+ if (!uniqueErrors.has(errorMsg)) {
67
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
68
+ uniqueErrors.add(errorMsg);
69
+ errorCounter++;
70
+ }
71
+
72
+ }
73
+
74
+ } catch (error) {
75
+ console.error(error);
76
+ }
77
+ }
78
+
79
+ console.log("");
80
+ console.log("########################################################")
81
+ console.log("")
82
+ logger.info(' Campus Data Migration Completed');
83
+ logger.info(`Total successful Campus records created: ${createdCounter}/${createdCounter}`);
84
+ logger.info(`Total Campus Error Records: ${errorCounter}/${errorCounter}`);
85
+ console.log("")
86
+ console.log("########################################################")
87
+ console.log("")
88
+
89
+ let totalSummary = {
90
+ itemLength: campusApi.length,
91
+ error: errorCounter,
92
+ success: createdCounter
93
+ }
94
+ return totalSummary
95
+
96
+ } catch (error) {
97
+ console.error(error);
98
+
99
+ }
100
+ },
101
+
102
+ async College(){
103
+ try {
104
+ console.log("");
105
+ console.log("########################################################")
106
+ console.log(" Colleges Migration ")
107
+ console.log("########################################################")
108
+ console.log("");
109
+
110
+ const collegeApi = await api.College()
111
+ const campusApi = await api.Campus()
112
+
113
+ const campusSeq = await Campuses.findAll()
114
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
115
+
116
+ let createdCounter = 0
117
+ let errorCounter = 0
118
+ let uniqueErrors = new Set()
119
+
120
+ for (let i = 0; i < collegeApi.length; i++){
121
+ try {
122
+ let _college = collegeApi[i]
123
+
124
+ let campusMap = campusApi.find(a => a.id === _college?.campus_id)
125
+
126
+ let _campus = campusSeq.find(b => b.name === campusMap?.name)
127
+
128
+ let campusDefault = 999999
129
+
130
+ let modifiedById = userMail._id
131
+ let createdById = userMail._id
132
+
133
+ let [record, created] = await Colleges.findOrCreate({
134
+
135
+ where:{
136
+ name: _college?.name,
137
+ code: _college?.code
138
+ },
139
+ defaults:{
140
+ campusId: _campus?._id??campusDefault,
141
+ modifiedById,
142
+ createdById
143
+ }
144
+ })
145
+ if (created){
146
+ logger.info(`New college record created ${createdCounter + 1}/${createdCounter + 1}: [${record.code}] - ${record.name} `)
147
+ createdCounter++;
148
+ }
149
+ else {
150
+ const errorMsg = `Record college already exists: [${record.code}] - ${record.name} `
151
+
152
+ if (!uniqueErrors.has(errorMsg)) {
153
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
154
+ uniqueErrors.add(errorMsg);
155
+ errorCounter++;
156
+ }
157
+ }
158
+
159
+ } catch (error) {
160
+ console.error(error);
161
+ }
162
+ }
163
+
164
+ console.log("");
165
+ console.log("########################################################")
166
+ console.log("")
167
+ logger.info(' College Data Migration Completed');
168
+ logger.info(`Total successful College records created: ${createdCounter}/${createdCounter}`);
169
+ logger.info(`Total College Error Records: ${errorCounter}/${errorCounter}`);
170
+ console.log("")
171
+ console.log("########################################################")
172
+ console.log("")
173
+
174
+ let totalSummary = {
175
+ itemLength: collegeApi.length,
176
+ error: errorCounter,
177
+ success: createdCounter
178
+ }
179
+ return totalSummary
180
+
181
+ } catch (error) {
182
+ console.error(error);
183
+
184
+ }
185
+ },
186
+
187
+ async AcademicDepartment(){
188
+ try {
189
+ console.log("");
190
+ console.log("########################################################")
191
+ console.log(" Academic Departments Migration ")
192
+ console.log("########################################################")
193
+ console.log("");
194
+
195
+ const departmentApi = await api.Department()
196
+ const campusApi = await api.Campus()
197
+ const collegeApi = await api.College()
198
+
199
+
200
+ const campusSeq = await Campuses.findAll()
201
+ const collegeSeq = await Colleges.findAll()
202
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
203
+
204
+ let createdCounter = 0
205
+ let errorCounter = 0
206
+ let uniqueErrors = new Set()
207
+
208
+ for (let i = 0; i < departmentApi.length; i++){
209
+ try {
210
+ let _acadDept = departmentApi[i]
211
+
212
+
213
+ let _college = collegeSeq.find( col => col.code === _acadDept?.code)
214
+
215
+ let college = collegeApi.find( cols => cols.code === _acadDept?.code)
216
+
217
+ let _campus = campusApi.find(cam => cam.id === college?.campus_id)
218
+
219
+ let campus = campusSeq.find(camp => camp.code === _campus?.code)
220
+
221
+ let campusDefault = 999999
222
+ let collegeDefault = 999999
223
+ let chairPersonDefault = 999999
224
+
225
+ let modifiedById = userMail._id
226
+ let createdById = userMail._id
227
+
228
+
229
+ let [record, created] = await AcademicDepartments.findOrCreate({
230
+
231
+ where:{
232
+ name: _acadDept?.name,
233
+ code: _acadDept?.code
234
+ },
235
+ defaults:{
236
+ collegeId: _college?._id??collegeDefault,
237
+ campusId: campus?._id??campusDefault,
238
+ chairPersonId: chairPersonDefault,
239
+ modifiedById,
240
+ createdById
241
+ }
242
+ })
243
+ if (created){
244
+ logger.info(`New academic department record created ${createdCounter + 1}/${createdCounter + 1}: [${record.code}] - ${record.name} `)
245
+ createdCounter++;
246
+ }
247
+ else {
248
+ const errorMsg = `Record academic department already exists [${record.code}] - ${record.name} `
249
+
250
+ if (!uniqueErrors.has(errorMsg)) {
251
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
252
+ uniqueErrors.add(errorMsg);
253
+ errorCounter++;
254
+ }
255
+
256
+ }
257
+
258
+ } catch (error) {
259
+ console.error(error);
260
+ }
261
+ }
262
+
263
+ console.log("");
264
+ console.log("########################################################")
265
+ console.log("")
266
+ logger.info(' Academic Department Data Migration Completed');
267
+ logger.info(`Total successful Academic Department records created: ${createdCounter}/${createdCounter}`);
268
+ logger.info(`Total Academic Department Error Records: ${errorCounter}/${errorCounter}`);
269
+ console.log("")
270
+ console.log("########################################################")
271
+ console.log("")
272
+
273
+ let totalSummary = {
274
+ itemLength: departmentApi.length,
275
+ error: errorCounter,
276
+ success: createdCounter
277
+ }
278
+ return totalSummary
279
+
280
+ } catch (error) {
281
+ console.error(error);
282
+
283
+ }
284
+ },
285
+
286
+ async Course(){
287
+ try {
288
+ console.log("");
289
+ console.log("########################################################")
290
+ console.log(" Courses Migration ")
291
+ console.log("########################################################")
292
+ console.log("");
293
+
294
+ const studentApi = (await api.Student()).data
295
+
296
+ const courseApi = await api.Course()
297
+ const collegeApi = await api.College()
298
+ const departmentApi = await api.Department()
299
+
300
+ const acadDeptSeq = await AcademicDepartments.findAll()
301
+
302
+ const campusSeq = await Campuses.findAll()
303
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
304
+
305
+ let createdCounter = 0
306
+ let errorCounter = 0
307
+ let uniqueErrors = new Set()
308
+
309
+ for (let i = 0; i < studentApi.length; i++){
310
+ try {
311
+
312
+ let course = studentApi[i]
313
+ let courseCode = courseApi.find(crs => crs.name === course?.course)
314
+ let campus = campusSeq.find(camp => camp.name === course?.campus)
315
+
316
+ let college = collegeApi.find(col => col.name === course?.college)
317
+ let department = departmentApi.find(dep => dep.name === college?.name)
318
+ let _department = acadDeptSeq.find(ad => ad.name === department?.name)
319
+
320
+
321
+
322
+
323
+
324
+ let modifiedById = userMail._id
325
+ let createdById = userMail._id
326
+
327
+
328
+ let [record, created] = await Courses.findOrCreate({
329
+ where:{
330
+ name: course?.course,
331
+ code: courseCode?.code,
332
+ major: course?.major,
333
+ campusId: campus?._id??null,
334
+ departmentId: _department?._id??null,
335
+ modifiedById,
336
+ createdById
337
+ },
338
+ defaults:{
339
+
340
+
341
+ }
342
+ })
343
+
344
+ if (created) {
345
+ logger.info(`New course record created ${createdCounter +1}/${createdCounter +1}: [${record.code}] - ${record.name}, Major in ${record.major}`)
346
+ createdCounter++
347
+ } else {
348
+
349
+ const errorMsg = `Record course already exists [${record.code}] - ${record.name}, Major in ${record.major}`;
350
+
351
+ if (!uniqueErrors.has(errorMsg)) {
352
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
353
+ uniqueErrors.add(errorMsg);
354
+ errorCounter++;
355
+ }
356
+
357
+ }
358
+
359
+ } catch (error) {
360
+ console.error(error);
361
+ }
362
+ }
363
+
364
+
365
+ console.log("");
366
+ console.log("########################################################")
367
+ console.log("")
368
+ logger.info(' Course Data Migration Completed');
369
+ logger.info(`Total successful Course records created: ${createdCounter}/${createdCounter}`);
370
+ logger.info(`Total Course Error Records: ${errorCounter}/${errorCounter}`);
371
+ console.log("")
372
+ console.log("########################################################")
373
+ console.log("")
374
+
375
+ let totalSummary = {
376
+ itemLength: courseApi.length,
377
+ error: errorCounter,
378
+ success: createdCounter
379
+ }
380
+
381
+ uniqueErrors.clear();
382
+
383
+ return totalSummary
384
+
385
+ } catch (error) {
386
+ console.error(error);
387
+ }
388
+ },
389
+
390
+ async Room(){
391
+ try {
392
+ console.log("");
393
+ console.log("########################################################")
394
+ console.log(" Rooms Migration ")
395
+ console.log("########################################################")
396
+ console.log("");
397
+
398
+ const subjectRoom = await api.Subject()
399
+ const roomApi = await api.Room()
400
+
401
+ const subjectSeq = await Subjects.findAll()
402
+ const campusSeq = await Campuses.findAll()
403
+ const departmentSeq = await AcademicDepartments.findAll()
404
+
405
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
406
+
407
+ let createdCounter = 0
408
+ let errorCounter = 0
409
+ let uniqueErrors = new Set()
410
+
411
+ for (let i = 0; i < roomApi.length; i++){
412
+ try {
413
+ let _room = roomApi[i]
414
+
415
+ let _subject = subjectRoom.find(r => r.room_id === _room?.id)
416
+ // console.log('_subject :>> ', _subject);
417
+
418
+ let _subjects = subjectSeq.find(s => s.name === _subject?.name)
419
+ // console.log('_subjects :>> ', _subjects);
420
+
421
+
422
+ let _department = departmentSeq.find(dep => dep._id === _subjects?.departmentId)
423
+ // console.log('_department :>> ', _department);
424
+
425
+
426
+ let _campus = campusSeq.find (cam => cam._id === _department?.campusId)
427
+ // console.log('_campus :>> ', _campus);
428
+
429
+
430
+ let capacity = 50
431
+
432
+ let campusDefault = "MSC - Boac Campus"
433
+
434
+ let _campusDefault = campusSeq.find(ccc => ccc.name === campusDefault)
435
+
436
+ // return console.log('campusDefault :>> ', campusDefault);
437
+
438
+ let modifiedById = userMail._id
439
+ let createdById = userMail._id
440
+
441
+ let [record, created] = await Rooms.findOrCreate({
442
+ where:{
443
+ name: _room?.name,
444
+ campusId: _campus?._id??_campusDefault?._id??null,
445
+ },
446
+ defaults:{
447
+ capacity,
448
+ modifiedById,
449
+ createdById
450
+
451
+ }
452
+ })
453
+ if (created){
454
+ logger.info(`New room record created ${createdCounter + 1}/${createdCounter + 1}: ${record.name} `)
455
+ createdCounter++;
456
+ }
457
+ else {
458
+ const errorMsg = `Record room already exists ${record.name}`;
459
+
460
+ if (!uniqueErrors.has(errorMsg)) {
461
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
462
+ uniqueErrors.add(errorMsg);
463
+ errorCounter++;
464
+ }
465
+
466
+ }
467
+
468
+ } catch (error) {
469
+ console.error(error);
470
+ }
471
+ }
472
+
473
+ console.log("");
474
+ console.log("########################################################")
475
+ console.log("")
476
+ logger.info(' Room Data Migration Completed');
477
+ logger.info(`Total successful Room records created: ${createdCounter}/${createdCounter}`);
478
+ logger.info(`Total Room Error Records: ${errorCounter}/${errorCounter}`);
479
+ console.log("")
480
+ console.log("########################################################")
481
+ console.log("")
482
+
483
+ let totalSummary = {
484
+ itemLength: roomApi.length,
485
+ error: errorCounter,
486
+ success: createdCounter
487
+ }
488
+ return totalSummary
489
+
490
+ } catch (error) {
491
+ console.error(error);
492
+
493
+ }
494
+ },
495
+
496
+ async Instructor(){
497
+ try {
498
+ console.log("");
499
+ console.log("########################################################")
500
+ console.log(" Instructors Migration ")
501
+ console.log("########################################################")
502
+ console.log("");
503
+
504
+ const instructorApi = await api.Instructor()
505
+ const departmentApi = await api.Department()
506
+
507
+ const departmentSeq = await AcademicDepartments.findAll()
508
+ const campusSeq = await Campuses.findAll()
509
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
510
+
511
+ let createdCounter = 0
512
+ let errorCounter = 0
513
+ let uniqueErrors = new Set()
514
+
515
+ for (let i = 0; i < instructorApi.length; i++){
516
+ try {
517
+ let _instructor = instructorApi[i]
518
+
519
+ let acadDepartmentMap = departmentApi.find(a => a.name === _instructor?.department_name)
520
+
521
+ let _acadDepartment = departmentSeq.find(b => b.name === acadDepartmentMap?.name)
522
+
523
+ let campusMap = campusSeq.find(c => c._id === _acadDepartment?.campusId)
524
+
525
+ let academicDepartmentDefault = 999999
526
+
527
+ let modifiedById = userMail._id
528
+ let createdById = userMail._id
529
+
530
+
531
+ let campusDefault = "MSC - Boac Campus"
532
+ let _campusDefault = campusSeq.find(ccc => ccc.name === campusDefault)
533
+
534
+ let [record, created] = await Instructors.findOrCreate({
535
+ where:{
536
+ firstName: _instructor?.first_name,
537
+ lastName: _instructor?.last_name,
538
+ middleName: _instructor?.middle_name,
539
+ employeeNumber: _instructor?.faculty_id,
540
+ departmentId: _acadDepartment?._id??academicDepartmentDefault,
541
+ campusId: campusMap?._id??_campusDefault?._id,
542
+ modifiedById,
543
+ createdById,
544
+ // employeeId: record?._id??null,
545
+
546
+
547
+ },
548
+ defaults:{
549
+
550
+ }
551
+ })
552
+ if (created){
553
+ logger.info(`New instructor record created ${createdCounter + 1}/${createdCounter + 1}: [${record.employeeNumber}] - ${record.lastName}, ${record.firstName} `)
554
+ createdCounter++;
555
+ }
556
+ else {
557
+ const errorMsg = `Record instructor already exists [${record.employeeNumber}] - ${record.lastName}, ${record.firstName}`;
558
+
559
+ if (!uniqueErrors.has(errorMsg)) {
560
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
561
+ uniqueErrors.add(errorMsg);
562
+ errorCounter++;
563
+ }
564
+
565
+ }
566
+
567
+ } catch (error) {
568
+ console.error(error);
569
+ }
570
+ }
571
+
572
+ console.log("");
573
+ console.log("########################################################")
574
+ console.log("")
575
+ logger.info(' Instructors Data Migration Completed');
576
+ logger.info(`Total successful Instructors records created: ${createdCounter}/${createdCounter}`);
577
+ logger.info(`Total Instructors Error Records: ${errorCounter}/${errorCounter}`);
578
+ console.log("")
579
+ console.log("########################################################")
580
+ console.log("")
581
+
582
+ let totalSummary = {
583
+ itemLength: instructorApi.length,
584
+ error: errorCounter,
585
+ success: createdCounter
586
+ }
587
+ return totalSummary
588
+
589
+ } catch (error) {
590
+ console.error(error);
591
+
592
+ }
593
+ },
594
+
595
+ async AcademicYear(){
596
+ try {
597
+ console.log("");
598
+ console.log("########################################################")
599
+ console.log(" Academic Years Migration ")
600
+ console.log("########################################################")
601
+ console.log("");
602
+
603
+ const acadYearApi = await api.AcademicYear()
604
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
605
+
606
+ let createdCounter = 0
607
+ let errorCounter = 0
608
+ let uniqueErrors = new Set()
609
+
610
+ const { acadYearResult, currentSchoolYear } = acadYearApi;
611
+
612
+ for (let i = 0; i < acadYearResult.length; i++){
613
+ try {
614
+ let _acadyear = acadYearResult[i]
615
+ // console.log('_acadyear :>> ', _acadyear);
616
+
617
+ let [from, to] = _acadyear.year.split('-')
618
+
619
+ to = /^\d+$/.test(to) ? parseInt(to, 10) : null;
620
+ from = /^\d+$/.test(from) ? parseInt(from, 10) : null;
621
+
622
+ let defaultDate = new Date()
623
+ let currentYear = defaultDate.getFullYear()
624
+ let previousYear = currentYear - 1
625
+
626
+ let isDefault = false
627
+ if(from == previousYear && to == currentYear) isDefault = true
628
+
629
+ let modifiedById = userMail._id
630
+ let createdById = userMail._id
631
+
632
+ let [record, created] = await AcademicYears.findOrCreate({
633
+ where:{
634
+ from,
635
+ to
636
+ },
637
+ defaults:{
638
+ modifiedById,
639
+ createdById,
640
+ default: isDefault
641
+ }
642
+ })
643
+ if (created){
644
+ logger.info(`New academic year record created ${createdCounter + 1}/${createdCounter + 1}: ${record.from} - ${record.to} `)
645
+ createdCounter++;
646
+ }
647
+ else {
648
+ const errorMsg = `Record academic year already exists ${record.from} - ${record.to}`;
649
+ if (!uniqueErrors.has(errorMsg)) {
650
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
651
+ uniqueErrors.add(errorMsg);
652
+ errorCounter++;
653
+ }
654
+ }
655
+
656
+ } catch (error) {
657
+ console.error(error);
658
+ }
659
+ }
660
+
661
+ console.log("");
662
+ console.log("########################################################")
663
+ console.log("")
664
+ logger.info(' Academic Years Data Migration Completed');
665
+ logger.info(`Total successful Academic Years records created: ${createdCounter}/${createdCounter}`);
666
+ logger.info(`Total Academic Years Error Records: ${errorCounter}/${errorCounter}`);
667
+ console.log("")
668
+ console.log("########################################################")
669
+ console.log("")
670
+
671
+ let totalSummary = {
672
+ itemLength: acadYearResult.length,
673
+ error: errorCounter,
674
+ success: createdCounter
675
+ }
676
+ return totalSummary
677
+
678
+ } catch (error) {
679
+ console.error(error);
680
+
681
+ }
682
+ },
683
+
684
+ async Subject(){
685
+ try {
686
+ console.log("");
687
+ console.log("########################################################")
688
+ console.log(" Subjects Migration ")
689
+ console.log("########################################################")
690
+ console.log("");
691
+
692
+ const studentSubject = (await api.Student()).data
693
+
694
+ const subjectApi = await api.Subject()
695
+
696
+ const departmentSeq = await AcademicDepartments.findAll()
697
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
698
+
699
+ let createdCounter = 0
700
+ let errorCounter = 0
701
+ let uniqueErrors = new Set()
702
+
703
+ for (let i = 0; i < studentSubject.length; i++){
704
+ try {
705
+ let _subject = studentSubject[i]
706
+
707
+ let _department = departmentSeq.find(dep => dep.name === _subject?.college)
708
+
709
+ let _subs = studentSubject[i].subjects_enrolled;
710
+
711
+
712
+ for (let j = 0; j < _subs.length; j++){
713
+
714
+ let subject = _subs[j].subject_code
715
+
716
+ let _subjects = subjectApi.find(sub => sub.code === subject)
717
+
718
+ // return console.log('_subjects :>> ', _subjects);
719
+
720
+
721
+ if (!subject) {
722
+ // console.error(`Subject with code ${subjects} not found.`);
723
+ continue;
724
+ }
725
+ if (!_subjects) {
726
+ // console.error(`Subject with code ${subjects} not found.`);
727
+ continue;
728
+ }
729
+ let subjectType = "LECTURE"
730
+ let modifiedById = userMail._id
731
+ let createdById = userMail._id
732
+
733
+
734
+
735
+ let [record, created] = await Subjects.findOrCreate({
736
+ where:{
737
+ code:_subjects?.code,
738
+ name:_subjects?.name,
739
+ units:_subjects?.units,
740
+ departmentId: _department?._id,
741
+ subjectType,
742
+ modifiedById,
743
+ createdById
744
+ },
745
+ defaults:{
746
+
747
+ }
748
+ })
749
+ if (created){
750
+ logger.info(`New subject record created ${createdCounter + 1}/${createdCounter + 1}: [${record.code}], ${record.name} `)
751
+ createdCounter++;
752
+ }
753
+ else {
754
+ const errorMsg = `Record subject already exists [${record.code}], ${record.name}`;
755
+
756
+ if (!uniqueErrors.has(errorMsg)) {
757
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
758
+ uniqueErrors.add(errorMsg);
759
+ errorCounter++;
760
+ }
761
+ }
762
+ }
763
+
764
+
765
+ } catch (error) {
766
+ console.error(error);
767
+ }
768
+ }
769
+
770
+ console.log("");
771
+ console.log("########################################################")
772
+ console.log("")
773
+ logger.info(' Subjects Data Migration Completed');
774
+ logger.info(`Total successful Subjects records created: ${createdCounter}/${createdCounter}`);
775
+ logger.info(`Total Subjects Error Records: ${errorCounter}/${errorCounter}`);
776
+ console.log("")
777
+ console.log("########################################################")
778
+ console.log("")
779
+
780
+ let totalSummary = {
781
+ itemLength: studentSubject.length,
782
+ error: errorCounter,
783
+ success: createdCounter
784
+ }
785
+ return totalSummary
786
+
787
+ } catch (error) {
788
+ console.error(error);
789
+
790
+ }
791
+ },
792
+
793
+ async Schedule(){
794
+ try {
795
+ console.log("");
796
+ console.log("########################################################")
797
+ console.log(" Schedules Migration ")
798
+ console.log("########################################################")
799
+ console.log("");
800
+
801
+ const scheduleApi = await api.Schedule()
802
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
803
+
804
+ let createdCounter = 0
805
+ let errorCounter = 0
806
+ let uniqueErrors = new Set()
807
+
808
+ for (let i = 0; i < scheduleApi.length; i++){
809
+ try {
810
+ let _schedule = scheduleApi[i]
811
+
812
+ const timeRegex = /(\d{1,2}:\d{2} [APMapm]{2}) - (\d{1,2}:\d{2} [APMapm]{2})/
813
+ const matchTime = _schedule.schedule.match(timeRegex)
814
+
815
+ if (!matchTime) {
816
+ // console.error(`Invalid schedule format, check the record:${_schedule.schedule}`);
817
+ continue;
818
+ }
819
+
820
+ const [_, startTime, endTime] = matchTime;
821
+ const stFormat = moment(startTime, 'h:mm A').format('HH:mm:ss')
822
+ const etFormat = moment(endTime, 'h:mm A').format('HH:mm:ss')
823
+
824
+
825
+ let dayHandler = _schedule.schedule.split(' ')
826
+
827
+ const dayMappings = {
828
+ 'M': 'Monday',
829
+ 'T': 'Tuesday',
830
+ 'W': 'Wednesday',
831
+ 'Th': 'Thursday',
832
+ 'F': 'Friday',
833
+ 'S': 'Saturday',
834
+ 'Su': 'Sunday'
835
+ };
836
+
837
+ let modifiedById = userMail._id
838
+ let createdById = userMail._id
839
+
840
+
841
+ let from = null
842
+ let to = null
843
+ let days = null
844
+
845
+ if (dayHandler.length > 1) {
846
+ days = dayHandler[0].split('').map(day => dayMappings[day]).join(', ');
847
+ } else {
848
+ days = dayMappings[dayHandler[0]];
849
+ }
850
+
851
+
852
+ let [record, created] = await Schedules.findOrCreate({
853
+ where:{
854
+ name: _schedule?.schedule,
855
+ from : stFormat??from,
856
+ to : etFormat??to,
857
+ days
858
+ },
859
+ defaults:{
860
+ modifiedById,
861
+ createdById
862
+ }
863
+ })
864
+ if (created){
865
+ logger.info(`New schedule record created ${createdCounter + 1}/${createdCounter + 1}: [${record.from} - ${record.to}] ${record.name} `)
866
+ createdCounter++;
867
+ }
868
+ else {
869
+ const errorMsg = `Record schedule already exists [${record.from} - ${record.to}] ${record.name}`;
870
+
871
+ if (!uniqueErrors.has(errorMsg)) {
872
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
873
+ uniqueErrors.add(errorMsg);
874
+ errorCounter++;
875
+ }
876
+ }
877
+
878
+ } catch (error) {
879
+ console.error(error);
880
+ }
881
+ }
882
+
883
+ console.log("");
884
+ console.log("########################################################")
885
+ console.log("")
886
+ logger.info(' Schedule Data Migration Completed');
887
+ logger.info(`Total successful Schedule records created: ${createdCounter}/${createdCounter}`);
888
+ logger.info(`Total Schedule Error Records: ${errorCounter}/${errorCounter}`);
889
+ console.log("")
890
+ console.log("########################################################")
891
+ console.log("")
892
+
893
+ let totalSummary = {
894
+ itemLength: scheduleApi.length,
895
+ error: errorCounter,
896
+ success: createdCounter
897
+ }
898
+ return totalSummary
899
+
900
+ } catch (error) {
901
+ console.error(error);
902
+ }
903
+ },
904
+
905
+ async Student(){
906
+ try {
907
+ console.log("");
908
+ console.log("########################################################")
909
+ console.log(" Students Migration ")
910
+ console.log("########################################################")
911
+ console.log("");
912
+
913
+ const studentApi = await api.Student()
914
+
915
+ const campusSeq = await Campuses.findAll()
916
+ const courseSeq = await Courses.findAll()
917
+ const collegeSeq = await Colleges.findAll()
918
+ const semesterSeq = await Semesters.findAll()
919
+ const acadYearSeq = await AcademicYears.findAll()
920
+
921
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
922
+
923
+ let createdCounter = 0
924
+ let errorCounter = 0
925
+ let uniqueErrors = new Set()
926
+
927
+ const emailDomain = 'default.msc.edu.ph';
928
+
929
+
930
+ const {data} = studentApi
931
+ for (let i = 0; i < data.length; i++){
932
+ try {
933
+
934
+ let _student = data[i]
935
+
936
+
937
+ let _campus = campusSeq.find(a => a.name === _student?.campus)
938
+ let _course = courseSeq.find(b => b.name === _student?.course)
939
+ let _college = collegeSeq.find(c => c.name === _student?.college)
940
+
941
+ const getLastName = _student?.last_name.toLowerCase().replace(/\s/g, '') ?? "";
942
+
943
+ let email = `${_student?.student_number}_${getLastName}@${emailDomain}`;
944
+
945
+ let modifiedById = userMail._id
946
+ let createdById = userMail._id
947
+
948
+ let campusDefault = 999999
949
+ let courseDefault = 999999
950
+ let collegeDefault = 999999
951
+
952
+ let semester = "2nd Semester"
953
+ let _semester = semesterSeq.find(sem => sem.code === semester)
954
+
955
+ let acadFrom = 2023
956
+ let acadTo = 2024
957
+
958
+
959
+
960
+
961
+
962
+ let _acadYear = acadYearSeq.find(yr => yr.from === acadFrom && yr.to === acadTo)
963
+
964
+ let [record, created] = await Students.findOrCreate({
965
+ where:{
966
+ studentNumber: _student?.student_number,
967
+ firstName: _student?.first_name,
968
+ lastName: _student?.last_name,
969
+ middleName: _student?.middle_name,
970
+ },
971
+ defaults:{
972
+ email: email,
973
+ courseId: _course?._id??courseDefault,
974
+ campusId: _campus?._id??campusDefault,
975
+ collegeId: _college?._id??collegeDefault,
976
+ admittedYearId: _acadYear?._id ?? null,
977
+ admittedSemId: _semester?._id ?? null,
978
+ modifiedById,
979
+ createdById
980
+ }
981
+ })
982
+ if (created){
983
+ logger.info(`New student record created ${createdCounter + 1}/${createdCounter + 1}: [${record.studentNumber}] ${record.lastName}, ${record.firstName} ${record.middleName} `)
984
+ createdCounter++;
985
+ }
986
+ else {
987
+
988
+ const errorMsg = `Record student already exists [${record.studentNumber}] ${record.lastName}, ${record.firstName} ${record.middleName}`;
989
+
990
+ if (!uniqueErrors.has(errorMsg)) {
991
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
992
+ uniqueErrors.add(errorMsg);
993
+ errorCounter++;
994
+ }
995
+
996
+ }
997
+
998
+ } catch (error) {
999
+ console.error(error);
1000
+ }
1001
+ }
1002
+
1003
+ console.log("");
1004
+ console.log("########################################################")
1005
+ console.log("")
1006
+ logger.info(' Student Data Migration Completed');
1007
+ logger.info(`Total successful Student records created: ${createdCounter}/${createdCounter}`);
1008
+ logger.info(`Total Student Error Records: ${errorCounter}/${errorCounter}`);
1009
+ console.log("")
1010
+ console.log("########################################################")
1011
+ console.log("")
1012
+
1013
+ let totalSummary = {
1014
+ itemLength: data.length,
1015
+ error: errorCounter,
1016
+ success: createdCounter
1017
+ }
1018
+ return totalSummary
1019
+
1020
+ } catch (error) {
1021
+ console.error(error);
1022
+
1023
+ }
1024
+ },
1025
+
1026
+ async Section() {
1027
+ try {
1028
+ console.log("");
1029
+ console.log("########################################################");
1030
+ console.log(" Sections Migration ");
1031
+ console.log("########################################################");
1032
+ console.log("");
1033
+
1034
+ const student = (await api.Student()).data;
1035
+
1036
+ const subjectApi = await api.Subject();
1037
+ const instructorApi = await api.Instructor()
1038
+
1039
+ const subjectSeq = await Subjects.findAll();
1040
+ const instructorSeq = await Instructors.findAll()
1041
+ const courseSeq = await Courses.findAll()
1042
+ const campusSeq = await Campuses.findAll()
1043
+ const semesterSeq = await Semesters.findAll()
1044
+ const acadYearSeq = await AcademicYears.findAll()
1045
+ const acadDeptSeq = await AcademicDepartments.findAll()
1046
+
1047
+
1048
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
1049
+
1050
+ let createdCounter = 0
1051
+ let errorCounter = 0
1052
+ let uniqueErrors = new Set()
1053
+
1054
+ for (let i = 0; i < student.length; i++) {
1055
+ try {
1056
+
1057
+ let _sec = student[i]
1058
+
1059
+ let _course = courseSeq.find(crs => crs.name === _sec?.course)
1060
+ let _campus = campusSeq.find(cam => cam.name === _sec?.campus)
1061
+ let _section = student[i].subjects_enrolled;
1062
+
1063
+
1064
+ for (let j = 0; j < _section.length; j++) {
1065
+ let sections = _section[j].section_name
1066
+ let subjects = _section[j].subject_code;
1067
+ let instructors = _section[j].faculty_id
1068
+
1069
+ let _subject = subjectApi.find(sub => sub.code === subjects);
1070
+
1071
+ let _instructor = instructorApi.find( ins => ins.faculty_id === instructors)
1072
+
1073
+ let _subjects = subjectSeq.find( subs => subs.code === _subject?.code)
1074
+
1075
+ let _instructors = instructorSeq.find(inst => inst.employeeNumber === _instructor?.faculty_id)
1076
+
1077
+ let _insdepartment = acadDeptSeq.find(idep => idep.name === _instructor?.department_name)
1078
+
1079
+
1080
+ if (!_subject) {
1081
+ // console.error(`Subject with code ${subjects} not found.`);
1082
+ continue;
1083
+ }
1084
+
1085
+ if (!_instructor) {
1086
+ // console.error(`Instructor with faculty_id ${instructors} not found.`);
1087
+ continue;
1088
+ }
1089
+
1090
+
1091
+
1092
+
1093
+ let code = sections ?? 'CODE'
1094
+ code = code.split(/\s+/).map((word) => word.charAt(0).toUpperCase()).join('')
1095
+
1096
+ let semester = "2nd Semester"
1097
+ let _semester = semesterSeq.find(sem => sem.code === semester)
1098
+
1099
+ let acadFrom = 2023
1100
+ let acadTo = 2024
1101
+
1102
+ let _acadYear = acadYearSeq.find(yr => yr.from === acadFrom && yr.to === acadTo)
1103
+
1104
+
1105
+ let modifiedById = userMail._id;
1106
+ let createdById = userMail._id;
1107
+
1108
+ let defaultSub = 99999
1109
+ let defaultInst = 99999
1110
+
1111
+ let classType = 'SYNCHRONOUS'
1112
+
1113
+ let [record, created] = await Sections.findOrCreate({
1114
+ where: {
1115
+ name: sections,
1116
+ code,
1117
+ subjectId: _subjects?._id??defaultSub??null,
1118
+ instructorId: _instructors?._id??defaultInst??null,
1119
+ classType,
1120
+ semesterId: _semester?._id??null,
1121
+ academicYearId: _acadYear?._id??null,
1122
+ courseId: _course?._id??null,
1123
+ campusId: _campus?._id??null,
1124
+ departmentId: _insdepartment?._id??null,
1125
+ modifiedById,
1126
+ createdById,
1127
+
1128
+ },
1129
+ defaults: {
1130
+ // classType,
1131
+ // semesterId: _semester?._id??null,
1132
+ // academicYearId: _acadYear?._id??null,
1133
+ // courseId: _course?._id??null,
1134
+ // campusId: _campus?._id??null,
1135
+ // modifiedById,
1136
+ // createdById,
1137
+ }
1138
+ });
1139
+
1140
+ if (created) {
1141
+ logger.info(`New section record created ${createdCounter + 1}/${createdCounter + 1}: ${record.name} `);
1142
+ createdCounter++;
1143
+ } else {
1144
+
1145
+ const errorMsg = `Record section already exists ${record.name} `;
1146
+
1147
+ if (!uniqueErrors.has(errorMsg)) {
1148
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
1149
+ uniqueErrors.add(errorMsg);
1150
+ errorCounter++;
1151
+ }
1152
+ }
1153
+ }
1154
+ } catch (error) {
1155
+ console.error(error);
1156
+ }
1157
+ }
1158
+
1159
+ console.log("");
1160
+ console.log("########################################################");
1161
+ console.log("");
1162
+ logger.info(' Section Data Migration Completed');
1163
+ logger.info(`Total successful Section records created: ${createdCounter}/${createdCounter}`);
1164
+ logger.info(`Total Section Error Records: ${errorCounter}/${errorCounter}`);
1165
+ console.log("");
1166
+ console.log("########################################################");
1167
+ console.log("");
1168
+
1169
+ let totalSummary = {
1170
+ itemLength: student.length,
1171
+ error: errorCounter,
1172
+ success: createdCounter
1173
+ };
1174
+ return totalSummary;
1175
+
1176
+ } catch (error) {
1177
+ console.error(error);
1178
+ }
1179
+ },
1180
+
1181
+
1182
+ async EnrolledStudent(){
1183
+ try {
1184
+ console.log("");
1185
+ console.log("########################################################")
1186
+ console.log(" Enrolled Students Migration ")
1187
+ console.log("########################################################")
1188
+ console.log("");
1189
+
1190
+ const studentApi = (await api.Student()).data
1191
+
1192
+ const sectionsApi = await api.Section()
1193
+ const instructorApi = await api.Instructor()
1194
+
1195
+
1196
+ const studentSeq = await Students.findAll()
1197
+ const courseSeq = await Courses.findAll()
1198
+ const campusSeq = await Campuses.findAll()
1199
+ const acadYearSeq = await AcademicYears.findAll()
1200
+ const semesterSeq = await Semesters.findAll()
1201
+ const sectionSeq = await Sections.findAll()
1202
+ const instructorSeq = await Instructors.findAll()
1203
+
1204
+ const userMail = await Users.findOne({ where: { email: 'ccci_integrator@gmail.com' } });
1205
+
1206
+ let createdCounter = 0
1207
+ let errorCounter = 0
1208
+ let uniqueErrors = new Set()
1209
+
1210
+ for (let i = 0; i < studentApi.length; i++){
1211
+ try {
1212
+
1213
+ let _student = studentApi[i]
1214
+
1215
+ let student = studentSeq.find(st => st.studentNumber === _student?.student_number)
1216
+
1217
+ let campus = campusSeq.find(ca => ca.name === _student?.campus)
1218
+ let course = courseSeq.find(cr => cr.name === _student?.course)
1219
+
1220
+ let _students = studentApi[i].subjects_enrolled
1221
+
1222
+ let semester = "2nd Semester"
1223
+ let _semester = semesterSeq.find(sem => sem.code === semester)
1224
+
1225
+ let acadFrom = 2023
1226
+ let acadTo = 2024
1227
+ let _acadYear = acadYearSeq.find(yr => yr.from === acadFrom && yr.to === acadTo)
1228
+
1229
+ let modifiedById = userMail._id;
1230
+ let createdById = userMail._id;
1231
+
1232
+ for (let j = 0; j < _students.length; j++){
1233
+
1234
+ let instrcutor = _students[j].faculty_id
1235
+ let sections = _students[j].section_name
1236
+
1237
+ let _inst = instructorApi.find(i => i.faculty_id === instrcutor)
1238
+
1239
+
1240
+ let _instructor = instructorSeq.find(ins => ins.employeeNumber === _inst?.faculty_id)
1241
+
1242
+ let _section = sectionSeq.find(sec => sec.name === sections)
1243
+
1244
+
1245
+
1246
+ if (!_inst) {
1247
+ continue;
1248
+ }
1249
+
1250
+ if (!_student) {
1251
+ continue;
1252
+ }
1253
+
1254
+ if (!student) {
1255
+ continue;
1256
+ }
1257
+
1258
+
1259
+ // return
1260
+ let [record, created] = await EnrolledStudents.findOrCreate({
1261
+ where:{
1262
+ studentId: student?._id,
1263
+ courseId: course?._id,
1264
+ instructorId: _instructor?._id??null,
1265
+ sectionId: _section?._id??null,
1266
+ campusId: campus?._id,
1267
+ academicYearId: _acadYear?._id,
1268
+ semesterId: _semester?._id,
1269
+ createdById,
1270
+ modifiedById,
1271
+ },
1272
+ default:{
1273
+
1274
+ }
1275
+ })
1276
+
1277
+ if (created) {
1278
+ logger.info(`New enrolled student record created ${createdCounter + 1}/${createdCounter + 1}: studentId = [${record.studentId}], sectionId = [${record.sectionId}], instructorId = [${record.instructorId}]`);
1279
+ createdCounter++;
1280
+ } else {
1281
+
1282
+ const errorMsg = `Record enrolled student already exists studentId = [${record.studentId}], sectionId = [${record.sectionId}], instructorId = [${record.instructorId}]`;
1283
+
1284
+ if (!uniqueErrors.has(errorMsg)) {
1285
+ logger.error(`${errorCounter + 1}/${errorCounter + 1}: ${errorMsg}`);
1286
+ uniqueErrors.add(errorMsg);
1287
+ errorCounter++;
1288
+ }
1289
+ }
1290
+ }
1291
+ } catch (error) {
1292
+ console.error(error);
1293
+ }
1294
+ }
1295
+
1296
+ console.log("");
1297
+ console.log("########################################################")
1298
+ console.log("")
1299
+ logger.info(' Enrolled Student Data Migration Completed');
1300
+ logger.info(`Total successful Enrolled Student records created: ${createdCounter}/${createdCounter}`);
1301
+ logger.info(`Total Enrolled Student Error Records: ${errorCounter}/${errorCounter}`);
1302
+ console.log("")
1303
+ console.log("########################################################")
1304
+ console.log("")
1305
+
1306
+ let totalSummary = {
1307
+ itemLength: studentApi.length,
1308
+ error: errorCounter,
1309
+ success: createdCounter
1310
+ }
1311
+ return totalSummary
1312
+
1313
+ } catch (error) {
1314
+ console.error(error);
1315
+
1316
+ }
1317
+ },
1318
+
1319
+ async executeAll(){
1320
+ await this.Campus()
1321
+ await this.College()
1322
+ await this.AcademicDepartment()
1323
+ await this.Course()
1324
+ await this.Room()
1325
+ await this.Instructor()
1326
+ await this.AcademicYear()
1327
+ await this.Subject()
1328
+ await this.Schedule()
1329
+ await this.Student()
1330
+ await this.Section()
1331
+ await this.EnrolledStudent()
1332
+
1333
+ }
1334
+ }
1335
+
1336
+
1337
+ module.exports = server