@universis/accommodation 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/.gitlab-ci.yml +23 -0
  2. package/LICENSE +163 -0
  3. package/README.md +3 -0
  4. package/dist/AccommodationSchemaLoader.js +35 -0
  5. package/dist/AccommodationSchemaLoader.js.map +1 -0
  6. package/dist/AccommodationService.js +68 -0
  7. package/dist/AccommodationService.js.map +1 -0
  8. package/dist/DepartmentReplacer.js +54 -0
  9. package/dist/DepartmentReplacer.js.map +1 -0
  10. package/dist/StudentReplacer.js +75 -0
  11. package/dist/StudentReplacer.js.map +1 -0
  12. package/dist/config/models/Accommodation.json +96 -0
  13. package/dist/config/models/AccommodationCardEffectiveStatusType.json +107 -0
  14. package/dist/config/models/AccommodationCardEffectiveStatusTypeLocale.json +85 -0
  15. package/dist/config/models/AccommodationChildFinancialAttribute.json +46 -0
  16. package/dist/config/models/AccommodationGuardianFinancialAttribute.json +46 -0
  17. package/dist/config/models/AccommodationInscriptionModeTag.json +100 -0
  18. package/dist/config/models/AccommodationRequestAction.json +500 -0
  19. package/dist/config/models/AccommodationRequestActionMessage.json +46 -0
  20. package/dist/config/models/AccommodationRequestActionReview.json +31 -0
  21. package/dist/config/models/AccommodationRequestAttachmentConfiguration.json +72 -0
  22. package/dist/config/models/AccommodationRequestCategory.json +50 -0
  23. package/dist/config/models/AccommodationRequestEffectiveStatusType.json +212 -0
  24. package/dist/config/models/AccommodationRequestEffectiveStatusTypeLocale.json +85 -0
  25. package/dist/config/models/AccommodationRequestEvent.json +117 -0
  26. package/dist/config/models/AccommodationRequestFinancialAttribute.json +53 -0
  27. package/dist/config/models/AccommodationRoom.json +151 -0
  28. package/dist/config/models/AccommodationSiblingFinancialAttribute.json +57 -0
  29. package/dist/config/models/CancelAccommodationCardAction.json +32 -0
  30. package/dist/config/models/GuardianType.json +78 -0
  31. package/dist/config/models/Review.json +50 -0
  32. package/dist/config/models/RoomType.json +320 -0
  33. package/dist/config/models/RoomTypeLocale.json +86 -0
  34. package/dist/config/models/StudentAccommodationCard.json +158 -0
  35. package/dist/config/models/TestAction.json +50 -0
  36. package/dist/config/scope.access.js +148 -0
  37. package/dist/config/scope.access.js.map +1 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +3 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/listeners/AddDefaultAttachmentConfiguration.js +44 -0
  42. package/dist/listeners/AddDefaultAttachmentConfiguration.js.map +1 -0
  43. package/dist/listeners/DefaultAttachmentConfigurations.json +277 -0
  44. package/dist/listeners/DefaultAttachmentTypes.json +523 -0
  45. package/dist/listeners/GenerateRequestNumberListener.js +87 -0
  46. package/dist/listeners/GenerateRequestNumberListener.js.map +1 -0
  47. package/dist/listeners/OnActionCompleteListener.js +96 -0
  48. package/dist/listeners/OnActionCompleteListener.js.map +1 -0
  49. package/dist/listeners/OnCancelAccommodationCardListener.js +87 -0
  50. package/dist/listeners/OnCancelAccommodationCardListener.js.map +1 -0
  51. package/dist/listeners/OnReactivateAccommodationCardListener.js +87 -0
  52. package/dist/listeners/OnReactivateAccommodationCardListener.js.map +1 -0
  53. package/dist/listeners/SendEmailAfterActionStatusChangeListener.js +98 -0
  54. package/dist/listeners/SendEmailAfterActionStatusChangeListener.js.map +1 -0
  55. package/dist/listeners/SendEmailAfterCardStatusChangeListener.js +139 -0
  56. package/dist/listeners/SendEmailAfterCardStatusChangeListener.js.map +1 -0
  57. package/dist/listeners/StudentAccommodationCardSaveListener.js +90 -0
  58. package/dist/listeners/StudentAccommodationCardSaveListener.js.map +1 -0
  59. package/dist/listeners/UpdateStudentAccommodationCardListener.js +70 -0
  60. package/dist/listeners/UpdateStudentAccommodationCardListener.js.map +1 -0
  61. package/dist/listeners/ValidateActionListener.js +348 -0
  62. package/dist/listeners/ValidateActionListener.js.map +1 -0
  63. package/dist/listeners/data-localization.js +209 -0
  64. package/dist/listeners/data-localization.js.map +1 -0
  65. package/dist/listeners/lookup-cache-listener.js +90 -0
  66. package/dist/listeners/lookup-cache-listener.js.map +1 -0
  67. package/dist/models/Accommodation.js +53 -0
  68. package/dist/models/Accommodation.js.map +1 -0
  69. package/dist/models/AccommodationRequestAction.js +214 -0
  70. package/dist/models/AccommodationRequestAction.js.map +1 -0
  71. package/dist/models/AccommodationRequestEvent.js +277 -0
  72. package/dist/models/AccommodationRequestEvent.js.map +1 -0
  73. package/dist/models/EnableAttachmentModel.js +210 -0
  74. package/dist/models/EnableAttachmentModel.js.map +1 -0
  75. package/dist/models/StudentAccommodationCard.js +93 -0
  76. package/dist/models/StudentAccommodationCard.js.map +1 -0
  77. package/dist/models/TestAction.d.ts +5 -0
  78. package/dist/models/TestAction.js +5 -0
  79. package/dist/models/TestAction.js.map +1 -0
  80. package/dist/templates/mail-after-dining-request-status-change/html.ejs +27 -0
  81. package/package.json +57 -0
  82. package/src/AccommodationSchemaLoader.js +35 -0
  83. package/src/AccommodationService.js +67 -0
  84. package/src/DepartmentReplacer.js +53 -0
  85. package/src/StudentReplacer.js +74 -0
  86. package/src/config/models/Accommodation.json +96 -0
  87. package/src/config/models/AccommodationCardEffectiveStatusType.json +107 -0
  88. package/src/config/models/AccommodationCardEffectiveStatusTypeLocale.json +85 -0
  89. package/src/config/models/AccommodationChildFinancialAttribute.json +46 -0
  90. package/src/config/models/AccommodationGuardianFinancialAttribute.json +46 -0
  91. package/src/config/models/AccommodationInscriptionModeTag.json +100 -0
  92. package/src/config/models/AccommodationRequestAction.json +500 -0
  93. package/src/config/models/AccommodationRequestActionMessage.json +46 -0
  94. package/src/config/models/AccommodationRequestActionReview.json +31 -0
  95. package/src/config/models/AccommodationRequestAttachmentConfiguration.json +72 -0
  96. package/src/config/models/AccommodationRequestCategory.json +50 -0
  97. package/src/config/models/AccommodationRequestEffectiveStatusType.json +212 -0
  98. package/src/config/models/AccommodationRequestEffectiveStatusTypeLocale.json +85 -0
  99. package/src/config/models/AccommodationRequestEvent.json +117 -0
  100. package/src/config/models/AccommodationRequestFinancialAttribute.json +53 -0
  101. package/src/config/models/AccommodationRoom.json +151 -0
  102. package/src/config/models/AccommodationSiblingFinancialAttribute.json +57 -0
  103. package/src/config/models/CancelAccommodationCardAction.json +32 -0
  104. package/src/config/models/GuardianType.json +78 -0
  105. package/src/config/models/Review.json +50 -0
  106. package/src/config/models/RoomType.json +320 -0
  107. package/src/config/models/RoomTypeLocale.json +86 -0
  108. package/src/config/models/StudentAccommodationCard.json +158 -0
  109. package/src/config/models/TestAction.json +50 -0
  110. package/src/config/scope.access.js +148 -0
  111. package/src/index.d.ts +2 -0
  112. package/src/index.js +2 -0
  113. package/src/listeners/AddDefaultAttachmentConfiguration.js +43 -0
  114. package/src/listeners/DefaultAttachmentConfigurations.json +277 -0
  115. package/src/listeners/DefaultAttachmentTypes.json +523 -0
  116. package/src/listeners/GenerateRequestNumberListener.js +86 -0
  117. package/src/listeners/OnActionCompleteListener.js +95 -0
  118. package/src/listeners/OnCancelAccommodationCardListener.js +86 -0
  119. package/src/listeners/OnReactivateAccommodationCardListener.js +86 -0
  120. package/src/listeners/SendEmailAfterActionStatusChangeListener.js +97 -0
  121. package/src/listeners/SendEmailAfterCardStatusChangeListener.js +138 -0
  122. package/src/listeners/StudentAccommodationCardSaveListener.js +89 -0
  123. package/src/listeners/UpdateStudentAccommodationCardListener.js +69 -0
  124. package/src/listeners/ValidateActionListener.js +347 -0
  125. package/src/listeners/data-localization.js +214 -0
  126. package/src/listeners/lookup-cache-listener.js +89 -0
  127. package/src/models/Accommodation.js +52 -0
  128. package/src/models/AccommodationRequestAction.js +195 -0
  129. package/src/models/AccommodationRequestEvent.js +276 -0
  130. package/src/models/EnableAttachmentModel.js +209 -0
  131. package/src/models/StudentAccommodationCard.js +92 -0
  132. package/src/models/TestAction.d.ts +5 -0
  133. package/src/models/TestAction.js +10 -0
  134. package/src/templates/mail-after-dining-request-status-change/html.ejs +27 -0
@@ -0,0 +1,96 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.afterSave = afterSave;exports.beforeSave = beforeSave; // eslint-disable-next-line no-unused-vars
2
+ async function beforeSaveAsync(event) {
3
+ const context = event.model.context;
4
+ }
5
+
6
+ async function afterSaveAsync(event) {
7
+ // get context
8
+ // eslint-disable-next-line no-unused-vars
9
+ const context = event.model.context;
10
+ // get current status
11
+ const request = await event.model.where('id').equal(event.target.id).
12
+ expand({
13
+ name: 'accommodationRequestEvent',
14
+ options: {
15
+ $expand: 'academicYear,academicPeriod'
16
+ }
17
+ }).getItem();
18
+ const actionStatus = request && request.actionStatus && request.actionStatus.alternateName ? request.actionStatus.alternateName : null;
19
+ if ((actionStatus || actionStatus.alternateName) === 'CompletedActionStatus') {
20
+ // set student accommodation card
21
+ const now = new Date();
22
+
23
+ // const now = new Date();
24
+ let academicYear = request && request.accommodationRequestEvent && request.accommodationRequestEvent.academicYear ? request.accommodationRequestEvent.academicYear : null;
25
+ let academicPeriod = request && request.accommodationRequestEvent && request.accommodationRequestEvent.academicPeriod ? request.accommodationRequestEvent.academicPeriod : null;
26
+ let validThrough = request && request.accommodationRequestEvent && request.accommodationRequestEvent.validThrough ? request.accommodationRequestEvent.validThrough : null;
27
+ // get original student
28
+ const student = await context.model('Student').where('id').equal(request.student.id || request.student).
29
+ expand({
30
+ name: 'department',
31
+ options: {
32
+ $expand: 'currentYear,currentPeriod'
33
+ }
34
+ }).getItem();
35
+ if (student == null) {
36
+ throw new Error(`Student with id ${request.student.id || request.student} not found.`);
37
+ }
38
+
39
+ if (academicYear == null) {
40
+ // get student current academic year
41
+
42
+ academicYear = student && student.department && student.department.currentYear ? student.department.currentYear : null;
43
+ // await event.model.where('id').equal(event.target.id).select('student/department/currentYear').value();
44
+ }
45
+ if (academicPeriod == null) {
46
+ // get student current academic period
47
+ academicPeriod = student && student.department && student.department.currentPeriod ? student.department.currentPeriod : null;
48
+ }
49
+ let cardActionStatus = {};
50
+ if (event.target.accommodation && (Object.keys(event.target.accommodation).length === 0 || event.target.accommodation === '')) {
51
+ // get accommodation valid through date
52
+ cardActionStatus = { alternateName: 'PotentialActionStatus' };
53
+
54
+ } else {
55
+ cardActionStatus = { alternateName: 'CompletedActionStatus' };
56
+ }
57
+
58
+ const StudentAccommodationCard = {
59
+ action: event.target.id,
60
+ student: student,
61
+ academicYear: academicYear,
62
+ academicPeriod: academicPeriod,
63
+ validFrom: now,
64
+ validThrough: validThrough,
65
+ cardStatus: cardActionStatus,
66
+ accommodationRoom: event.target.room || null
67
+ };
68
+ // save student accommodation card
69
+ await context.model('StudentAccommodationCard').silent().save(StudentAccommodationCard);
70
+ }
71
+ }
72
+
73
+ /**
74
+ * @param {DataEventArgs} event
75
+ * @param {Function} callback
76
+ */
77
+ function beforeSave(event, callback) {
78
+ return beforeSaveAsync(event).then(() => {
79
+ return callback();
80
+ }).catch((err) => {
81
+ return callback(err);
82
+ });
83
+ }
84
+
85
+ /**
86
+ * @param {DataEventArgs} event
87
+ * @param {Function} callback
88
+ */
89
+ function afterSave(event, callback) {
90
+ return afterSaveAsync(event).then(() => {
91
+ return callback();
92
+ }).catch((err) => {
93
+ return callback(err);
94
+ });
95
+ }
96
+ //# sourceMappingURL=OnActionCompleteListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnActionCompleteListener.js","names":["beforeSaveAsync","event","context","model","afterSaveAsync","request","where","equal","target","id","expand","name","options","$expand","getItem","actionStatus","alternateName","now","Date","academicYear","accommodationRequestEvent","academicPeriod","validThrough","student","Error","department","currentYear","currentPeriod","cardActionStatus","accommodation","Object","keys","length","StudentAccommodationCard","action","validFrom","cardStatus","accommodationRoom","room","silent","save","beforeSave","callback","then","catch","err","afterSave"],"sources":["../../src/listeners/OnActionCompleteListener.js"],"sourcesContent":["// eslint-disable-next-line no-unused-vars\nasync function beforeSaveAsync(event) {\n const context = event.model.context;\n}\n\nasync function afterSaveAsync(event) {\n // get context\n // eslint-disable-next-line no-unused-vars\n const context = event.model.context;\n // get current status\n const request = await event.model.where('id').equal(event.target.id)\n .expand({\n name: 'accommodationRequestEvent',\n options: {\n $expand: 'academicYear,academicPeriod',\n }\n }).getItem();\n const actionStatus = request && request.actionStatus && request.actionStatus.alternateName ? request.actionStatus.alternateName : null;\n if ((actionStatus || actionStatus.alternateName) === 'CompletedActionStatus') {\n // set student accommodation card\n const now = new Date();\n\n // const now = new Date(); \n let academicYear = request && request.accommodationRequestEvent && request.accommodationRequestEvent.academicYear ? request.accommodationRequestEvent.academicYear : null;\n let academicPeriod = request && request.accommodationRequestEvent && request.accommodationRequestEvent.academicPeriod ? request.accommodationRequestEvent.academicPeriod : null;\n let validThrough = request && request.accommodationRequestEvent && request.accommodationRequestEvent.validThrough ? request.accommodationRequestEvent.validThrough : null;\n // get original student\n const student = await context.model('Student').where('id').equal(request.student.id || request.student)\n .expand({\n name: 'department',\n options: {\n $expand: 'currentYear,currentPeriod',\n }\n }).getItem();\n if (student == null) {\n throw new Error(`Student with id ${request.student.id || request.student} not found.`);\n }\n\n if (academicYear == null) {\n // get student current academic year\n\n academicYear = student && student.department && student.department.currentYear ? student.department.currentYear : null;\n // await event.model.where('id').equal(event.target.id).select('student/department/currentYear').value();\n }\n if (academicPeriod == null) {\n // get student current academic period\n academicPeriod = student && student.department && student.department.currentPeriod ? student.department.currentPeriod : null;\n }\n let cardActionStatus = {};\n if (event.target.accommodation && (Object.keys(event.target.accommodation).length === 0 || event.target.accommodation === '')) {\n // get accommodation valid through date\n cardActionStatus = { alternateName: 'PotentialActionStatus' }\n\n } else {\n cardActionStatus = { alternateName: 'CompletedActionStatus' }\n }\n\n const StudentAccommodationCard = {\n action: event.target.id,\n student: student,\n academicYear: academicYear,\n academicPeriod: academicPeriod,\n validFrom: now,\n validThrough: validThrough,\n cardStatus: cardActionStatus,\n accommodationRoom: event.target.room || null\n };\n // save student accommodation card \n await context.model('StudentAccommodationCard').silent().save(StudentAccommodationCard);\n }\n}\n\n/**\n * @param {DataEventArgs} event\n * @param {Function} callback\n */\nexport function beforeSave(event, callback) {\n return beforeSaveAsync(event).then(() => {\n return callback();\n }).catch((err) => {\n return callback(err);\n });\n}\n\n/**\n * @param {DataEventArgs} event\n * @param {Function} callback\n */\nexport function afterSave(event, callback) {\n return afterSaveAsync(event).then(() => {\n return callback();\n }).catch((err) => {\n return callback(err);\n });\n}"],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.afterSave = afterSave;exports.beforeSave = beforeSave;var _data = require("@themost/data");
2
+ var _common = require("@themost/common");
3
+ var _util = require("util");
4
+
5
+ async function beforeSaveAsync(event) {
6
+ //
7
+ if (event.state !== 2) {
8
+ return;
9
+ }
10
+
11
+ const context = event.model.context;
12
+
13
+ const previous = event.previous;
14
+ if (previous == null) {
15
+ throw new _common.DataError('E_PREVIOUS', 'The previous state of the object cannot be determined');
16
+ }
17
+
18
+ const target = event.target;
19
+
20
+ if (target.active === false && previous.active === true) {
21
+ // get validator listener
22
+ const validator = new _data.DataPermissionEventListener();
23
+ // noinspection JSUnresolvedFunction
24
+ const validateAsync = (0, _util.promisify)(validator.validate).
25
+ bind(validator);
26
+ // validate StudentAccommodationCard/Cancel execute permission
27
+ const validateEvent = {
28
+ model: context.model('StudentAccommodationCard'),
29
+ privilege: 'StudentAccommodationCard/Cancel',
30
+ mask: _data.PermissionMask.Execute,
31
+ target: event.target && event.target.id,
32
+ throwError: true
33
+ };
34
+ await validateAsync(validateEvent);
35
+
36
+ }
37
+ }
38
+
39
+ async function afterSaveAsync(event) {
40
+ if (event.state !== 2) {
41
+ return;
42
+ }
43
+
44
+ const context = event.model.context;
45
+
46
+ const previous = event.previous;
47
+ if (previous == null) {
48
+ throw new _common.DataError('E_PREVIOUS', 'The previous state of the object cannot be determined');
49
+ }
50
+
51
+ const target = event.target;
52
+
53
+ if (target.active === false && previous.active === true) {
54
+ //save
55
+ await context.model('CancelAccommodationCardAction').save({
56
+ accommodationCard: target.id,
57
+ actionStatus: {
58
+ alternateName: 'CompletedActionStatus'
59
+ }
60
+ });
61
+ }
62
+ }
63
+
64
+ /**
65
+ * @param {DataEventArgs} event
66
+ * @param {Function} callback
67
+ */
68
+ function beforeSave(event, callback) {
69
+ return beforeSaveAsync(event).then(() => {
70
+ return callback();
71
+ }).catch((err) => {
72
+ return callback(err);
73
+ });
74
+ }
75
+
76
+ /**
77
+ * @param {DataEventArgs} event
78
+ * @param {Function} callback
79
+ */
80
+ function afterSave(event, callback) {
81
+ return afterSaveAsync(event).then(() => {
82
+ return callback();
83
+ }).catch((err) => {
84
+ return callback(err);
85
+ });
86
+ }
87
+ //# sourceMappingURL=OnCancelAccommodationCardListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnCancelAccommodationCardListener.js","names":["_data","require","_common","_util","beforeSaveAsync","event","state","context","model","previous","DataError","target","active","validator","DataPermissionEventListener","validateAsync","promisify","validate","bind","validateEvent","privilege","mask","PermissionMask","Execute","id","throwError","afterSaveAsync","save","accommodationCard","actionStatus","alternateName","beforeSave","callback","then","catch","err","afterSave"],"sources":["../../src/listeners/OnCancelAccommodationCardListener.js"],"sourcesContent":["import { DataPermissionEventListener, PermissionMask } from \"@themost/data\";\nimport { DataError } from '@themost/common';\nimport { promisify } from \"util\";\n\nasync function beforeSaveAsync(event) {\n //\n if (event.state !== 2) {\n return;\n }\n\n const context = event.model.context;\n\n const previous = event.previous;\n if (previous == null) {\n throw new DataError('E_PREVIOUS', 'The previous state of the object cannot be determined');\n }\n\n const target = event.target;\n\n if (target.active === false && previous.active === true) {\n // get validator listener\n const validator = new DataPermissionEventListener();\n // noinspection JSUnresolvedFunction\n const validateAsync = promisify(validator.validate)\n .bind(validator);\n // validate StudentAccommodationCard/Cancel execute permission\n const validateEvent = {\n model: context.model('StudentAccommodationCard'),\n privilege: 'StudentAccommodationCard/Cancel',\n mask: PermissionMask.Execute,\n target: event.target && event.target.id,\n throwError: true\n }\n await validateAsync(validateEvent);\n\n }\n}\n\nasync function afterSaveAsync(event) {\n if (event.state !== 2) {\n return;\n }\n\n const context = event.model.context;\n\n const previous = event.previous;\n if (previous == null) {\n throw new DataError('E_PREVIOUS', 'The previous state of the object cannot be determined');\n }\n\n const target = event.target;\n\n if (target.active === false && previous.active === true) {\n //save \n await context.model('CancelAccommodationCardAction').save({\n accommodationCard: target.id,\n actionStatus: {\n alternateName: 'CompletedActionStatus'\n }\n })\n }\n}\n\n/**\n * @param {DataEventArgs} event\n * @param {Function} callback\n */\nexport function beforeSave(event, callback) {\n return beforeSaveAsync(event).then(() => {\n return callback();\n }).catch((err) => {\n return callback(err);\n });\n}\n\n/**\n * @param {DataEventArgs} event\n * @param {Function} callback\n */\nexport function afterSave(event, callback) {\n return afterSaveAsync(event).then(() => {\n return callback();\n }).catch((err) => {\n return callback(err);\n });\n}"],"mappings":"yIAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;;AAEA,eAAeG,eAAeA,CAACC,KAAK,EAAE;EAClC;EACA,IAAIA,KAAK,CAACC,KAAK,KAAK,CAAC,EAAE;IACnB;EACJ;;EAEA,MAAMC,OAAO,GAAGF,KAAK,CAACG,KAAK,CAACD,OAAO;;EAEnC,MAAME,QAAQ,GAAGJ,KAAK,CAACI,QAAQ;EAC/B,IAAIA,QAAQ,IAAI,IAAI,EAAE;IAClB,MAAM,IAAIC,iBAAS,CAAC,YAAY,EAAE,uDAAuD,CAAC;EAC9F;;EAEA,MAAMC,MAAM,GAAGN,KAAK,CAACM,MAAM;;EAE3B,IAAIA,MAAM,CAACC,MAAM,KAAK,KAAK,IAAIH,QAAQ,CAACG,MAAM,KAAK,IAAI,EAAE;IACrD;IACA,MAAMC,SAAS,GAAG,IAAIC,iCAA2B,EAAE;IACnD;IACA,MAAMC,aAAa,GAAG,IAAAC,eAAS,EAACH,SAAS,CAACI,QAAQ,CAAC;IAC9CC,IAAI,CAACL,SAAS,CAAC;IACpB;IACA,MAAMM,aAAa,GAAG;MAClBX,KAAK,EAAED,OAAO,CAACC,KAAK,CAAC,0BAA0B,CAAC;MAChDY,SAAS,EAAE,iCAAiC;MAC5CC,IAAI,EAAEC,oBAAc,CAACC,OAAO;MAC5BZ,MAAM,EAAEN,KAAK,CAACM,MAAM,IAAIN,KAAK,CAACM,MAAM,CAACa,EAAE;MACvCC,UAAU,EAAE;IAChB,CAAC;IACD,MAAMV,aAAa,CAACI,aAAa,CAAC;;EAEtC;AACJ;;AAEA,eAAeO,cAAcA,CAACrB,KAAK,EAAE;EACjC,IAAIA,KAAK,CAACC,KAAK,KAAK,CAAC,EAAE;IACnB;EACJ;;EAEA,MAAMC,OAAO,GAAGF,KAAK,CAACG,KAAK,CAACD,OAAO;;EAEnC,MAAME,QAAQ,GAAGJ,KAAK,CAACI,QAAQ;EAC/B,IAAIA,QAAQ,IAAI,IAAI,EAAE;IAClB,MAAM,IAAIC,iBAAS,CAAC,YAAY,EAAE,uDAAuD,CAAC;EAC9F;;EAEA,MAAMC,MAAM,GAAGN,KAAK,CAACM,MAAM;;EAE3B,IAAIA,MAAM,CAACC,MAAM,KAAK,KAAK,IAAIH,QAAQ,CAACG,MAAM,KAAK,IAAI,EAAE;IACrD;IACA,MAAML,OAAO,CAACC,KAAK,CAAC,+BAA+B,CAAC,CAACmB,IAAI,CAAC;MACtDC,iBAAiB,EAAEjB,MAAM,CAACa,EAAE;MAC5BK,YAAY,EAAE;QACVC,aAAa,EAAE;MACnB;IACJ,CAAC,CAAC;EACN;AACJ;;AAEA;AACA;AACA;AACA;AACO,SAASC,UAAUA,CAAC1B,KAAK,EAAE2B,QAAQ,EAAE;EACxC,OAAO5B,eAAe,CAACC,KAAK,CAAC,CAAC4B,IAAI,CAAC,MAAM;IACrC,OAAOD,QAAQ,EAAE;EACrB,CAAC,CAAC,CAACE,KAAK,CAAC,CAACC,GAAG,KAAK;IACd,OAAOH,QAAQ,CAACG,GAAG,CAAC;EACxB,CAAC,CAAC;AACN;;AAEA;AACA;AACA;AACA;AACO,SAASC,SAASA,CAAC/B,KAAK,EAAE2B,QAAQ,EAAE;EACvC,OAAON,cAAc,CAACrB,KAAK,CAAC,CAAC4B,IAAI,CAAC,MAAM;IACpC,OAAOD,QAAQ,EAAE;EACrB,CAAC,CAAC,CAACE,KAAK,CAAC,CAACC,GAAG,KAAK;IACd,OAAOH,QAAQ,CAACG,GAAG,CAAC;EACxB,CAAC,CAAC;AACN"}
@@ -0,0 +1,87 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.afterSave = afterSave;exports.beforeSave = beforeSave;var _data = require("@themost/data");
2
+ var _common = require("@themost/common");
3
+ var _util = require("util");
4
+
5
+ async function beforeSaveAsync(event) {
6
+ //
7
+ if (event.state !== 2) {
8
+ return;
9
+ }
10
+
11
+ const context = event.model.context;
12
+
13
+ const previous = event.previous;
14
+ if (previous == null) {
15
+ throw new _common.DataError('E_PREVIOUS', 'The previous state of the object cannot be determined');
16
+ }
17
+
18
+ const target = event.target;
19
+
20
+ if (target.active === false && previous.active === true) {
21
+ // get validator listener
22
+ const validator = new _data.DataPermissionEventListener();
23
+ // noinspection JSUnresolvedFunction
24
+ const validateAsync = (0, _util.promisify)(validator.validate).
25
+ bind(validator);
26
+ // validate StudentAccommodationCard/Cancel execute permission
27
+ const validateEvent = {
28
+ model: context.model('StudentAccommodationCard'),
29
+ privilege: 'StudentAccommodationCard/Cancel',
30
+ mask: _data.PermissionMask.Execute,
31
+ target: event.target && event.target.id,
32
+ throwError: true
33
+ };
34
+ await validateAsync(validateEvent);
35
+
36
+ }
37
+ }
38
+
39
+ async function afterSaveAsync(event) {
40
+ if (event.state !== 2) {
41
+ return;
42
+ }
43
+
44
+ const context = event.model.context;
45
+
46
+ const previous = event.previous;
47
+ if (previous == null) {
48
+ throw new _common.DataError('E_PREVIOUS', 'The previous state of the object cannot be determined');
49
+ }
50
+
51
+ const target = event.target;
52
+
53
+ if (target.active === false && previous.active === true) {
54
+ //save
55
+ await context.model('CancelAccommodationCardAction').save({
56
+ accommodationCard: target.id,
57
+ actionStatus: {
58
+ alternateName: 'CompletedActionStatus'
59
+ }
60
+ });
61
+ }
62
+ }
63
+
64
+ /**
65
+ * @param {DataEventArgs} event
66
+ * @param {Function} callback
67
+ */
68
+ function beforeSave(event, callback) {
69
+ return beforeSaveAsync(event).then(() => {
70
+ return callback();
71
+ }).catch((err) => {
72
+ return callback(err);
73
+ });
74
+ }
75
+
76
+ /**
77
+ * @param {DataEventArgs} event
78
+ * @param {Function} callback
79
+ */
80
+ function afterSave(event, callback) {
81
+ return afterSaveAsync(event).then(() => {
82
+ return callback();
83
+ }).catch((err) => {
84
+ return callback(err);
85
+ });
86
+ }
87
+ //# sourceMappingURL=OnReactivateAccommodationCardListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnReactivateAccommodationCardListener.js","names":["_data","require","_common","_util","beforeSaveAsync","event","state","context","model","previous","DataError","target","active","validator","DataPermissionEventListener","validateAsync","promisify","validate","bind","validateEvent","privilege","mask","PermissionMask","Execute","id","throwError","afterSaveAsync","save","accommodationCard","actionStatus","alternateName","beforeSave","callback","then","catch","err","afterSave"],"sources":["../../src/listeners/OnReactivateAccommodationCardListener.js"],"sourcesContent":["import { DataPermissionEventListener, PermissionMask } from \"@themost/data\";\nimport { DataError } from '@themost/common';\nimport { promisify } from \"util\";\n\nasync function beforeSaveAsync(event) {\n //\n if (event.state !== 2) {\n return;\n }\n\n const context = event.model.context;\n\n const previous = event.previous;\n if (previous == null) {\n throw new DataError('E_PREVIOUS', 'The previous state of the object cannot be determined');\n }\n\n const target = event.target;\n\n if (target.active === false && previous.active === true) {\n // get validator listener\n const validator = new DataPermissionEventListener();\n // noinspection JSUnresolvedFunction\n const validateAsync = promisify(validator.validate)\n .bind(validator);\n // validate StudentAccommodationCard/Cancel execute permission\n const validateEvent = {\n model: context.model('StudentAccommodationCard'),\n privilege: 'StudentAccommodationCard/Cancel',\n mask: PermissionMask.Execute,\n target: event.target && event.target.id,\n throwError: true\n }\n await validateAsync(validateEvent);\n\n }\n}\n\nasync function afterSaveAsync(event) {\n if (event.state !== 2) {\n return;\n }\n\n const context = event.model.context;\n\n const previous = event.previous;\n if (previous == null) {\n throw new DataError('E_PREVIOUS', 'The previous state of the object cannot be determined');\n }\n\n const target = event.target;\n\n if (target.active === false && previous.active === true) {\n //save \n await context.model('CancelAccommodationCardAction').save({\n accommodationCard: target.id,\n actionStatus: {\n alternateName: 'CompletedActionStatus'\n }\n })\n }\n}\n\n/**\n * @param {DataEventArgs} event\n * @param {Function} callback\n */\nexport function beforeSave(event, callback) {\n return beforeSaveAsync(event).then(() => {\n return callback();\n }).catch((err) => {\n return callback(err);\n });\n}\n\n/**\n * @param {DataEventArgs} event\n * @param {Function} callback\n */\nexport function afterSave(event, callback) {\n return afterSaveAsync(event).then(() => {\n return callback();\n }).catch((err) => {\n return callback(err);\n });\n}"],"mappings":"yIAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;;AAEA,eAAeG,eAAeA,CAACC,KAAK,EAAE;EAClC;EACA,IAAIA,KAAK,CAACC,KAAK,KAAK,CAAC,EAAE;IACnB;EACJ;;EAEA,MAAMC,OAAO,GAAGF,KAAK,CAACG,KAAK,CAACD,OAAO;;EAEnC,MAAME,QAAQ,GAAGJ,KAAK,CAACI,QAAQ;EAC/B,IAAIA,QAAQ,IAAI,IAAI,EAAE;IAClB,MAAM,IAAIC,iBAAS,CAAC,YAAY,EAAE,uDAAuD,CAAC;EAC9F;;EAEA,MAAMC,MAAM,GAAGN,KAAK,CAACM,MAAM;;EAE3B,IAAIA,MAAM,CAACC,MAAM,KAAK,KAAK,IAAIH,QAAQ,CAACG,MAAM,KAAK,IAAI,EAAE;IACrD;IACA,MAAMC,SAAS,GAAG,IAAIC,iCAA2B,EAAE;IACnD;IACA,MAAMC,aAAa,GAAG,IAAAC,eAAS,EAACH,SAAS,CAACI,QAAQ,CAAC;IAC9CC,IAAI,CAACL,SAAS,CAAC;IACpB;IACA,MAAMM,aAAa,GAAG;MAClBX,KAAK,EAAED,OAAO,CAACC,KAAK,CAAC,0BAA0B,CAAC;MAChDY,SAAS,EAAE,iCAAiC;MAC5CC,IAAI,EAAEC,oBAAc,CAACC,OAAO;MAC5BZ,MAAM,EAAEN,KAAK,CAACM,MAAM,IAAIN,KAAK,CAACM,MAAM,CAACa,EAAE;MACvCC,UAAU,EAAE;IAChB,CAAC;IACD,MAAMV,aAAa,CAACI,aAAa,CAAC;;EAEtC;AACJ;;AAEA,eAAeO,cAAcA,CAACrB,KAAK,EAAE;EACjC,IAAIA,KAAK,CAACC,KAAK,KAAK,CAAC,EAAE;IACnB;EACJ;;EAEA,MAAMC,OAAO,GAAGF,KAAK,CAACG,KAAK,CAACD,OAAO;;EAEnC,MAAME,QAAQ,GAAGJ,KAAK,CAACI,QAAQ;EAC/B,IAAIA,QAAQ,IAAI,IAAI,EAAE;IAClB,MAAM,IAAIC,iBAAS,CAAC,YAAY,EAAE,uDAAuD,CAAC;EAC9F;;EAEA,MAAMC,MAAM,GAAGN,KAAK,CAACM,MAAM;;EAE3B,IAAIA,MAAM,CAACC,MAAM,KAAK,KAAK,IAAIH,QAAQ,CAACG,MAAM,KAAK,IAAI,EAAE;IACrD;IACA,MAAML,OAAO,CAACC,KAAK,CAAC,+BAA+B,CAAC,CAACmB,IAAI,CAAC;MACtDC,iBAAiB,EAAEjB,MAAM,CAACa,EAAE;MAC5BK,YAAY,EAAE;QACVC,aAAa,EAAE;MACnB;IACJ,CAAC,CAAC;EACN;AACJ;;AAEA;AACA;AACA;AACA;AACO,SAASC,UAAUA,CAAC1B,KAAK,EAAE2B,QAAQ,EAAE;EACxC,OAAO5B,eAAe,CAACC,KAAK,CAAC,CAAC4B,IAAI,CAAC,MAAM;IACrC,OAAOD,QAAQ,EAAE;EACrB,CAAC,CAAC,CAACE,KAAK,CAAC,CAACC,GAAG,KAAK;IACd,OAAOH,QAAQ,CAACG,GAAG,CAAC;EACxB,CAAC,CAAC;AACN;;AAEA;AACA;AACA;AACA;AACO,SAASC,SAASA,CAAC/B,KAAK,EAAE2B,QAAQ,EAAE;EACvC,OAAON,cAAc,CAACrB,KAAK,CAAC,CAAC4B,IAAI,CAAC,MAAM;IACpC,OAAOD,QAAQ,EAAE;EACrB,CAAC,CAAC,CAACE,KAAK,CAAC,CAACC,GAAG,KAAK;IACd,OAAOH,QAAQ,CAACG,GAAG,CAAC;EACxB,CAAC,CAAC;AACN"}
@@ -0,0 +1,98 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.afterSave = afterSave;var _mailer = require("@themost/mailer");
2
+ var _data = require("@themost/data");
3
+ var _common = require("@themost/common");
4
+ /**
5
+ * @param {DataEventArgs} event
6
+ */
7
+ async function afterSaveAsync(event) {
8
+ if (event.state === 2) {
9
+ const context = event.model.context;
10
+ /**
11
+ * @type {import('@themost/mailer').MailerHelper}
12
+ */
13
+ const mailer = (0, _mailer.getMailer)(context);
14
+
15
+ const actionStatus = await context.model('AccommodationRequestAction').
16
+ where('id').equal(event.target.id).select('actionStatus/alternateName').value();
17
+ let previousStatus = 'UnknownActionStatus';
18
+ if (event.previous) {
19
+ previousStatus = event.previous.actionStatus.alternateName;
20
+ } else {
21
+ throw new _data.DataError('E_STATE', 'The previous state of an object cannot be determined', null, 'AccommodationRequestAction');
22
+ }
23
+ if (actionStatus === previousStatus) {
24
+ return;
25
+ }
26
+ // get mail template
27
+ const mailTemplate = await context.model('MailConfiguration').where('target').equal('AccommodationRequestActionStatusChange').silent().getItem();
28
+ if (mailTemplate == null) {
29
+ //
30
+ return;
31
+ }
32
+ // get parent action data
33
+ const item = await context.model('AccommodationRequestAction').
34
+ where('id').equal(event.target.id).
35
+ expand({
36
+ name: 'student',
37
+ options: {
38
+ $expand: 'person'
39
+ }
40
+ }, 'owner').
41
+ silent().getItem();
42
+
43
+ const application = await context.model('WebApplication').
44
+ where('alternateName').equal('students').
45
+ and('applicationSuite').equal('universis').
46
+ silent().getItem();
47
+ const config = await context.model('StudentRequestConfiguration').
48
+ where('additionalType').equal(event.model.name).
49
+ and('inLanguage').equal(event.target.inLanguage || context.locale).
50
+ silent().getItem();
51
+
52
+ if (item && application && config) {
53
+
54
+ const email = item.student.person.email;
55
+
56
+ if (email == null || typeof email !== 'string') {
57
+ _common.TraceUtils.warn(`Cannot send email for ${item.student.person.familyName} ${item.student.person.givenName}. Student [${item.student.id}] email does not exist.`);
58
+ return;
59
+ }
60
+ await new Promise((resolve) => {
61
+ mailer.template(mailTemplate.template).
62
+ subject(mailTemplate.subject).
63
+ bcc(mailTemplate.bcc || '').
64
+ to(email).
65
+ send({
66
+ model: item,
67
+ application: application,
68
+ configuration: config
69
+ }, (err) => {
70
+ if (err) {
71
+ try {
72
+ _common.TraceUtils.error('An error occurred while trying to send an email notification after status change.');
73
+ _common.TraceUtils.error(`Student=${item.student.id}, template=${mailTemplate.template}`);
74
+ _common.TraceUtils.error(err);
75
+ } catch (err1) {
76
+
77
+ // do nothing
78
+ }return resolve();
79
+ }
80
+ return resolve();
81
+ });
82
+ });
83
+
84
+ }
85
+ }
86
+ }
87
+ /**
88
+ * @param {DataEventArgs} event
89
+ * @param {Function} callback
90
+ */
91
+ function afterSave(event, callback) {
92
+ return afterSaveAsync(event).then(() => {
93
+ return callback();
94
+ }).catch((err) => {
95
+ return callback(err);
96
+ });
97
+ }
98
+ //# sourceMappingURL=SendEmailAfterActionStatusChangeListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SendEmailAfterActionStatusChangeListener.js","names":["_mailer","require","_data","_common","afterSaveAsync","event","state","context","model","mailer","getMailer","actionStatus","where","equal","target","id","select","value","previousStatus","previous","alternateName","DataError","mailTemplate","silent","getItem","item","expand","name","options","$expand","application","and","config","inLanguage","locale","email","student","person","TraceUtils","warn","familyName","givenName","Promise","resolve","template","subject","bcc","to","send","configuration","err","error","err1","afterSave","callback","then","catch"],"sources":["../../src/listeners/SendEmailAfterActionStatusChangeListener.js"],"sourcesContent":["import { getMailer } from '@themost/mailer';\nimport { DataError } from '@themost/data';\nimport { TraceUtils } from \"@themost/common\";\n/**\n * @param {DataEventArgs} event\n */\nasync function afterSaveAsync(event) {\n if (event.state === 2) {\n const context = event.model.context;\n /**\n * @type {import('@themost/mailer').MailerHelper}\n */\n const mailer = getMailer(context);\n\n const actionStatus = await context.model('AccommodationRequestAction')\n .where('id').equal(event.target.id).select('actionStatus/alternateName').value();\n let previousStatus = 'UnknownActionStatus';\n if (event.previous) {\n previousStatus = event.previous.actionStatus.alternateName;\n } else {\n throw new DataError('E_STATE', 'The previous state of an object cannot be determined', null, 'AccommodationRequestAction');\n }\n if (actionStatus === previousStatus) {\n return;\n }\n // get mail template\n const mailTemplate = await context.model('MailConfiguration').where('target').equal('AccommodationRequestActionStatusChange').silent().getItem();\n if (mailTemplate == null) {\n //\n return;\n }\n // get parent action data\n const item = await context.model('AccommodationRequestAction')\n .where('id').equal(event.target.id)\n .expand({\n name: 'student',\n options: {\n $expand: 'person'\n }\n }, 'owner')\n .silent().getItem();\n\n const application = await context.model('WebApplication')\n .where('alternateName').equal('students')\n .and('applicationSuite').equal('universis')\n .silent().getItem();\n const config = await context.model('StudentRequestConfiguration')\n .where('additionalType').equal(event.model.name)\n .and('inLanguage').equal(event.target.inLanguage || context.locale)\n .silent().getItem();\n\n if (item && application && config) {\n \n const email = item.student.person.email;\n \n if (email == null || typeof email !== 'string') {\n TraceUtils.warn(`Cannot send email for ${item.student.person.familyName} ${item.student.person.givenName}. Student [${item.student.id}] email does not exist.`);\n return;\n }\n await new Promise((resolve) => {\n mailer.template(mailTemplate.template)\n .subject(mailTemplate.subject)\n .bcc(mailTemplate.bcc || '')\n .to(email)\n .send({\n model: item,\n application: application,\n configuration: config\n }, (err) => {\n if (err) {\n try {\n TraceUtils.error('An error occurred while trying to send an email notification after status change.');\n TraceUtils.error(`Student=${item.student.id}, template=${mailTemplate.template}`);\n TraceUtils.error(err);\n } catch (err1) {\n // do nothing\n }\n return resolve();\n }\n return resolve();\n })\n });\n\n }\n }\n}\n/**\n * @param {DataEventArgs} event\n * @param {Function} callback\n */\nexport function afterSave(event, callback) {\n return afterSaveAsync(event).then(() => {\n return callback();\n }).catch((err) => {\n return callback(err);\n });\n}"],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.afterSave = afterSave;var _mailer = require("@themost/mailer");
2
+ var _data = require("@themost/data");
3
+ var _common = require("@themost/common");
4
+ /**
5
+ * @param {DataEventArgs} event
6
+ */
7
+ async function afterSaveAsync(event) {
8
+ if (event.state === 2) {
9
+ const context = event.model.context;
10
+ /**
11
+ * @type {import('@themost/mailer').MailerHelper}
12
+ */
13
+ const mailer = (0, _mailer.getMailer)(context);
14
+
15
+ const currentCardStatus = await context.
16
+ model('StudentDiningCard').
17
+ where('id').
18
+ equal(event.target.id).
19
+ select('active').
20
+ value();
21
+ let previousCardStatus = 'UnknownStatus';
22
+ if (event.previous) {
23
+ previousCardStatus = event.previous.active;
24
+ } else {
25
+ throw new _data.DataError('E_STATE', 'The previous state of an object cannot be determined', null, 'StudentDiningCard');
26
+ }
27
+ if (currentCardStatus === previousCardStatus) {
28
+ return;
29
+ }
30
+
31
+ // get mail template
32
+ const mailTemplate = await context.
33
+ model('MailConfigurations').
34
+ where('target').
35
+ equal('DiningCardActiveStatusChange').
36
+ silent().
37
+ getItem();
38
+ if (mailTemplate == null) {
39
+ //
40
+ return;
41
+ }
42
+
43
+ //get parent action data
44
+ let item;
45
+ if (typeof event.target.action === 'object' && typeof event.target.action.id === 'number' && Number.isInteger(event.target.action.id) && event.target.action.id > 0) {
46
+ item = await context.
47
+ model('DiningRequestAction').
48
+ where('id').
49
+ equal(event.target.action.id).
50
+ expand({
51
+ name: 'student',
52
+ options: {
53
+ $expand: 'person'
54
+ }
55
+ }).
56
+ silent().
57
+ getItem();
58
+
59
+ } else if (typeof event.target.action === 'number' && Number.isInteger(event.target.action) && event.target.action > 0) {
60
+ item = await context.
61
+ model('DiningRequestAction').
62
+ where('id').
63
+ equal(event.target.action).
64
+ expand({
65
+ name: 'student',
66
+ options: {
67
+ $expand: 'person'
68
+ }
69
+ }).
70
+ silent().
71
+ getItem();
72
+ }
73
+
74
+ const application = await context.
75
+ model('WebApplication').
76
+ where('alternateName').
77
+ equal('students').
78
+ and('applicationSuite').
79
+ equal('universis').
80
+ silent().
81
+ getItem();
82
+
83
+ const config = await context.
84
+ model('StudentRequestConfiguration').
85
+ where('additionalType').
86
+ equal('DiningRequestAction').
87
+ and('inLanguage').
88
+ equal(event.target.inLanguage || context.locale).
89
+ silent().
90
+ getItem();
91
+
92
+ if (item && application && config) {
93
+
94
+ const email = item.student.person.email;
95
+
96
+ if (email == null || typeof email !== 'string') {
97
+ _common.TraceUtils.warn(`Cannot send email for ${item.student.person.familyName} ${item.student.person.givenName}. Student [${item.student.id}] email does not exist.`);
98
+ return;
99
+ }
100
+ await new Promise((resolve) => {
101
+ mailer.template(mailTemplate.template).
102
+ subject(mailTemplate.subject).
103
+ bcc(mailTemplate.bcc || '').
104
+ to(email).
105
+ send({
106
+ model: item,
107
+ application: application,
108
+ configuration: config
109
+ }, (err) => {
110
+ if (err) {
111
+ try {
112
+ _common.TraceUtils.error('An error occurred while trying to send an email notification after status change.');
113
+ _common.TraceUtils.error(`Student=${item.student.id}, template=${mailTemplate.template}`);
114
+ _common.TraceUtils.error(err);
115
+ } catch (err1) {
116
+
117
+ // do nothing
118
+ }return resolve();
119
+ }
120
+
121
+ return resolve();
122
+ });
123
+ });
124
+
125
+ }
126
+ }
127
+ }
128
+ /**
129
+ * @param {DataEventArgs} event
130
+ * @param {Function} callback
131
+ */
132
+ function afterSave(event, callback) {
133
+ return afterSaveAsync(event).then(() => {
134
+ return callback();
135
+ }).catch((err) => {
136
+ return callback(err);
137
+ });
138
+ }
139
+ //# sourceMappingURL=SendEmailAfterCardStatusChangeListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SendEmailAfterCardStatusChangeListener.js","names":["_mailer","require","_data","_common","afterSaveAsync","event","state","context","model","mailer","getMailer","currentCardStatus","where","equal","target","id","select","value","previousCardStatus","previous","active","DataError","mailTemplate","silent","getItem","item","action","Number","isInteger","expand","name","options","$expand","application","and","config","inLanguage","locale","email","student","person","TraceUtils","warn","familyName","givenName","Promise","resolve","template","subject","bcc","to","send","configuration","err","error","err1","afterSave","callback","then","catch"],"sources":["../../src/listeners/SendEmailAfterCardStatusChangeListener.js"],"sourcesContent":["import { getMailer } from '@themost/mailer';\nimport { DataError } from '@themost/data';\nimport { TraceUtils } from \"@themost/common\";\n/**\n * @param {DataEventArgs} event\n */\nasync function afterSaveAsync(event) {\n if (event.state === 2) {\n const context = event.model.context;\n /**\n * @type {import('@themost/mailer').MailerHelper}\n */\n const mailer = getMailer(context);\n\n const currentCardStatus = await context\n .model('StudentDiningCard')\n .where('id')\n .equal(event.target.id)\n .select('active')\n .value();\n let previousCardStatus = 'UnknownStatus';\n if (event.previous) {\n previousCardStatus = event.previous.active;\n } else {\n throw new DataError('E_STATE', 'The previous state of an object cannot be determined', null, 'StudentDiningCard');\n }\n if (currentCardStatus === previousCardStatus) {\n return;\n }\n\n // get mail template\n const mailTemplate = await context\n .model('MailConfigurations')\n .where('target')\n .equal('DiningCardActiveStatusChange')\n .silent()\n .getItem();\n if (mailTemplate == null) {\n //\n return;\n }\n\n //get parent action data\n let item;\n if (typeof event.target.action === 'object' && typeof event.target.action.id === 'number' && Number.isInteger(event.target.action.id) && event.target.action.id > 0) {\n item = await context\n .model('DiningRequestAction')\n .where('id')\n .equal(event.target.action.id)\n .expand({\n name: 'student',\n options: {\n $expand: 'person'\n }\n })\n .silent()\n .getItem();\n\n } else if (typeof event.target.action === 'number' && Number.isInteger(event.target.action) && event.target.action > 0) {\n item = await context\n .model('DiningRequestAction')\n .where('id')\n .equal(event.target.action)\n .expand({\n name: 'student',\n options: {\n $expand: 'person'\n }\n })\n .silent()\n .getItem();\n }\n\n const application = await context\n .model('WebApplication')\n .where('alternateName')\n .equal('students')\n .and('applicationSuite')\n .equal('universis')\n .silent()\n .getItem();\n\n const config = await context\n .model('StudentRequestConfiguration')\n .where('additionalType')\n .equal('DiningRequestAction')\n .and('inLanguage')\n .equal(event.target.inLanguage || context.locale)\n .silent()\n .getItem();\n\n if (item && application && config) {\n\n const email = item.student.person.email;\n\n if (email == null || typeof email !== 'string') {\n TraceUtils.warn(`Cannot send email for ${item.student.person.familyName} ${item.student.person.givenName}. Student [${item.student.id}] email does not exist.`);\n return;\n }\n await new Promise((resolve) => {\n mailer.template(mailTemplate.template)\n .subject(mailTemplate.subject)\n .bcc(mailTemplate.bcc || '')\n .to(email)\n .send({\n model: item,\n application: application,\n configuration: config\n }, (err) => {\n if (err) {\n try {\n TraceUtils.error('An error occurred while trying to send an email notification after status change.');\n TraceUtils.error(`Student=${item.student.id}, template=${mailTemplate.template}`);\n TraceUtils.error(err);\n } catch (err1) {\n // do nothing\n }\n return resolve();\n }\n\n return resolve();\n })\n });\n\n }\n }\n}\n/**\n * @param {DataEventArgs} event\n * @param {Function} callback\n */\nexport function afterSave(event, callback) {\n return afterSaveAsync(event).then(() => {\n return callback();\n }).catch((err) => {\n return callback(err);\n });\n}"],"mappings":"yGAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AACA;AACA;AACA;AACA,eAAeG,cAAcA,CAACC,KAAK,EAAE;EACjC,IAAIA,KAAK,CAACC,KAAK,KAAK,CAAC,EAAE;IACnB,MAAMC,OAAO,GAAGF,KAAK,CAACG,KAAK,CAACD,OAAO;IACnC;AACR;AACA;IACQ,MAAME,MAAM,GAAG,IAAAC,iBAAS,EAACH,OAAO,CAAC;;IAEjC,MAAMI,iBAAiB,GAAG,MAAMJ,OAAO;IAClCC,KAAK,CAAC,mBAAmB,CAAC;IAC1BI,KAAK,CAAC,IAAI,CAAC;IACXC,KAAK,CAACR,KAAK,CAACS,MAAM,CAACC,EAAE,CAAC;IACtBC,MAAM,CAAC,QAAQ,CAAC;IAChBC,KAAK,EAAE;IACZ,IAAIC,kBAAkB,GAAG,eAAe;IACxC,IAAIb,KAAK,CAACc,QAAQ,EAAE;MAChBD,kBAAkB,GAAGb,KAAK,CAACc,QAAQ,CAACC,MAAM;IAC9C,CAAC,MAAM;MACH,MAAM,IAAIC,eAAS,CAAC,SAAS,EAAE,sDAAsD,EAAE,IAAI,EAAE,mBAAmB,CAAC;IACrH;IACA,IAAIV,iBAAiB,KAAKO,kBAAkB,EAAE;MAC1C;IACJ;;IAEA;IACA,MAAMI,YAAY,GAAG,MAAMf,OAAO;IAC7BC,KAAK,CAAC,oBAAoB,CAAC;IAC3BI,KAAK,CAAC,QAAQ,CAAC;IACfC,KAAK,CAAC,8BAA8B,CAAC;IACrCU,MAAM,EAAE;IACRC,OAAO,EAAE;IACd,IAAIF,YAAY,IAAI,IAAI,EAAE;MACtB;MACA;IACJ;;IAEA;IACA,IAAIG,IAAI;IACR,IAAI,OAAOpB,KAAK,CAACS,MAAM,CAACY,MAAM,KAAK,QAAQ,IAAI,OAAOrB,KAAK,CAACS,MAAM,CAACY,MAAM,CAACX,EAAE,KAAK,QAAQ,IAAIY,MAAM,CAACC,SAAS,CAACvB,KAAK,CAACS,MAAM,CAACY,MAAM,CAACX,EAAE,CAAC,IAAIV,KAAK,CAACS,MAAM,CAACY,MAAM,CAACX,EAAE,GAAG,CAAC,EAAE;MACjKU,IAAI,GAAG,MAAMlB,OAAO;MACfC,KAAK,CAAC,qBAAqB,CAAC;MAC5BI,KAAK,CAAC,IAAI,CAAC;MACXC,KAAK,CAACR,KAAK,CAACS,MAAM,CAACY,MAAM,CAACX,EAAE,CAAC;MAC7Bc,MAAM,CAAC;QACJC,IAAI,EAAE,SAAS;QACfC,OAAO,EAAE;UACLC,OAAO,EAAE;QACb;MACJ,CAAC,CAAC;MACDT,MAAM,EAAE;MACRC,OAAO,EAAE;;IAElB,CAAC,MAAM,IAAI,OAAOnB,KAAK,CAACS,MAAM,CAACY,MAAM,KAAK,QAAQ,IAAIC,MAAM,CAACC,SAAS,CAACvB,KAAK,CAACS,MAAM,CAACY,MAAM,CAAC,IAAIrB,KAAK,CAACS,MAAM,CAACY,MAAM,GAAG,CAAC,EAAE;MACpHD,IAAI,GAAG,MAAMlB,OAAO;MACfC,KAAK,CAAC,qBAAqB,CAAC;MAC5BI,KAAK,CAAC,IAAI,CAAC;MACXC,KAAK,CAACR,KAAK,CAACS,MAAM,CAACY,MAAM,CAAC;MAC1BG,MAAM,CAAC;QACJC,IAAI,EAAE,SAAS;QACfC,OAAO,EAAE;UACLC,OAAO,EAAE;QACb;MACJ,CAAC,CAAC;MACDT,MAAM,EAAE;MACRC,OAAO,EAAE;IAClB;;IAEA,MAAMS,WAAW,GAAG,MAAM1B,OAAO;IAC5BC,KAAK,CAAC,gBAAgB,CAAC;IACvBI,KAAK,CAAC,eAAe,CAAC;IACtBC,KAAK,CAAC,UAAU,CAAC;IACjBqB,GAAG,CAAC,kBAAkB,CAAC;IACvBrB,KAAK,CAAC,WAAW,CAAC;IAClBU,MAAM,EAAE;IACRC,OAAO,EAAE;;IAEd,MAAMW,MAAM,GAAG,MAAM5B,OAAO;IACvBC,KAAK,CAAC,6BAA6B,CAAC;IACpCI,KAAK,CAAC,gBAAgB,CAAC;IACvBC,KAAK,CAAC,qBAAqB,CAAC;IAC5BqB,GAAG,CAAC,YAAY,CAAC;IACjBrB,KAAK,CAACR,KAAK,CAACS,MAAM,CAACsB,UAAU,IAAI7B,OAAO,CAAC8B,MAAM,CAAC;IAChDd,MAAM,EAAE;IACRC,OAAO,EAAE;;IAEd,IAAIC,IAAI,IAAIQ,WAAW,IAAIE,MAAM,EAAE;;MAE/B,MAAMG,KAAK,GAAGb,IAAI,CAACc,OAAO,CAACC,MAAM,CAACF,KAAK;;MAEvC,IAAIA,KAAK,IAAI,IAAI,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;QAC5CG,kBAAU,CAACC,IAAI,CAAE,yBAAwBjB,IAAI,CAACc,OAAO,CAACC,MAAM,CAACG,UAAW,IAAGlB,IAAI,CAACc,OAAO,CAACC,MAAM,CAACI,SAAU,cAAanB,IAAI,CAACc,OAAO,CAACxB,EAAG,yBAAwB,CAAC;QAC/J;MACJ;MACA,MAAM,IAAI8B,OAAO,CAAC,CAACC,OAAO,KAAK;QAC3BrC,MAAM,CAACsC,QAAQ,CAACzB,YAAY,CAACyB,QAAQ,CAAC;QACjCC,OAAO,CAAC1B,YAAY,CAAC0B,OAAO,CAAC;QAC7BC,GAAG,CAAC3B,YAAY,CAAC2B,GAAG,IAAI,EAAE,CAAC;QAC3BC,EAAE,CAACZ,KAAK,CAAC;QACTa,IAAI,CAAC;UACF3C,KAAK,EAAEiB,IAAI;UACXQ,WAAW,EAAEA,WAAW;UACxBmB,aAAa,EAAEjB;QACnB,CAAC,EAAE,CAACkB,GAAG,KAAK;UACR,IAAIA,GAAG,EAAE;YACL,IAAI;cACAZ,kBAAU,CAACa,KAAK,CAAC,mFAAmF,CAAC;cACrGb,kBAAU,CAACa,KAAK,CAAE,WAAU7B,IAAI,CAACc,OAAO,CAACxB,EAAG,cAAaO,YAAY,CAACyB,QAAS,EAAC,CAAC;cACjFN,kBAAU,CAACa,KAAK,CAACD,GAAG,CAAC;YACzB,CAAC,CAAC,OAAOE,IAAI,EAAE;;cACX;YAAA,CAEJ,OAAOT,OAAO,EAAE;UACpB;;UAEA,OAAOA,OAAO,EAAE;QACpB,CAAC,CAAC;MACV,CAAC,CAAC;;IAEN;EACJ;AACJ;AACA;AACA;AACA;AACA;AACO,SAASU,SAASA,CAACnD,KAAK,EAAEoD,QAAQ,EAAE;EACvC,OAAOrD,cAAc,CAACC,KAAK,CAAC,CAACqD,IAAI,CAAC,MAAM;IACpC,OAAOD,QAAQ,EAAE;EACrB,CAAC,CAAC,CAACE,KAAK,CAAC,CAACN,GAAG,KAAK;IACd,OAAOI,QAAQ,CAACJ,GAAG,CAAC;EACxB,CAAC,CAAC;AACN"}