openchs-models 1.33.45 → 1.33.47
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.
- package/dist/AttendanceRecord.js +127 -0
- package/dist/AttendanceType.js +147 -0
- package/dist/Calendar.js +225 -0
- package/dist/CalendarDateMarker.js +110 -0
- package/dist/EntityMetaData.js +34 -1
- package/dist/Schema.js +13 -2
- package/dist/SchemaNames.js +5 -0
- package/dist/Session.js +291 -0
- package/dist/SubjectType.js +16 -0
- package/dist/application/WorkItem.js +19 -2
- package/dist/index.js +42 -0
- package/dist/location/Calendars.js +33 -0
- package/dist/utility/DateTimeUtil.js +44 -0
- package/package.json +1 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _BaseEntity = _interopRequireDefault(require("./BaseEntity"));
|
|
8
|
+
var _SchemaNames = _interopRequireDefault(require("./SchemaNames"));
|
|
9
|
+
var _AuditUtil = require("./utility/AuditUtil");
|
|
10
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
15
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
16
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
17
|
+
class AttendanceRecord extends _BaseEntity.default {
|
|
18
|
+
constructor(that = null) {
|
|
19
|
+
super(that);
|
|
20
|
+
}
|
|
21
|
+
get sessionUUID() {
|
|
22
|
+
return this.that.sessionUUID;
|
|
23
|
+
}
|
|
24
|
+
set sessionUUID(x) {
|
|
25
|
+
this.that.sessionUUID = x;
|
|
26
|
+
}
|
|
27
|
+
get subjectUUID() {
|
|
28
|
+
return this.that.subjectUUID;
|
|
29
|
+
}
|
|
30
|
+
set subjectUUID(x) {
|
|
31
|
+
this.that.subjectUUID = x;
|
|
32
|
+
}
|
|
33
|
+
get status() {
|
|
34
|
+
return this.that.status;
|
|
35
|
+
}
|
|
36
|
+
set status(x) {
|
|
37
|
+
this.that.status = x;
|
|
38
|
+
}
|
|
39
|
+
get reasonConceptUUID() {
|
|
40
|
+
return this.that.reasonConceptUUID;
|
|
41
|
+
}
|
|
42
|
+
set reasonConceptUUID(x) {
|
|
43
|
+
this.that.reasonConceptUUID = x;
|
|
44
|
+
}
|
|
45
|
+
get followUpEncounterUUID() {
|
|
46
|
+
return this.that.followUpEncounterUUID;
|
|
47
|
+
}
|
|
48
|
+
set followUpEncounterUUID(x) {
|
|
49
|
+
this.that.followUpEncounterUUID = x;
|
|
50
|
+
}
|
|
51
|
+
get createdBy() {
|
|
52
|
+
return this.that.createdBy;
|
|
53
|
+
}
|
|
54
|
+
set createdBy(x) {
|
|
55
|
+
this.that.createdBy = x;
|
|
56
|
+
}
|
|
57
|
+
get lastModifiedBy() {
|
|
58
|
+
return this.that.lastModifiedBy;
|
|
59
|
+
}
|
|
60
|
+
set lastModifiedBy(x) {
|
|
61
|
+
this.that.lastModifiedBy = x;
|
|
62
|
+
}
|
|
63
|
+
get createdByUUID() {
|
|
64
|
+
return this.that.createdByUUID;
|
|
65
|
+
}
|
|
66
|
+
set createdByUUID(x) {
|
|
67
|
+
this.that.createdByUUID = x;
|
|
68
|
+
}
|
|
69
|
+
get lastModifiedByUUID() {
|
|
70
|
+
return this.that.lastModifiedByUUID;
|
|
71
|
+
}
|
|
72
|
+
set lastModifiedByUUID(x) {
|
|
73
|
+
this.that.lastModifiedByUUID = x;
|
|
74
|
+
}
|
|
75
|
+
isPresent() {
|
|
76
|
+
return this.status === AttendanceRecord.status.PRESENT;
|
|
77
|
+
}
|
|
78
|
+
isAbsent() {
|
|
79
|
+
return this.status === AttendanceRecord.status.ABSENT;
|
|
80
|
+
}
|
|
81
|
+
static fromResource(resource) {
|
|
82
|
+
const record = new AttendanceRecord();
|
|
83
|
+
record.uuid = resource.uuid;
|
|
84
|
+
record.sessionUUID = resource.sessionUUID;
|
|
85
|
+
record.subjectUUID = resource.subjectUUID;
|
|
86
|
+
record.status = resource.status;
|
|
87
|
+
record.reasonConceptUUID = resource.reasonConceptUUID || null;
|
|
88
|
+
record.followUpEncounterUUID = resource.followUpEncounterUUID || null;
|
|
89
|
+
record.voided = !!resource.voided;
|
|
90
|
+
(0, _AuditUtil.mapAuditFields)(record, resource);
|
|
91
|
+
return record;
|
|
92
|
+
}
|
|
93
|
+
get toResource() {
|
|
94
|
+
const resource = _lodash.default.pick(this, ["uuid", "sessionUUID", "subjectUUID", "status", "voided"]);
|
|
95
|
+
resource.reasonConceptUUID = this.reasonConceptUUID || null;
|
|
96
|
+
resource.followUpEncounterUUID = this.followUpEncounterUUID || null;
|
|
97
|
+
return resource;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
_defineProperty(AttendanceRecord, "schema", {
|
|
101
|
+
name: _SchemaNames.default.AttendanceRecord,
|
|
102
|
+
primaryKey: "uuid",
|
|
103
|
+
properties: _objectSpread({
|
|
104
|
+
uuid: "string",
|
|
105
|
+
sessionUUID: "string",
|
|
106
|
+
subjectUUID: "string",
|
|
107
|
+
status: "string",
|
|
108
|
+
reasonConceptUUID: {
|
|
109
|
+
type: "string",
|
|
110
|
+
optional: true
|
|
111
|
+
},
|
|
112
|
+
followUpEncounterUUID: {
|
|
113
|
+
type: "string",
|
|
114
|
+
optional: true
|
|
115
|
+
},
|
|
116
|
+
voided: {
|
|
117
|
+
type: "bool",
|
|
118
|
+
default: false
|
|
119
|
+
}
|
|
120
|
+
}, _AuditUtil.AuditFields)
|
|
121
|
+
});
|
|
122
|
+
_defineProperty(AttendanceRecord, "status", {
|
|
123
|
+
PRESENT: "Present",
|
|
124
|
+
ABSENT: "Absent"
|
|
125
|
+
});
|
|
126
|
+
var _default = AttendanceRecord;
|
|
127
|
+
exports.default = _default;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _BaseEntity = _interopRequireDefault(require("./BaseEntity"));
|
|
8
|
+
var _SchemaNames = _interopRequireDefault(require("./SchemaNames"));
|
|
9
|
+
var _AuditUtil = require("./utility/AuditUtil");
|
|
10
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
15
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
16
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
17
|
+
const CONFIG_KEYS = {
|
|
18
|
+
SESSION_OUTCOME_REASON_CONCEPT_UUID: "session_outcome_reason_concept_uuid",
|
|
19
|
+
ABSENCE_REASON_CONCEPT_UUID: "absence_reason_concept_uuid",
|
|
20
|
+
FOLLOW_UP_ENCOUNTER_TYPE_UUID: "follow_up_encounter_type_uuid",
|
|
21
|
+
SHARE_RULE: "share_rule",
|
|
22
|
+
AUTO_SHARE_ON_SAVE: "auto_share_on_save"
|
|
23
|
+
};
|
|
24
|
+
class AttendanceType extends _BaseEntity.default {
|
|
25
|
+
constructor(that = null) {
|
|
26
|
+
super(that);
|
|
27
|
+
}
|
|
28
|
+
get subjectTypeUUID() {
|
|
29
|
+
return this.that.subjectTypeUUID;
|
|
30
|
+
}
|
|
31
|
+
set subjectTypeUUID(x) {
|
|
32
|
+
this.that.subjectTypeUUID = x;
|
|
33
|
+
}
|
|
34
|
+
get name() {
|
|
35
|
+
return this.that.name;
|
|
36
|
+
}
|
|
37
|
+
set name(x) {
|
|
38
|
+
this.that.name = x;
|
|
39
|
+
}
|
|
40
|
+
get sortOrder() {
|
|
41
|
+
return this.that.sortOrder;
|
|
42
|
+
}
|
|
43
|
+
set sortOrder(x) {
|
|
44
|
+
this.that.sortOrder = x;
|
|
45
|
+
}
|
|
46
|
+
get config() {
|
|
47
|
+
return this.that.config;
|
|
48
|
+
}
|
|
49
|
+
set config(x) {
|
|
50
|
+
this.that.config = x;
|
|
51
|
+
}
|
|
52
|
+
get createdBy() {
|
|
53
|
+
return this.that.createdBy;
|
|
54
|
+
}
|
|
55
|
+
set createdBy(x) {
|
|
56
|
+
this.that.createdBy = x;
|
|
57
|
+
}
|
|
58
|
+
get lastModifiedBy() {
|
|
59
|
+
return this.that.lastModifiedBy;
|
|
60
|
+
}
|
|
61
|
+
set lastModifiedBy(x) {
|
|
62
|
+
this.that.lastModifiedBy = x;
|
|
63
|
+
}
|
|
64
|
+
get createdByUUID() {
|
|
65
|
+
return this.that.createdByUUID;
|
|
66
|
+
}
|
|
67
|
+
set createdByUUID(x) {
|
|
68
|
+
this.that.createdByUUID = x;
|
|
69
|
+
}
|
|
70
|
+
get lastModifiedByUUID() {
|
|
71
|
+
return this.that.lastModifiedByUUID;
|
|
72
|
+
}
|
|
73
|
+
set lastModifiedByUUID(x) {
|
|
74
|
+
this.that.lastModifiedByUUID = x;
|
|
75
|
+
}
|
|
76
|
+
getConfig() {
|
|
77
|
+
if (_lodash.default.isEmpty(this.config)) return {};
|
|
78
|
+
try {
|
|
79
|
+
return JSON.parse(this.config);
|
|
80
|
+
} catch (_e) {
|
|
81
|
+
return {};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
setConfig(obj) {
|
|
85
|
+
this.config = JSON.stringify(obj || {});
|
|
86
|
+
}
|
|
87
|
+
getSessionOutcomeReasonConceptUUID() {
|
|
88
|
+
return this.getConfig()[CONFIG_KEYS.SESSION_OUTCOME_REASON_CONCEPT_UUID] || null;
|
|
89
|
+
}
|
|
90
|
+
getAbsenceReasonConceptUUID() {
|
|
91
|
+
return this.getConfig()[CONFIG_KEYS.ABSENCE_REASON_CONCEPT_UUID] || null;
|
|
92
|
+
}
|
|
93
|
+
getFollowUpEncounterTypeUUID() {
|
|
94
|
+
return this.getConfig()[CONFIG_KEYS.FOLLOW_UP_ENCOUNTER_TYPE_UUID] || null;
|
|
95
|
+
}
|
|
96
|
+
getShareRule() {
|
|
97
|
+
return this.getConfig()[CONFIG_KEYS.SHARE_RULE] || null;
|
|
98
|
+
}
|
|
99
|
+
isAutoShareOnSave() {
|
|
100
|
+
return !!this.getConfig()[CONFIG_KEYS.AUTO_SHARE_ON_SAVE];
|
|
101
|
+
}
|
|
102
|
+
static fromResource(resource) {
|
|
103
|
+
const at = new AttendanceType();
|
|
104
|
+
at.uuid = resource.uuid;
|
|
105
|
+
at.subjectTypeUUID = resource.subjectTypeUUID;
|
|
106
|
+
at.name = resource.name;
|
|
107
|
+
at.sortOrder = _lodash.default.isNil(resource.sortOrder) ? 0 : resource.sortOrder;
|
|
108
|
+
const config = resource.config;
|
|
109
|
+
if (_lodash.default.isNil(config)) {
|
|
110
|
+
at.config = "{}";
|
|
111
|
+
} else if (_lodash.default.isString(config)) {
|
|
112
|
+
at.config = config;
|
|
113
|
+
} else {
|
|
114
|
+
at.config = JSON.stringify(config);
|
|
115
|
+
}
|
|
116
|
+
at.voided = !!resource.voided;
|
|
117
|
+
(0, _AuditUtil.mapAuditFields)(at, resource);
|
|
118
|
+
return at;
|
|
119
|
+
}
|
|
120
|
+
get toResource() {
|
|
121
|
+
return _lodash.default.pick(this, ["uuid", "subjectTypeUUID", "name", "sortOrder", "config", "voided"]);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
_defineProperty(AttendanceType, "schema", {
|
|
125
|
+
name: _SchemaNames.default.AttendanceType,
|
|
126
|
+
primaryKey: "uuid",
|
|
127
|
+
properties: _objectSpread({
|
|
128
|
+
uuid: "string",
|
|
129
|
+
subjectTypeUUID: "string",
|
|
130
|
+
name: "string",
|
|
131
|
+
sortOrder: {
|
|
132
|
+
type: "int",
|
|
133
|
+
default: 0
|
|
134
|
+
},
|
|
135
|
+
config: {
|
|
136
|
+
type: "string",
|
|
137
|
+
default: "{}"
|
|
138
|
+
},
|
|
139
|
+
voided: {
|
|
140
|
+
type: "bool",
|
|
141
|
+
default: false
|
|
142
|
+
}
|
|
143
|
+
}, _AuditUtil.AuditFields)
|
|
144
|
+
});
|
|
145
|
+
_defineProperty(AttendanceType, "configKeys", CONFIG_KEYS);
|
|
146
|
+
var _default = AttendanceType;
|
|
147
|
+
exports.default = _default;
|
package/dist/Calendar.js
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _BaseEntity = _interopRequireDefault(require("./BaseEntity"));
|
|
8
|
+
var _General = _interopRequireDefault(require("./utility/General"));
|
|
9
|
+
var _SchemaNames = _interopRequireDefault(require("./SchemaNames"));
|
|
10
|
+
var _AuditUtil = require("./utility/AuditUtil");
|
|
11
|
+
var _DateTimeUtil = _interopRequireDefault(require("./utility/DateTimeUtil"));
|
|
12
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
15
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
16
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
17
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
18
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
19
|
+
const DAY_KEYS = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"];
|
|
20
|
+
const DEFAULT_WORKING_PATTERN = {
|
|
21
|
+
mon: "all",
|
|
22
|
+
tue: "all",
|
|
23
|
+
wed: "all",
|
|
24
|
+
thu: "all",
|
|
25
|
+
fri: "all",
|
|
26
|
+
sat: "none",
|
|
27
|
+
sun: "none"
|
|
28
|
+
};
|
|
29
|
+
class Calendar extends _BaseEntity.default {
|
|
30
|
+
constructor(that = null) {
|
|
31
|
+
super(that);
|
|
32
|
+
}
|
|
33
|
+
get name() {
|
|
34
|
+
return this.that.name;
|
|
35
|
+
}
|
|
36
|
+
set name(x) {
|
|
37
|
+
this.that.name = x;
|
|
38
|
+
}
|
|
39
|
+
get workingPattern() {
|
|
40
|
+
return this.that.workingPattern;
|
|
41
|
+
}
|
|
42
|
+
set workingPattern(x) {
|
|
43
|
+
this.that.workingPattern = x;
|
|
44
|
+
}
|
|
45
|
+
get addressLevelUUID() {
|
|
46
|
+
return this.that.addressLevelUUID;
|
|
47
|
+
}
|
|
48
|
+
set addressLevelUUID(x) {
|
|
49
|
+
this.that.addressLevelUUID = x;
|
|
50
|
+
}
|
|
51
|
+
get isDefault() {
|
|
52
|
+
return this.that.isDefault;
|
|
53
|
+
}
|
|
54
|
+
set isDefault(x) {
|
|
55
|
+
this.that.isDefault = x;
|
|
56
|
+
}
|
|
57
|
+
get createdBy() {
|
|
58
|
+
return this.that.createdBy;
|
|
59
|
+
}
|
|
60
|
+
set createdBy(x) {
|
|
61
|
+
this.that.createdBy = x;
|
|
62
|
+
}
|
|
63
|
+
get lastModifiedBy() {
|
|
64
|
+
return this.that.lastModifiedBy;
|
|
65
|
+
}
|
|
66
|
+
set lastModifiedBy(x) {
|
|
67
|
+
this.that.lastModifiedBy = x;
|
|
68
|
+
}
|
|
69
|
+
get createdByUUID() {
|
|
70
|
+
return this.that.createdByUUID;
|
|
71
|
+
}
|
|
72
|
+
set createdByUUID(x) {
|
|
73
|
+
this.that.createdByUUID = x;
|
|
74
|
+
}
|
|
75
|
+
get lastModifiedByUUID() {
|
|
76
|
+
return this.that.lastModifiedByUUID;
|
|
77
|
+
}
|
|
78
|
+
set lastModifiedByUUID(x) {
|
|
79
|
+
this.that.lastModifiedByUUID = x;
|
|
80
|
+
}
|
|
81
|
+
getWorkingPatternObject() {
|
|
82
|
+
if (_lodash.default.isEmpty(this.workingPattern)) return DEFAULT_WORKING_PATTERN;
|
|
83
|
+
try {
|
|
84
|
+
return JSON.parse(this.workingPattern);
|
|
85
|
+
} catch (_e) {
|
|
86
|
+
return DEFAULT_WORKING_PATTERN;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Domain methods accept a calendar-date input as either a "YYYY-MM-DD" string
|
|
91
|
+
// or a JS Date. All comparisons happen on canonical "YYYY-MM-DD" strings;
|
|
92
|
+
// arithmetic uses moment.utc internally. Methods that return a calendar-date
|
|
93
|
+
// value return a "YYYY-MM-DD" string — never a Date — so consumers can't
|
|
94
|
+
// accidentally drift via locale-aware formatting.
|
|
95
|
+
|
|
96
|
+
_findActiveMarker(dateKey, markers) {
|
|
97
|
+
if (_lodash.default.isEmpty(markers) || _lodash.default.isNil(dateKey)) return null;
|
|
98
|
+
return _lodash.default.find(markers, m => {
|
|
99
|
+
if (!m || m.voided) return false;
|
|
100
|
+
if (m.calendarUUID !== this.uuid) return false;
|
|
101
|
+
return _DateTimeUtil.default.toCalendarDateString(m.markerDate) === dateKey;
|
|
102
|
+
}) || null;
|
|
103
|
+
}
|
|
104
|
+
dayType(date, markers = []) {
|
|
105
|
+
const dateKey = _DateTimeUtil.default.toCalendarDateString(date);
|
|
106
|
+
if (_lodash.default.isNil(dateKey)) return Calendar.dayType.WEEKLY_OFF;
|
|
107
|
+
const marker = this._findActiveMarker(dateKey, markers);
|
|
108
|
+
if (marker) {
|
|
109
|
+
return marker.isWorking ? Calendar.dayType.WORKING_OVERRIDE : Calendar.dayType.PUBLIC_HOLIDAY;
|
|
110
|
+
}
|
|
111
|
+
const d = _DateTimeUtil.default.calendarMoment(dateKey);
|
|
112
|
+
const dayKey = DAY_KEYS[d.day()];
|
|
113
|
+
const dayOfMonth = d.date();
|
|
114
|
+
const occurrence = Math.floor((dayOfMonth - 1) / 7) + 1;
|
|
115
|
+
const pattern = this.getWorkingPatternObject();
|
|
116
|
+
const slot = pattern[dayKey];
|
|
117
|
+
if (slot === "all") return Calendar.dayType.WORKING_DAY;
|
|
118
|
+
if (slot === "none") return Calendar.dayType.WEEKLY_OFF;
|
|
119
|
+
if (_lodash.default.isArray(slot)) {
|
|
120
|
+
return _lodash.default.includes(slot, occurrence) ? Calendar.dayType.WORKING_DAY : Calendar.dayType.WEEKLY_OFF;
|
|
121
|
+
}
|
|
122
|
+
return Calendar.dayType.WEEKLY_OFF;
|
|
123
|
+
}
|
|
124
|
+
isHoliday(date, markers = []) {
|
|
125
|
+
const t = this.dayType(date, markers);
|
|
126
|
+
return t === Calendar.dayType.WEEKLY_OFF || t === Calendar.dayType.PUBLIC_HOLIDAY;
|
|
127
|
+
}
|
|
128
|
+
isWorkingDay(date, markers = []) {
|
|
129
|
+
return !this.isHoliday(date, markers);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Returns [{date: "YYYY-MM-DD", name}] sorted by date.
|
|
133
|
+
getHolidays(startDate, endDate, markers = []) {
|
|
134
|
+
if (_lodash.default.isEmpty(markers)) return [];
|
|
135
|
+
const startKey = _DateTimeUtil.default.toCalendarDateString(startDate);
|
|
136
|
+
const endKey = _DateTimeUtil.default.toCalendarDateString(endDate);
|
|
137
|
+
if (_lodash.default.isNil(startKey) || _lodash.default.isNil(endKey)) return [];
|
|
138
|
+
return _lodash.default.chain(markers).filter(m => m && !m.voided && m.calendarUUID === this.uuid && m.isWorking === false).map(m => ({
|
|
139
|
+
date: _DateTimeUtil.default.toCalendarDateString(m.markerDate),
|
|
140
|
+
name: m.name
|
|
141
|
+
})).filter(h => !_lodash.default.isNil(h.date) && h.date >= startKey && h.date <= endKey).sortBy("date").value();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Returns "YYYY-MM-DD" (string), bounded scan ≤365 days, throws on exceed.
|
|
145
|
+
nextWorkingDay(date, markers = []) {
|
|
146
|
+
const startKey = _DateTimeUtil.default.toCalendarDateString(date);
|
|
147
|
+
if (_lodash.default.isNil(startKey)) throw new Error("Calendar.nextWorkingDay: invalid date");
|
|
148
|
+
let cursor = _DateTimeUtil.default.calendarMoment(startKey).add(1, "day");
|
|
149
|
+
for (let i = 0; i < 365; i++) {
|
|
150
|
+
const key = cursor.format("YYYY-MM-DD");
|
|
151
|
+
if (this.isWorkingDay(key, markers)) return key;
|
|
152
|
+
cursor.add(1, "day");
|
|
153
|
+
}
|
|
154
|
+
throw new Error(`Calendar '${this.name}': no working day found within 365 days after ${startKey}`);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Returns "YYYY-MM-DD" (string), symmetric bounded scan.
|
|
158
|
+
previousWorkingDay(date, markers = []) {
|
|
159
|
+
const startKey = _DateTimeUtil.default.toCalendarDateString(date);
|
|
160
|
+
if (_lodash.default.isNil(startKey)) throw new Error("Calendar.previousWorkingDay: invalid date");
|
|
161
|
+
let cursor = _DateTimeUtil.default.calendarMoment(startKey).subtract(1, "day");
|
|
162
|
+
for (let i = 0; i < 365; i++) {
|
|
163
|
+
const key = cursor.format("YYYY-MM-DD");
|
|
164
|
+
if (this.isWorkingDay(key, markers)) return key;
|
|
165
|
+
cursor.subtract(1, "day");
|
|
166
|
+
}
|
|
167
|
+
throw new Error(`Calendar '${this.name}': no working day found within 365 days before ${startKey}`);
|
|
168
|
+
}
|
|
169
|
+
static fromResource(resource) {
|
|
170
|
+
const calendar = new Calendar();
|
|
171
|
+
calendar.uuid = resource.uuid;
|
|
172
|
+
calendar.name = resource.name;
|
|
173
|
+
const pattern = resource.workingPattern;
|
|
174
|
+
if (_lodash.default.isNil(pattern)) {
|
|
175
|
+
calendar.workingPattern = JSON.stringify(DEFAULT_WORKING_PATTERN);
|
|
176
|
+
} else if (_lodash.default.isString(pattern)) {
|
|
177
|
+
calendar.workingPattern = pattern;
|
|
178
|
+
} else {
|
|
179
|
+
calendar.workingPattern = JSON.stringify(pattern);
|
|
180
|
+
}
|
|
181
|
+
calendar.addressLevelUUID = resource.addressLevelUUID || null;
|
|
182
|
+
calendar.isDefault = !!resource.isDefault;
|
|
183
|
+
calendar.voided = !!resource.voided;
|
|
184
|
+
(0, _AuditUtil.mapAuditFields)(calendar, resource);
|
|
185
|
+
return calendar;
|
|
186
|
+
}
|
|
187
|
+
get toResource() {
|
|
188
|
+
const resource = _lodash.default.pick(this, ["uuid", "name", "workingPattern", "isDefault", "voided"]);
|
|
189
|
+
resource.addressLevelUUID = this.addressLevelUUID || null;
|
|
190
|
+
return resource;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
_defineProperty(Calendar, "schema", {
|
|
194
|
+
name: _SchemaNames.default.Calendar,
|
|
195
|
+
primaryKey: "uuid",
|
|
196
|
+
properties: _objectSpread({
|
|
197
|
+
uuid: "string",
|
|
198
|
+
name: "string",
|
|
199
|
+
workingPattern: {
|
|
200
|
+
type: "string",
|
|
201
|
+
default: JSON.stringify(DEFAULT_WORKING_PATTERN)
|
|
202
|
+
},
|
|
203
|
+
addressLevelUUID: {
|
|
204
|
+
type: "string",
|
|
205
|
+
optional: true
|
|
206
|
+
},
|
|
207
|
+
isDefault: {
|
|
208
|
+
type: "bool",
|
|
209
|
+
default: false
|
|
210
|
+
},
|
|
211
|
+
voided: {
|
|
212
|
+
type: "bool",
|
|
213
|
+
default: false
|
|
214
|
+
}
|
|
215
|
+
}, _AuditUtil.AuditFields)
|
|
216
|
+
});
|
|
217
|
+
_defineProperty(Calendar, "dayType", {
|
|
218
|
+
WORKING_DAY: "working_day",
|
|
219
|
+
WEEKLY_OFF: "weekly_off",
|
|
220
|
+
PUBLIC_HOLIDAY: "public_holiday",
|
|
221
|
+
WORKING_OVERRIDE: "working_override"
|
|
222
|
+
});
|
|
223
|
+
_defineProperty(Calendar, "defaultWorkingPattern", DEFAULT_WORKING_PATTERN);
|
|
224
|
+
var _default = Calendar;
|
|
225
|
+
exports.default = _default;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _BaseEntity = _interopRequireDefault(require("./BaseEntity"));
|
|
8
|
+
var _General = _interopRequireDefault(require("./utility/General"));
|
|
9
|
+
var _SchemaNames = _interopRequireDefault(require("./SchemaNames"));
|
|
10
|
+
var _AuditUtil = require("./utility/AuditUtil");
|
|
11
|
+
var _DateTimeUtil = _interopRequireDefault(require("./utility/DateTimeUtil"));
|
|
12
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
15
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
16
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
17
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
18
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
19
|
+
class CalendarDateMarker extends _BaseEntity.default {
|
|
20
|
+
constructor(that = null) {
|
|
21
|
+
super(that);
|
|
22
|
+
}
|
|
23
|
+
get calendarUUID() {
|
|
24
|
+
return this.that.calendarUUID;
|
|
25
|
+
}
|
|
26
|
+
set calendarUUID(x) {
|
|
27
|
+
this.that.calendarUUID = x;
|
|
28
|
+
}
|
|
29
|
+
get markerDate() {
|
|
30
|
+
return this.that.markerDate;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Accepts either a "YYYY-MM-DD" string or a JS Date; persists as a canonical
|
|
34
|
+
// "YYYY-MM-DD" string so storage carries zero TZ semantics.
|
|
35
|
+
set markerDate(x) {
|
|
36
|
+
this.that.markerDate = _DateTimeUtil.default.toCalendarDateString(x);
|
|
37
|
+
}
|
|
38
|
+
get name() {
|
|
39
|
+
return this.that.name;
|
|
40
|
+
}
|
|
41
|
+
set name(x) {
|
|
42
|
+
this.that.name = x;
|
|
43
|
+
}
|
|
44
|
+
get isWorking() {
|
|
45
|
+
return this.that.isWorking;
|
|
46
|
+
}
|
|
47
|
+
set isWorking(x) {
|
|
48
|
+
this.that.isWorking = x;
|
|
49
|
+
}
|
|
50
|
+
get createdBy() {
|
|
51
|
+
return this.that.createdBy;
|
|
52
|
+
}
|
|
53
|
+
set createdBy(x) {
|
|
54
|
+
this.that.createdBy = x;
|
|
55
|
+
}
|
|
56
|
+
get lastModifiedBy() {
|
|
57
|
+
return this.that.lastModifiedBy;
|
|
58
|
+
}
|
|
59
|
+
set lastModifiedBy(x) {
|
|
60
|
+
this.that.lastModifiedBy = x;
|
|
61
|
+
}
|
|
62
|
+
get createdByUUID() {
|
|
63
|
+
return this.that.createdByUUID;
|
|
64
|
+
}
|
|
65
|
+
set createdByUUID(x) {
|
|
66
|
+
this.that.createdByUUID = x;
|
|
67
|
+
}
|
|
68
|
+
get lastModifiedByUUID() {
|
|
69
|
+
return this.that.lastModifiedByUUID;
|
|
70
|
+
}
|
|
71
|
+
set lastModifiedByUUID(x) {
|
|
72
|
+
this.that.lastModifiedByUUID = x;
|
|
73
|
+
}
|
|
74
|
+
static fromResource(resource) {
|
|
75
|
+
const marker = new CalendarDateMarker();
|
|
76
|
+
marker.uuid = resource.uuid;
|
|
77
|
+
marker.calendarUUID = resource.calendarUUID;
|
|
78
|
+
marker.markerDate = _DateTimeUtil.default.toCalendarDateString(resource.markerDate);
|
|
79
|
+
marker.name = resource.name;
|
|
80
|
+
marker.isWorking = !!resource.isWorking;
|
|
81
|
+
marker.voided = !!resource.voided;
|
|
82
|
+
(0, _AuditUtil.mapAuditFields)(marker, resource);
|
|
83
|
+
return marker;
|
|
84
|
+
}
|
|
85
|
+
get toResource() {
|
|
86
|
+
return _lodash.default.pick(this, ["uuid", "calendarUUID", "markerDate", "name", "isWorking", "voided"]);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
_defineProperty(CalendarDateMarker, "schema", {
|
|
90
|
+
name: _SchemaNames.default.CalendarDateMarker,
|
|
91
|
+
primaryKey: "uuid",
|
|
92
|
+
properties: _objectSpread({
|
|
93
|
+
uuid: "string",
|
|
94
|
+
calendarUUID: "string",
|
|
95
|
+
// markerDate is stored as a "YYYY-MM-DD" string so it carries zero TZ
|
|
96
|
+
// semantics. Mirrors the Postgres `date` type on the server side.
|
|
97
|
+
markerDate: "string",
|
|
98
|
+
name: "string",
|
|
99
|
+
isWorking: {
|
|
100
|
+
type: "bool",
|
|
101
|
+
default: false
|
|
102
|
+
},
|
|
103
|
+
voided: {
|
|
104
|
+
type: "bool",
|
|
105
|
+
default: false
|
|
106
|
+
}
|
|
107
|
+
}, _AuditUtil.AuditFields)
|
|
108
|
+
});
|
|
109
|
+
var _default = CalendarDateMarker;
|
|
110
|
+
exports.default = _default;
|
package/dist/EntityMetaData.js
CHANGED
|
@@ -75,6 +75,11 @@ var _SubjectProgramEligibility = _interopRequireDefault(require("./program/Subje
|
|
|
75
75
|
var _MenuItem = _interopRequireDefault(require("./application/MenuItem"));
|
|
76
76
|
var _UserSubjectAssignment = _interopRequireDefault(require("./assignment/UserSubjectAssignment"));
|
|
77
77
|
var _DashboardFilter = _interopRequireDefault(require("./reports/DashboardFilter"));
|
|
78
|
+
var _Calendar = _interopRequireDefault(require("./Calendar"));
|
|
79
|
+
var _CalendarDateMarker = _interopRequireDefault(require("./CalendarDateMarker"));
|
|
80
|
+
var _AttendanceType = _interopRequireDefault(require("./AttendanceType"));
|
|
81
|
+
var _Session = _interopRequireDefault(require("./Session"));
|
|
82
|
+
var _AttendanceRecord = _interopRequireDefault(require("./AttendanceRecord"));
|
|
78
83
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
79
84
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
80
85
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
@@ -537,6 +542,34 @@ const subjectProgramEligibility = txData(_SubjectProgramEligibility.default, {
|
|
|
537
542
|
const userSubjectAssignment = txData(_UserSubjectAssignment.default, {
|
|
538
543
|
syncWeight: 0
|
|
539
544
|
});
|
|
545
|
+
|
|
546
|
+
// Calendars + Attendance (issue #63). Resource names default to the camelCase of the
|
|
547
|
+
// schema name; if avni-server publishes different REST roots they can be passed via {res, resUrl}.
|
|
548
|
+
const calendar = refData(_Calendar.default, {
|
|
549
|
+
syncWeight: 1
|
|
550
|
+
});
|
|
551
|
+
const calendarDateMarker = refData(_CalendarDateMarker.default, {
|
|
552
|
+
parent: calendar,
|
|
553
|
+
syncWeight: 1
|
|
554
|
+
});
|
|
555
|
+
const attendanceType = refData(_AttendanceType.default, {
|
|
556
|
+
parent: subjectType,
|
|
557
|
+
syncWeight: 1
|
|
558
|
+
});
|
|
559
|
+
const session = txData(_Session.default, {
|
|
560
|
+
parent: individual,
|
|
561
|
+
syncWeight: 7,
|
|
562
|
+
privilegeParam: "subjectTypeUuid",
|
|
563
|
+
privilegeEntity: _Privilege.default.privilegeEntityType.subject,
|
|
564
|
+
privilegeName: _Privilege.default.privilegeName.editSubject
|
|
565
|
+
});
|
|
566
|
+
const attendanceRecord = txData(_AttendanceRecord.default, {
|
|
567
|
+
parent: session,
|
|
568
|
+
syncWeight: 8,
|
|
569
|
+
privilegeParam: "subjectTypeUuid",
|
|
570
|
+
privilegeEntity: _Privilege.default.privilegeEntityType.subject,
|
|
571
|
+
privilegeName: _Privilege.default.privilegeName.editSubject
|
|
572
|
+
});
|
|
540
573
|
class EntityMetaData {
|
|
541
574
|
constructor() {
|
|
542
575
|
_defineProperty(this, "schemaName", void 0);
|
|
@@ -552,7 +585,7 @@ class EntityMetaData {
|
|
|
552
585
|
}
|
|
553
586
|
//order is important. last entity in each (tx and ref) with be executed first. parent should be synced before the child.
|
|
554
587
|
static model() {
|
|
555
|
-
return [groupDashboard, approvalStatus, dashboardSectionCardMapping, dashboardSection, dashboardFilter, dashboard, reportCard, customCardConfig, standardReportCardType, menuItem, locationHierarchy, video, checklistItemDetail, checklistDetail, rule, ruleDependency, individualRelationshipType, individualRelationGenderMapping, individualRelation, formMapping, formElement, formElementGroup, form, documentationItem, documentation, identifierSource, organisationConfig, platformTranslation, translation, locationMapping, addressLevel, taskStatus, taskType, encounterType, program, gender, groupRole, subjectType, conceptAnswer, concept, myGroups, groupPrivileges, groups, privilege, resetSync, subjectMigration, userSubjectAssignment, task, taskUnAssigment, subjectProgramEligibility, news, videoTelemetric, groupSubject, comment, commentThread, entityApprovalStatus, subjectEntityApprovalStatus, encounterEntityApprovalStatus, programEncounterEntityApprovalStatus, programEnrolmentEntityApprovalStatus, checklistItemEntityApprovalStatus, individualRelationship, checklistItem, checklist, encounter, identifierAssignment, programEncounter, programEnrolment, individual, extension, userInfo, ruleFailureTelemetry, syncTelemetry];
|
|
588
|
+
return [groupDashboard, approvalStatus, dashboardSectionCardMapping, dashboardSection, dashboardFilter, dashboard, reportCard, customCardConfig, standardReportCardType, menuItem, locationHierarchy, video, checklistItemDetail, checklistDetail, rule, ruleDependency, individualRelationshipType, individualRelationGenderMapping, individualRelation, formMapping, formElement, formElementGroup, form, documentationItem, documentation, identifierSource, organisationConfig, platformTranslation, translation, locationMapping, addressLevel, taskStatus, taskType, encounterType, program, gender, groupRole, calendarDateMarker, calendar, attendanceType, subjectType, conceptAnswer, concept, myGroups, groupPrivileges, groups, privilege, resetSync, subjectMigration, userSubjectAssignment, task, taskUnAssigment, subjectProgramEligibility, news, videoTelemetric, groupSubject, comment, commentThread, entityApprovalStatus, subjectEntityApprovalStatus, encounterEntityApprovalStatus, programEncounterEntityApprovalStatus, programEnrolmentEntityApprovalStatus, checklistItemEntityApprovalStatus, individualRelationship, checklistItem, checklist, attendanceRecord, session, encounter, identifierAssignment, programEncounter, programEnrolment, individual, extension, userInfo, ruleFailureTelemetry, syncTelemetry];
|
|
556
589
|
}
|
|
557
590
|
static entitiesLoadedFromServer() {
|
|
558
591
|
return _lodash.default.differenceBy(_Schema.default.getInstance().getEntities(), [_Settings.default, _LocaleMapping.default].concat(EntityMetaData.embeddedEntities()), "schema.name");
|
package/dist/Schema.js
CHANGED
|
@@ -100,9 +100,14 @@ var _MetaDataService = _interopRequireDefault(require("./service/MetaDataService
|
|
|
100
100
|
var _ReportCardResult = _interopRequireDefault(require("./reports/ReportCardResult"));
|
|
101
101
|
var _NestedReportCardResult = _interopRequireDefault(require("./reports/NestedReportCardResult"));
|
|
102
102
|
var _SubjectLocation = _interopRequireDefault(require("./SubjectLocation"));
|
|
103
|
+
var _Calendar = _interopRequireDefault(require("./Calendar"));
|
|
104
|
+
var _CalendarDateMarker = _interopRequireDefault(require("./CalendarDateMarker"));
|
|
105
|
+
var _AttendanceType = _interopRequireDefault(require("./AttendanceType"));
|
|
106
|
+
var _Session = _interopRequireDefault(require("./Session"));
|
|
107
|
+
var _AttendanceRecord = _interopRequireDefault(require("./AttendanceRecord"));
|
|
103
108
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
104
109
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
105
|
-
const entities = [_ReportCardResult.default, _NestedReportCardResult.default, _SubjectLocation.default, _DashboardFilter.default, _LocaleMapping.default, _Settings.default, _ConceptAnswer.default, _ConceptMedia.default, _Concept.default, _EncounterType.default, _Gender.default, _AddressLevel.LocationMapping, _AddressLevel.default, _KeyValue.default, _Form.default, _FormMapping.default, _FormElementGroup.default, _FormElement.default, _SubjectType.default, _Individual.default, _Program.default, _ProgramEnrolment.default, _Observation.default, _ProgramEncounter.default, _Encounter.default, _EntitySyncStatus.default, _EntityQueue.default, _Checklist.default, _ChecklistItem.default, _Format.default, _UserInfo.default, _StringKeyNumericValue.default, _Family.default, _IndividualRelation.default, _IndividualRelationGenderMapping.default, _IndividualRelationshipType.default, _IndividualRelationship.default, _RuleDependency.default, _Rule.default, _ChecklistItemStatus.default, _ChecklistDetail.default, _ChecklistItemDetail.default, _VideoTelemetric.default, _Video.default, _MediaQueue.default, _Point.default, _SyncTelemetry.default, _IdentifierSource.default, _IdentifierAssignment.default, _RuleFailureTelemetry.default, _BeneficiaryModePin.default, _OrganisationConfig.default, _PlatformTranslation.default, _Translation.default, _Groups.default, _MyGroups.default, _GroupPrivileges.default, _Privilege.default, _GroupRole.default, _GroupSubject.default, _DashboardCache.default, _CustomDashboardCache.default, _LocationHierarchy.default, _CustomCardConfig.default, _ReportCard.default, _Dashboard.default, _DashboardSectionCardMapping.default, _DraftSubject.default, _StandardReportCardType.default, _ApprovalStatus.default, _EntityApprovalStatus.default, _GroupDashboard.default, _DashboardSection.default, _News.default, _Comment.default, _CommentThread.default, _Extension.default, _SubjectMigration.default, _ResetSync.default, _Documentation.default, _DocumentationItem.default, _TaskType.default, _TaskStatus.default, _Task.default, _TaskUnAssignment.default, _DraftEncounter.default, _DraftEnrolment.default, _DraftProgramEncounter.default, _SubjectProgramEligibility.default, _MenuItem.default, _UserSubjectAssignment.default];
|
|
110
|
+
const entities = [_ReportCardResult.default, _NestedReportCardResult.default, _SubjectLocation.default, _DashboardFilter.default, _LocaleMapping.default, _Settings.default, _ConceptAnswer.default, _ConceptMedia.default, _Concept.default, _EncounterType.default, _Gender.default, _AddressLevel.LocationMapping, _AddressLevel.default, _KeyValue.default, _Form.default, _FormMapping.default, _FormElementGroup.default, _FormElement.default, _SubjectType.default, _Individual.default, _Program.default, _ProgramEnrolment.default, _Observation.default, _ProgramEncounter.default, _Encounter.default, _EntitySyncStatus.default, _EntityQueue.default, _Checklist.default, _ChecklistItem.default, _Format.default, _UserInfo.default, _StringKeyNumericValue.default, _Family.default, _IndividualRelation.default, _IndividualRelationGenderMapping.default, _IndividualRelationshipType.default, _IndividualRelationship.default, _RuleDependency.default, _Rule.default, _ChecklistItemStatus.default, _ChecklistDetail.default, _ChecklistItemDetail.default, _VideoTelemetric.default, _Video.default, _MediaQueue.default, _Point.default, _SyncTelemetry.default, _IdentifierSource.default, _IdentifierAssignment.default, _RuleFailureTelemetry.default, _BeneficiaryModePin.default, _OrganisationConfig.default, _PlatformTranslation.default, _Translation.default, _Groups.default, _MyGroups.default, _GroupPrivileges.default, _Privilege.default, _GroupRole.default, _GroupSubject.default, _DashboardCache.default, _CustomDashboardCache.default, _LocationHierarchy.default, _CustomCardConfig.default, _ReportCard.default, _Dashboard.default, _DashboardSectionCardMapping.default, _DraftSubject.default, _StandardReportCardType.default, _ApprovalStatus.default, _EntityApprovalStatus.default, _GroupDashboard.default, _DashboardSection.default, _News.default, _Comment.default, _CommentThread.default, _Extension.default, _SubjectMigration.default, _ResetSync.default, _Documentation.default, _DocumentationItem.default, _TaskType.default, _TaskStatus.default, _Task.default, _TaskUnAssignment.default, _DraftEncounter.default, _DraftEnrolment.default, _DraftProgramEncounter.default, _SubjectProgramEligibility.default, _MenuItem.default, _UserSubjectAssignment.default, _Calendar.default, _CalendarDateMarker.default, _AttendanceType.default, _Session.default, _AttendanceRecord.default];
|
|
106
111
|
function migrateObjectTypeFieldToEmbedded(newDB, oldDB, schemaName, field, creatorFn) {
|
|
107
112
|
console.log(`schema: ${schemaName}, field: ${field}`);
|
|
108
113
|
newDB.objects(schemaName).forEach(newDbParentEntity => {
|
|
@@ -181,7 +186,7 @@ function createRealmConfig() {
|
|
|
181
186
|
return doCompact;
|
|
182
187
|
},
|
|
183
188
|
//order is important, should be arranged according to the dependency
|
|
184
|
-
schemaVersion:
|
|
189
|
+
schemaVersion: 212,
|
|
185
190
|
onMigration: function (oldDB, newDB) {
|
|
186
191
|
console.log("[AvniModels.Schema]", `Running migration with old schema version: ${oldDB.schemaVersion} and new schema version: ${newDB.schemaVersion}`);
|
|
187
192
|
if (oldDB.schemaVersion === VersionWithEmbeddedMigrationProblem) throw new Error(`Update from schema version ${VersionWithEmbeddedMigrationProblem} is not allowed. Please uninstall and install app.`);
|
|
@@ -812,6 +817,12 @@ function createRealmConfig() {
|
|
|
812
817
|
config.translations = null;
|
|
813
818
|
});
|
|
814
819
|
}
|
|
820
|
+
if (oldDB.schemaVersion < 212) {
|
|
821
|
+
// Additive: introduces Calendar, CalendarDateMarker, AttendanceType,
|
|
822
|
+
// Session, AttendanceRecord schemas and SubjectType.attendanceEnabled
|
|
823
|
+
// (bool default false). Realm backfills the new boolean and the new
|
|
824
|
+
// schemas have no pre-existing rows.
|
|
825
|
+
}
|
|
815
826
|
}
|
|
816
827
|
};
|
|
817
828
|
}
|
package/dist/SchemaNames.js
CHANGED
|
@@ -53,5 +53,10 @@ _defineProperty(SchemaNames, "Concept", "Concept");
|
|
|
53
53
|
_defineProperty(SchemaNames, "ConceptMedia", "ConceptMedia");
|
|
54
54
|
_defineProperty(SchemaNames, "EntityApprovalStatus", "EntityApprovalStatus");
|
|
55
55
|
_defineProperty(SchemaNames, "Point", "Point");
|
|
56
|
+
_defineProperty(SchemaNames, "Calendar", "Calendar");
|
|
57
|
+
_defineProperty(SchemaNames, "CalendarDateMarker", "CalendarDateMarker");
|
|
58
|
+
_defineProperty(SchemaNames, "AttendanceType", "AttendanceType");
|
|
59
|
+
_defineProperty(SchemaNames, "Session", "Session");
|
|
60
|
+
_defineProperty(SchemaNames, "AttendanceRecord", "AttendanceRecord");
|
|
56
61
|
var _default = SchemaNames;
|
|
57
62
|
exports.default = _default;
|
package/dist/Session.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _BaseEntity = _interopRequireDefault(require("./BaseEntity"));
|
|
8
|
+
var _General = _interopRequireDefault(require("./utility/General"));
|
|
9
|
+
var _SchemaNames = _interopRequireDefault(require("./SchemaNames"));
|
|
10
|
+
var _AuditUtil = require("./utility/AuditUtil");
|
|
11
|
+
var _DateTimeUtil = _interopRequireDefault(require("./utility/DateTimeUtil"));
|
|
12
|
+
var _AttendanceRecord = _interopRequireDefault(require("./AttendanceRecord"));
|
|
13
|
+
var _Encounter = _interopRequireDefault(require("./Encounter"));
|
|
14
|
+
var _ProgramEncounter = _interopRequireDefault(require("./ProgramEncounter"));
|
|
15
|
+
var _moment = _interopRequireDefault(require("moment"));
|
|
16
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
17
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
19
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
20
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
21
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
22
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
23
|
+
class Session extends _BaseEntity.default {
|
|
24
|
+
constructor(that = null) {
|
|
25
|
+
super(that);
|
|
26
|
+
}
|
|
27
|
+
get groupSubjectUUID() {
|
|
28
|
+
return this.that.groupSubjectUUID;
|
|
29
|
+
}
|
|
30
|
+
set groupSubjectUUID(x) {
|
|
31
|
+
this.that.groupSubjectUUID = x;
|
|
32
|
+
}
|
|
33
|
+
get scheduledDate() {
|
|
34
|
+
return this.that.scheduledDate;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Accepts a "YYYY-MM-DD" string or a JS Date; normalizes to a canonical string.
|
|
38
|
+
set scheduledDate(x) {
|
|
39
|
+
this.that.scheduledDate = _DateTimeUtil.default.toCalendarDateString(x);
|
|
40
|
+
}
|
|
41
|
+
get attendanceTypeUUID() {
|
|
42
|
+
return this.that.attendanceTypeUUID;
|
|
43
|
+
}
|
|
44
|
+
set attendanceTypeUUID(x) {
|
|
45
|
+
this.that.attendanceTypeUUID = x;
|
|
46
|
+
}
|
|
47
|
+
get status() {
|
|
48
|
+
return this.that.status;
|
|
49
|
+
}
|
|
50
|
+
set status(x) {
|
|
51
|
+
this.that.status = x;
|
|
52
|
+
}
|
|
53
|
+
get reasonConceptUUID() {
|
|
54
|
+
return this.that.reasonConceptUUID;
|
|
55
|
+
}
|
|
56
|
+
set reasonConceptUUID(x) {
|
|
57
|
+
this.that.reasonConceptUUID = x;
|
|
58
|
+
}
|
|
59
|
+
get notes() {
|
|
60
|
+
return this.that.notes;
|
|
61
|
+
}
|
|
62
|
+
set notes(x) {
|
|
63
|
+
this.that.notes = x;
|
|
64
|
+
}
|
|
65
|
+
get markedByUserName() {
|
|
66
|
+
return this.that.markedByUserName;
|
|
67
|
+
}
|
|
68
|
+
set markedByUserName(x) {
|
|
69
|
+
this.that.markedByUserName = x;
|
|
70
|
+
}
|
|
71
|
+
get markedAt() {
|
|
72
|
+
return this.that.markedAt;
|
|
73
|
+
}
|
|
74
|
+
set markedAt(x) {
|
|
75
|
+
this.that.markedAt = x;
|
|
76
|
+
}
|
|
77
|
+
get createdBy() {
|
|
78
|
+
return this.that.createdBy;
|
|
79
|
+
}
|
|
80
|
+
set createdBy(x) {
|
|
81
|
+
this.that.createdBy = x;
|
|
82
|
+
}
|
|
83
|
+
get lastModifiedBy() {
|
|
84
|
+
return this.that.lastModifiedBy;
|
|
85
|
+
}
|
|
86
|
+
set lastModifiedBy(x) {
|
|
87
|
+
this.that.lastModifiedBy = x;
|
|
88
|
+
}
|
|
89
|
+
get createdByUUID() {
|
|
90
|
+
return this.that.createdByUUID;
|
|
91
|
+
}
|
|
92
|
+
set createdByUUID(x) {
|
|
93
|
+
this.that.createdByUUID = x;
|
|
94
|
+
}
|
|
95
|
+
get lastModifiedByUUID() {
|
|
96
|
+
return this.that.lastModifiedByUUID;
|
|
97
|
+
}
|
|
98
|
+
set lastModifiedByUUID(x) {
|
|
99
|
+
this.that.lastModifiedByUUID = x;
|
|
100
|
+
}
|
|
101
|
+
isHeld() {
|
|
102
|
+
return this.status === Session.status.HELD;
|
|
103
|
+
}
|
|
104
|
+
isDidntHappen() {
|
|
105
|
+
return this.status === Session.status.DIDNT_HAPPEN;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Caller iterates the returned records and persists them in the same realm.write.
|
|
109
|
+
// rosterByStudentUUID: { [studentUUID]: { status: 'Present'|'Absent', reasonConceptUUID?: string } }
|
|
110
|
+
markHeld(rosterByStudentUUID) {
|
|
111
|
+
this.status = Session.status.HELD;
|
|
112
|
+
this.reasonConceptUUID = null;
|
|
113
|
+
this.markedAt = new Date();
|
|
114
|
+
const records = [];
|
|
115
|
+
_lodash.default.forOwn(rosterByStudentUUID || {}, (entry, studentUUID) => {
|
|
116
|
+
const record = new _AttendanceRecord.default();
|
|
117
|
+
record.uuid = _General.default.randomUUID();
|
|
118
|
+
record.sessionUUID = this.uuid;
|
|
119
|
+
record.subjectUUID = studentUUID;
|
|
120
|
+
record.status = entry.status;
|
|
121
|
+
record.reasonConceptUUID = entry.reasonConceptUUID || null;
|
|
122
|
+
record.followUpEncounterUUID = null;
|
|
123
|
+
record.voided = false;
|
|
124
|
+
records.push(record);
|
|
125
|
+
});
|
|
126
|
+
return records;
|
|
127
|
+
}
|
|
128
|
+
markDidntHappen(reasonConcept, notes) {
|
|
129
|
+
if (_lodash.default.isNil(reasonConcept) || _lodash.default.isNil(reasonConcept.uuid)) {
|
|
130
|
+
throw new Error("Session.markDidntHappen requires a reason concept");
|
|
131
|
+
}
|
|
132
|
+
this.status = Session.status.DIDNT_HAPPEN;
|
|
133
|
+
this.reasonConceptUUID = reasonConcept.uuid;
|
|
134
|
+
this.notes = notes || null;
|
|
135
|
+
this.markedAt = new Date();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Returns a list of newly built Encounter or ProgramEncounter instances; mutates
|
|
139
|
+
// each triggering record's followUpEncounterUUID. Caller persists in same realm.write.
|
|
140
|
+
//
|
|
141
|
+
// Options:
|
|
142
|
+
// attendanceRecords — the AttendanceRecords created for this session
|
|
143
|
+
// attendanceType — the AttendanceType driving this session (config carries follow-up type)
|
|
144
|
+
// encounterType — resolved EncounterType matching attendanceType.getFollowUpEncounterTypeUUID()
|
|
145
|
+
// programUUID — if set, the encounterType is a program-encounter type; caller resolved this
|
|
146
|
+
// via FormMapping. If null/undef, a general Encounter is created.
|
|
147
|
+
// studentLookup — (subjectUUID) => Individual | null
|
|
148
|
+
// enrolmentLookup — (student, programUUID) => ProgramEnrolment | null
|
|
149
|
+
// only consulted when programUUID is set.
|
|
150
|
+
autoCreateFollowUps({
|
|
151
|
+
attendanceRecords,
|
|
152
|
+
attendanceType,
|
|
153
|
+
encounterType,
|
|
154
|
+
programUUID,
|
|
155
|
+
studentLookup,
|
|
156
|
+
enrolmentLookup
|
|
157
|
+
} = {}) {
|
|
158
|
+
if (!attendanceType) return [];
|
|
159
|
+
const followUpEncounterTypeUUID = attendanceType.getFollowUpEncounterTypeUUID();
|
|
160
|
+
if (!followUpEncounterTypeUUID) return [];
|
|
161
|
+
if (!encounterType) return [];
|
|
162
|
+
const startOfToday = (0, _moment.default)().startOf("day").toDate();
|
|
163
|
+
const maxVisit = (0, _moment.default)().startOf("day").add(2, "days").toDate();
|
|
164
|
+
const created = [];
|
|
165
|
+
_lodash.default.forEach(attendanceRecords || [], record => {
|
|
166
|
+
if (!record) return;
|
|
167
|
+
if (record.status !== _AttendanceRecord.default.status.ABSENT) return;
|
|
168
|
+
if (!_lodash.default.isNil(record.reasonConceptUUID)) return;
|
|
169
|
+
const student = studentLookup ? studentLookup(record.subjectUUID) : null;
|
|
170
|
+
if (!student) return;
|
|
171
|
+
let encounter;
|
|
172
|
+
if (programUUID) {
|
|
173
|
+
const enrolment = enrolmentLookup ? enrolmentLookup(student, programUUID) : null;
|
|
174
|
+
if (!enrolment) return;
|
|
175
|
+
encounter = new _ProgramEncounter.default();
|
|
176
|
+
encounter.uuid = _General.default.randomUUID();
|
|
177
|
+
encounter.encounterType = encounterType;
|
|
178
|
+
encounter.programEnrolment = enrolment;
|
|
179
|
+
encounter.earliestVisitDateTime = startOfToday;
|
|
180
|
+
encounter.maxVisitDateTime = maxVisit;
|
|
181
|
+
encounter.observations = [];
|
|
182
|
+
encounter.cancelObservations = [];
|
|
183
|
+
encounter.voided = false;
|
|
184
|
+
} else {
|
|
185
|
+
encounter = new _Encounter.default();
|
|
186
|
+
encounter.uuid = _General.default.randomUUID();
|
|
187
|
+
encounter.encounterType = encounterType;
|
|
188
|
+
encounter.individual = student;
|
|
189
|
+
encounter.earliestVisitDateTime = startOfToday;
|
|
190
|
+
encounter.maxVisitDateTime = maxVisit;
|
|
191
|
+
encounter.observations = [];
|
|
192
|
+
encounter.cancelObservations = [];
|
|
193
|
+
encounter.voided = false;
|
|
194
|
+
}
|
|
195
|
+
record.followUpEncounterUUID = encounter.uuid;
|
|
196
|
+
created.push(encounter);
|
|
197
|
+
});
|
|
198
|
+
return created;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Void previously-auto-created follow-up encounters that are no longer warranted,
|
|
202
|
+
// skipping any encounter that has been started (has observations) or completed.
|
|
203
|
+
// Returns { voided: [...], skipped: [...] }.
|
|
204
|
+
voidStaleFollowUps(previousRecords, newRecords, encounterLookup) {
|
|
205
|
+
const result = {
|
|
206
|
+
voided: [],
|
|
207
|
+
skipped: []
|
|
208
|
+
};
|
|
209
|
+
const prevByStudent = _lodash.default.keyBy(previousRecords || [], "subjectUUID");
|
|
210
|
+
const newByStudent = _lodash.default.keyBy(newRecords || [], "subjectUUID");
|
|
211
|
+
_lodash.default.forOwn(prevByStudent, (prev, studentUUID) => {
|
|
212
|
+
if (!prev || !prev.followUpEncounterUUID) return;
|
|
213
|
+
const next = newByStudent[studentUUID];
|
|
214
|
+
const stillNeedsFollowUp = next && next.status === _AttendanceRecord.default.status.ABSENT && _lodash.default.isNil(next.reasonConceptUUID);
|
|
215
|
+
if (stillNeedsFollowUp) return;
|
|
216
|
+
const encounter = encounterLookup ? encounterLookup(prev.followUpEncounterUUID) : null;
|
|
217
|
+
if (!encounter) return;
|
|
218
|
+
const isScheduledNoObs = (_lodash.default.isFunction(encounter.isScheduled) ? encounter.isScheduled() : _lodash.default.isNil(encounter.encounterDateTime)) && _lodash.default.isEmpty(encounter.observations);
|
|
219
|
+
if (isScheduledNoObs) {
|
|
220
|
+
encounter.voided = true;
|
|
221
|
+
result.voided.push(encounter);
|
|
222
|
+
} else {
|
|
223
|
+
result.skipped.push(encounter);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
static fromResource(resource) {
|
|
229
|
+
const session = new Session();
|
|
230
|
+
session.uuid = resource.uuid;
|
|
231
|
+
session.groupSubjectUUID = resource.groupSubjectUUID;
|
|
232
|
+
session.scheduledDate = resource.scheduledDate; // setter normalizes
|
|
233
|
+
session.attendanceTypeUUID = resource.attendanceTypeUUID;
|
|
234
|
+
session.status = resource.status;
|
|
235
|
+
session.reasonConceptUUID = resource.reasonConceptUUID || null;
|
|
236
|
+
session.notes = resource.notes || null;
|
|
237
|
+
session.markedByUserName = resource.markedByUserName || null;
|
|
238
|
+
// markedAt is a true timestamp (not a calendar date) — preserve the instant.
|
|
239
|
+
session.markedAt = _lodash.default.isNil(resource.markedAt) ? null : new Date(resource.markedAt);
|
|
240
|
+
session.voided = !!resource.voided;
|
|
241
|
+
(0, _AuditUtil.mapAuditFields)(session, resource);
|
|
242
|
+
return session;
|
|
243
|
+
}
|
|
244
|
+
get toResource() {
|
|
245
|
+
const resource = _lodash.default.pick(this, ["uuid", "groupSubjectUUID", "scheduledDate", "attendanceTypeUUID", "status", "markedByUserName", "voided"]);
|
|
246
|
+
resource.markedAt = _lodash.default.isNil(this.markedAt) ? null : (0, _moment.default)(this.markedAt).format();
|
|
247
|
+
resource.reasonConceptUUID = this.reasonConceptUUID || null;
|
|
248
|
+
resource.notes = this.notes || null;
|
|
249
|
+
return resource;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
_defineProperty(Session, "schema", {
|
|
253
|
+
name: _SchemaNames.default.Session,
|
|
254
|
+
primaryKey: "uuid",
|
|
255
|
+
properties: _objectSpread({
|
|
256
|
+
uuid: "string",
|
|
257
|
+
groupSubjectUUID: "string",
|
|
258
|
+
// scheduledDate is a Postgres `date` (no time, no zone); stored as
|
|
259
|
+
// "YYYY-MM-DD" so the client carries zero TZ semantics at rest.
|
|
260
|
+
scheduledDate: "string",
|
|
261
|
+
attendanceTypeUUID: "string",
|
|
262
|
+
status: "string",
|
|
263
|
+
reasonConceptUUID: {
|
|
264
|
+
type: "string",
|
|
265
|
+
optional: true
|
|
266
|
+
},
|
|
267
|
+
notes: {
|
|
268
|
+
type: "string",
|
|
269
|
+
optional: true
|
|
270
|
+
},
|
|
271
|
+
markedByUserName: {
|
|
272
|
+
type: "string",
|
|
273
|
+
optional: true
|
|
274
|
+
},
|
|
275
|
+
// markedAt is a true timestamp (when the user saved) — Realm `date` is fine.
|
|
276
|
+
markedAt: {
|
|
277
|
+
type: "date",
|
|
278
|
+
optional: true
|
|
279
|
+
},
|
|
280
|
+
voided: {
|
|
281
|
+
type: "bool",
|
|
282
|
+
default: false
|
|
283
|
+
}
|
|
284
|
+
}, _AuditUtil.AuditFields)
|
|
285
|
+
});
|
|
286
|
+
_defineProperty(Session, "status", {
|
|
287
|
+
HELD: "Held",
|
|
288
|
+
DIDNT_HAPPEN: "DidntHappen"
|
|
289
|
+
});
|
|
290
|
+
var _default = Session;
|
|
291
|
+
exports.default = _default;
|
package/dist/SubjectType.js
CHANGED
|
@@ -144,6 +144,12 @@ class SubjectType extends _ReferenceEntity.default {
|
|
|
144
144
|
set settings(x) {
|
|
145
145
|
this.that.settings = x;
|
|
146
146
|
}
|
|
147
|
+
get attendanceEnabled() {
|
|
148
|
+
return this.that.attendanceEnabled;
|
|
149
|
+
}
|
|
150
|
+
set attendanceEnabled(x) {
|
|
151
|
+
this.that.attendanceEnabled = x;
|
|
152
|
+
}
|
|
147
153
|
static create(name, group = false, household = false, type) {
|
|
148
154
|
let subjectType = new SubjectType();
|
|
149
155
|
subjectType.uuid = _General.default.randomUUID();
|
|
@@ -179,6 +185,7 @@ class SubjectType extends _ReferenceEntity.default {
|
|
|
179
185
|
subjectType.syncRegistrationConcept2 = _ResourceUtil.default.getUUIDFor(operationalSubjectType, 'syncRegistrationConcept2');
|
|
180
186
|
subjectType.nameHelpText = _ResourceUtil.default.getUUIDFor(operationalSubjectType, 'nameHelpText');
|
|
181
187
|
subjectType.settings = !_lodash.default.isNil(operationalSubjectType.settings) ? JSON.stringify(operationalSubjectType.settings) : '{}';
|
|
188
|
+
subjectType.attendanceEnabled = !!operationalSubjectType.attendanceEnabled;
|
|
182
189
|
return subjectType;
|
|
183
190
|
}
|
|
184
191
|
clone() {
|
|
@@ -207,6 +214,7 @@ class SubjectType extends _ReferenceEntity.default {
|
|
|
207
214
|
cloned.syncRegistrationConcept2 = this.syncRegistrationConcept2;
|
|
208
215
|
cloned.nameHelpText = this.nameHelpText;
|
|
209
216
|
cloned.settings = this.settings;
|
|
217
|
+
cloned.attendanceEnabled = this.attendanceEnabled;
|
|
210
218
|
return cloned;
|
|
211
219
|
}
|
|
212
220
|
isPerson() {
|
|
@@ -236,6 +244,10 @@ class SubjectType extends _ReferenceEntity.default {
|
|
|
236
244
|
getSetting(settingName) {
|
|
237
245
|
return this.getSettings()[settingName];
|
|
238
246
|
}
|
|
247
|
+
getAttendanceTypes(allAttendanceTypes) {
|
|
248
|
+
if (_lodash.default.isEmpty(allAttendanceTypes)) return [];
|
|
249
|
+
return _lodash.default.chain(allAttendanceTypes).filter(at => at && !at.voided && at.subjectTypeUUID === this.uuid).sortBy(at => _lodash.default.isNil(at.sortOrder) ? 0 : at.sortOrder).value();
|
|
250
|
+
}
|
|
239
251
|
}
|
|
240
252
|
_defineProperty(SubjectType, "schema", {
|
|
241
253
|
name: 'SubjectType',
|
|
@@ -326,6 +338,10 @@ _defineProperty(SubjectType, "schema", {
|
|
|
326
338
|
settings: {
|
|
327
339
|
type: "string",
|
|
328
340
|
default: '{}'
|
|
341
|
+
},
|
|
342
|
+
attendanceEnabled: {
|
|
343
|
+
type: 'bool',
|
|
344
|
+
default: false
|
|
329
345
|
}
|
|
330
346
|
}
|
|
331
347
|
});
|
|
@@ -23,7 +23,7 @@ class WorkItem {
|
|
|
23
23
|
}
|
|
24
24
|
validate() {
|
|
25
25
|
assertTrue(WorkItem.type[this.type], "Work item must be one of WorkItem.type");
|
|
26
|
-
if (!_lodash.default.includes([WorkItem.type.REGISTRATION, WorkItem.type.ADD_MEMBER, WorkItem.type.HOUSEHOLD], this.type)) {
|
|
26
|
+
if (!_lodash.default.includes([WorkItem.type.REGISTRATION, WorkItem.type.ADD_MEMBER, WorkItem.type.HOUSEHOLD, WorkItem.type.SHARE_SESSION], this.type)) {
|
|
27
27
|
this.ensureFieldExists("subjectUUID");
|
|
28
28
|
}
|
|
29
29
|
if (this.type === WorkItem.type.PROGRAM_ENROLMENT) {
|
|
@@ -42,6 +42,17 @@ class WorkItem {
|
|
|
42
42
|
if (this.type === WorkItem.type.REMOVE_MEMBER) {
|
|
43
43
|
this.ensureFieldExists("groupSubjectUUID");
|
|
44
44
|
}
|
|
45
|
+
if (this.type === WorkItem.type.SHARE) {
|
|
46
|
+
this.validateShareFormat();
|
|
47
|
+
}
|
|
48
|
+
if (this.type === WorkItem.type.SHARE_SESSION) {
|
|
49
|
+
this.ensureFieldExists("sessionUUID");
|
|
50
|
+
this.validateShareFormat();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
validateShareFormat() {
|
|
54
|
+
const format = _lodash.default.get(this.parameters, "format");
|
|
55
|
+
assertTrue(format === WorkItem.shareFormat.PDF || format === WorkItem.shareFormat.TEXT, `Work Item id: ${this.id}, type: ${this.type}, format must be 'pdf' or 'text', got '${format}'`);
|
|
45
56
|
}
|
|
46
57
|
fieldMissingError(field) {
|
|
47
58
|
return `Work Item id: ${this.id}, type: ${this.type}, ` + `parameters: {${Object.keys(this.parameters)}}, ` + `'${field}: ${this.parameters[field]}', ` + `errorMessage: '${field} is mandatory'`;
|
|
@@ -63,5 +74,11 @@ _defineProperty(WorkItem, "type", {
|
|
|
63
74
|
CANCELLED_ENCOUNTER: "CANCELLED_ENCOUNTER",
|
|
64
75
|
ADD_MEMBER: "ADD_MEMBER",
|
|
65
76
|
HOUSEHOLD: "HOUSEHOLD",
|
|
66
|
-
REMOVE_MEMBER: "REMOVE_MEMBER"
|
|
77
|
+
REMOVE_MEMBER: "REMOVE_MEMBER",
|
|
78
|
+
SHARE: "SHARE",
|
|
79
|
+
SHARE_SESSION: "SHARE_SESSION"
|
|
80
|
+
});
|
|
81
|
+
_defineProperty(WorkItem, "shareFormat", {
|
|
82
|
+
PDF: "pdf",
|
|
83
|
+
TEXT: "text"
|
|
67
84
|
});
|
package/dist/index.js
CHANGED
|
@@ -855,6 +855,42 @@ Object.defineProperty(exports, "SubjectLocation", {
|
|
|
855
855
|
return _SubjectLocation.default;
|
|
856
856
|
}
|
|
857
857
|
});
|
|
858
|
+
Object.defineProperty(exports, "Calendar", {
|
|
859
|
+
enumerable: true,
|
|
860
|
+
get: function () {
|
|
861
|
+
return _Calendar.default;
|
|
862
|
+
}
|
|
863
|
+
});
|
|
864
|
+
Object.defineProperty(exports, "CalendarDateMarker", {
|
|
865
|
+
enumerable: true,
|
|
866
|
+
get: function () {
|
|
867
|
+
return _CalendarDateMarker.default;
|
|
868
|
+
}
|
|
869
|
+
});
|
|
870
|
+
Object.defineProperty(exports, "AttendanceType", {
|
|
871
|
+
enumerable: true,
|
|
872
|
+
get: function () {
|
|
873
|
+
return _AttendanceType.default;
|
|
874
|
+
}
|
|
875
|
+
});
|
|
876
|
+
Object.defineProperty(exports, "Session", {
|
|
877
|
+
enumerable: true,
|
|
878
|
+
get: function () {
|
|
879
|
+
return _Session.default;
|
|
880
|
+
}
|
|
881
|
+
});
|
|
882
|
+
Object.defineProperty(exports, "AttendanceRecord", {
|
|
883
|
+
enumerable: true,
|
|
884
|
+
get: function () {
|
|
885
|
+
return _AttendanceRecord.default;
|
|
886
|
+
}
|
|
887
|
+
});
|
|
888
|
+
Object.defineProperty(exports, "Calendars", {
|
|
889
|
+
enumerable: true,
|
|
890
|
+
get: function () {
|
|
891
|
+
return _Calendars.default;
|
|
892
|
+
}
|
|
893
|
+
});
|
|
858
894
|
var _AbstractEncounter = _interopRequireDefault(require("./AbstractEncounter"));
|
|
859
895
|
var _AddressLevel = _interopRequireWildcard(require("./AddressLevel"));
|
|
860
896
|
var _BaseEntity = _interopRequireDefault(require("./BaseEntity"));
|
|
@@ -992,5 +1028,11 @@ var _Range = _interopRequireDefault(require("./reports/Range"));
|
|
|
992
1028
|
var _ReportCardResult = _interopRequireDefault(require("./reports/ReportCardResult"));
|
|
993
1029
|
var _NestedReportCardResult = _interopRequireDefault(require("./reports/NestedReportCardResult"));
|
|
994
1030
|
var _SubjectLocation = _interopRequireDefault(require("./SubjectLocation"));
|
|
1031
|
+
var _Calendar = _interopRequireDefault(require("./Calendar"));
|
|
1032
|
+
var _CalendarDateMarker = _interopRequireDefault(require("./CalendarDateMarker"));
|
|
1033
|
+
var _AttendanceType = _interopRequireDefault(require("./AttendanceType"));
|
|
1034
|
+
var _Session = _interopRequireDefault(require("./Session"));
|
|
1035
|
+
var _AttendanceRecord = _interopRequireDefault(require("./AttendanceRecord"));
|
|
1036
|
+
var _Calendars = _interopRequireDefault(require("./location/Calendars"));
|
|
995
1037
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
996
1038
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
class Calendars {
|
|
10
|
+
// Walk the subject's address-level chain leaf -> root; return the first non-voided
|
|
11
|
+
// calendar attached at any level. Falls back to the org's global default calendar
|
|
12
|
+
// (addressLevelUUID == null). Returns null if neither resolves. Never throws.
|
|
13
|
+
static forSubject(subject, calendars) {
|
|
14
|
+
if (_lodash.default.isNil(subject) || _lodash.default.isEmpty(calendars)) return Calendars._globalDefault(calendars);
|
|
15
|
+
const addressLevel = subject.lowestAddressLevel;
|
|
16
|
+
if (_lodash.default.isNil(addressLevel) || !_lodash.default.isFunction(addressLevel.getLineage)) {
|
|
17
|
+
return Calendars._globalDefault(calendars);
|
|
18
|
+
}
|
|
19
|
+
const lineage = addressLevel.getLineage();
|
|
20
|
+
for (const level of lineage) {
|
|
21
|
+
if (_lodash.default.isNil(level)) continue;
|
|
22
|
+
const match = _lodash.default.find(calendars, c => c && !c.voided && c.addressLevelUUID === level.uuid);
|
|
23
|
+
if (match) return match;
|
|
24
|
+
}
|
|
25
|
+
return Calendars._globalDefault(calendars);
|
|
26
|
+
}
|
|
27
|
+
static _globalDefault(calendars) {
|
|
28
|
+
if (_lodash.default.isEmpty(calendars)) return null;
|
|
29
|
+
return _lodash.default.find(calendars, c => c && !c.voided && _lodash.default.isNil(c.addressLevelUUID)) || null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
var _default = Calendars;
|
|
33
|
+
exports.default = _default;
|
|
@@ -7,6 +7,7 @@ exports.default = void 0;
|
|
|
7
7
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
8
8
|
var _moment = _interopRequireDefault(require("moment"));
|
|
9
9
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
const CALENDAR_DATE_FORMAT = "YYYY-MM-DD";
|
|
10
11
|
class DateTimeUtil {
|
|
11
12
|
static validateDateRange(fromDate, toDate) {
|
|
12
13
|
if (_lodash.default.isNil(toDate) && _lodash.default.isNil(fromDate)) return [true];
|
|
@@ -20,6 +21,49 @@ class DateTimeUtil {
|
|
|
20
21
|
if (!(0, _moment.default)(fromTime, 'HH:mm').isSameOrBefore((0, _moment.default)(toTime, 'HH:mm'))) return [false, 'startTimeGreaterThanEndError'];
|
|
21
22
|
return [true];
|
|
22
23
|
}
|
|
24
|
+
|
|
25
|
+
// Calendar-date helpers.
|
|
26
|
+
//
|
|
27
|
+
// Calendar dates are Postgres `date` values on the server — no time, no zone.
|
|
28
|
+
// We mirror that exactly on the client by storing them as plain `"YYYY-MM-DD"`
|
|
29
|
+
// strings in Realm and returning them as strings from accessors. This makes
|
|
30
|
+
// it impossible to introduce timezone bugs at the storage layer.
|
|
31
|
+
//
|
|
32
|
+
// These helpers also accept JS `Date` inputs for convenience — they're
|
|
33
|
+
// normalised via UTC components so a caller who built a Date with
|
|
34
|
+
// `moment.utc(...)` or `DateTimeUtil.calendarDateToDate(string)` gets the
|
|
35
|
+
// day they wrote; a caller who hands in a local-midnight Date or a
|
|
36
|
+
// `new Date()` will see the UTC calendar day at that instant, which is
|
|
37
|
+
// the closest TZ-stable reading we can compute.
|
|
38
|
+
static toCalendarDateString(value) {
|
|
39
|
+
if (_lodash.default.isNil(value)) return null;
|
|
40
|
+
if (_lodash.default.isString(value)) {
|
|
41
|
+
// Canonicalise via moment.utc round-trip so "2026-05-9" → "2026-05-09",
|
|
42
|
+
// and any unsupported shape returns null rather than corrupt storage.
|
|
43
|
+
const m = _moment.default.utc(value, CALENDAR_DATE_FORMAT, true);
|
|
44
|
+
return m.isValid() ? m.format(CALENDAR_DATE_FORMAT) : null;
|
|
45
|
+
}
|
|
46
|
+
return _moment.default.utc(value).format(CALENDAR_DATE_FORMAT);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// For arithmetic on calendar dates (next/previous day, day-of-week extraction).
|
|
50
|
+
// Returns a moment in UTC mode anchored at start-of-day.
|
|
51
|
+
static calendarMoment(value) {
|
|
52
|
+
if (_lodash.default.isNil(value)) return null;
|
|
53
|
+
if (_lodash.default.isString(value)) return _moment.default.utc(value, CALENDAR_DATE_FORMAT).startOf("day");
|
|
54
|
+
return _moment.default.utc(value).startOf("day");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Optional: turn a stored "YYYY-MM-DD" back into a JS Date at UTC midnight,
|
|
58
|
+
// for callers (e.g. UI components) that need a Date object. Display code that
|
|
59
|
+
// uses this MUST format via `moment.utc(...)` or risk a TZ shift.
|
|
60
|
+
static calendarDateToDate(value) {
|
|
61
|
+
if (_lodash.default.isNil(value)) return null;
|
|
62
|
+
if (_lodash.default.isString(value)) {
|
|
63
|
+
return _moment.default.utc(value, CALENDAR_DATE_FORMAT).startOf("day").toDate();
|
|
64
|
+
}
|
|
65
|
+
return _moment.default.utc(value).startOf("day").toDate();
|
|
66
|
+
}
|
|
23
67
|
}
|
|
24
68
|
var _default = DateTimeUtil;
|
|
25
69
|
exports.default = _default;
|