Skip to content

Commit 22af47c

Browse files
Merge pull request #477 from tidepool-org/WEB-3698-dosing-decision-bolus-normal
[BACK-3698/BACK-3697] Updates to dosing decision model
2 parents f4bc155 + 6875bbf commit 22af47c

File tree

7 files changed

+39
-19
lines changed

7 files changed

+39
-19
lines changed

data/types.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,8 +426,8 @@ export class DosingDecision extends Common {
426426
}],
427427
deviceTime: this.makeDeviceTime(),
428428
reason: 'normalBolus',
429-
recommendedBolus: { amount: '2' },
430-
requestedBolus: { amount: '1.5' },
429+
recommendedBolus: { normal: '2' },
430+
requestedBolus: { normal: '1.5' },
431431
units: MGDL_UNITS,
432432
});
433433

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"node": "20.8.0"
55
},
66
"packageManager": "[email protected]",
7-
"version": "1.47.0-web-3688-twiist-suppressed-basal-data.2",
7+
"version": "1.46.1-web-3698-dosing-decision-bolus-normal",
88
"description": "Tidepool data visualization for diabetes device data.",
99
"keywords": [
1010
"data visualization"

src/utils/DataUtil.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,16 @@ export class DataUtil {
226226
d.sampleInterval = sampleInterval;
227227
}
228228

229+
// Use normal instead of deprecated amount for recommendedBolus and requestedBolus
230+
if (d.type === 'dosingDecision') {
231+
_.each([d.recommendedBolus, d.requestedBolus], (bolus) => {
232+
if (_.isObject(bolus)) {
233+
bolus.normal = _.get(bolus, 'normal', _.get(bolus, 'amount'));
234+
delete bolus.amount;
235+
}
236+
});
237+
}
238+
229239
// We validate datums before converting the time and deviceTime to hammerTime integers,
230240
// as we want to validate that they are valid ISO date strings
231241
this.validateDatumIn(d);
@@ -258,7 +268,7 @@ export class DataUtil {
258268
}
259269

260270
// Populate mappings to be used for 2-way join of boluses and dosing decisions
261-
if (d.type === 'dosingDecision' && _.includes(['normalBolus', 'simpleBolus', 'watchBolus'], d.reason)) {
271+
if (d.type === 'dosingDecision' && _.includes(['normalBolus', 'simpleBolus', 'watchBolus', 'oneButtonBolus'], d.reason)) {
262272
this.bolusDosingDecisionDatumsByIdMap[d.id] = d;
263273
}
264274

@@ -325,7 +335,7 @@ export class DataUtil {
325335
);
326336

327337
const sortedProximateDosingDecisions = _.orderBy(proximateDosingDecisions, ({ time }) => Math.abs(time - d.time), 'asc');
328-
const dosingDecisionWithMatchingNormal = _.find(sortedProximateDosingDecisions, dosingDecision => dosingDecision.requestedBolus?.amount === d.normal);
338+
const dosingDecisionWithMatchingNormal = _.find(sortedProximateDosingDecisions, dosingDecision => dosingDecision.requestedBolus?.normal === d.normal);
329339
d.dosingDecision = dosingDecisionWithMatchingNormal || sortedProximateDosingDecisions[0];
330340

331341
if (d.dosingDecision) {
@@ -334,7 +344,7 @@ export class DataUtil {
334344
d.dosingDecision.pumpSettings = this.pumpSettingsDatumsByIdMap[associatedPumpSettingsId];
335345

336346
// Translate relevant dosing decision data onto expected bolus fields
337-
d.expectedNormal = d.dosingDecision.requestedBolus?.amount;
347+
d.expectedNormal = d.dosingDecision.requestedBolus?.normal;
338348
d.carbInput = d.dosingDecision.food?.nutrition?.carbohydrate?.net;
339349
d.bgInput = _.last(d.dosingDecision.bgHistorical || [])?.value;
340350
d.insulinOnBoard = d.dosingDecision.insulinOnBoard?.amount;
@@ -740,6 +750,7 @@ export class DataUtil {
740750
if (d.type === 'dosingDecision') {
741751
this.normalizeDatumBgUnits(d, ['bgTargetSchedule'], ['low', 'high']);
742752
this.normalizeDatumBgUnits(d, ['bgForecast'], ['value']);
753+
this.normalizeDatumBgUnits(d, ['bgHistorical'], ['value']);
743754
this.normalizeDatumBgUnits(d, ['smbg'], ['value']);
744755
if (_.isObject(d.pumpSettings)) this.normalizeDatumOut(d.pumpSettings, fields);
745756
}

src/utils/bolus.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export function getRecommended(insulinEvent) {
127127
return NaN;
128128
}
129129
const netRecommendation = event.recommendedBolus
130-
? _.get(event, ['recommendedBolus', 'amount'], null)
130+
? _.get(event, ['recommendedBolus', 'normal'], null)
131131
: _.get(event, ['recommended', 'net'], null);
132132

133133
if (netRecommendation !== null) {
@@ -369,7 +369,7 @@ export function isUnderride(insulinEvent) {
369369
export function isCorrection(insulinEvent) {
370370
const recommended = insulinEvent.dosingDecision
371371
? {
372-
correction: _.get(insulinEvent, 'dosingDecision.recommendedBolus.amount'),
372+
correction: _.get(insulinEvent, 'dosingDecision.recommendedBolus.normal'),
373373
carb: _.get(insulinEvent, 'dosingDecision.food.nutrition.carbohydrate.net', 0),
374374
}
375375
: _.get(insulinEvent, 'wizard.recommended', insulinEvent.recommended);

stories/data/DataUtil.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ stories.add('Query Generator', (opts, props) => {
287287
...computedFields,
288288
associations: 'associations',
289289
bgForecast: 'bgForecast',
290+
bgHistorical: 'bgHistorical',
290291
bgTargetSchedule: 'bgTargetSchedule',
291292
bolus: 'bolus',
292293
food: 'food',

test/utils/DataUtil.test.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -972,17 +972,18 @@ describe('DataUtil', () => {
972972
it('should add the datum to the `bolusDosingDecisionDatumsByIdMap`', () => {
973973
dataUtil.validateDatumIn = sinon.stub().returns(true);
974974

975-
const acceptableReasons = ['normalBolus', 'simpleBolus', 'watchBolus'];
976-
const dosingDecisionReasons = ['loop', 'normalBolus', 'simpleBolus', 'watchBolus'];
975+
const acceptableReasons = ['normalBolus', 'simpleBolus', 'watchBolus', 'oneButtonBolus'];
976+
const dosingDecisionReasons = ['loop', 'normalBolus', 'simpleBolus', 'watchBolus', 'oneButtonBolus'];
977977
_.each(dosingDecisionReasons, (reason, index) => {
978978
dataUtil.normalizeDatumIn({ type: 'dosingDecision', id: `ID${index}`, reason });
979979
});
980980

981981
// the 'loop' reason datum should not be added
982-
expect(_.keys(dataUtil.bolusDosingDecisionDatumsByIdMap)).to.have.lengthOf(3);
982+
expect(_.keys(dataUtil.bolusDosingDecisionDatumsByIdMap)).to.have.lengthOf(4);
983983
expect(dataUtil.bolusDosingDecisionDatumsByIdMap.ID1.reason).to.eql(acceptableReasons[0]);
984984
expect(dataUtil.bolusDosingDecisionDatumsByIdMap.ID2.reason).to.eql(acceptableReasons[1]);
985985
expect(dataUtil.bolusDosingDecisionDatumsByIdMap.ID3.reason).to.eql(acceptableReasons[2]);
986+
expect(dataUtil.bolusDosingDecisionDatumsByIdMap.ID4.reason).to.eql(acceptableReasons[3]);
986987
});
987988
});
988989

@@ -1050,7 +1051,7 @@ describe('DataUtil', () => {
10501051
time: Date.parse('2024-02-02T10:05:00.000Z'),
10511052
origin: { name: 'org.tidepool.Loop' },
10521053
associations: [{ reason: 'pumpSettings', id: 'pumpSettings1' }],
1053-
requestedBolus: { amount: 12 },
1054+
requestedBolus: { normal: 12 },
10541055
insulinOnBoard: { amount: 4 },
10551056
food: { nutrition: { carbohydrate: { net: 30 } } },
10561057
bgHistorical: [
@@ -2016,6 +2017,13 @@ describe('DataUtil', () => {
20162017
sinon.assert.calledWithMatch(dataUtil.normalizeDatumBgUnits, datum, ['bgForecast'], ['value']);
20172018
});
20182019

2020+
it('should call `normalizeDatumBgUnits` on bgHistorical field objects', () => {
2021+
sinon.spy(dataUtil, 'normalizeDatumBgUnits');
2022+
const datum = { type: 'dosingDecision' };
2023+
dataUtil.normalizeDatumOut(datum);
2024+
sinon.assert.calledWithMatch(dataUtil.normalizeDatumBgUnits, datum, ['bgHistorical'], ['value']);
2025+
});
2026+
20192027
it('should call `normalizeDatumBgUnits` on smbg field objects', () => {
20202028
sinon.spy(dataUtil, 'normalizeDatumBgUnits');
20212029
const datum = { type: 'dosingDecision' };

test/utils/bolus.test.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ const withDosingDecision = {
303303
insulinOnBoard: 2.654,
304304
dosingDecision: {
305305
recommendedBolus: {
306-
amount: 2.8,
306+
normal: 2.8,
307307
},
308308
insulinOnBoard: {
309309
amount: 2.2354,
@@ -321,7 +321,7 @@ const withDosingDecisionOverride = {
321321
dosingDecision: {
322322
...withDosingDecision.dosingDecision,
323323
recommendedBolus: {
324-
amount: withDosingDecision.normal - 0.5,
324+
normal: withDosingDecision.normal - 0.5,
325325
},
326326
},
327327
};
@@ -331,7 +331,7 @@ const withDosingDecisionUnderride = {
331331
dosingDecision: {
332332
...withDosingDecision.dosingDecision,
333333
recommendedBolus: {
334-
amount: withDosingDecision.normal + 0.5,
334+
normal: withDosingDecision.normal + 0.5,
335335
},
336336
},
337337
};
@@ -340,7 +340,7 @@ const withDosingDecisionCorrection = {
340340
...withDosingDecision,
341341
dosingDecision: {
342342
...withDosingDecision.dosingDecision,
343-
recommendedBolus: { amount: 0.5 },
343+
recommendedBolus: { normal: 0.5 },
344344
food: { nutrition: { carbohydrate: { net: 0 } } },
345345
},
346346
};
@@ -552,9 +552,9 @@ describe('bolus utilities', () => {
552552
expect(bolusUtils.getRecommended(withNetRec)).to.equal(net);
553553
});
554554

555-
it('should return `amount` rec when `amount` rec exists on dosing decision', () => {
556-
const { recommendedBolus: { amount } } = withDosingDecision.dosingDecision;
557-
expect(bolusUtils.getRecommended(withDosingDecision)).to.equal(amount);
555+
it('should return `normal` rec when `normal` rec exists on dosing decision', () => {
556+
const { recommendedBolus } = withDosingDecision.dosingDecision;
557+
expect(bolusUtils.getRecommended(withDosingDecision)).to.equal(recommendedBolus.normal);
558558
});
559559

560560
it('should return 0 when no bolus recommended, even if overridden', () => {

0 commit comments

Comments
 (0)