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.
@@ -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;
@@ -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;
@@ -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: 211,
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
  }
@@ -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;
@@ -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;
@@ -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;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "openchs-models",
3
3
  "description": "OpenCHS data model to be used by front end clients",
4
- "version": "1.33.45",
4
+ "version": "1.33.47",
5
5
  "private": false,
6
6
  "repository": {
7
7
  "type": "git",