@@ -13,7 +13,8 @@ const MMR_MAX_SEQUENCE = 2
1313const REASON = {
1414 BeforeAge12Months : 'Given before age 12 months' ,
1515 BeforeAge15Months : 'Given before age 15 months' ,
16- LessThan28DaysAfterPrevious : 'Given less than 28 days after previous dose'
16+ LessThan28DaysAfterPrevious : 'Given less than 28 days after previous dose' ,
17+ ExtraDose : 'Additional dose'
1718}
1819
1920/**
@@ -32,6 +33,7 @@ const REASON = {
3233 * @returns {{
3334 * validDoses: Array<{ vaccination: object, sequence: number }>,
3435 * ignoredDoses: Array<{ vaccination: object, reason: string }>,
36+ * recordedDoses: Array<{ vaccination: object, kind: 'valid'|'ignored', sequence?: number, reason?: string }>,
3537 * nextEligibleFrom: Date|null
3638 * }}
3739 */
@@ -45,50 +47,61 @@ export function getScheduleSummary({
4547 )
4648
4749 if ( programme ?. id !== 'mmr' ) {
50+ const validDoses = givenDoses . map ( ( vaccination , i ) => ( {
51+ vaccination,
52+ sequence : i + 1
53+ } ) )
4854 return {
49- validDoses : givenDoses . map ( ( vaccination , i ) => ( {
50- vaccination,
51- sequence : i + 1
52- } ) ) ,
55+ validDoses,
5356 ignoredDoses : [ ] ,
57+ recordedDoses : validDoses . map ( ( d ) => ( { ...d , kind : 'valid' } ) ) ,
5458 nextEligibleFrom : null
5559 }
5660 }
5761
5862 const validDoses = [ ]
5963 const ignoredDoses = [ ]
64+ const recordedDoses = [ ]
6065 let lastValidCreatedAt = null
6166
6267 for ( const vaccination of givenDoses ) {
6368 const nextSequence = validDoses . length + 1
64- if ( nextSequence > MMR_MAX_SEQUENCE ) break
65-
69+ const atScheduleMax = nextSequence > MMR_MAX_SEQUENCE
6670 const createdAt = new Date ( vaccination . createdAt )
67- const minAgeDate = addMonths ( dob , MMR_MIN_AGE_MONTHS [ nextSequence ] )
6871
69- if ( isBefore ( createdAt , minAgeDate ) ) {
70- ignoredDoses . push ( {
71- vaccination,
72- reason :
72+ if ( ! atScheduleMax ) {
73+ const minAgeDate = addMonths ( dob , MMR_MIN_AGE_MONTHS [ nextSequence ] )
74+
75+ if ( isBefore ( createdAt , minAgeDate ) ) {
76+ const reason =
7377 nextSequence === 1
7478 ? REASON . BeforeAge12Months
7579 : REASON . BeforeAge15Months
76- } )
77- continue
80+ ignoredDoses . push ( { vaccination, reason } )
81+ recordedDoses . push ( { vaccination, kind : 'ignored' , reason } )
82+ continue
83+ }
7884 }
7985
8086 if ( lastValidCreatedAt ) {
8187 const gap = differenceInCalendarDays ( createdAt , lastValidCreatedAt )
8288 if ( gap < MMR_MIN_INTERVAL_DAYS ) {
83- ignoredDoses . push ( {
84- vaccination,
85- reason : REASON . LessThan28DaysAfterPrevious
86- } )
89+ const reason = REASON . LessThan28DaysAfterPrevious
90+ ignoredDoses . push ( { vaccination, reason } )
91+ recordedDoses . push ( { vaccination, kind : 'ignored' , reason } )
8792 continue
8893 }
8994 }
9095
96+ if ( atScheduleMax ) {
97+ const reason = REASON . ExtraDose
98+ ignoredDoses . push ( { vaccination, reason } )
99+ recordedDoses . push ( { vaccination, kind : 'ignored' , reason } )
100+ continue
101+ }
102+
91103 validDoses . push ( { vaccination, sequence : nextSequence } )
104+ recordedDoses . push ( { vaccination, kind : 'valid' , sequence : nextSequence } )
92105 lastValidCreatedAt = createdAt
93106 }
94107
@@ -101,5 +114,5 @@ export function getScheduleSummary({
101114 : minAgeDate
102115 }
103116
104- return { validDoses, ignoredDoses, nextEligibleFrom }
117+ return { validDoses, ignoredDoses, recordedDoses , nextEligibleFrom }
105118}
0 commit comments