diff --git a/package.json b/package.json index c67f64617..ae7ea7c43 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "styled-jsx": "^4.0.1" }, "dependencies": { - "@dhis2/multi-calendar-dates": "^1.2.2", + "@dhis2/multi-calendar-dates": "^1.3.2", "@dnd-kit/core": "^6.0.7", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.1", @@ -81,6 +81,16 @@ "src", "!src/**/__snapshots__/**", "!src/**/__demo__/data/**", + "!src/__fixtures__/period-types/**", + "!src/__fixtures__/org-units/**", + "!src/__fixtures__/fakeOrgUnitServer.js", + "!src/__fixtures__/dataItemProfileMetadata.js", + "!src/__fixtures__/dataItemProfileOrgUnits.js", + "!build/*/__fixtures__/period-types/**", + "!build/*/__fixtures__/org-units/**", + "!build/*/__fixtures__/fakeOrgUnitServer.js", + "!build/*/__fixtures__/dataItemProfileMetadata.js", + "!build/*/__fixtures__/dataItemProfileOrgUnits.js", "docs", "CHANGELOG.md" ], diff --git a/src/__demo__/DataItemProfile.reference.js b/src/__demo__/DataItemProfile.reference.js new file mode 100644 index 000000000..e8e4bc17a --- /dev/null +++ b/src/__demo__/DataItemProfile.reference.js @@ -0,0 +1,359 @@ +import PropTypes from 'prop-types' +import React from 'react' + +export const STATUS_DEFINITIONS = [ + [ + 'full', + 'Compatible with all the item’s data sets and programs that apply to the selection: every value comes back (also repeated, from an earlier period, or where only some org units are assigned).', + 'Data element in a monthly data set, with aggregation enabled, requested quarterly', + 'Indicator whose components are all in data sets assigned at facility level, requested at district level', + ], + [ + 'partial', + 'Compatible with only some of the item’s data sets and programs that apply to the selection: the others’ values are left out. For an item in several data sets or programs that differ, a selection whose periods or org units don’t all give a value, or a sum where some items give none (OPERAND_EMPTY). For an expression, computed from such an operand (OPERAND_PARTIAL).', + 'Data element in a Monday weekly and a Wednesday weekly data set, requested by Monday week', + 'Data element in a data set assigned at facility level and one assigned at district level, requested at a facility', + ], + [ + 'none', + 'Compatible with none of the item’s data sets and programs that apply to the selection: no value comes back. For an indicator, one side gives no value at all (OPERAND_EMPTY).', + 'Data element in a monthly data set, requested weekly', + 'Data element in a data set assigned at district level, requested at a facility', + ], + [ + 'unknown', + 'Can’t tell: see the reasons.', + 'Relative weeks when the weekly start setting is missing', + 'An org unit or group that isn’t loaded, or missing metadata', + ], +] + +export const PERIOD_REASON_DEFINITIONS = [ + [ + 'OPERAND_EMPTY', + 'An operand gives no value: a sum misses it (it counts as 0), a side where all are missing has none (a ratio without its denominator).', + 'partial, none', + 'ANC 1 Coverage by week: ANC 1st visit is monthly', + ], + [ + 'OPERAND_PARTIAL', + 'An expression computed from an operand that leaves values out: it can be off either way.', + 'partial', + 'An indicator over IDSR Measles by Monday week', + ], + [ + 'PERIOD_TOO_SHORT', + 'The period is shorter than the period type of the data sets.', + 'partial, none', + 'ANC 1st visit (monthly) by week', + ], + [ + 'PERIOD_TYPE_MISMATCH', + 'Another period type of the same length.', + 'partial, none', + 'IDSR Measles’ Wednesday weeks by Monday week', + ], + [ + 'REPORTING_RATE_TOO_SHORT', + 'A reporting rate asked for a shorter period: a meaningless value.', + 'partial, none', + 'Child Health reporting rate by week', + ], + [ + 'NO_EARLIER_PERIOD_VALUE', + 'FIRST or LAST data with no data period that counts for the period.', + 'partial, none', + 'Monthly LAST data on 1 January', + ], + [ + 'REPEATED_VALUE', + 'The value of a longer data period, repeated (period aggregation AVERAGE).', + 'full, partial', + 'Total Population (yearly) by month', + ], + [ + 'EARLIER_PERIOD_VALUE', + 'The value of an earlier data period (period aggregation FIRST or LAST).', + 'full, partial', + 'Monthly LAST data on 15 July: June’s value', + ], + [ + 'PROFILE_UNKNOWN', + 'Missing metadata: see the profile’s reasons.', + 'unknown', + 'A data element in no data set', + ], + [ + 'UNKNOWN_PERIOD', + 'The period id can’t be read.', + 'unknown', + 'A mistyped period id, like 2025X1', + ], + [ + 'SETTING_MISSING', + 'A relative period’s type depends on a setting that wasn’t given, and its types disagree.', + 'unknown', + 'LAST_4_WEEKS on weekly data, weekly start unknown', + ], + [ + 'UNSUPPORTED_VERSION', + 'The server version can’t answer it.', + 'unknown', + '2025NovQ1 on 2.40; a program indicator without period boundaries before 2.43', + ], +] + +export const ORG_UNIT_REASON_DEFINITIONS = [ + [ + 'NOT_ASSIGNED', + 'Neither the org unit nor its ancestors are assigned.', + 'none', + 'An event program’s indicator at a facility the program isn’t assigned to', + ], + [ + 'ASSIGNED_AT_HIGHER_LEVEL', + 'Assigned only at higher levels than the one asked: analytics never splits values down. Partial when another data set fills the org unit.', + 'none, partial', + 'A data set assigned at district level, requested by facility', + ], + [ + 'STOPPED_BY_AGGREGATION_LEVEL', + 'The data element’s aggregation levels stop values from lower levels reaching the level asked. Partial when another data set fills the org unit.', + 'none, partial', + 'Facility data with aggregation level 2, requested by district', + ], + [ + 'NO_ORG_UNITS_AT_LEVEL', + 'No org unit at the level asked under the parent org units, or no group member under them: analytics returns nothing there.', + 'none', + 'LEVEL-2 under a facility', + ], + [ + 'EMPTY_GROUP', + 'An org unit group without members: analytics refuses it (E7143). Leave it out of the request.', + 'none', + 'A group whose members were all removed', + ], + [ + 'PARTLY_ASSIGNED', + 'Assigned to only some org units at the deepest level: the others aren’t assigned, so nothing is left out.', + 'full', + 'ANC 1st visit in Sierra Leone: 1,159 of 1,166 facilities', + ], + [ + 'ANY_ORG_UNIT', + 'A program indicator placed by registration or an org unit attribute: its values can be at any org unit, wherever its program is assigned.', + 'full', + 'A program indicator by registration org unit', + ], + [ + 'UNKNOWN_ORG_UNIT', + 'The org unit, level or group isn’t loaded or can’t be read.', + 'unknown', + 'A mistyped id', + ], +] + +const ReferenceTable = ({ title, columns, rows }) => ( +
+ {title} + + + + {columns.map((column) => ( + + ))} + + + + {rows.map(([code, ...cells]) => ( + + + {cells.map((cell, i) => ( + + ))} + + ))} + +
{column}
+ {code} + {cell}
+ +
+) + +ReferenceTable.propTypes = { + columns: PropTypes.arrayOf(PropTypes.string), + rows: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)), + title: PropTypes.string, +} + +// The API a story shows, apart from the demo itself +const NO_REFERENCES = [] + +export const ApiPanel = ({ + basedOn, + runs, + input, + signature, + summary, + returns, + uses, + references = NO_REFERENCES, +}) => ( + +) + +ApiPanel.propTypes = { + basedOn: PropTypes.string, + input: PropTypes.string, + references: PropTypes.arrayOf( + PropTypes.shape({ + columns: PropTypes.arrayOf(PropTypes.string), + rows: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)), + title: PropTypes.string, + }) + ), + returns: PropTypes.string, + runs: PropTypes.string, + signature: PropTypes.string, + summary: PropTypes.string, + uses: PropTypes.string, +} + +export const DemoHeading = () => ( +

+ Demo + +

+) + +// The steps of a scenario, apart from the demo itself +export const ScenarioPanel = ({ title, steps }) => ( + +) + +ScenarioPanel.propTypes = { + steps: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)), + title: PropTypes.string, +} diff --git a/src/__demo__/DataItemProfile.shared.js b/src/__demo__/DataItemProfile.shared.js new file mode 100644 index 000000000..1e7cbab4b --- /dev/null +++ b/src/__demo__/DataItemProfile.shared.js @@ -0,0 +1,164 @@ +import { DataProvider } from '@dhis2/app-runtime' +import { ConfigProvider } from '@dhis2/app-service-config' +import { CircularLoader, NoticeBox, Tag } from '@dhis2/ui' +import PropTypes from 'prop-types' +import React from 'react' + +/* Log in to the server in the same browser first. It must allow requests + * from Storybook (localhost:5000): this dev server does, the play instances + * don't. */ +export const BASE_URL = 'https://dev.im.dhis2.org/analytics-dev/' + +export const Wrapper = (story) => ( + + + {story()} + + +) + +// Sierra Leone demo items, one per case +export const ITEMS = [ + { + id: 'fbfJHSPpUQD', + dimensionItemType: 'DATA_ELEMENT', + name: 'ANC 1st visit (monthly, sum)', + }, + { + id: 'fbfJHSPpUQD.pq2XI5kz2BY', + dimensionItemType: 'DATA_ELEMENT_OPERAND', + name: 'ANC 1st visit at facilities (category: Fixed)', + }, + { + id: 'WUg3MYWQ7pt', + dimensionItemType: 'DATA_ELEMENT', + name: 'Total Population (yearly, averaged)', + }, + { + id: 'YazgqXbizv1', + dimensionItemType: 'DATA_ELEMENT', + name: 'IDSR Measles (Monday and Wednesday weeks)', + }, + { + id: 'Uvn6LCg7dVU', + dimensionItemType: 'INDICATOR', + name: 'ANC 1 Coverage (indicator over the population)', + }, + { + id: 'BfMAe6Itzgt.REPORTING_RATE', + dimensionItemType: 'REPORTING_RATE', + name: 'Child Health reporting rate (monthly)', + }, + { + id: 'GSae40Fyppf', + dimensionItemType: 'PROGRAM_INDICATOR', + name: 'Age at visit (program indicator)', + }, + { + id: 'gKv1pdjF3wM', + dimensionItemType: 'INDICATOR', + name: 'Inpatient cases per 10 000 population (indicator over a program indicator)', + }, + { + id: 'eBAyeGv0exc.vV9UWAZohSf', + dimensionItemType: 'PROGRAM_DATA_ELEMENT', + name: 'Weight in kg (program data element)', + }, +] + +export const SIERRA_LEONE = 'ImspTQPwCqd' +// A district, and a facility without Reproductive Health (ANC 1st visit) +export const BO = 'O6uvpzGd5pu' +export const JUNCTIONLA_MCHP = 'QCnJDmNjQy0' + +export const splitList = (text) => + text + .split(/[,\s]+/) + .map((value) => value.trim()) + .filter(Boolean) + +const STATUS_TAG = { + full: { positive: true }, + partial: { neutral: true }, + none: { negative: true }, + unknown: {}, +} + +const NO_REASONS = [] + +export const Status = ({ status, reasons = NO_REASONS }) => ( + + {status} + {reasons.length > 0 && ( + {reasons.join(', ')} + )} + + +) + +Status.propTypes = { + reasons: PropTypes.arrayOf(PropTypes.string), + status: PropTypes.string, +} + +export const Loading = () => + +export const ErrorNotice = ({ error }) => ( + + {error.message}. Are you logged in to {BASE_URL} in this browser? + +) + +ErrorNotice.propTypes = { error: PropTypes.object } + +export const tableStyle = ( + +) diff --git a/src/__demo__/DataItemProfile.stories.js b/src/__demo__/DataItemProfile.stories.js new file mode 100644 index 000000000..8ac1d72e3 --- /dev/null +++ b/src/__demo__/DataItemProfile.stories.js @@ -0,0 +1,414 @@ +import { Button, Checkbox, InputField } from '@dhis2/ui' +import PropTypes from 'prop-types' +import React, { useMemo, useState } from 'react' +import { useDataItemProfiles } from '../components/DataItemProfile/useDataItemProfiles.js' +import { readOrgUnitSelection } from '../modules/dataItemProfile/orgUnits/orgUnitSelection.js' +import { + ApiPanel, + DemoHeading, + ORG_UNIT_REASON_DEFINITIONS, + PERIOD_REASON_DEFINITIONS, + STATUS_DEFINITIONS, +} from './DataItemProfile.reference.js' +import { + ErrorNotice, + BO, + ITEMS, + JUNCTIONLA_MCHP, + Loading, + SIERRA_LEONE, + splitList, + Status, + tableStyle, + Wrapper, +} from './DataItemProfile.shared.js' + +export default { + title: 'DataItemProfile/Hooks', + decorators: [Wrapper], +} + +// The status table with one example column: periods or org units +const statusReference = (exampleColumn, exampleIndex) => ({ + title: 'Compatibility statuses', + columns: ['Status', 'Meaning', exampleColumn], + rows: STATUS_DEFINITIONS.map(([status, meaning, ...examples]) => [ + status, + meaning, + examples[exampleIndex], + ]), +}) + +// Event data comes from programs: it is placed in any period by its dates +const isPlacedByDate = (profile) => + !profile.unknown && profile.sources.every(({ program }) => program) + +const listWithSeveral = ({ hasSeveral }, values) => + `${values.join(', ')}${hasSeveral ? ' (several)' : ''}` + +const describePeriodTypes = (profile) => { + const { assignedPeriodTypes } = profile + + if (assignedPeriodTypes.types.length) { + return listWithSeveral(assignedPeriodTypes, assignedPeriodTypes.types) + } + + return isPlacedByDate(profile) ? 'Event dates' : 'Unknown' +} + +const describeShortestDirectType = (profile) => { + if (profile.assignedPeriodTypes.shortestDirectType) { + return profile.assignedPeriodTypes.shortestDirectType + } + + return isPlacedByDate(profile) ? 'Any' : 'Unknown' +} + +// The levels its data sets and programs are assigned at, deepest first +const describeLevels = ({ assignedOrgUnitLevels }) => + assignedOrgUnitLevels?.levels.length + ? listWithSeveral(assignedOrgUnitLevels, assignedOrgUnitLevels.levels) + : '–' + +/* How many org units at the deepest level assigned the data sets are + * assigned to, of how many when the coverage counted them */ +const Assignment = ({ assignment }) => + assignment ? ( +
+ {assignment.assigned.toLocaleString('en')} + {assignment.total !== undefined && + ` of ${assignment.total.toLocaleString('en')}`}{' '} + at level {assignment.level} + +
+ ) : null + +Assignment.propTypes = { assignment: PropTypes.object } + +// The item's name, its status when the profile is unknown, and the profile as JSON +const ItemCells = ({ name, profile }) => ( + <> + + {name} + {profile.unknown && ( +
+ code)} + /> +
+ )} + + +
+ Show +
{JSON.stringify(profile, null, 2)}
+
+ + +) + +ItemCells.propTypes = { + name: PropTypes.string, + profile: PropTypes.object, +} + +// What a story judges is judged alone: this says so above its table +const AloneNote = ({ children }) => ( +

+ {children} + +

+) + +AloneNote.propTypes = { children: PropTypes.node } + +const PERIOD_EXAMPLES = 0 +const ORG_UNIT_EXAMPLES = 1 + +export const Periods = () => { + const [periodsText, setPeriodsText] = useState( + '2025W2, 202501, 2025Q1, 2025, LAST_12_MONTHS, LAST_4_WEEKS, Weekly' + ) + const periods = useMemo(() => splitList(periodsText), [periodsText]) + // No org units: periods need no request beyond the metadata + const { + loading, + error, + profiles, + relativePeriodTypes, + getDataItemCompatibility, + } = useDataItemProfiles(ITEMS) + + return ( +
+ {tableStyle} + + +
+ setPeriodsText(value)} + inputWidth="600px" + /> +
+ {loading && } + {error && } + {profiles && ( + <> + + Each period is judged alone, over all the item’s data + sets and programs, whatever the org units: where they + are assigned isn’t read here. Relative weeks:{' '} + {relativePeriodTypes.weeklyPeriodType ?? 'unknown'}. + Relative financial years:{' '} + {relativePeriodTypes.financialYearPeriodType ?? + 'unknown'} + . + + + + + + + {periods.length > 0 && ( + + )} + + + + + + {periods.map((period) => ( + + ))} + + + + {ITEMS.map(({ id, name }) => { + const profile = profiles[id] + const { periods: results } = + getDataItemCompatibility(id, { periods }) + + return ( + + + + + {results.map((result) => ( + + ))} + + ) + })} + +
Item + Profile getDataItemProfile + + Each period{' '} + getDataItemCompatibility +
JSONPeriod typesShortest direct type{period}
{describePeriodTypes(profile)} + {describeShortestDirectType( + profile + )} + + +
+ + )} +
+ ) +} + +Periods.storyName = 'Periods' + +// Org unit selections to try, one per kind of selection item +const ORG_UNIT_SCENARIOS = [ + [ + 'Org units', + `${SIERRA_LEONE}, ${BO}, ${JUNCTIONLA_MCHP}, USER_ORGUNIT_CHILDREN`, + ], + ['Levels in Bo', `${BO}, LEVEL-3, LEVEL-4`], + ['District group', 'OU_GROUP-w1Atoz18PCL'], + ['Clinic group in Bo', `${BO}, OU_GROUP-RXL3lPSK8oG`], +] + +export const OrgUnits = () => { + // Typed org units apply on blur: each change sends requests + const [orgUnitsText, setOrgUnitsText] = useState(ORG_UNIT_SCENARIOS[0][1]) + const [orgUnitsDraft, setOrgUnitsDraft] = useState(orgUnitsText) + const applyOrgUnits = (text) => { + setOrgUnitsDraft(text) + setOrgUnitsText(text) + } + const orgUnits = useMemo(() => splitList(orgUnitsText), [orgUnitsText]) + const orgUnitItems = readOrgUnitSelection(orgUnits).selectionItems.map( + ({ id }) => id + ) + const [withAssignmentTotals, setWithAssignmentTotals] = useState(false) + const { loading, error, profiles, getDataItemCompatibility } = + useDataItemProfiles(ITEMS, { orgUnits, withAssignmentTotals }) + + return ( +
+ {tableStyle} + + +
+ setOrgUnitsDraft(value)} + onBlur={({ value }) => applyOrgUnits(value)} + inputWidth="600px" + /> +
+ {ORG_UNIT_SCENARIOS.map(([label, text]) => ( + + ))} +
+ setWithAssignmentTotals(checked)} + dense + /> + +
+ {loading && } + {error && } + {profiles && ( + <> + + Each org unit, level or group is judged alone, over all + the item’s data sets and programs, whatever the periods: + their period types aren’t read here. + + + + + + + {orgUnitItems.length > 0 && ( + + )} + + + + + {orgUnitItems.map((orgUnit) => ( + + ))} + + + + {ITEMS.map(({ id, name }) => { + const profile = profiles[id] + const { orgUnits: results = [] } = + getDataItemCompatibility(id, { orgUnits }) + + return ( + + + + {results.map((result) => ( + + ))} + + ) + })} + +
Item + Profile getDataItemProfile + + Each org unit{' '} + getDataItemCompatibility +
JSONOrg unit levels{orgUnit}
{describeLevels(profile)} + + +
+ + )} +
+ ) +} + +OrgUnits.storyName = 'Org units' diff --git a/src/__demo__/DataItemProfileTypicalUse.stories.js b/src/__demo__/DataItemProfileTypicalUse.stories.js new file mode 100644 index 000000000..7889d03de --- /dev/null +++ b/src/__demo__/DataItemProfileTypicalUse.stories.js @@ -0,0 +1,445 @@ +import { Checkbox, InputField, NoticeBox } from '@dhis2/ui' +import PropTypes from 'prop-types' +import React, { useMemo, useState } from 'react' +import { useDataItemProfiles } from '../components/DataItemProfile/useDataItemProfiles.js' +import { ScenarioPanel } from './DataItemProfile.reference.js' +import { + ErrorNotice, + ITEMS, + Loading, + SIERRA_LEONE, + splitList, + Status, + tableStyle, + Wrapper, +} from './DataItemProfile.shared.js' + +export default { + title: 'DataItemProfile/Typical use in Data Visualizer', + decorators: [Wrapper], +} + +const STEPS = [ + [ + 'The user picks data items: DV loads their profiles, and where their data sets and programs are assigned under the org units.', + 'useDataItemProfiles(items, { orgUnits })', + ], + [ + 'The pickers mark each period type and each org unit level for those items.', + "getDataItemCompatibility(itemId, { periods: [periodType], orgUnits: [parentOrgUnit, 'LEVEL-n'] })", + ], + [ + 'Periods and org units selected, before Update: DV checks them, from current metadata only.', + 'getDataItemCompatibility(itemId, { periods, orgUnits })', + ], +] + +// The period types the picker offers in this demo, shortest first +const PICKER_PERIOD_TYPES = [ + 'Daily', + 'Weekly', + 'WeeklyWednesday', + 'BiWeekly', + 'Monthly', + 'Quarterly', + 'SixMonthly', + 'Yearly', + 'FinancialApril', +] + +// The types of the data sets that can't fill the period: compatible with none +const getTypesLeftOut = ({ sources }, profile) => [ + ...new Set( + sources + .map(({ status }, i) => + status === 'none' + ? profile.sources[i].dataSet?.periodType + : null + ) + .filter(Boolean) + ), +] + +// What DV could say about an item, for one period +const adviceFor = (result, profile) => { + const { status, reasons } = result + const typesLeftOut = getTypesLeftOut(result, profile).join(' and ') + + switch (status) { + case 'full': + if (reasons.includes('EARLIER_PERIOD_VALUE')) { + return 'Shown, from an earlier data period.' + } + return reasons.includes('REPEATED_VALUE') + ? 'Shown, repeated from the data period that holds it.' + : 'Shown.' + case 'partial': + return reasons.includes('OPERAND_PARTIAL') + ? 'Shown, but computed from incomplete data: it can be off either way.' + : `Partly shown: the ${typesLeftOut} data can’t fill this period.` + case 'none': + if (reasons.includes('REPORTING_RATE_TOO_SHORT')) { + return 'Not shown: a reporting rate can’t be shown by this period.' + } + if (reasons.includes('NO_EARLIER_PERIOD_VALUE')) { + return 'Not shown: no earlier value in these years.' + } + return `Not shown: its data sets are ${typesLeftOut}.` + default: + return 'Can’t tell.' + } +} + +const PeriodTypeMarks = ({ items, getDataItemCompatibility }) => ( + + + + + {items.map(({ id, name }) => ( + + ))} + + + + {PICKER_PERIOD_TYPES.map((periodType) => ( + + + {items.map(({ id }) => ( + + ))} + + ))} + +
Period type{name}
{periodType} + +
+) + +const formatCount = (count) => count.toLocaleString('en') + +// The total is there only when the org units were counted too (withAssignmentTotals) +const describeAssignment = ({ assigned, total, level }, levels) => { + const levelName = levels.find((item) => item.level === level)?.name + const counts = + total === undefined + ? formatCount(assigned) + : `${formatCount(assigned)} of ${formatCount(total)}` + + return `${counts} org units at level ${levelName ?? level}` +} + +const ORG_UNIT_NONE_ADVICE = { + ASSIGNED_AT_HIGHER_LEVEL: + 'Not shown: its data sets are assigned at a higher level.', + STOPPED_BY_AGGREGATION_LEVEL: + 'Not shown: its aggregation levels stop values before this level.', + EMPTY_GROUP: 'Leave it out: the group has no members.', + NO_ORG_UNITS_AT_LEVEL: 'Not shown: no org unit at this level there.', +} + +const getFullAdvice = (reasons, assignment, levels) => { + if (reasons.includes('ANY_ORG_UNIT') || !assignment) { + return 'Shown.' + } + + const assignedTo = describeAssignment(assignment, levels) + + return reasons.includes('PARTLY_ASSIGNED') + ? `Shown: assigned to ${assignedTo}; the others aren’t assigned.` + : `Shown: assigned to ${assignedTo}.` +} + +// What DV could say about an item, for one org unit selection item +const orgUnitAdviceFor = ({ status, reasons, assignment }, levels) => { + switch (status) { + case 'full': + return getFullAdvice(reasons, assignment, levels) + case 'partial': + return reasons.includes('OPERAND_PARTIAL') + ? 'Shown, but computed from incomplete data: it can be off either way.' + : 'Partly shown: values of data sets assigned at a higher level are left out.' + case 'none': { + const reason = reasons.find((code) => ORG_UNIT_NONE_ADVICE[code]) + + return reason + ? ORG_UNIT_NONE_ADVICE[reason] + : 'Not shown: its data sets aren’t assigned here.' + } + default: + return 'Can’t tell.' + } +} + +const OrgUnitLevelMarks = ({ items, levels, getDataItemCompatibility }) => ( + + + + + {items.map(({ id, name }) => ( + + ))} + + + + {levels.map(({ level, name }) => ( + + + {items.map(({ id }) => ( + + ))} + + ))} + +
Level{name}
{name} + +
+) + +OrgUnitLevelMarks.propTypes = { + getDataItemCompatibility: PropTypes.func, + items: PropTypes.array, + levels: PropTypes.array, +} + +PeriodTypeMarks.propTypes = { + getDataItemCompatibility: PropTypes.func, + items: PropTypes.array, +} + +// One column per dimension +const Columns = ({ period, orgUnit }) => ( +
+
+

Period

+ {period} +
+
+

Org unit

+ {orgUnit ??

Coming soon.

} +
+ +
+) + +Columns.propTypes = { orgUnit: PropTypes.node, period: PropTypes.node } + +// Before Update, both checks read today's metadata only +const MetadataOnlyNotice = () => ( + + Past data may have been entered with a different configuration. + +) + +export const TypicalUse = () => { + const [selectedIds, setSelectedIds] = useState([ + 'fbfJHSPpUQD', + 'Uvn6LCg7dVU', + 'YazgqXbizv1', + ]) + const [periodsText, setPeriodsText] = useState('2025W2') + const [orgUnitsText, setOrgUnitsText] = useState(SIERRA_LEONE) + const items = useMemo( + () => ITEMS.filter(({ id }) => selectedIds.includes(id)), + [selectedIds] + ) + const periods = useMemo(() => splitList(periodsText), [periodsText]) + const orgUnits = useMemo(() => splitList(orgUnitsText), [orgUnitsText]) + // The country, for the levels in the picker, and the org units selected + const loadedOrgUnits = useMemo( + () => [...new Set([SIERRA_LEONE, ...orgUnits])], + [orgUnits] + ) + const { + loading, + error, + profiles, + orgUnitCoverage, + getDataItemCompatibility, + } = useDataItemProfiles(items, { orgUnits: loadedOrgUnits }) + // While a newly picked item loads, the others keep their profiles + const loadedItems = items.filter(({ id }) => profiles?.[id]) + + const toggle = (id) => + setSelectedIds((ids) => + ids.includes(id) + ? ids.filter((other) => other !== id) + : [...ids, id] + ) + return ( +
+ {tableStyle} + + +

Data items

+ {ITEMS.map(({ id, name }) => ( + toggle(id)} + /> + ))} + {loading && } + {error && } + + {loadedItems.length > 0 && ( + <> +

Pickers

+ + } + orgUnit={ + orgUnitCoverage ? ( + + ) : ( + + ) + } + /> + +

Selected, before Update

+ +
+ + setPeriodsText(value) + } + /> +
+ + + + {loadedItems.map(({ id, name }) => ( + + + + + ))} + +
{name} + {getDataItemCompatibility( + id, + { periods } + )?.periods.map((result) => ( +
+ + {result.id} + {' '} + {' '} + {adviceFor( + result, + profiles[id] + )}{' '} +
+ ))} +
+ + } + orgUnit={ + <> +
+ + setOrgUnitsText(value) + } + /> +
+ + + + {loadedItems.map(({ id, name }) => ( + + + + + ))} + +
{name} + {orgUnitCoverage + ? getDataItemCompatibility( + id, + { orgUnits } + )?.orgUnits?.map( + (result) => ( +
+ + { + result.id + } + {' '} + {' '} + {orgUnitAdviceFor( + result, + orgUnitCoverage.levels + )} +
+ ) + ) + : null} +
+ + } + /> + + )} +
+ ) +} + +TypicalUse.storyName = 'Typical use in Data Visualizer' diff --git a/src/__fixtures__/dataItemProfileMetadata.js b/src/__fixtures__/dataItemProfileMetadata.js new file mode 100644 index 000000000..15690a62f --- /dev/null +++ b/src/__fixtures__/dataItemProfileMetadata.js @@ -0,0 +1,3 @@ +// Data sets for a test data element, one per period type: `${periodType}Form` +export const inDataSets = (periodTypes) => + periodTypes.map((periodType) => ({ id: `${periodType}Form`, periodType })) diff --git a/src/__fixtures__/dataItemProfileOrgUnits.js b/src/__fixtures__/dataItemProfileOrgUnits.js new file mode 100644 index 000000000..8df5a1253 --- /dev/null +++ b/src/__fixtures__/dataItemProfileOrgUnits.js @@ -0,0 +1,168 @@ +import { getDataItemProfile } from '../modules/dataItemProfile/getDataItemProfile.js' +import { inDataSets } from './dataItemProfileMetadata.js' + +/* Metadata and org unit coverage for the org unit compatibility specs */ +export const ORG_UNIT_METADATA = { + dataElements: { + facility: { + aggregationType: 'SUM', + dataSets: inDataSets(['Monthly']), + }, + district: { + aggregationType: 'SUM', + dataSets: inDataSets(['Quarterly']), + }, + twoForms: { + aggregationType: 'SUM', + dataSets: inDataSets(['Monthly', 'Weekly']), + }, + twoLevels: { + aggregationType: 'SUM', + dataSets: inDataSets(['Monthly', 'Quarterly']), + }, + cappedAtDistrict: { + aggregationType: 'SUM', + dataSets: inDataSets(['Monthly']), + aggregationLevels: [2], + }, + cappedWithDistrictForm: { + aggregationType: 'SUM', + dataSets: inDataSets(['Monthly', 'Quarterly']), + aggregationLevels: [2], + }, + orphan: { aggregationType: 'SUM', dataSets: [] }, + }, + dataSets: { MonthlyForm: { periodType: 'Monthly' } }, + programs: { eventProgra: { programType: 'WITHOUT_REGISTRATION' } }, + programIndicators: { + pi: { program: 'eventProgra' }, + piByOwner: { program: 'eventProgra', orgUnitField: 'OWNER_AT_END' }, + piByRegistr: { program: 'eventProgra', orgUnitField: 'REGISTRATION' }, + piByAttribu: { program: 'eventProgra', orgUnitField: 'attributeAAA' }, + }, + indicators: { + ratio: { numerator: '#{facility}', denominator: '#{district}' }, + facilityPlusDistrict: { + numerator: '#{facility} + #{district}', + denominator: '1', + }, + completeness: { + numerator: '#{facility}', + denominator: 'R{MonthlyForm.REPORTING_RATE}', + }, + partOfTotal: { numerator: '#{twoLevels}', denominator: '#{facility}' }, + casesPerFacility: { numerator: 'I{pi}', denominator: '#{facility}' }, + constantsOnly: { numerator: 'C{constantAA}', denominator: '[days]' }, + }, +} + +export const orgUnitProfileOf = (id, dimensionItemType = 'DATA_ELEMENT') => + getDataItemProfile({ id, dimensionItemType }, ORG_UNIT_METADATA) + +/* A nation (level 1) with 2 districts (2) and 4 facilities (3). + * MonthlyForm: 3 of the 4 facilities (missing facilityDDD, under districtBBB), + * and the nation. QuarterlyForm: both districts. WeeklyForm: facilityDDD. */ +const unit = (id, level, path) => ({ id, level, path }) +export const ORG_UNIT_COVERAGE = { + levels: [ + { id: 'levelNation', level: 1 }, + { id: 'levelDistri', level: 2 }, + { id: 'levelFacili', level: 3 }, + ], + orgUnits: { + nationUnit1: unit('nationUnit1', 1, '/nationUnit1'), + districtAAA: unit('districtAAA', 2, '/nationUnit1/districtAAA'), + districtBBB: unit('districtBBB', 2, '/nationUnit1/districtBBB'), + facilityAAA: unit( + 'facilityAAA', + 3, + '/nationUnit1/districtAAA/facilityAAA' + ), + facilityDDD: unit( + 'facilityDDD', + 3, + '/nationUnit1/districtBBB/facilityDDD' + ), + }, + rootIds: ['nationUnit1'], + userOrgUnitIds: ['districtBBB'], + // clinicGroup: facilityAAA and facilityDDD. mixedGroupA: districtBBB and facilityAAA + groups: { + clinicGroup: { 3: 2 }, + mixedGroupA: { 2: 1, 3: 1 }, + emptyGroupA: {}, + }, + assignedOrgUnitCounts: { + MonthlyForm: { 1: 1, 3: 3 }, + QuarterlyForm: { 2: 2 }, + WeeklyForm: { 3: 1 }, + eventProgra: { 3: 2 }, + }, + counts: { + nationUnit1: { + totals: { 1: 1, 2: 2, 3: 4 }, + sources: { + MonthlyForm: { byLevel: { 1: 1, 3: 3 } }, + QuarterlyForm: { byLevel: { 2: 2 } }, + WeeklyForm: { byLevel: { 3: 1 } }, + eventProgra: { byLevel: { 3: 2 } }, + }, + }, + districtAAA: { + totals: { 2: 1, 3: 2 }, + sources: { + MonthlyForm: { byLevel: { 3: 2 }, ancestors: 1 }, + QuarterlyForm: { byLevel: { 2: 1 } }, + WeeklyForm: { byLevel: {} }, + eventProgra: { byLevel: { 3: 2 } }, + }, + }, + districtBBB: { + totals: { 2: 1, 3: 2 }, + sources: { + MonthlyForm: { byLevel: { 3: 1 }, ancestors: 1 }, + QuarterlyForm: { byLevel: { 2: 1 } }, + WeeklyForm: { byLevel: { 3: 1 } }, + }, + }, + facilityAAA: { + totals: { 3: 1 }, + sources: { + MonthlyForm: { byLevel: { 3: 1 }, ancestors: 1 }, + QuarterlyForm: { byLevel: {}, ancestors: 1 }, + }, + }, + facilityDDD: { + totals: { 3: 1 }, + sources: { + eventProgra: { byLevel: {} }, + MonthlyForm: { byLevel: {}, ancestors: 1 }, + QuarterlyForm: { byLevel: {}, ancestors: 1 }, + WeeklyForm: { byLevel: { 3: 1 } }, + }, + }, + 'clinicGroup:3:': { + totals: { 3: 2 }, + sources: { + MonthlyForm: { byLevel: { 3: 1 }, ancestors: 1 }, + QuarterlyForm: { byLevel: {}, ancestors: 2 }, + }, + }, + 'mixedGroupA:2:': { + totals: { 2: 1, 3: 2 }, + sources: { MonthlyForm: { byLevel: { 3: 1 }, ancestors: 1 } }, + }, + 'mixedGroupA:3:': { + totals: { 3: 1 }, + sources: { MonthlyForm: { byLevel: { 3: 1 }, ancestors: 1 } }, + }, + 'mixedGroupA:2:districtAAA': { + totals: { 2: 0, 3: 0 }, + sources: { MonthlyForm: { byLevel: { 3: 0 }, ancestors: 1 } }, + }, + 'mixedGroupA:3:districtAAA': { + totals: { 3: 1 }, + sources: { MonthlyForm: { byLevel: { 3: 1 }, ancestors: 1 } }, + }, + }, +} diff --git a/src/__fixtures__/fakeOrgUnitServer.js b/src/__fixtures__/fakeOrgUnitServer.js new file mode 100644 index 000000000..ddbec57c7 --- /dev/null +++ b/src/__fixtures__/fakeOrgUnitServer.js @@ -0,0 +1,107 @@ +/* A fake server for the org unit requests of the data item profile: + * organisationUnits (with the filters the library sends), organisationUnitLevels + * and me. `orgUnits` are [{ id, level, path, dataSets, programs }] (ids of + * what each is assigned to), `groups` are { [groupId]: [orgUnitId] }, `user` + * is { organisationUnits, dataViewOrganisationUnits } (org unit ids), and + * `levels` the order levels are listed in (as found by default). */ +export const createFakeOrgUnitServer = ({ + orgUnits, + groups = {}, + user = {}, + levels = [...new Set(orgUnits.map(({ level }) => level))], +}) => { + const byId = Object.fromEntries( + orgUnits.map((orgUnit) => [orgUnit.id, orgUnit]) + ) + const parentOf = ({ path }) => byId[path.split('/').at(-2)] + const childrenOf = (orgUnit) => + orgUnits.filter((other) => parentOf(other) === orgUnit) + + // organisationUnitGroups.id, behind parent. and children. steps + const isInGroup = (orgUnit, field, groupId) => { + const steps = field.split('.').slice(0, -2) + const related = steps.reduce( + (matching, step) => + matching.flatMap((one) => + step === 'parent' + ? [parentOf(one)].filter(Boolean) + : childrenOf(one) + ), + [orgUnit] + ) + + return related.some(({ id }) => groups[groupId]?.includes(id)) + } + + const isAssigned = (orgUnit, field, id) => + orgUnit[field.split('.')[0]].includes(id) + + const FILTERS = { + in: (orgUnit, field, value) => + value.slice(1, -1).split(',').includes(orgUnit[field]), + eq: (orgUnit, field, value) => { + if (field.endsWith('organisationUnitGroups.id')) { + return isInGroup(orgUnit, field, value) + } + + return ['dataSets.id', 'programs.id'].includes(field) + ? isAssigned(orgUnit, field, value) + : String(orgUnit[field]) === value + }, + like: (orgUnit, field, value) => orgUnit[field].includes(value), + } + + const applyFilters = (filter) => + [filter].flat().reduce((matching, condition) => { + const [field, operator, ...rest] = condition.split(':') + + return matching.filter((orgUnit) => + FILTERS[operator](orgUnit, field, rest.join(':')) + ) + }, orgUnits) + + const toOrgUnits = (ids = []) => ids.map((id) => byId[id]) + + const answer = ({ resource, params }) => { + if (resource === 'organisationUnitLevels') { + return { + organisationUnitLevels: levels.map((level) => ({ + id: `level${level}`, + level, + displayName: `Level ${level}`, + })), + } + } + + if (resource === 'me') { + return { + organisationUnits: toOrgUnits(user.organisationUnits), + dataViewOrganisationUnits: toOrgUnits( + user.dataViewOrganisationUnits + ), + } + } + + const matching = applyFilters(params.filter) + + return params.pageSize === 1 + ? { + pager: { total: matching.length }, + organisationUnits: matching.slice(0, 1), + } + : { organisationUnits: matching } + } + + const createEngine = () => ({ + query: jest.fn(async (query) => + Object.fromEntries( + Object.entries(query).map(([key, request]) => [ + key, + answer(request), + ]) + ) + ), + }) + + return { answer, createEngine } +} diff --git a/src/__fixtures__/org-units/aggregation-levels.json b/src/__fixtures__/org-units/aggregation-levels.json new file mode 100644 index 000000000..222d9cd26 --- /dev/null +++ b/src/__fixtures__/org-units/aggregation-levels.json @@ -0,0 +1,118 @@ +{ + "schemaVersion": 1, + "group": "aggregation-levels", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "hierarchy": { + "orgUnits": { + "region": { + "level": 2, + "parent": null + }, + "A": { + "level": 3, + "parent": "region" + }, + "B": { + "level": 3, + "parent": "region" + }, + "D1": { + "level": 3, + "parent": "region" + }, + "D2": { + "level": 3, + "parent": "region" + }, + "D3": { + "level": 3, + "parent": "region" + }, + "F1": { + "level": 4, + "parent": "D1" + }, + "F2": { + "level": 4, + "parent": "D1" + }, + "F3": { + "level": 4, + "parent": "D2" + } + }, + "groups": { + "g": [ + "D2", + "F1" + ], + "empty": [], + "top": [ + "region" + ] + } + }, + "smoke": "12 of 12 cases, one per pattern", + "cases": [ + {"id":"ou-agg-d1-3__D1","item":{"code":"PTT_OU_AGG_D1_3","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set d1-3","periodType":"Monthly","orgUnits":["D1"],"aggregationLevels":[3]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["D1"]},"expected":{"status":"VALUE","value":3000,"contributes":["D1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.40.12":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.41.10":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.42.6":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.43.2":{"status":"VALUE","value":3000,"rows":{"D1":3000}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-d1-3__F1","item":{"code":"PTT_OU_AGG_D1_3","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set d1-3","periodType":"Monthly","orgUnits":["D1"],"aggregationLevels":[3]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["BELOW_COLLECTION"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-d1-3__region","item":{"code":"PTT_OU_AGG_D1_3","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set d1-3","periodType":"Monthly","orgUnits":["D1"],"aggregationLevels":[3]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":3000,"contributes":["D1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.40.12":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.41.10":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.42.6":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.43.2":{"status":"VALUE","value":3000,"rows":{"region":3000}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-f-2__D1","item":{"code":"PTT_OU_AGG_F_2","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set f-2","periodType":"Monthly","orgUnits":["F1","F2","F3"],"aggregationLevels":[2]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["D1"]},"expected":{"status":"VALUE","value":33,"contributes":["F1","F2"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.40.12":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.41.10":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.42.6":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.43.2":{"status":"VALUE","value":33,"rows":{"D1":33}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-f-2__F1","item":{"code":"PTT_OU_AGG_F_2","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set f-2","periodType":"Monthly","orgUnits":["F1","F2","F3"],"aggregationLevels":[2]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"VALUE","value":3,"contributes":["F1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.12":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.10":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.6":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.2":{"status":"VALUE","value":3,"rows":{"F1":3}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-f-2__region","item":{"code":"PTT_OU_AGG_F_2","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set f-2","periodType":"Monthly","orgUnits":["F1","F2","F3"],"aggregationLevels":[2]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["AGGREGATION_LEVEL"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-f-2-3__D1","item":{"code":"PTT_OU_AGG_F_2_3","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set f-2-3","periodType":"Monthly","orgUnits":["F1","F2","F3"],"aggregationLevels":[2,3]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["D1"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["AGGREGATION_LEVEL"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-f-2-3__F1","item":{"code":"PTT_OU_AGG_F_2_3","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set f-2-3","periodType":"Monthly","orgUnits":["F1","F2","F3"],"aggregationLevels":[2,3]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"VALUE","value":3,"contributes":["F1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.12":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.10":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.6":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.2":{"status":"VALUE","value":3,"rows":{"F1":3}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-f-2-3__region","item":{"code":"PTT_OU_AGG_F_2_3","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set f-2-3","periodType":"Monthly","orgUnits":["F1","F2","F3"],"aggregationLevels":[2,3]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["AGGREGATION_LEVEL"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-f-3__D1","item":{"code":"PTT_OU_AGG_F_3","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set f-3","periodType":"Monthly","orgUnits":["F1","F2","F3"],"aggregationLevels":[3]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["D1"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["AGGREGATION_LEVEL"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-f-3__F1","item":{"code":"PTT_OU_AGG_F_3","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set f-3","periodType":"Monthly","orgUnits":["F1","F2","F3"],"aggregationLevels":[3]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"VALUE","value":3,"contributes":["F1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.12":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.10":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.6":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.2":{"status":"VALUE","value":3,"rows":{"F1":3}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-agg-f-3__region","item":{"code":"PTT_OU_AGG_F_3","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU aggregation levels data set f-3","periodType":"Monthly","orgUnits":["F1","F2","F3"],"aggregationLevels":[3]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["AGGREGATION_LEVEL"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/org-units/entered-above.json b/src/__fixtures__/org-units/entered-above.json new file mode 100644 index 000000000..7b1b5b9be --- /dev/null +++ b/src/__fixtures__/org-units/entered-above.json @@ -0,0 +1,111 @@ +{ + "schemaVersion": 1, + "group": "entered-above", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "hierarchy": { + "orgUnits": { + "region": { + "level": 2, + "parent": null + }, + "A": { + "level": 3, + "parent": "region" + }, + "B": { + "level": 3, + "parent": "region" + }, + "D1": { + "level": 3, + "parent": "region" + }, + "D2": { + "level": 3, + "parent": "region" + }, + "D3": { + "level": 3, + "parent": "region" + }, + "F1": { + "level": 4, + "parent": "D1" + }, + "F2": { + "level": 4, + "parent": "D1" + }, + "F3": { + "level": 4, + "parent": "D2" + } + }, + "groups": { + "g": [ + "D2", + "F1" + ], + "empty": [], + "top": [ + "region" + ] + } + }, + "smoke": "5 of 5 cases, one per pattern", + "cases": [ + {"id":"ou-above__D1","item":{"code":"PTT_OU_ABOVE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set at D1","periodType":"Monthly","orgUnits":["D1"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["D1"]},"expected":{"status":"VALUE","value":3000,"contributes":["D1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.40.12":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.41.10":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.42.6":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.43.2":{"status":"VALUE","value":3000,"rows":{"D1":3000}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-above__F1","item":{"code":"PTT_OU_ABOVE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set at D1","periodType":"Monthly","orgUnits":["D1"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["BELOW_COLLECTION"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-above__level-3-region","item":{"code":"PTT_OU_ABOVE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set at D1","periodType":"Monthly","orgUnits":["D1"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["LEVEL-3","region"]},"expected":{"status":"VALUE","value":3000,"contributes":["D1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.40.12":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.41.10":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.42.6":{"status":"VALUE","value":3000,"rows":{"D1":3000}},"2.43.2":{"status":"VALUE","value":3000,"rows":{"D1":3000}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-above__level-4-region","item":{"code":"PTT_OU_ABOVE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set at D1","periodType":"Monthly","orgUnits":["D1"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["LEVEL-4","region"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["BELOW_COLLECTION"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-above__region","item":{"code":"PTT_OU_ABOVE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set at D1","periodType":"Monthly","orgUnits":["D1"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":3000,"contributes":["D1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.40.12":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.41.10":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.42.6":{"status":"VALUE","value":3000,"rows":{"region":3000}},"2.43.2":{"status":"VALUE","value":3000,"rows":{"region":3000}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/org-units/mixed-levels.json b/src/__fixtures__/org-units/mixed-levels.json new file mode 100644 index 000000000..6bd3cb7d2 --- /dev/null +++ b/src/__fixtures__/org-units/mixed-levels.json @@ -0,0 +1,112 @@ +{ + "schemaVersion": 1, + "group": "mixed-levels", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "hierarchy": { + "orgUnits": { + "region": { + "level": 2, + "parent": null + }, + "A": { + "level": 3, + "parent": "region" + }, + "B": { + "level": 3, + "parent": "region" + }, + "D1": { + "level": 3, + "parent": "region" + }, + "D2": { + "level": 3, + "parent": "region" + }, + "D3": { + "level": 3, + "parent": "region" + }, + "F1": { + "level": 4, + "parent": "D1" + }, + "F2": { + "level": 4, + "parent": "D1" + }, + "F3": { + "level": 4, + "parent": "D2" + } + }, + "groups": { + "g": [ + "D2", + "F1" + ], + "empty": [], + "top": [ + "region" + ] + } + }, + "smoke": "6 of 6 cases, one per pattern", + "cases": [ + {"id":"ou-mixed-element__D1","item":{"code":"PTT_OU_MIXED","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU mixed data set at facilities","periodType":"Monthly","orgUnits":["F1","F2","F3"]},{"dataSet":"PTT OU mixed data set at D1","periodType":"Monthly","orgUnits":["D1"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["D1"]},"expected":{"status":"VALUE","value":3033,"contributes":["F1","F2","D1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.40.12":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.41.10":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.42.6":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.43.2":{"status":"VALUE","value":3033,"rows":{"D1":3033}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-mixed-element__F1","item":{"code":"PTT_OU_MIXED","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU mixed data set at facilities","periodType":"Monthly","orgUnits":["F1","F2","F3"]},{"dataSet":"PTT OU mixed data set at D1","periodType":"Monthly","orgUnits":["D1"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"VALUE","value":3,"contributes":["F1"],"compatibility":"partial","reasons":["BELOW_COLLECTION"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.12":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.10":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.6":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.2":{"status":"VALUE","value":3,"rows":{"F1":3}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-mixed-element__region","item":{"code":"PTT_OU_MIXED","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU mixed data set at facilities","periodType":"Monthly","orgUnits":["F1","F2","F3"]},{"dataSet":"PTT OU mixed data set at D1","periodType":"Monthly","orgUnits":["D1"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":3333,"contributes":["F1","F2","F3","D1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.40.12":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.41.10":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.42.6":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.43.2":{"status":"VALUE","value":3333,"rows":{"region":3333}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-mixed-indicator__D1","item":{"code":"PTT_OU_IND_MIXED","dimensionItemType":"INDICATOR","numerator":"#{ciJTwyIYu2T}","denominator":"1","operands":[{"id":"ciJTwyIYu2T","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU mixed data set at facilities","periodType":"Monthly","orgUnits":["F1","F2","F3"]},{"dataSet":"PTT OU mixed data set at D1","periodType":"Monthly","orgUnits":["D1"]}]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["D1"]},"expected":{"status":"VALUE","value":3033,"contributes":["F1","F2","D1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.40.12":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.41.10":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.42.6":{"status":"VALUE","value":3033,"rows":{"D1":3033}},"2.43.2":{"status":"VALUE","value":3033,"rows":{"D1":3033}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-mixed-indicator__F1","item":{"code":"PTT_OU_IND_MIXED","dimensionItemType":"INDICATOR","numerator":"#{ciJTwyIYu2T}","denominator":"1","operands":[{"id":"ciJTwyIYu2T","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU mixed data set at facilities","periodType":"Monthly","orgUnits":["F1","F2","F3"]},{"dataSet":"PTT OU mixed data set at D1","periodType":"Monthly","orgUnits":["D1"]}]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"VALUE","value":3,"contributes":["F1"],"compatibility":"partial","reasons":["OPERAND_PARTIAL"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.12":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.10":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.6":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.2":{"status":"VALUE","value":3,"rows":{"F1":3}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-mixed-indicator__region","item":{"code":"PTT_OU_IND_MIXED","dimensionItemType":"INDICATOR","numerator":"#{ciJTwyIYu2T}","denominator":"1","operands":[{"id":"ciJTwyIYu2T","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU mixed data set at facilities","periodType":"Monthly","orgUnits":["F1","F2","F3"]},{"dataSet":"PTT OU mixed data set at D1","periodType":"Monthly","orgUnits":["D1"]}]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":3333,"contributes":["F1","F2","F3","D1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.40.12":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.41.10":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.42.6":{"status":"VALUE","value":3333,"rows":{"region":3333}},"2.43.2":{"status":"VALUE","value":3333,"rows":{"region":3333}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/org-units/org-unit-groups.json b/src/__fixtures__/org-units/org-unit-groups.json new file mode 100644 index 000000000..e6e3212e7 --- /dev/null +++ b/src/__fixtures__/org-units/org-unit-groups.json @@ -0,0 +1,110 @@ +{ + "schemaVersion": 1, + "group": "org-unit-groups", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "hierarchy": { + "orgUnits": { + "region": { + "level": 2, + "parent": null + }, + "A": { + "level": 3, + "parent": "region" + }, + "B": { + "level": 3, + "parent": "region" + }, + "D1": { + "level": 3, + "parent": "region" + }, + "D2": { + "level": 3, + "parent": "region" + }, + "D3": { + "level": 3, + "parent": "region" + }, + "F1": { + "level": 4, + "parent": "D1" + }, + "F2": { + "level": 4, + "parent": "D1" + }, + "F3": { + "level": 4, + "parent": "D2" + } + }, + "groups": { + "g": [ + "D2", + "F1" + ], + "empty": [], + "top": [ + "region" + ] + } + }, + "smoke": "4 of 4 cases, one per pattern", + "cases": [ + {"id":"ou-groups__empty","item":{"code":"PTT_OU_EVERYWHERE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set everywhere","periodType":"Monthly","orgUnits":["F1","F2","F3","D1","D2","D3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["OU_GROUP-empty"]},"expected":{"status":"ERROR","value":null,"contributes":[],"compatibility":null,"reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7143: Organisation unit or organisation unit level is not valid"},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7143: Organisation unit or organisation unit level is not valid"},"2.41.11-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7143: Organisation unit or organisation unit level is not valid"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7143: Organisation unit or organisation unit level is not valid"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7143: Organisation unit or organisation unit level is not valid"},"2.40.12":{"status":"ERROR","value":null,"error":"E7143: Organisation unit or organisation unit level is not valid"},"2.41.10":{"status":"ERROR","value":null,"error":"E7143: Organisation unit or organisation unit level is not valid"},"2.42.6":{"status":"ERROR","value":null,"error":"E7143: Organisation unit or organisation unit level is not valid"},"2.43.2":{"status":"ERROR","value":null,"error":"E7143: Organisation unit or organisation unit level is not valid"}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-groups__g","item":{"code":"PTT_OU_EVERYWHERE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set everywhere","periodType":"Monthly","orgUnits":["F1","F2","F3","D1","D2","D3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["OU_GROUP-g"]},"expected":{"status":"VALUE","value":30303,"contributes":["D2","F3","F1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.40.12":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.41.10":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.42.6":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.43.2":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-groups__g-in-D1","item":{"code":"PTT_OU_EVERYWHERE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set everywhere","periodType":"Monthly","orgUnits":["F1","F2","F3","D1","D2","D3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["OU_GROUP-g","D1"]},"expected":{"status":"VALUE","value":3,"contributes":["F1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.12":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.10":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.6":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.2":{"status":"VALUE","value":3,"rows":{"F1":3}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-groups__g-in-region","item":{"code":"PTT_OU_EVERYWHERE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set everywhere","periodType":"Monthly","orgUnits":["F1","F2","F3","D1","D2","D3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["OU_GROUP-g","region"]},"expected":{"status":"VALUE","value":30303,"contributes":["D2","F3","F1"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.40.12":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.41.10":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.42.6":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}},"2.43.2":{"status":"VALUE","value":30303,"rows":{"D2":30300,"F1":3}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/org-units/org-unit-requests.json b/src/__fixtures__/org-units/org-unit-requests.json new file mode 100644 index 000000000..163eed119 --- /dev/null +++ b/src/__fixtures__/org-units/org-unit-requests.json @@ -0,0 +1,122 @@ +{ + "schemaVersion": 1, + "group": "org-unit-requests", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "hierarchy": { + "orgUnits": { + "region": { + "level": 2, + "parent": null + }, + "A": { + "level": 3, + "parent": "region" + }, + "B": { + "level": 3, + "parent": "region" + }, + "D1": { + "level": 3, + "parent": "region" + }, + "D2": { + "level": 3, + "parent": "region" + }, + "D3": { + "level": 3, + "parent": "region" + }, + "F1": { + "level": 4, + "parent": "D1" + }, + "F2": { + "level": 4, + "parent": "D1" + }, + "F3": { + "level": 4, + "parent": "D2" + } + }, + "groups": { + "g": [ + "D2", + "F1" + ], + "empty": [], + "top": [ + "region" + ] + } + }, + "smoke": "16 of 16 cases, one per pattern", + "cases": [ + {"id":"ou-request-count-child-in-group","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnits.json?filter=children.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1"},"expected":{"status":"VALUE","value":2},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2},"2.40.12":{"status":"VALUE","value":2},"2.41.10":{"status":"VALUE","value":2},"2.42.6":{"status":"VALUE","value":2},"2.43.2":{"status":"VALUE","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-count-dataSet","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnits.json?filter=dataSets.id:eq:v200HCJsE6E&fields=id&pageSize=1"},"expected":{"status":"VALUE","value":2},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2},"2.40.12":{"status":"VALUE","value":2},"2.41.10":{"status":"VALUE","value":2},"2.42.6":{"status":"VALUE","value":2},"2.43.2":{"status":"VALUE","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-count-grandparent-in-group","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:TTEvM2Zx7wF&fields=id&pageSize=1"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3},"2.40.12":{"status":"VALUE","value":3},"2.41.10":{"status":"VALUE","value":3},"2.42.6":{"status":"VALUE","value":3},"2.43.2":{"status":"VALUE","value":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-count-grandparent-in-group-none","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1"},"expected":{"status":"EMPTY","value":0},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":0},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":0},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":0},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":0},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":0},"2.40.12":{"status":"EMPTY","value":0},"2.41.10":{"status":"EMPTY","value":0},"2.42.6":{"status":"EMPTY","value":0},"2.43.2":{"status":"EMPTY","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-count-group","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnits.json?filter=organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1"},"expected":{"status":"VALUE","value":2},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2},"2.40.12":{"status":"VALUE","value":2},"2.41.10":{"status":"VALUE","value":2},"2.42.6":{"status":"VALUE","value":2},"2.43.2":{"status":"VALUE","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-count-ids","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3},"2.40.12":{"status":"VALUE","value":3},"2.41.10":{"status":"VALUE","value":3},"2.42.6":{"status":"VALUE","value":3},"2.43.2":{"status":"VALUE","value":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-count-level","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1169},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1169},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1169},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1169},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1169},"2.40.12":{"status":"VALUE","value":1169},"2.41.10":{"status":"VALUE","value":1169},"2.42.6":{"status":"VALUE","value":1169},"2.43.2":{"status":"VALUE","value":1169}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ou-request-count-path","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1"},"expected":{"status":"VALUE","value":9},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":9},"2.40.13-SNAPSHOT":{"status":"VALUE","value":9},"2.41.11-SNAPSHOT":{"status":"VALUE","value":9},"2.42.7-SNAPSHOT":{"status":"VALUE","value":9},"2.43.3-SNAPSHOT":{"status":"VALUE","value":9},"2.40.12":{"status":"VALUE","value":9},"2.41.10":{"status":"VALUE","value":9},"2.42.6":{"status":"VALUE","value":9},"2.43.2":{"status":"VALUE","value":9}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-count-program","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnits.json?filter=programs.id:eq:KfzRtyEQHht&fields=id&pageSize=1"},"expected":{"status":"VALUE","value":2},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2},"2.40.12":{"status":"VALUE","value":2},"2.41.10":{"status":"VALUE","value":2},"2.42.6":{"status":"VALUE","value":2},"2.43.2":{"status":"VALUE","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-dataElements-aggregationLevels","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/dataElements.json?filter=code:$like:PTT_OU_AGG&fields=id,code,aggregationType,aggregationLevels,dataSetElements[dataSet[id,periodType]]&paging=false&order=code:asc"},"expected":{"status":"VALUE","value":4},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.40.13-SNAPSHOT":{"status":"VALUE","value":4},"2.41.11-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.40.12":{"status":"VALUE","value":4},"2.41.10":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-list-assigned-ancestors","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,Zkx2DMsGgi0,RIinNUb6rg7]&filter=dataSets.id:eq:pRfTWd7fDDO&fields=id&paging=false"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"VALUE","value":1},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-me","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":null},"2.40.13-SNAPSHOT":{"status":"VALUE","value":null},"2.41.11-SNAPSHOT":{"status":"VALUE","value":null},"2.42.7-SNAPSHOT":{"status":"VALUE","value":null},"2.43.3-SNAPSHOT":{"status":"VALUE","value":null},"2.40.12":{"status":"VALUE","value":null},"2.41.10":{"status":"VALUE","value":null},"2.42.6":{"status":"VALUE","value":null},"2.43.2":{"status":"VALUE","value":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ou-request-me-ptt-user","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]","asUser":true},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":null},"2.40.13-SNAPSHOT":{"status":"VALUE","value":null},"2.41.11-SNAPSHOT":{"status":"VALUE","value":null},"2.42.7-SNAPSHOT":{"status":"VALUE","value":null},"2.43.3-SNAPSHOT":{"status":"VALUE","value":null},"2.40.12":{"status":"VALUE","value":null},"2.41.10":{"status":"VALUE","value":null},"2.42.6":{"status":"VALUE","value":null},"2.43.2":{"status":"VALUE","value":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ou-request-organisationUnitLevels","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/organisationUnitLevels.json?fields=id,level,displayName&paging=false&order=level:asc"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.40.13-SNAPSHOT":{"status":"VALUE","value":4},"2.41.11-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.40.12":{"status":"VALUE","value":4},"2.41.10":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ou-request-programIndicators","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/programIndicators.json?filter=code:$like:PTT_PROG&fields=id,code,program[id],orgUnitField,analyticsType,analyticsPeriodBoundaries[id]&paging=false&order=code:asc"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-request-programs","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/programs.json?filter=code:$like:PTT_PROG&fields=id,code,programType&paging=false&order=code:asc"},"expected":{"status":"VALUE","value":2},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2},"2.40.12":{"status":"VALUE","value":2},"2.41.10":{"status":"VALUE","value":2},"2.42.6":{"status":"VALUE","value":2},"2.43.2":{"status":"VALUE","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/org-units/partly-assigned.json b/src/__fixtures__/org-units/partly-assigned.json new file mode 100644 index 000000000..7215df721 --- /dev/null +++ b/src/__fixtures__/org-units/partly-assigned.json @@ -0,0 +1,111 @@ +{ + "schemaVersion": 1, + "group": "partly-assigned", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "hierarchy": { + "orgUnits": { + "region": { + "level": 2, + "parent": null + }, + "A": { + "level": 3, + "parent": "region" + }, + "B": { + "level": 3, + "parent": "region" + }, + "D1": { + "level": 3, + "parent": "region" + }, + "D2": { + "level": 3, + "parent": "region" + }, + "D3": { + "level": 3, + "parent": "region" + }, + "F1": { + "level": 4, + "parent": "D1" + }, + "F2": { + "level": 4, + "parent": "D1" + }, + "F3": { + "level": 4, + "parent": "D2" + } + }, + "groups": { + "g": [ + "D2", + "F1" + ], + "empty": [], + "top": [ + "region" + ] + } + }, + "smoke": "5 of 5 cases, one per pattern", + "cases": [ + {"id":"ou-partly__D1","item":{"code":"PTT_OU_PARTLY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set at F1 and F2","periodType":"Monthly","orgUnits":["F1","F2"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["D1"]},"expected":{"status":"VALUE","value":33,"contributes":["F1","F2"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.40.12":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.41.10":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.42.6":{"status":"VALUE","value":33,"rows":{"D1":33}},"2.43.2":{"status":"VALUE","value":33,"rows":{"D1":33}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-partly__D2","item":{"code":"PTT_OU_PARTLY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set at F1 and F2","periodType":"Monthly","orgUnits":["F1","F2"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["D2"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["NOT_ASSIGNED"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-partly__F3","item":{"code":"PTT_OU_PARTLY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set at F1 and F2","periodType":"Monthly","orgUnits":["F1","F2"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F3"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["NOT_ASSIGNED"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-partly__level-4-region","item":{"code":"PTT_OU_PARTLY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set at F1 and F2","periodType":"Monthly","orgUnits":["F1","F2"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["LEVEL-4","region"]},"expected":{"status":"VALUE","value":33,"contributes":["F1","F2"],"compatibility":"full","reasons":["PARTLY_ASSIGNED"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"F1":3,"F2":30}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"F1":3,"F2":30}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"F1":3,"F2":30}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"F1":3,"F2":30}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"F1":3,"F2":30}},"2.40.12":{"status":"VALUE","value":33,"rows":{"F1":3,"F2":30}},"2.41.10":{"status":"VALUE","value":33,"rows":{"F1":3,"F2":30}},"2.42.6":{"status":"VALUE","value":33,"rows":{"F1":3,"F2":30}},"2.43.2":{"status":"VALUE","value":33,"rows":{"F1":3,"F2":30}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-partly__region","item":{"code":"PTT_OU_PARTLY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set at F1 and F2","periodType":"Monthly","orgUnits":["F1","F2"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":33,"contributes":["F1","F2"],"compatibility":"full","reasons":["PARTLY_ASSIGNED"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"region":33}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"region":33}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"region":33}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"region":33}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":33,"rows":{"region":33}},"2.40.12":{"status":"VALUE","value":33,"rows":{"region":33}},"2.41.10":{"status":"VALUE","value":33,"rows":{"region":33}},"2.42.6":{"status":"VALUE","value":33,"rows":{"region":33}},"2.43.2":{"status":"VALUE","value":33,"rows":{"region":33}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/org-units/programs.json b/src/__fixtures__/org-units/programs.json new file mode 100644 index 000000000..7ef6b8a93 --- /dev/null +++ b/src/__fixtures__/org-units/programs.json @@ -0,0 +1,134 @@ +{ + "schemaVersion": 1, + "group": "programs", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "hierarchy": { + "orgUnits": { + "region": { + "level": 2, + "parent": null + }, + "A": { + "level": 3, + "parent": "region" + }, + "B": { + "level": 3, + "parent": "region" + }, + "D1": { + "level": 3, + "parent": "region" + }, + "D2": { + "level": 3, + "parent": "region" + }, + "D3": { + "level": 3, + "parent": "region" + }, + "F1": { + "level": 4, + "parent": "D1" + }, + "F2": { + "level": 4, + "parent": "D1" + }, + "F3": { + "level": 4, + "parent": "D2" + } + }, + "groups": { + "g": [ + "D2", + "F1" + ], + "empty": [], + "top": [ + "region" + ] + } + }, + "smoke": "28 of 28 cases, one per pattern", + "cases": [ + {"id":"ou-prog-event__F1","item":{"code":"PTT_PROG_PI_EVENT","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT event program","orgUnits":["F1","F2"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"VALUE","value":3,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.40.12":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.41.10":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.42.6":{"status":"VALUE","value":3,"rows":{"F1":3}},"2.43.2":{"status":"VALUE","value":3,"rows":{"F1":3}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-event__F2","item":{"code":"PTT_PROG_PI_EVENT","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT event program","orgUnits":["F1","F2"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F2"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"F2":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-event__F3","item":{"code":"PTT_PROG_PI_EVENT","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT event program","orgUnits":["F1","F2"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F3"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"none","reasons":["NOT_ASSIGNED"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-event__region","item":{"code":"PTT_PROG_PI_EVENT","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT event program","orgUnits":["F1","F2"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":5,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5,"rows":{"region":5}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":5,"rows":{"region":5}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5,"rows":{"region":5}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5,"rows":{"region":5}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5,"rows":{"region":5}},"2.40.12":{"status":"VALUE","value":5,"rows":{"region":5}},"2.41.10":{"status":"VALUE","value":5,"rows":{"region":5}},"2.42.6":{"status":"VALUE","value":5,"rows":{"region":5}},"2.43.2":{"status":"VALUE","value":5,"rows":{"region":5}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-event-place__F1","item":{"code":"PTT_PROG_PI_EVENT_PLACE","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT event program","orgUnits":["F1","F2"],"orgUnitField":"DATA_ELEMENT"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":["ORG_UNIT_FIELD"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-event-place__F2","item":{"code":"PTT_PROG_PI_EVENT_PLACE","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT event program","orgUnits":["F1","F2"],"orgUnitField":"DATA_ELEMENT"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F2"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":["ORG_UNIT_FIELD"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-event-place__F3","item":{"code":"PTT_PROG_PI_EVENT_PLACE","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT event program","orgUnits":["F1","F2"],"orgUnitField":"DATA_ELEMENT"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F3"]},"expected":{"status":"VALUE","value":1,"contributes":[],"compatibility":"full","reasons":["ORG_UNIT_FIELD"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1,"rows":{"F3":1}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1,"rows":{"F3":1}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1,"rows":{"F3":1}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1,"rows":{"F3":1}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1,"rows":{"F3":1}},"2.40.12":{"status":"VALUE","value":1,"rows":{"F3":1}},"2.41.10":{"status":"VALUE","value":1,"rows":{"F3":1}},"2.42.6":{"status":"VALUE","value":1,"rows":{"F3":1}},"2.43.2":{"status":"VALUE","value":1,"rows":{"F3":1}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-event-place__region","item":{"code":"PTT_PROG_PI_EVENT_PLACE","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT event program","orgUnits":["F1","F2"],"orgUnitField":"DATA_ELEMENT"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":1,"contributes":[],"compatibility":"full","reasons":["ORG_UNIT_FIELD"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1,"rows":{"region":1}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1,"rows":{"region":1}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1,"rows":{"region":1}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1,"rows":{"region":1}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1,"rows":{"region":1}},"2.40.12":{"status":"VALUE","value":1,"rows":{"region":1}},"2.41.10":{"status":"VALUE","value":1,"rows":{"region":1}},"2.42.6":{"status":"VALUE","value":1,"rows":{"region":1}},"2.43.2":{"status":"VALUE","value":1,"rows":{"region":1}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker__F1","item":{"code":"PTT_PROG_PI_TRACKER","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"F1":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker__F2","item":{"code":"PTT_PROG_PI_TRACKER","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F2"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker__F3","item":{"code":"PTT_PROG_PI_TRACKER","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F3"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker__region","item":{"code":"PTT_PROG_PI_TRACKER","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"region":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"region":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"region":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"region":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-enrollment__F1","item":{"code":"PTT_PROG_PI_TRACKER_ENROLLMENT","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"ENROLLMENT"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"F1":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-enrollment__F2","item":{"code":"PTT_PROG_PI_TRACKER_ENROLLMENT","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"ENROLLMENT"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F2"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-enrollment__F3","item":{"code":"PTT_PROG_PI_TRACKER_ENROLLMENT","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"ENROLLMENT"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F3"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-enrollment__region","item":{"code":"PTT_PROG_PI_TRACKER_ENROLLMENT","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"ENROLLMENT"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"region":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"region":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"region":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"region":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-owner-end__F1","item":{"code":"PTT_PROG_PI_TRACKER_OWNER_END","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"OWNER_AT_END"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"F1":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-owner-end__F2","item":{"code":"PTT_PROG_PI_TRACKER_OWNER_END","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"OWNER_AT_END"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F2"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-owner-end__F3","item":{"code":"PTT_PROG_PI_TRACKER_OWNER_END","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"OWNER_AT_END"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F3"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-owner-end__region","item":{"code":"PTT_PROG_PI_TRACKER_OWNER_END","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"OWNER_AT_END"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"region":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"region":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"region":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"region":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-owner-start__F1","item":{"code":"PTT_PROG_PI_TRACKER_OWNER_START","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"OWNER_AT_START"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"F1":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"F1":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-owner-start__F2","item":{"code":"PTT_PROG_PI_TRACKER_OWNER_START","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"OWNER_AT_START"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F2"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-owner-start__F3","item":{"code":"PTT_PROG_PI_TRACKER_OWNER_START","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"OWNER_AT_START"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F3"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-owner-start__region","item":{"code":"PTT_PROG_PI_TRACKER_OWNER_START","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"OWNER_AT_START"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"region":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"region":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"region":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"region":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-registration__F1","item":{"code":"PTT_PROG_PI_TRACKER_REGISTRATION","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"REGISTRATION"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F1"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":["ORG_UNIT_FIELD"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-registration__F2","item":{"code":"PTT_PROG_PI_TRACKER_REGISTRATION","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"REGISTRATION"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F2"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":["ORG_UNIT_FIELD"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"F2":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"F2":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-registration__F3","item":{"code":"PTT_PROG_PI_TRACKER_REGISTRATION","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"REGISTRATION"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["F3"]},"expected":{"status":"EMPTY","value":null,"contributes":[],"compatibility":"full","reasons":["ORG_UNIT_FIELD"]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"rows":{}},"2.40.12":{"status":"EMPTY","value":null,"rows":{}},"2.41.10":{"status":"EMPTY","value":null,"rows":{}},"2.42.6":{"status":"EMPTY","value":null,"rows":{}},"2.43.2":{"status":"EMPTY","value":null,"rows":{}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-prog-tracker-registration__region","item":{"code":"PTT_PROG_PI_TRACKER_REGISTRATION","dimensionItemType":"PROGRAM_INDICATOR","collectionSources":[{"program":"PTT tracker program","orgUnits":["F1","F2","F3"],"orgUnitField":"REGISTRATION"}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["region"]},"expected":{"status":"VALUE","value":2,"contributes":[],"compatibility":"full","reasons":["ORG_UNIT_FIELD"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2,"rows":{"region":2}},"2.40.12":{"status":"VALUE","value":2,"rows":{"region":2}},"2.41.10":{"status":"VALUE","value":2,"rows":{"region":2}},"2.42.6":{"status":"VALUE","value":2,"rows":{"region":2}},"2.43.2":{"status":"VALUE","value":2,"rows":{"region":2}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/org-units/user-org-units.json b/src/__fixtures__/org-units/user-org-units.json new file mode 100644 index 000000000..833ef8fbd --- /dev/null +++ b/src/__fixtures__/org-units/user-org-units.json @@ -0,0 +1,109 @@ +{ + "schemaVersion": 1, + "group": "user-org-units", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "hierarchy": { + "orgUnits": { + "region": { + "level": 2, + "parent": null + }, + "A": { + "level": 3, + "parent": "region" + }, + "B": { + "level": 3, + "parent": "region" + }, + "D1": { + "level": 3, + "parent": "region" + }, + "D2": { + "level": 3, + "parent": "region" + }, + "D3": { + "level": 3, + "parent": "region" + }, + "F1": { + "level": 4, + "parent": "D1" + }, + "F2": { + "level": 4, + "parent": "D1" + }, + "F3": { + "level": 4, + "parent": "D2" + } + }, + "groups": { + "g": [ + "D2", + "F1" + ], + "empty": [], + "top": [ + "region" + ] + } + }, + "smoke": "3 of 3 cases, one per pattern", + "cases": [ + {"id":"ou-user__children","item":{"code":"PTT_OU_EVERYWHERE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set everywhere","periodType":"Monthly","orgUnits":["F1","F2","F3","D1","D2","D3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["USER_ORGUNIT_CHILDREN"]},"expected":{"status":"VALUE","value":333333,"contributes":["F1","F2","F3","D1","D2","D3"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":333333,"rows":{"D3":300000,"D1":3033,"D2":30300}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":333333,"rows":{"D3":300000,"D1":3033,"D2":30300}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":333333,"rows":{"D3":300000,"D1":3033,"D2":30300}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":333333,"rows":{"D3":300000,"D1":3033,"D2":30300}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":333333,"rows":{"D3":300000,"D1":3033,"D2":30300}},"2.40.12":{"status":"VALUE","value":333333,"rows":{"D3":300000,"D1":3033,"D2":30300}},"2.41.10":{"status":"VALUE","value":333333,"rows":{"D3":300000,"D1":3033,"D2":30300}},"2.42.6":{"status":"VALUE","value":333333,"rows":{"D3":300000,"D1":3033,"D2":30300}},"2.43.2":{"status":"VALUE","value":333333,"rows":{"D3":300000,"D1":3033,"D2":30300}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-user__grandchildren","item":{"code":"PTT_OU_EVERYWHERE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set everywhere","periodType":"Monthly","orgUnits":["F1","F2","F3","D1","D2","D3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["USER_ORGUNIT_GRANDCHILDREN"]},"expected":{"status":"VALUE","value":333,"contributes":["F1","F2","F3"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":333,"rows":{"F1":3,"F2":30,"F3":300}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":333,"rows":{"F1":3,"F2":30,"F3":300}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":333,"rows":{"F1":3,"F2":30,"F3":300}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":333,"rows":{"F1":3,"F2":30,"F3":300}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":333,"rows":{"F1":3,"F2":30,"F3":300}},"2.40.12":{"status":"VALUE","value":333,"rows":{"F1":3,"F2":30,"F3":300}},"2.41.10":{"status":"VALUE","value":333,"rows":{"F1":3,"F2":30,"F3":300}},"2.42.6":{"status":"VALUE","value":333,"rows":{"F1":3,"F2":30,"F3":300}},"2.43.2":{"status":"VALUE","value":333,"rows":{"F1":3,"F2":30,"F3":300}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ou-user__user-orgunit","item":{"code":"PTT_OU_EVERYWHERE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"collectionSources":[{"dataSet":"PTT OU data set everywhere","periodType":"Monthly","orgUnits":["F1","F2","F3","D1","D2","D3"]}]},"query":{"periodType":"Quarterly","period":"2025Q1","orgUnits":["USER_ORGUNIT"]},"expected":{"status":"VALUE","value":333333,"contributes":["F1","F2","F3","D1","D2","D3"],"compatibility":"full","reasons":[]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":333333,"rows":{"region":333333}},"2.40.13-SNAPSHOT":{"status":"VALUE","value":333333,"rows":{"region":333333}},"2.41.11-SNAPSHOT":{"status":"VALUE","value":333333,"rows":{"region":333333}},"2.42.7-SNAPSHOT":{"status":"VALUE","value":333333,"rows":{"region":333333}},"2.43.3-SNAPSHOT":{"status":"VALUE","value":333333,"rows":{"region":333333}},"2.40.12":{"status":"VALUE","value":333333,"rows":{"region":333333}},"2.41.10":{"status":"VALUE","value":333333,"rows":{"region":333333}},"2.42.6":{"status":"VALUE","value":333333,"rows":{"region":333333}},"2.43.2":{"status":"VALUE","value":333333,"rows":{"region":333333}}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/period-types/aggregation-by-period-type.json b/src/__fixtures__/period-types/aggregation-by-period-type.json new file mode 100644 index 000000000..425e304e3 --- /dev/null +++ b/src/__fixtures__/period-types/aggregation-by-period-type.json @@ -0,0 +1,459 @@ +{ + "schemaVersion": 1, + "group": "aggregation-by-period-type", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "smoke": "403 of 60306 cases, one per pattern", + "cases": [ + {"id":"agg-AVERAGE__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_AVG_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_AVG_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":6},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":6},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":6},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":6},"2.40.12":{"status":"REPEATED","value":6},"2.41.10":{"status":"REPEATED","value":6},"2.42.6":{"status":"REPEATED","value":6},"2.43.2":{"status":"REPEATED","value":6}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_AVG_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5.5},"2.40.13-SNAPSHOT":{"status":"VALUE","value":5.5},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5.5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5.5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5.5},"2.40.12":{"status":"VALUE","value":5.5},"2.41.10":{"status":"VALUE","value":5.5},"2.42.6":{"status":"VALUE","value":5.5},"2.43.2":{"status":"VALUE","value":5.5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_AVG_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2.5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2.5},"2.43.2":{"status":"VALUE","value":2.5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_AVG_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":2.5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2.5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2.5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2.5},"2.42.6":{"status":"VALUE","value":2.5},"2.43.2":{"status":"VALUE","value":2.5}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":6.5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":6.5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":6.5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":6.5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":6.5},"2.42.6":{"status":"VALUE","value":6.5},"2.43.2":{"status":"VALUE","value":6.5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_AVG_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.2":{"status":"REPEATED","value":6}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_AVG_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1.5833333333},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1.5833333333},"2.43.2":{"status":"REPEATED","value":1.5833333333}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_AVG_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2.5},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":2.5},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2.5},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2.5},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2.5},"2.40.12":{"status":"REPEATED","value":2.5},"2.41.10":{"status":"REPEATED","value":2.5},"2.42.6":{"status":"REPEATED","value":2.5},"2.43.2":{"status":"REPEATED","value":2.5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_AVG_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1.6666666667},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1.6666666667},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1.6666666667},"2.42.6":{"status":"REPEATED","value":1.6666666667},"2.43.2":{"status":"REPEATED","value":1.6666666667}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_AVG_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_AVG_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_AVG_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":4},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":4},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":4},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":4},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":4},"2.42.6":{"status":"REPEATED","value":4},"2.43.2":{"status":"REPEATED","value":4}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":51},"2.43.3-SNAPSHOT":{"status":"VALUE","value":51},"2.43.2":{"status":"VALUE","value":51}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_AVG_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_AVG_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":6},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":6},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":6},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":6},"2.40.12":{"status":"REPEATED","value":6},"2.41.10":{"status":"REPEATED","value":6},"2.42.6":{"status":"REPEATED","value":6},"2.43.2":{"status":"REPEATED","value":6}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_AVG_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5.4876712329},"2.40.13-SNAPSHOT":{"status":"VALUE","value":5.4876712329},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5.4876712329},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5.4876712329},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5.4876712329},"2.40.12":{"status":"VALUE","value":5.4876712329},"2.41.10":{"status":"VALUE","value":5.4876712329},"2.42.6":{"status":"VALUE","value":5.4876712329},"2.43.2":{"status":"VALUE","value":5.4876712329}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_AVG_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1.674863388},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1.674863388},"2.43.2":{"status":"VALUE","value":1.674863388}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_AVG_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1.674863387978142},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1.674863388},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1.674863388},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1.674863388},"2.42.6":{"status":"VALUE","value":1.674863388},"2.43.2":{"status":"VALUE","value":1.674863388}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":8.4673913043},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":8.4673913043},"2.42.7-SNAPSHOT":{"status":"VALUE","value":8.4673913043},"2.43.3-SNAPSHOT":{"status":"VALUE","value":8.4673913043},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":8.4673913043},"2.42.6":{"status":"VALUE","value":8.4673913043},"2.43.2":{"status":"VALUE","value":8.4673913043}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_AVG_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.2":{"status":"REPEATED","value":6}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_AVG_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1.5801457195},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1.5801457195},"2.43.2":{"status":"REPEATED","value":1.5801457195}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_AVG_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2.5},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":2.5},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2.5},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2.5},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2.5},"2.40.12":{"status":"REPEATED","value":2.5},"2.41.10":{"status":"REPEATED","value":2.5},"2.42.6":{"status":"REPEATED","value":2.5},"2.43.2":{"status":"REPEATED","value":2.5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_AVG_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1.6630236794},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1.6675799087},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1.6630236794},"2.42.6":{"status":"REPEATED","value":1.6675799087},"2.43.2":{"status":"REPEATED","value":1.6630236794}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_AVG_SUM_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_SUM_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_AVG_SUM_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_AVG_SUM_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_SUM_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_SUM_OU_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":4},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":4},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":4},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":4},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":4},"2.42.6":{"status":"REPEATED","value":4},"2.43.2":{"status":"REPEATED","value":4}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_SUM_OU_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-AVERAGE_SUM_ORG_UNIT__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_AVG_SUM_OU_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":50.4456521739},"2.43.3-SNAPSHOT":{"status":"VALUE","value":50.4456521739},"2.43.2":{"status":"VALUE","value":50.4456521739}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-COUNT__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_COUNT_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"VALUE","value":1},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_COUNT_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_COUNT_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":6},"2.40.13-SNAPSHOT":{"status":"VALUE","value":6},"2.41.11-SNAPSHOT":{"status":"VALUE","value":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":6},"2.40.12":{"status":"VALUE","value":6},"2.41.10":{"status":"VALUE","value":6},"2.42.6":{"status":"VALUE","value":6},"2.43.2":{"status":"VALUE","value":6}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-COUNT__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_COUNT_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-COUNT__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_COUNT_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":4},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_COUNT_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":2},"2.42.6":{"status":"VALUE","value":2},"2.43.2":{"status":"VALUE","value":2}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-COUNT__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_COUNT_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_COUNT_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_COUNT_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_COUNT_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_COUNT_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_COUNT_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_COUNT_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_COUNT_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_COUNT_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_COUNT_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_COUNT_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_COUNT_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-COUNT__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_COUNT_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"COUNT","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":13},"2.43.3-SNAPSHOT":{"status":"VALUE","value":13},"2.43.2":{"status":"VALUE","value":13}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-FIRST__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_FIRST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_FIRST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":1},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"REPEATED","value":1},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-BiMonthly__q-Daily__p-20250101__A","item":{"code":"PTT_G1_FIRST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"Daily","period":"20250101","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_FIRST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"VALUE","value":1},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_FIRST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_FIRST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_FIRST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialApril__q-FinancialFeb__p-2024Feb__A","item":{"code":"PTT_G1_FIRST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialFeb","period":"2024Feb","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_FIRST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":2},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"REPEATED","value":2},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialApril__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_FIRST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialApril__q-Yearly__p-2024__A","item":{"code":"PTT_G1_FIRST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_FIRST_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialFeb__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FinancialFeb","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialFeb"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialNov__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_FinancialNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialNov"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_FIRST_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":2},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":2},"2.42.6":{"status":"VALUE","value":2},"2.43.2":{"status":"VALUE","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-SixMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_SixMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["SixMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_FIRST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_FIRST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":1},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"REPEATED","value":1},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-BiMonthly__q-Daily__p-20250101__A","item":{"code":"PTT_G1_FIRST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"Daily","period":"20250101","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_FIRST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"VALUE","value":1},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_FIRST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_FIRST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialFeb__p-2024Feb__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialFeb","period":"2024Feb","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":2},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"REPEATED","value":2},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialApril__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialApril__q-Yearly__p-2024__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialFeb__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialFeb","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialFeb"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialNov__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialNov"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_AVG_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_AVG_OU_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_AVG_OU_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":2},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":2},"2.42.6":{"status":"VALUE","value":2},"2.43.2":{"status":"VALUE","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-SixMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_AVG_OU_SixMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["SixMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_AVERAGE_ORG_UNIT__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_AVG_OU_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":1},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"REPEATED","value":1},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-BiMonthly__q-Daily__p-20250101__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"Daily","period":"20250101","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"VALUE","value":1},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialApril__q-FinancialFeb__p-2024Feb__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialFeb","period":"2024Feb","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":2},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"REPEATED","value":2},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialApril__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialApril__q-Yearly__p-2024__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialFeb__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialFeb","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialFeb"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialNov__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialNov"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":2},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":2},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":2},"2.42.7-SNAPSHOT":{"status":"VALUE","value":2},"2.43.3-SNAPSHOT":{"status":"VALUE","value":2},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":2},"2.42.6":{"status":"VALUE","value":2},"2.43.2":{"status":"VALUE","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-SixMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_SixMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["SixMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-FIRST_FIRST_ORG_UNIT__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_FIRST_FIRST_OU_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_FIRST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_LAST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_LAST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":6},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":6},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":6},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":6},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":6},"2.40.12":{"status":"REPEATED","value":6},"2.41.10":{"status":"REPEATED","value":6},"2.42.6":{"status":"REPEATED","value":6},"2.43.2":{"status":"REPEATED","value":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-BiMonthly__q-Daily__p-20250101__A","item":{"code":"PTT_G1_LAST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"Daily","period":"20250101","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_LAST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LAST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3},"2.43.2":{"status":"VALUE","value":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":4},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":6},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":6},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":6},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":6},"2.42.6":{"status":"VALUE","value":6},"2.43.2":{"status":"VALUE","value":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_LAST_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":6},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.2":{"status":"REPEATED","value":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LAST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialApril__q-FinancialFeb__p-2024Feb__A","item":{"code":"PTT_G1_LAST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialFeb","period":"2024Feb","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_LAST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":2},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"REPEATED","value":2},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialApril__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_LAST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialApril__q-Yearly__p-2024__A","item":{"code":"PTT_G1_LAST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LAST_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialFeb__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_FinancialFeb","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialFeb"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialNov__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_FinancialNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialNov"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_LAST_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":4},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":4},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":4},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":4},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":4},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":4},"2.42.6":{"status":"REPEATED","value":4},"2.43.2":{"status":"REPEATED","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-SixMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_SixMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["SixMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":57},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":57},"2.43.3-SNAPSHOT":{"status":"VALUE","value":57},"2.43.2":{"status":"VALUE","value":57}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_LAST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_LAST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":6},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":6},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":6},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":6},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":6},"2.40.12":{"status":"REPEATED","value":6},"2.41.10":{"status":"REPEATED","value":6},"2.42.6":{"status":"REPEATED","value":6},"2.43.2":{"status":"REPEATED","value":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-BiMonthly__q-Daily__p-20250101__A","item":{"code":"PTT_G1_LAST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"Daily","period":"20250101","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_LAST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LAST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3},"2.43.2":{"status":"VALUE","value":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":4},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":6},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":6},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":6},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":6},"2.42.6":{"status":"VALUE","value":6},"2.43.2":{"status":"VALUE","value":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_LAST_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":6},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.2":{"status":"REPEATED","value":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialFeb__p-2024Feb__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialFeb","period":"2024Feb","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":2},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"REPEATED","value":2},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialApril__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialApril__q-Yearly__p-2024__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialFeb__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialFeb","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialFeb"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialNov__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialNov"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_AVG_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_AVG_OU_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":4},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":4},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":4},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":4},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":4},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":4},"2.42.6":{"status":"REPEATED","value":4},"2.43.2":{"status":"REPEATED","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_AVG_OU_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-SixMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_AVG_OU_SixMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["SixMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_AVERAGE_ORG_UNIT__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_AVG_OU_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":57},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":57},"2.43.3-SNAPSHOT":{"status":"VALUE","value":57},"2.43.2":{"status":"VALUE","value":57}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_LIP_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_LIP_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_LIP_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LIP_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3},"2.43.2":{"status":"VALUE","value":3}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LIP_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":6},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":6},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":6},"2.42.6":{"status":"VALUE","value":6},"2.43.2":{"status":"VALUE","value":6}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_LIP_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LIP_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_LIP_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LIP_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LIP_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_LIP_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LIP_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":57},"2.43.3-SNAPSHOT":{"status":"VALUE","value":57},"2.43.2":{"status":"VALUE","value":57}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_LIP_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_LIP_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_LIP_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LIP_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3},"2.43.2":{"status":"VALUE","value":3}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LIP_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":6},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":6},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":6},"2.42.6":{"status":"VALUE","value":6},"2.43.2":{"status":"VALUE","value":6}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_LIP_AVG_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LIP_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_LIP_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LIP_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LIP_AVG_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_AVG_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_LIP_AVG_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LIP_AVG_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_AVG_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_AVG_OU_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_AVG_OU_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_IN_PERIOD_AVERAGE_ORG_UNIT__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LIP_AVG_OU_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":57},"2.43.3-SNAPSHOT":{"status":"VALUE","value":57},"2.43.2":{"status":"VALUE","value":57}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_LAST_LAST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_LAST_LAST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":6},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":6},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":6},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":6},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":6},"2.40.12":{"status":"REPEATED","value":6},"2.41.10":{"status":"REPEATED","value":6},"2.42.6":{"status":"REPEATED","value":6},"2.43.2":{"status":"REPEATED","value":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-BiMonthly__q-Daily__p-20250101__A","item":{"code":"PTT_G1_LAST_LAST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"Daily","period":"20250101","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_LAST_LAST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LAST_LAST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3},"2.43.2":{"status":"VALUE","value":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_LAST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":4},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_LAST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":6},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":6},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":6},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":6},"2.42.6":{"status":"VALUE","value":6},"2.43.2":{"status":"VALUE","value":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_LAST_LAST_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":6},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":6},"2.43.2":{"status":"REPEATED","value":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialApril__q-FinancialFeb__p-2024Feb__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialFeb","period":"2024Feb","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":2},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"REPEATED","value":2},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialApril__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialApril__q-Yearly__p-2024__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialFeb__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialFeb","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialFeb"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialNov__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialNov"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_LAST_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_LAST_OU_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":4},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":4},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":4},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":4},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":4},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":4},"2.42.6":{"status":"REPEATED","value":4},"2.43.2":{"status":"REPEATED","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_LAST_OU_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-SixMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_LAST_OU_SixMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["SixMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":2},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":2},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":2},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":2},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":2},"2.42.6":{"status":"REPEATED","value":2},"2.43.2":{"status":"REPEATED","value":2}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-LAST_LAST_ORG_UNIT__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_LAST_LAST_OU_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_LAST_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":57},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":57},"2.43.3-SNAPSHOT":{"status":"VALUE","value":57},"2.43.2":{"status":"VALUE","value":57}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_MAX_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_MAX_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_MAX_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":8},"2.40.13-SNAPSHOT":{"status":"VALUE","value":8},"2.41.11-SNAPSHOT":{"status":"VALUE","value":8},"2.42.7-SNAPSHOT":{"status":"VALUE","value":8},"2.43.3-SNAPSHOT":{"status":"VALUE","value":8},"2.40.12":{"status":"VALUE","value":8},"2.41.10":{"status":"VALUE","value":8},"2.42.6":{"status":"VALUE","value":8},"2.43.2":{"status":"VALUE","value":8}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MAX_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MAX_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":4},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_MAX_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MAX_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_MAX_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MAX_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MAX_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_MAX_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MAX_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":57},"2.43.3-SNAPSHOT":{"status":"VALUE","value":57},"2.43.2":{"status":"VALUE","value":57}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_MAX_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_MAX_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_MAX_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":8},"2.40.13-SNAPSHOT":{"status":"VALUE","value":8},"2.41.11-SNAPSHOT":{"status":"VALUE","value":8},"2.42.7-SNAPSHOT":{"status":"VALUE","value":8},"2.43.3-SNAPSHOT":{"status":"VALUE","value":8},"2.40.12":{"status":"VALUE","value":8},"2.41.10":{"status":"VALUE","value":8},"2.42.6":{"status":"VALUE","value":8},"2.43.2":{"status":"VALUE","value":8}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MAX_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MAX_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_MAX_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MAX_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_MAX_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MAX_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MAX_SUM_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_SUM_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_MAX_SUM_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MAX_SUM_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_SUM_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_SUM_OU_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_SUM_OU_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MAX_SUM_ORG_UNIT__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MAX_SUM_OU_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"MAX_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":57},"2.43.3-SNAPSHOT":{"status":"VALUE","value":57},"2.43.2":{"status":"VALUE","value":57}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_MIN_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_MIN_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_MIN_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3},"2.40.12":{"status":"VALUE","value":3},"2.41.10":{"status":"VALUE","value":3},"2.42.6":{"status":"VALUE","value":3},"2.43.2":{"status":"VALUE","value":3}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MIN_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MIN_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":6},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":6},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":6},"2.42.6":{"status":"VALUE","value":6},"2.43.2":{"status":"VALUE","value":6}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_MIN_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MIN_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_MIN_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MIN_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MIN_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_MIN_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MIN_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":45},"2.43.3-SNAPSHOT":{"status":"VALUE","value":45},"2.43.2":{"status":"VALUE","value":45}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_MIN_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_MIN_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_MIN_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3},"2.40.12":{"status":"VALUE","value":3},"2.41.10":{"status":"VALUE","value":3},"2.42.6":{"status":"VALUE","value":3},"2.43.2":{"status":"VALUE","value":3}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MIN_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MIN_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":6},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":6},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":6},"2.42.6":{"status":"VALUE","value":6},"2.43.2":{"status":"VALUE","value":6}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_MIN_SUM_OU_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MIN_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_MIN_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MIN_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_SUM_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_MIN_SUM_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_SUM_OU_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_MIN_SUM_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_MIN_SUM_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_SUM_OU_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_SUM_OU_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_SUM_OU_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-MIN_SUM_ORG_UNIT__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_MIN_SUM_OU_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"MIN_SUM_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":45},"2.43.3-SNAPSHOT":{"status":"VALUE","value":45},"2.43.2":{"status":"VALUE","value":45}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-NONE__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_NONE_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.41.11-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.40.12":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.41.10":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_NONE_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.41.11-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.40.12":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.41.10":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_NONE_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.41.11-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.40.12":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.41.10":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_NONE_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_NONE_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_NONE_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_NONE_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[XDSZDkGkmtJ]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_NONE_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_NONE_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.41.11-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.40.12":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.41.10":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_NONE_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_NONE_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[wpF6jTXcbOo]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_NONE_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[ZzBnkzMGZym]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[ZzBnkzMGZym]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[ZzBnkzMGZym]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_NONE_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[ZzBnkzMGZym]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[ZzBnkzMGZym]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[ZzBnkzMGZym]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_NONE_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_NONE_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_NONE_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[RqiFEO5xtay]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_NONE_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[vXy44pRCQCT]`"},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[vXy44pRCQCT]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[vXy44pRCQCT]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[vXy44pRCQCT]`"},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[vXy44pRCQCT]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[vXy44pRCQCT]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[vXy44pRCQCT]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_NONE_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[cOxFW3SkO4p]`"},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[cOxFW3SkO4p]`"},"2.42.7-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[cOxFW3SkO4p]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[cOxFW3SkO4p]`"},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[cOxFW3SkO4p]`"},"2.42.6":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[cOxFW3SkO4p]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[cOxFW3SkO4p]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-NONE__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_NONE_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"NONE","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"ERROR","value":null},"observed":{"2.44-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[iCp9VVH5GPI]`"},"2.43.3-SNAPSHOT":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[iCp9VVH5GPI]`"},"2.43.2":{"status":"ERROR","value":null,"error":"E7115: Data elements must be of a value and aggregation type that allow aggregation: `[iCp9VVH5GPI]`"}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_STDDEV_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0},"2.40.13-SNAPSHOT":{"status":"VALUE","value":0},"2.41.11-SNAPSHOT":{"status":"VALUE","value":0},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0},"2.40.12":{"status":"VALUE","value":0},"2.41.10":{"status":"VALUE","value":0},"2.42.6":{"status":"VALUE","value":0},"2.43.2":{"status":"VALUE","value":0}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-STDDEV__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_STDDEV_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_STDDEV_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1.8708286934},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1.8708286934},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1.8708286934},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1.8708286934},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1.8708286934},"2.40.12":{"status":"VALUE","value":1.8708286934},"2.41.10":{"status":"VALUE","value":1.8708286934},"2.42.6":{"status":"VALUE","value":1.8708286934},"2.43.2":{"status":"VALUE","value":1.8708286934}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-STDDEV__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_STDDEV_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1.2909944487},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1.2909944487},"2.43.2":{"status":"VALUE","value":1.2909944487}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-STDDEV__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_STDDEV_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1.2909944487},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1.2909944487},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1.2909944487},"2.42.6":{"status":"VALUE","value":1.2909944487},"2.43.2":{"status":"VALUE","value":1.2909944487}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-STDDEV__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_STDDEV_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0.7071067812},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":0.7071067812},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0.7071067812},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0.7071067812},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":0.7071067812},"2.42.6":{"status":"VALUE","value":0.7071067812},"2.43.2":{"status":"VALUE","value":0.7071067812}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-STDDEV__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_STDDEV_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_STDDEV_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_STDDEV_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_STDDEV_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_STDDEV_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_STDDEV_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0},"2.43.2":{"status":"VALUE","value":0}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-STDDEV__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_STDDEV_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_STDDEV_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_STDDEV_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0},"2.42.6":{"status":"VALUE","value":0},"2.43.2":{"status":"VALUE","value":0}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-STDDEV__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_STDDEV_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_STDDEV_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-STDDEV__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_STDDEV_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":0},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":0},"2.42.6":{"status":"VALUE","value":0},"2.43.2":{"status":"VALUE","value":0}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-STDDEV__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_STDDEV_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"STDDEV","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3.8944404818},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3.8944404818},"2.43.2":{"status":"VALUE","value":3.8944404818}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-SUM__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_SUM_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":7},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":7},"2.40.12":{"status":"VALUE","value":7},"2.41.10":{"status":"VALUE","value":7},"2.42.6":{"status":"VALUE","value":7},"2.43.2":{"status":"VALUE","value":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_SUM_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_SUM_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":33},"2.40.13-SNAPSHOT":{"status":"VALUE","value":33},"2.41.11-SNAPSHOT":{"status":"VALUE","value":33},"2.42.7-SNAPSHOT":{"status":"VALUE","value":33},"2.43.3-SNAPSHOT":{"status":"VALUE","value":33},"2.40.12":{"status":"VALUE","value":33},"2.41.10":{"status":"VALUE","value":33},"2.42.6":{"status":"VALUE","value":33},"2.43.2":{"status":"VALUE","value":33}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-SUM__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_SUM_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":10},"2.43.3-SNAPSHOT":{"status":"VALUE","value":10},"2.43.2":{"status":"VALUE","value":10}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-SUM__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_SUM_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":10},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":10},"2.42.7-SNAPSHOT":{"status":"VALUE","value":10},"2.43.3-SNAPSHOT":{"status":"VALUE","value":10},"2.42.6":{"status":"VALUE","value":10},"2.43.2":{"status":"VALUE","value":10}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_SUM_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":13},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":13},"2.42.7-SNAPSHOT":{"status":"VALUE","value":13},"2.43.3-SNAPSHOT":{"status":"VALUE","value":13},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":13},"2.42.6":{"status":"VALUE","value":13},"2.43.2":{"status":"VALUE","value":13}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-SUM__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_SUM_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_SUM_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_SUM_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_SUM_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_SUM_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_SUM_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_SUM_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_SUM_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_SUM_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_SUM_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_SUM_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_SUM_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-SUM__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_SUM_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":663},"2.43.3-SNAPSHOT":{"status":"VALUE","value":663},"2.43.2":{"status":"VALUE","value":663}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-VARIANCE__col-BiMonthly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_VAR_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0},"2.40.13-SNAPSHOT":{"status":"VALUE","value":0},"2.41.11-SNAPSHOT":{"status":"VALUE","value":0},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0},"2.40.12":{"status":"VALUE","value":0},"2.41.10":{"status":"VALUE","value":0},"2.42.6":{"status":"VALUE","value":0},"2.43.2":{"status":"VALUE","value":0}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-VARIANCE__col-BiMonthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G1_VAR_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-VARIANCE__col-BiMonthly__q-FinancialApril__p-2024April__A","item":{"code":"PTT_G1_VAR_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialApril","period":"2024April","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3.5},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3.5},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3.5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3.5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3.5},"2.40.12":{"status":"VALUE","value":3.5},"2.41.10":{"status":"VALUE","value":3.5},"2.42.6":{"status":"VALUE","value":3.5},"2.43.2":{"status":"VALUE","value":3.5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-VARIANCE__col-BiMonthly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_VAR_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1.6666666667},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1.6666666667},"2.43.2":{"status":"VALUE","value":1.6666666667}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-VARIANCE__col-BiMonthly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_VAR_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1.6666666667},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1.6666666667},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1.6666666667},"2.42.6":{"status":"VALUE","value":1.6666666667},"2.43.2":{"status":"VALUE","value":1.6666666667}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-VARIANCE__col-BiMonthly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_VAR_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0.5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":0.5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0.5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0.5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":0.5},"2.42.6":{"status":"VALUE","value":0.5},"2.43.2":{"status":"VALUE","value":0.5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-VARIANCE__col-BiMonthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G1_VAR_BiMonthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["BiMonthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-VARIANCE__col-FinancialApril__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_VAR_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-VARIANCE__col-FinancialApril__q-FinancialJuly__p-2024July__A","item":{"code":"PTT_G1_VAR_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialJuly","period":"2024July","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-VARIANCE__col-FinancialApril__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_VAR_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-VARIANCE__col-FinancialApril__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_VAR_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-VARIANCE__col-FinancialAug__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G1_VAR_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0},"2.43.2":{"status":"VALUE","value":0}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"agg-VARIANCE__col-FinancialAug__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_VAR_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"agg-VARIANCE__col-FinancialSep__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G1_VAR_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-VARIANCE__col-FinancialSep__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G1_VAR_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0},"2.42.6":{"status":"VALUE","value":0},"2.43.2":{"status":"VALUE","value":0}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-VARIANCE__col-FinancialSep__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_VAR_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-VARIANCE__col-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_VAR_Quarterly","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"agg-VARIANCE__col-QuarterlyNov__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_VAR_QuarterlyNov","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["QuarterlyNov"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":0},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":0},"2.42.6":{"status":"VALUE","value":0},"2.43.2":{"status":"VALUE","value":0}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"agg-VARIANCE__col-WeeklyFriday__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G1_VAR_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"VARIANCE","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":15.1666666667},"2.43.3-SNAPSHOT":{"status":"VALUE","value":15.1666666667},"2.43.2":{"status":"VALUE","value":15.1666666667}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}} + ] +} diff --git a/src/__fixtures__/period-types/carry-windows.json b/src/__fixtures__/period-types/carry-windows.json new file mode 100644 index 000000000..ec1d8bd66 --- /dev/null +++ b/src/__fixtures__/period-types/carry-windows.json @@ -0,0 +1,4938 @@ +{ + "schemaVersion": 1, + "group": "carry-windows", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "findings": { + "2.44-SNAPSHOT": { + "rules": { + "FIRST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0", + "start<=q.end, id-year>=q-0" + ], + "matched": 443, + "missed": [ + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0" + ], + "matched": 348, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 351, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 311, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 320, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 528, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202412__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202512__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2024Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2025Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-FinancialApril__p-2024April__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + } + }, + "pairs": { + "FIRST__col-Daily__q-Daily__p-20250715__with-alone": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20250101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20240615": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20230101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-202501": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2024": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2023": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-alone": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20250101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20240615": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20230101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-202501": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2024": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2023": "20250101", + "LAST__col-Daily__q-Daily__p-20250715__with-alone": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20250101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20240615": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20230101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-202501": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2024": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2023": "20250715", + "LAST__col-Daily__q-Monthly__p-202507__with-alone": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20250101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20240615": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20230101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-202501": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2024": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2023": "20250731", + "FIRST__col-Monthly__q-Daily__p-20250715__with-alone": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20250101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20240615": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20230101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-202501": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2024": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2023": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-alone": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20250101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20240615": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20230101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-202501": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2024": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2023": "202501", + "LAST__col-Monthly__q-Daily__p-20250715__with-alone": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20250101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20240615": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20230101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-202501": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2024": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2023": "202506", + "LAST__col-Monthly__q-Monthly__p-202507__with-alone": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20250101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20240615": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20230101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-202501": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2024": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2023": "202507" + } + }, + "2.40.13-SNAPSHOT": { + "rules": { + "FIRST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0", + "start<=q.end, id-year>=q-0" + ], + "matched": 443, + "missed": [ + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0" + ], + "matched": 348, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 351, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 311, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 320, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 528, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202412__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202512__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2024Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2025Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-FinancialApril__p-2024April__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + } + }, + "pairs": { + "FIRST__col-Daily__q-Daily__p-20250715__with-alone": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20250101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20240615": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20230101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-202501": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2024": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2023": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-alone": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20250101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20240615": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20230101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-202501": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2024": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2023": "20250101", + "LAST__col-Daily__q-Daily__p-20250715__with-alone": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20250101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20240615": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20230101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-202501": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2024": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2023": "20250715", + "LAST__col-Daily__q-Monthly__p-202507__with-alone": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20250101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20240615": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20230101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-202501": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2024": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2023": "20250731", + "FIRST__col-Monthly__q-Daily__p-20250715__with-alone": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20250101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20240615": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20230101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-202501": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2024": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2023": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-alone": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20250101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20240615": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20230101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-202501": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2024": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2023": "202501", + "LAST__col-Monthly__q-Daily__p-20250715__with-alone": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20250101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20240615": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20230101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-202501": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2024": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2023": "202506", + "LAST__col-Monthly__q-Monthly__p-202507__with-alone": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20250101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20240615": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20230101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-202501": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2024": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2023": "202507" + } + }, + "2.41.11-SNAPSHOT": { + "rules": { + "FIRST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0", + "start<=q.end, id-year>=q-0" + ], + "matched": 443, + "missed": [ + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0" + ], + "matched": 348, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 351, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 311, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 320, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 528, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202412__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202512__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2024Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2025Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-FinancialApril__p-2024April__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + } + }, + "pairs": { + "FIRST__col-Daily__q-Daily__p-20250715__with-alone": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20250101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20240615": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20230101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-202501": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2024": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2023": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-alone": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20250101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20240615": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20230101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-202501": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2024": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2023": "20250101", + "LAST__col-Daily__q-Daily__p-20250715__with-alone": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20250101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20240615": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20230101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-202501": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2024": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2023": "20250715", + "LAST__col-Daily__q-Monthly__p-202507__with-alone": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20250101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20240615": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20230101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-202501": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2024": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2023": "20250731", + "FIRST__col-Monthly__q-Daily__p-20250715__with-alone": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20250101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20240615": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20230101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-202501": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2024": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2023": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-alone": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20250101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20240615": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20230101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-202501": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2024": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2023": "202501", + "LAST__col-Monthly__q-Daily__p-20250715__with-alone": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20250101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20240615": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20230101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-202501": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2024": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2023": "202506", + "LAST__col-Monthly__q-Monthly__p-202507__with-alone": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20250101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20240615": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20230101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-202501": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2024": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2023": "202507" + } + }, + "2.42.7-SNAPSHOT": { + "rules": { + "FIRST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0", + "start<=q.end, id-year>=q-0" + ], + "matched": 443, + "missed": [ + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0" + ], + "matched": 348, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 351, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 311, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 320, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 528, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202412__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202512__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2024Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2025Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-FinancialApril__p-2024April__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + } + }, + "pairs": { + "FIRST__col-Daily__q-Daily__p-20250715__with-alone": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20250101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20240615": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20230101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-202501": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2024": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2023": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-alone": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20250101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20240615": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20230101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-202501": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2024": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2023": "20250101", + "LAST__col-Daily__q-Daily__p-20250715__with-alone": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20250101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20240615": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20230101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-202501": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2024": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2023": "20250715", + "LAST__col-Daily__q-Monthly__p-202507__with-alone": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20250101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20240615": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20230101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-202501": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2024": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2023": "20250731", + "FIRST__col-Monthly__q-Daily__p-20250715__with-alone": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20250101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20240615": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20230101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-202501": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2024": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2023": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-alone": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20250101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20240615": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20230101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-202501": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2024": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2023": "202501", + "LAST__col-Monthly__q-Daily__p-20250715__with-alone": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20250101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20240615": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20230101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-202501": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2024": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2023": "202506", + "LAST__col-Monthly__q-Monthly__p-202507__with-alone": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20250101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20240615": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20230101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-202501": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2024": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2023": "202507" + } + }, + "2.43.3-SNAPSHOT": { + "rules": { + "FIRST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0", + "start<=q.end, id-year>=q-0" + ], + "matched": 443, + "missed": [ + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0" + ], + "matched": 348, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 351, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 311, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 320, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 528, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202412__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202512__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2024Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2025Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-FinancialApril__p-2024April__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + } + }, + "pairs": { + "FIRST__col-Daily__q-Daily__p-20250715__with-alone": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20250101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20240615": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20230101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-202501": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2024": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2023": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-alone": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20250101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20240615": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20230101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-202501": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2024": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2023": "20250101", + "LAST__col-Daily__q-Daily__p-20250715__with-alone": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20250101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20240615": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20230101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-202501": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2024": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2023": "20250715", + "LAST__col-Daily__q-Monthly__p-202507__with-alone": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20250101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20240615": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20230101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-202501": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2024": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2023": "20250731", + "FIRST__col-Monthly__q-Daily__p-20250715__with-alone": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20250101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20240615": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20230101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-202501": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2024": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2023": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-alone": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20250101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20240615": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20230101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-202501": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2024": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2023": "202501", + "LAST__col-Monthly__q-Daily__p-20250715__with-alone": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20250101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20240615": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20230101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-202501": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2024": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2023": "202506", + "LAST__col-Monthly__q-Monthly__p-202507__with-alone": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20250101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20240615": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20230101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-202501": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2024": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2023": "202507" + } + }, + "2.40.12": { + "rules": { + "FIRST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0", + "start<=q.end, id-year>=q-0" + ], + "matched": 443, + "missed": [ + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0" + ], + "matched": 348, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 351, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 311, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 320, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 528, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202412__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202512__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2024Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2025Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-FinancialApril__p-2024April__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + } + }, + "pairs": { + "FIRST__col-Daily__q-Daily__p-20250715__with-alone": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20250101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20240615": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20230101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-202501": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2024": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2023": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-alone": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20250101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20240615": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20230101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-202501": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2024": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2023": "20250101", + "LAST__col-Daily__q-Daily__p-20250715__with-alone": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20250101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20240615": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20230101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-202501": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2024": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2023": "20250715", + "LAST__col-Daily__q-Monthly__p-202507__with-alone": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20250101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20240615": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20230101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-202501": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2024": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2023": "20250731", + "FIRST__col-Monthly__q-Daily__p-20250715__with-alone": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20250101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20240615": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20230101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-202501": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2024": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2023": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-alone": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20250101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20240615": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20230101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-202501": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2024": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2023": "202501", + "LAST__col-Monthly__q-Daily__p-20250715__with-alone": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20250101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20240615": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20230101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-202501": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2024": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2023": "202506", + "LAST__col-Monthly__q-Monthly__p-202507__with-alone": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20250101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20240615": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20230101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-202501": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2024": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2023": "202507" + } + }, + "2.41.10": { + "rules": { + "FIRST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0", + "start<=q.end, id-year>=q-0" + ], + "matched": 443, + "missed": [ + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0" + ], + "matched": 348, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 351, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 311, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 320, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 528, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202412__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202512__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2024Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2025Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-FinancialApril__p-2024April__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + } + }, + "pairs": { + "FIRST__col-Daily__q-Daily__p-20250715__with-alone": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20250101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20240615": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20230101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-202501": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2024": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2023": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-alone": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20250101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20240615": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20230101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-202501": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2024": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2023": "20250101", + "LAST__col-Daily__q-Daily__p-20250715__with-alone": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20250101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20240615": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20230101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-202501": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2024": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2023": "20250715", + "LAST__col-Daily__q-Monthly__p-202507__with-alone": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20250101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20240615": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20230101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-202501": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2024": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2023": "20250731", + "FIRST__col-Monthly__q-Daily__p-20250715__with-alone": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20250101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20240615": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20230101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-202501": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2024": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2023": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-alone": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20250101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20240615": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20230101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-202501": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2024": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2023": "202501", + "LAST__col-Monthly__q-Daily__p-20250715__with-alone": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20250101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20240615": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20230101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-202501": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2024": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2023": "202506", + "LAST__col-Monthly__q-Monthly__p-202507__with-alone": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20250101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20240615": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20230101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-202501": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2024": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2023": "202507" + } + }, + "2.42.6": { + "rules": { + "FIRST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0", + "start<=q.end, id-year>=q-0" + ], + "matched": 443, + "missed": [ + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0" + ], + "matched": 348, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 351, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 311, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 320, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 528, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202412__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202512__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2024Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2025Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-FinancialApril__p-2024April__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + } + }, + "pairs": { + "FIRST__col-Daily__q-Daily__p-20250715__with-alone": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20250101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20240615": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20230101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-202501": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2024": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2023": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-alone": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20250101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20240615": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20230101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-202501": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2024": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2023": "20250101", + "LAST__col-Daily__q-Daily__p-20250715__with-alone": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20250101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20240615": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20230101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-202501": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2024": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2023": "20250715", + "LAST__col-Daily__q-Monthly__p-202507__with-alone": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20250101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20240615": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20230101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-202501": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2024": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2023": "20250731", + "FIRST__col-Monthly__q-Daily__p-20250715__with-alone": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20250101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20240615": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20230101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-202501": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2024": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2023": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-alone": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20250101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20240615": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20230101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-202501": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2024": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2023": "202501", + "LAST__col-Monthly__q-Daily__p-20250715__with-alone": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20250101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20240615": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20230101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-202501": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2024": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2023": "202506", + "LAST__col-Monthly__q-Monthly__p-202507__with-alone": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20250101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20240615": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20230101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-202501": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2024": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2023": "202507" + } + }, + "2.43.2": { + "rules": { + "FIRST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0", + "start<=q.end, date-year>=q-0", + "start<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Daily": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0", + "start<=q.end, id-year>=q-0" + ], + "matched": 443, + "missed": [ + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-sparse-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Weekly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0" + ], + "matched": 348, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Weekly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD WeeklyWednesday": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 351, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240115__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-WeeklyWednesday__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Monthly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 311, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240201__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240215__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240301__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240315__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Monthly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Quarterly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 320, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240401__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240415__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240501__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240515__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Quarterly__q-Daily__p-20240601__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD Yearly": { + "cases": 540, + "bestRules": [ + "end<=q.end, id-year>=q-0" + ], + "matched": 528, + "missed": [ + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202412__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Monthly__p-202512__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2024Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-Quarterly__p-2025Q4__A", + "source": null, + "status": "EMPTY" + }, + { + "id": "carry-dense-LAST_IN_PERIOD__col-Yearly__q-FinancialApril__p-2024April__A", + "source": null, + "status": "EMPTY" + } + ] + }, + "FIRST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "FIRST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_AVERAGE_ORG_UNIT FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + }, + "LAST_IN_PERIOD FinancialApril": { + "cases": 540, + "bestRules": [ + "end<=q.end, date-year>=q-0", + "end<=q.end, id-year>=q-0", + "end<=q.end, mixed-year>=q-0" + ], + "matched": 540, + "missed": [] + } + }, + "pairs": { + "FIRST__col-Daily__q-Daily__p-20250715__with-alone": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20250101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20240615": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-20230101": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-202501": "20250101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2024": "20240101", + "FIRST__col-Daily__q-Daily__p-20250715__with-2023": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-alone": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20250101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20240615": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-20230101": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-202501": "20250101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2024": "20240101", + "FIRST__col-Daily__q-Monthly__p-202507__with-2023": "20250101", + "LAST__col-Daily__q-Daily__p-20250715__with-alone": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20250101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20240615": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-20230101": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-202501": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2024": "20250715", + "LAST__col-Daily__q-Daily__p-20250715__with-2023": "20250715", + "LAST__col-Daily__q-Monthly__p-202507__with-alone": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20250101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20240615": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-20230101": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-202501": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2024": "20250731", + "LAST__col-Daily__q-Monthly__p-202507__with-2023": "20250731", + "FIRST__col-Monthly__q-Daily__p-20250715__with-alone": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20250101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20240615": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-20230101": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-202501": "202501", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2024": "202401", + "FIRST__col-Monthly__q-Daily__p-20250715__with-2023": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-alone": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20250101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20240615": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-20230101": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-202501": "202501", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2024": "202401", + "FIRST__col-Monthly__q-Monthly__p-202507__with-2023": "202501", + "LAST__col-Monthly__q-Daily__p-20250715__with-alone": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20250101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20240615": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-20230101": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-202501": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2024": "202506", + "LAST__col-Monthly__q-Daily__p-20250715__with-2023": "202506", + "LAST__col-Monthly__q-Monthly__p-202507__with-alone": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20250101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20240615": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-20230101": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-202501": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2024": "202507", + "LAST__col-Monthly__q-Monthly__p-202507__with-2023": "202507" + } + } + }, + "smoke": "38 of 18956 cases, one per pattern", + "cases": [ + {"id":"carry-dense-FIRST__col-Daily__q-Daily__p-20230101__A","item":{"code":"PTT_G7_DENSE_FIRST_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20230101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST__col-Daily__q-Daily__p-20240101__A","item":{"code":"PTT_G7_DENSE_FIRST_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20240101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.12":{"status":"VALUE","value":1,"source":"20240101"},"2.41.10":{"status":"VALUE","value":1,"source":"20240101"},"2.42.6":{"status":"VALUE","value":1,"source":"20240101"},"2.43.2":{"status":"VALUE","value":1,"source":"20240101"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST__col-Daily__q-FinancialApril__p-2022April__A","item":{"code":"PTT_G7_DENSE_FIRST_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"FinancialApril","period":"2022April","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST__col-Daily__q-FinancialApril__p-2023April__A","item":{"code":"PTT_G7_DENSE_FIRST_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"FinancialApril","period":"2023April","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.12":{"status":"VALUE","value":1,"source":"20240101"},"2.41.10":{"status":"VALUE","value":1,"source":"20240101"},"2.42.6":{"status":"VALUE","value":1,"source":"20240101"},"2.43.2":{"status":"VALUE","value":1,"source":"20240101"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST__col-FinancialApril__q-Daily__p-20230101__A","item":{"code":"PTT_G7_DENSE_FIRST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20230101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST__col-FinancialApril__q-Yearly__p-2023__A","item":{"code":"PTT_G7_DENSE_FIRST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"],"notes":"Layout dense."},"query":{"periodType":"Yearly","period":"2023","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST__col-Monthly__q-Daily__p-20240201__A","item":{"code":"PTT_G7_DENSE_FIRST_Monthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20240201","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.40.12":{"status":"REPEATED","value":1,"source":"202401"},"2.41.10":{"status":"REPEATED","value":1,"source":"202401"},"2.42.6":{"status":"REPEATED","value":1,"source":"202401"},"2.43.2":{"status":"REPEATED","value":1,"source":"202401"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST__col-Weekly__q-WeeklyWednesday__p-2024WedW11__A","item":{"code":"PTT_G7_DENSE_FIRST_Weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST","valueType":"INTEGER","collectionPeriodTypes":["Weekly"],"notes":"Layout dense."},"query":{"periodType":"WeeklyWednesday","period":"2024WedW11","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1,"source":"2024W1"},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":1,"source":"2024W1"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1,"source":"2024W1"},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1,"source":"2024W1"},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1,"source":"2024W1"},"2.40.12":{"status":"REPEATED","value":1,"source":"2024W1"},"2.41.10":{"status":"REPEATED","value":1,"source":"2024W1"},"2.42.6":{"status":"REPEATED","value":1,"source":"2024W1"},"2.43.2":{"status":"REPEATED","value":1,"source":"2024W1"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST_AVERAGE_ORG_UNIT__col-Daily__q-Daily__p-20230101__A","item":{"code":"PTT_G7_DENSE_FIRST_AVG_OU_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20230101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST_AVERAGE_ORG_UNIT__col-Daily__q-Daily__p-20240101__A","item":{"code":"PTT_G7_DENSE_FIRST_AVG_OU_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20240101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.12":{"status":"VALUE","value":1,"source":"20240101"},"2.41.10":{"status":"VALUE","value":1,"source":"20240101"},"2.42.6":{"status":"VALUE","value":1,"source":"20240101"},"2.43.2":{"status":"VALUE","value":1,"source":"20240101"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST_AVERAGE_ORG_UNIT__col-Daily__q-FinancialApril__p-2022April__A","item":{"code":"PTT_G7_DENSE_FIRST_AVG_OU_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"FinancialApril","period":"2022April","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST_AVERAGE_ORG_UNIT__col-Daily__q-FinancialApril__p-2023April__A","item":{"code":"PTT_G7_DENSE_FIRST_AVG_OU_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"FinancialApril","period":"2023April","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.12":{"status":"VALUE","value":1,"source":"20240101"},"2.41.10":{"status":"VALUE","value":1,"source":"20240101"},"2.42.6":{"status":"VALUE","value":1,"source":"20240101"},"2.43.2":{"status":"VALUE","value":1,"source":"20240101"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST_AVERAGE_ORG_UNIT__col-FinancialApril__q-Daily__p-20230101__A","item":{"code":"PTT_G7_DENSE_FIRST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20230101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST_AVERAGE_ORG_UNIT__col-FinancialApril__q-Yearly__p-2023__A","item":{"code":"PTT_G7_DENSE_FIRST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"],"notes":"Layout dense."},"query":{"periodType":"Yearly","period":"2023","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST_AVERAGE_ORG_UNIT__col-Monthly__q-Daily__p-20240201__A","item":{"code":"PTT_G7_DENSE_FIRST_AVG_OU_Monthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20240201","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.40.12":{"status":"REPEATED","value":1,"source":"202401"},"2.41.10":{"status":"REPEATED","value":1,"source":"202401"},"2.42.6":{"status":"REPEATED","value":1,"source":"202401"},"2.43.2":{"status":"REPEATED","value":1,"source":"202401"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-FIRST_AVERAGE_ORG_UNIT__col-Weekly__q-WeeklyWednesday__p-2024WedW11__A","item":{"code":"PTT_G7_DENSE_FIRST_AVG_OU_Weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"FIRST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Weekly"],"notes":"Layout dense."},"query":{"periodType":"WeeklyWednesday","period":"2024WedW11","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1,"source":"2024W1"},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":1,"source":"2024W1"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1,"source":"2024W1"},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1,"source":"2024W1"},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1,"source":"2024W1"},"2.40.12":{"status":"REPEATED","value":1,"source":"2024W1"},"2.41.10":{"status":"REPEATED","value":1,"source":"2024W1"},"2.42.6":{"status":"REPEATED","value":1,"source":"2024W1"},"2.43.2":{"status":"REPEATED","value":1,"source":"2024W1"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST__col-Daily__q-Daily__p-20230101__A","item":{"code":"PTT_G7_DENSE_LAST_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20230101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST__col-Daily__q-Daily__p-20240101__A","item":{"code":"PTT_G7_DENSE_LAST_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20240101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.12":{"status":"VALUE","value":1,"source":"20240101"},"2.41.10":{"status":"VALUE","value":1,"source":"20240101"},"2.42.6":{"status":"VALUE","value":1,"source":"20240101"},"2.43.2":{"status":"VALUE","value":1,"source":"20240101"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST__col-Daily__q-FinancialApril__p-2022April__A","item":{"code":"PTT_G7_DENSE_LAST_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"FinancialApril","period":"2022April","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST__col-Daily__q-FinancialApril__p-2023April__A","item":{"code":"PTT_G7_DENSE_LAST_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"FinancialApril","period":"2023April","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.40.13-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.42.7-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.43.3-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.40.12":{"status":"VALUE","value":91,"source":"20240331"},"2.41.10":{"status":"VALUE","value":91,"source":"20240331"},"2.42.6":{"status":"VALUE","value":91,"source":"20240331"},"2.43.2":{"status":"VALUE","value":91,"source":"20240331"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST__col-FinancialApril__q-Daily__p-20230101__A","item":{"code":"PTT_G7_DENSE_LAST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20230101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST__col-FinancialApril__q-Yearly__p-2023__A","item":{"code":"PTT_G7_DENSE_LAST_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"],"notes":"Layout dense."},"query":{"periodType":"Yearly","period":"2023","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST__col-Monthly__q-Daily__p-20240201__A","item":{"code":"PTT_G7_DENSE_LAST_Monthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20240201","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.40.12":{"status":"REPEATED","value":1,"source":"202401"},"2.41.10":{"status":"REPEATED","value":1,"source":"202401"},"2.42.6":{"status":"REPEATED","value":1,"source":"202401"},"2.43.2":{"status":"REPEATED","value":1,"source":"202401"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST__col-Weekly__q-WeeklyWednesday__p-2024WedW11__A","item":{"code":"PTT_G7_DENSE_LAST_Weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST","valueType":"INTEGER","collectionPeriodTypes":["Weekly"],"notes":"Layout dense."},"query":{"periodType":"WeeklyWednesday","period":"2024WedW11","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":11,"source":"2024W11"},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":11,"source":"2024W11"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":11,"source":"2024W11"},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":11,"source":"2024W11"},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":11,"source":"2024W11"},"2.40.12":{"status":"REPEATED","value":11,"source":"2024W11"},"2.41.10":{"status":"REPEATED","value":11,"source":"2024W11"},"2.42.6":{"status":"REPEATED","value":11,"source":"2024W11"},"2.43.2":{"status":"REPEATED","value":11,"source":"2024W11"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_AVERAGE_ORG_UNIT__col-Daily__q-Daily__p-20230101__A","item":{"code":"PTT_G7_DENSE_LAST_AVG_OU_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20230101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_AVERAGE_ORG_UNIT__col-Daily__q-Daily__p-20240101__A","item":{"code":"PTT_G7_DENSE_LAST_AVG_OU_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20240101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.12":{"status":"VALUE","value":1,"source":"20240101"},"2.41.10":{"status":"VALUE","value":1,"source":"20240101"},"2.42.6":{"status":"VALUE","value":1,"source":"20240101"},"2.43.2":{"status":"VALUE","value":1,"source":"20240101"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_AVERAGE_ORG_UNIT__col-Daily__q-FinancialApril__p-2022April__A","item":{"code":"PTT_G7_DENSE_LAST_AVG_OU_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"FinancialApril","period":"2022April","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_AVERAGE_ORG_UNIT__col-Daily__q-FinancialApril__p-2023April__A","item":{"code":"PTT_G7_DENSE_LAST_AVG_OU_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"FinancialApril","period":"2023April","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.40.13-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.42.7-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.43.3-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.40.12":{"status":"VALUE","value":91,"source":"20240331"},"2.41.10":{"status":"VALUE","value":91,"source":"20240331"},"2.42.6":{"status":"VALUE","value":91,"source":"20240331"},"2.43.2":{"status":"VALUE","value":91,"source":"20240331"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_AVERAGE_ORG_UNIT__col-FinancialApril__q-Daily__p-20230101__A","item":{"code":"PTT_G7_DENSE_LAST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20230101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_AVERAGE_ORG_UNIT__col-FinancialApril__q-Yearly__p-2023__A","item":{"code":"PTT_G7_DENSE_LAST_AVG_OU_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"],"notes":"Layout dense."},"query":{"periodType":"Yearly","period":"2023","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_AVERAGE_ORG_UNIT__col-Monthly__q-Daily__p-20240201__A","item":{"code":"PTT_G7_DENSE_LAST_AVG_OU_Monthly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Monthly"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20240201","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1,"source":"202401"},"2.40.12":{"status":"REPEATED","value":1,"source":"202401"},"2.41.10":{"status":"REPEATED","value":1,"source":"202401"},"2.42.6":{"status":"REPEATED","value":1,"source":"202401"},"2.43.2":{"status":"REPEATED","value":1,"source":"202401"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_AVERAGE_ORG_UNIT__col-Weekly__q-WeeklyWednesday__p-2024WedW11__A","item":{"code":"PTT_G7_DENSE_LAST_AVG_OU_Weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_AVERAGE_ORG_UNIT","valueType":"INTEGER","collectionPeriodTypes":["Weekly"],"notes":"Layout dense."},"query":{"periodType":"WeeklyWednesday","period":"2024WedW11","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":11,"source":"2024W11"},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":11,"source":"2024W11"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":11,"source":"2024W11"},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":11,"source":"2024W11"},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":11,"source":"2024W11"},"2.40.12":{"status":"REPEATED","value":11,"source":"2024W11"},"2.41.10":{"status":"REPEATED","value":11,"source":"2024W11"},"2.42.6":{"status":"REPEATED","value":11,"source":"2024W11"},"2.43.2":{"status":"REPEATED","value":11,"source":"2024W11"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_IN_PERIOD__col-Daily__q-Daily__p-20230101__A","item":{"code":"PTT_G7_DENSE_LIP_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20230101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_IN_PERIOD__col-Daily__q-Daily__p-20240101__A","item":{"code":"PTT_G7_DENSE_LIP_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20240101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1,"source":"20240101"},"2.40.12":{"status":"VALUE","value":1,"source":"20240101"},"2.41.10":{"status":"VALUE","value":1,"source":"20240101"},"2.42.6":{"status":"VALUE","value":1,"source":"20240101"},"2.43.2":{"status":"VALUE","value":1,"source":"20240101"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_IN_PERIOD__col-Daily__q-FinancialApril__p-2022April__A","item":{"code":"PTT_G7_DENSE_LIP_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"FinancialApril","period":"2022April","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_IN_PERIOD__col-Daily__q-FinancialApril__p-2023April__A","item":{"code":"PTT_G7_DENSE_LIP_Daily","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["Daily"],"notes":"Layout dense."},"query":{"periodType":"FinancialApril","period":"2023April","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.40.13-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.42.7-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.43.3-SNAPSHOT":{"status":"VALUE","value":91,"source":"20240331"},"2.40.12":{"status":"VALUE","value":91,"source":"20240331"},"2.41.10":{"status":"VALUE","value":91,"source":"20240331"},"2.42.6":{"status":"VALUE","value":91,"source":"20240331"},"2.43.2":{"status":"VALUE","value":91,"source":"20240331"}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_IN_PERIOD__col-FinancialApril__q-Daily__p-20230101__A","item":{"code":"PTT_G7_DENSE_LIP_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"],"notes":"Layout dense."},"query":{"periodType":"Daily","period":"20230101","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"carry-dense-LAST_IN_PERIOD__col-FinancialApril__q-Yearly__p-2023__A","item":{"code":"PTT_G7_DENSE_LIP_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"LAST_IN_PERIOD","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"],"notes":"Layout dense."},"query":{"periodType":"Yearly","period":"2023","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"source":null},"2.40.12":{"status":"EMPTY","value":null,"source":null},"2.41.10":{"status":"EMPTY","value":null,"source":null},"2.42.6":{"status":"EMPTY","value":null,"source":null},"2.43.2":{"status":"EMPTY","value":null,"source":null}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}} + ] +} diff --git a/src/__fixtures__/period-types/detection-requests.json b/src/__fixtures__/period-types/detection-requests.json new file mode 100644 index 000000000..723f8ba27 --- /dev/null +++ b/src/__fixtures__/period-types/detection-requests.json @@ -0,0 +1,74 @@ +{ + "schemaVersion": 1, + "group": "detection-requests", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "smoke": "18 of 47 cases, one per pattern", + "cases": [ + {"id":"meta-aggregationTypes","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/schemas/dataElement.json?fields=properties[fieldName,constants]"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"VALUE","value":1},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"meta-categoryOptionCombos","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/categoryOptionCombos.json?filter=id:in:[HllvX50cXC0,l6y6maQF8He,eUlTvjHxjZF,MHtSLMctHku,eHq7UQzuwBc]&fields=id,categoryCombo[id]&paging=false&order=id:asc"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"VALUE","value":5},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"VALUE","value":5},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"meta-dataElements","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/dataElements.json?filter=code:$like:PTT_G3&filter=code:$like:PTT_DIS&rootJunction=OR&fields=id,code,name,aggregationType,valueType,domainType,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]&paging=false&order=code:asc"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":6},"2.40.13-SNAPSHOT":{"status":"VALUE","value":6},"2.41.11-SNAPSHOT":{"status":"VALUE","value":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":6},"2.40.12":{"status":"VALUE","value":6},"2.41.10":{"status":"VALUE","value":6},"2.42.6":{"status":"VALUE","value":6},"2.43.2":{"status":"VALUE","value":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"meta-dataElements-dataSets","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/dataElements.json?filter=code:$like:PTT_G3&fields=id,code,dataSets[id,periodType]&paging=false&order=code:asc"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.40.13-SNAPSHOT":{"status":"VALUE","value":4},"2.41.11-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.40.12":{"status":"VALUE","value":4},"2.41.10":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"meta-dataItems","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/dataItems.json?filter=name:ilike:PTT G4&fields=id,name,dimensionItemType,expression,aggregationType,valueType&paging=false&order=name:asc"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":23},"2.40.13-SNAPSHOT":{"status":"VALUE","value":23},"2.41.11-SNAPSHOT":{"status":"VALUE","value":23},"2.42.7-SNAPSHOT":{"status":"VALUE","value":23},"2.43.3-SNAPSHOT":{"status":"VALUE","value":23},"2.40.12":{"status":"VALUE","value":23},"2.41.10":{"status":"VALUE","value":23},"2.42.6":{"status":"VALUE","value":23},"2.43.2":{"status":"VALUE","value":23}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"meta-dataSets","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/dataSets.json?filter=code:$like:PTT_G5&fields=id,code,periodType,dataSetElements[dataElement[id]]&paging=false&order=code:asc"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"VALUE","value":5},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"VALUE","value":5},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"meta-expressionDimensionItems","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/expressionDimensionItems.json?filter=code:$like:PTT&fields=id,code,expression,missingValueStrategy&paging=false&order=code:asc"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":4},"2.40.13-SNAPSHOT":{"status":"VALUE","value":4},"2.41.11-SNAPSHOT":{"status":"VALUE","value":4},"2.42.7-SNAPSHOT":{"status":"VALUE","value":4},"2.43.3-SNAPSHOT":{"status":"VALUE","value":4},"2.40.12":{"status":"VALUE","value":4},"2.41.10":{"status":"VALUE","value":4},"2.42.6":{"status":"VALUE","value":4},"2.43.2":{"status":"VALUE","value":4}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"meta-indicators","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/indicators.json?filter=code:$like:PTT_G4&fields=id,code,name,numerator,denominator,annualized,indicatorType[id,factor]&paging=false&order=code:asc"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":14},"2.40.13-SNAPSHOT":{"status":"VALUE","value":14},"2.41.11-SNAPSHOT":{"status":"VALUE","value":14},"2.42.7-SNAPSHOT":{"status":"VALUE","value":14},"2.43.3-SNAPSHOT":{"status":"VALUE","value":14},"2.40.12":{"status":"VALUE","value":14},"2.41.10":{"status":"VALUE","value":14},"2.42.6":{"status":"VALUE","value":14},"2.43.2":{"status":"VALUE","value":14}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"meta-periodTypes","item":{"notes":"Metadata request; the response is in metadata-shapes.json."},"query":{"request":"/api/periodTypes.json?fields=name,isoFormat,isoDuration,frequencyOrder"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":24},"2.40.13-SNAPSHOT":{"status":"VALUE","value":19},"2.41.11-SNAPSHOT":{"status":"VALUE","value":19},"2.42.7-SNAPSHOT":{"status":"VALUE","value":20},"2.43.3-SNAPSHOT":{"status":"VALUE","value":24},"2.40.12":{"status":"VALUE","value":19},"2.41.10":{"status":"VALUE","value":19},"2.42.6":{"status":"VALUE","value":20},"2.43.2":{"status":"VALUE","value":24}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"raw-history__r-2024__A","item":{"code":"PTT_G3_HISTORY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Weekly"],"notes":"Monthly in 2024, weekly in 2025; only the weekly data set is left."},"query":{"request":"rawData","startDate":"2024-01-01","endDate":"2024-12-31","orgUnit":"A"},"expected":{"status":"VALUE","value":null,"periodTypes":["Monthly"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.40.12":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.41.10":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.42.6":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.43.2":{"status":"VALUE","value":3,"periodTypes":["Monthly"]}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"raw-mw__r-2024__A","item":{"code":"PTT_G3_MW","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Weekly","WeeklyWednesday"],"notes":"In a Monday and a Wednesday weekly data set, both used at A and B."},"query":{"request":"rawData","startDate":"2024-01-01","endDate":"2024-12-31","orgUnit":"A"},"expected":{"status":"EMPTY","value":null,"periodTypes":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.40.12":{"status":"EMPTY","value":0,"periodTypes":[]},"2.41.10":{"status":"EMPTY","value":0,"periodTypes":[]},"2.42.6":{"status":"EMPTY","value":0,"periodTypes":[]},"2.43.2":{"status":"EMPTY","value":0,"periodTypes":[]}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"raw-mw__r-2025__A","item":{"code":"PTT_G3_MW","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Weekly","WeeklyWednesday"],"notes":"In a Monday and a Wednesday weekly data set, both used at A and B."},"query":{"request":"rawData","startDate":"2025-01-01","endDate":"2025-12-31","orgUnit":"A"},"expected":{"status":"VALUE","value":null,"periodTypes":["Weekly","WeeklyWednesday"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":24,"periodTypes":["Weekly","WeeklyWednesday"]},"2.40.13-SNAPSHOT":{"status":"VALUE","value":24,"periodTypes":["Weekly","WeeklyWednesday"]},"2.41.11-SNAPSHOT":{"status":"VALUE","value":24,"periodTypes":["Weekly","WeeklyWednesday"]},"2.42.7-SNAPSHOT":{"status":"VALUE","value":24,"periodTypes":["Weekly","WeeklyWednesday"]},"2.43.3-SNAPSHOT":{"status":"VALUE","value":24,"periodTypes":["Weekly","WeeklyWednesday"]},"2.40.12":{"status":"VALUE","value":24,"periodTypes":["Weekly","WeeklyWednesday"]},"2.41.10":{"status":"VALUE","value":24,"periodTypes":["Weekly","WeeklyWednesday"]},"2.42.6":{"status":"VALUE","value":24,"periodTypes":["Weekly","WeeklyWednesday"]},"2.43.2":{"status":"VALUE","value":24,"periodTypes":["Weekly","WeeklyWednesday"]}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"raw-orphan__r-2024__A","item":{"code":"PTT_G3_ORPHAN","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":[],"notes":"Monthly values, then removed from its only data set."},"query":{"request":"rawData","startDate":"2024-01-01","endDate":"2024-12-31","orgUnit":"A"},"expected":{"status":"EMPTY","value":null,"periodTypes":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.40.12":{"status":"EMPTY","value":0,"periodTypes":[]},"2.41.10":{"status":"EMPTY","value":0,"periodTypes":[]},"2.42.6":{"status":"EMPTY","value":0,"periodTypes":[]},"2.43.2":{"status":"EMPTY","value":0,"periodTypes":[]}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"raw-orphan__r-2025__A","item":{"code":"PTT_G3_ORPHAN","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":[],"notes":"Monthly values, then removed from its only data set."},"query":{"request":"rawData","startDate":"2025-01-01","endDate":"2025-12-31","orgUnit":"A"},"expected":{"status":"VALUE","value":null,"periodTypes":["Monthly"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.40.12":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.41.10":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.42.6":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.43.2":{"status":"VALUE","value":3,"periodTypes":["Monthly"]}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"raw-place__r-2024__A","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B."},"query":{"request":"rawData","startDate":"2024-01-01","endDate":"2024-12-31","orgUnit":"A"},"expected":{"status":"EMPTY","value":null,"periodTypes":[]},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":0,"periodTypes":[]},"2.40.12":{"status":"EMPTY","value":0,"periodTypes":[]},"2.41.10":{"status":"EMPTY","value":0,"periodTypes":[]},"2.42.6":{"status":"EMPTY","value":0,"periodTypes":[]},"2.43.2":{"status":"EMPTY","value":0,"periodTypes":[]}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"raw-place__r-2025__A","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B."},"query":{"request":"rawData","startDate":"2025-01-01","endDate":"2025-12-31","orgUnit":"A"},"expected":{"status":"VALUE","value":null,"periodTypes":["Monthly"]},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.40.12":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.41.10":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.42.6":{"status":"VALUE","value":3,"periodTypes":["Monthly"]},"2.43.2":{"status":"VALUE","value":3,"periodTypes":["Monthly"]}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"raw-range-inside-only","item":{"code":"PTT_G1_SUM_Weekly","notes":"And PTT_G1_SUM_Monthly."},"query":{"request":"rawData","startDate":"2025-04-15","endDate":"2025-05-15","orgUnit":"A"},"expected":{"status":null,"value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Weekly"],"periods":["2025W17","2025W18","2025W19"]},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Weekly"],"periods":["2025W17","2025W18","2025W19"]},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Weekly"],"periods":["2025W17","2025W18","2025W19"]},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Weekly"],"periods":["2025W17","2025W18","2025W19"]},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"periodTypes":["Weekly"],"periods":["2025W17","2025W18","2025W19"]},"2.40.12":{"status":"VALUE","value":3,"periodTypes":["Weekly"],"periods":["2025W17","2025W18","2025W19"]},"2.41.10":{"status":"VALUE","value":3,"periodTypes":["Weekly"],"periods":["2025W17","2025W18","2025W19"]},"2.42.6":{"status":"VALUE","value":3,"periodTypes":["Weekly"],"periods":["2025W17","2025W18","2025W19"]},"2.43.2":{"status":"VALUE","value":3,"periodTypes":["Weekly"],"periods":["2025W17","2025W18","2025W19"]}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"raw-row-limit","item":{"notes":"G1 elements but NONE, collected Daily, Weekly, WeeklyWednesday, WeeklyThursday, WeeklyFriday, WeeklySaturday, WeeklySunday, BiWeekly, Monthly: 51408 values."},"query":{"request":"rawData","startDate":"2024-01-01","endDate":"2025-12-31","orgUnit":"A;B"},"expected":{"status":"VALUE","value":51408},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":51408,"periodTypes":["BiWeekly","Daily","Monthly","Weekly","WeeklyFriday","WeeklySaturday","WeeklySunday","WeeklyThursday","WeeklyWednesday"]},"2.40.13-SNAPSHOT":{"status":"VALUE","value":47700,"periodTypes":["BiWeekly","Daily","Monthly","Weekly","WeeklySaturday","WeeklySunday","WeeklyThursday","WeeklyWednesday"]},"2.41.11-SNAPSHOT":{"status":"VALUE","value":47700,"periodTypes":["BiWeekly","Daily","Monthly","Weekly","WeeklySaturday","WeeklySunday","WeeklyThursday","WeeklyWednesday"]},"2.42.7-SNAPSHOT":{"status":"VALUE","value":47700,"periodTypes":["BiWeekly","Daily","Monthly","Weekly","WeeklySaturday","WeeklySunday","WeeklyThursday","WeeklyWednesday"]},"2.43.3-SNAPSHOT":{"status":"VALUE","value":51408,"periodTypes":["BiWeekly","Daily","Monthly","Weekly","WeeklyFriday","WeeklySaturday","WeeklySunday","WeeklyThursday","WeeklyWednesday"]},"2.40.12":{"status":"VALUE","value":47700,"periodTypes":["BiWeekly","Daily","Monthly","Weekly","WeeklySaturday","WeeklySunday","WeeklyThursday","WeeklyWednesday"]},"2.41.10":{"status":"VALUE","value":47700,"periodTypes":["BiWeekly","Daily","Monthly","Weekly","WeeklySaturday","WeeklySunday","WeeklyThursday","WeeklyWednesday"]},"2.42.6":{"status":"VALUE","value":47700,"periodTypes":["BiWeekly","Daily","Monthly","Weekly","WeeklySaturday","WeeklySunday","WeeklyThursday","WeeklyWednesday"]},"2.43.2":{"status":"VALUE","value":51408,"periodTypes":["BiWeekly","Daily","Monthly","Weekly","WeeklyFriday","WeeklySaturday","WeeklySunday","WeeklyThursday","WeeklyWednesday"]}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/period-types/disaggregation.json b/src/__fixtures__/period-types/disaggregation.json new file mode 100644 index 000000000..2f74f3c0a --- /dev/null +++ b/src/__fixtures__/period-types/disaggregation.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "group": "disaggregation", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "smoke": "17 of 36 cases, one per pattern", + "cases": [ + {"id":"dis-both-female__q-Monthly__r-2025Q2__A","item":{"code":"PTT_DIS_BOTH.FEMALE","id":"wrXAErJOkRS.l6y6maQF8He","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation both monthly, sex","periodType":"Monthly","orgUnits":["A","B"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation both quarterly, age","periodType":"Quarterly","orgUnits":["A","B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"female","id":"l6y6maQF8He","categoryCombo":"A"}},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.40.12":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.41.10":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.42.6":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.43.2":{"status":"VALUE","value":3,"coarse":3,"rows":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-both-female__q-Quarterly__r-2025Q2__A","item":{"code":"PTT_DIS_BOTH.FEMALE","id":"wrXAErJOkRS.l6y6maQF8He","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation both monthly, sex","periodType":"Monthly","orgUnits":["A","B"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation both quarterly, age","periodType":"Quarterly","orgUnits":["A","B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"female","id":"l6y6maQF8He","categoryCombo":"A"}},"query":{"periodType":"Quarterly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.40.12":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.41.10":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.42.6":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.43.2":{"status":"VALUE","value":3,"coarse":3,"rows":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-both-under5__q-Monthly__r-2025Q2__A","item":{"code":"PTT_DIS_BOTH.UNDER5","id":"wrXAErJOkRS.MHtSLMctHku","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation both monthly, sex","periodType":"Monthly","orgUnits":["A","B"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation both quarterly, age","periodType":"Quarterly","orgUnits":["A","B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"under5","id":"MHtSLMctHku","categoryCombo":"B"}},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":100},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":100},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":100},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":100},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":100},"2.40.12":{"status":"EMPTY","value":null,"coarse":100},"2.41.10":{"status":"EMPTY","value":null,"coarse":100},"2.42.6":{"status":"EMPTY","value":null,"coarse":100},"2.43.2":{"status":"EMPTY","value":null,"coarse":100}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-both-under5__q-Quarterly__r-2025Q2__A","item":{"code":"PTT_DIS_BOTH.UNDER5","id":"wrXAErJOkRS.MHtSLMctHku","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation both monthly, sex","periodType":"Monthly","orgUnits":["A","B"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation both quarterly, age","periodType":"Quarterly","orgUnits":["A","B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"under5","id":"MHtSLMctHku","categoryCombo":"B"}},"query":{"periodType":"Quarterly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":100},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":100,"coarse":100,"rows":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":100,"coarse":100,"rows":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":100,"coarse":100,"rows":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":100,"coarse":100,"rows":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":100,"coarse":100,"rows":1},"2.40.12":{"status":"VALUE","value":100,"coarse":100,"rows":1},"2.41.10":{"status":"VALUE","value":100,"coarse":100,"rows":1},"2.42.6":{"status":"VALUE","value":100,"coarse":100,"rows":1},"2.43.2":{"status":"VALUE","value":100,"coarse":100,"rows":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-both-whole__q-Monthly__r-2025Q2__A","item":{"code":"PTT_DIS_BOTH","id":"wrXAErJOkRS","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation both monthly, sex","periodType":"Monthly","orgUnits":["A","B"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation both quarterly, age","periodType":"Quarterly","orgUnits":["A","B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}]},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"PARTIAL","value":9},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":9,"coarse":309,"rows":3},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":9,"coarse":309,"rows":3},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":9,"coarse":309,"rows":3},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":9,"coarse":309,"rows":3},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":9,"coarse":309,"rows":3},"2.40.12":{"status":"PARTIAL","value":9,"coarse":309,"rows":3},"2.41.10":{"status":"PARTIAL","value":9,"coarse":309,"rows":3},"2.42.6":{"status":"PARTIAL","value":9,"coarse":309,"rows":3},"2.43.2":{"status":"PARTIAL","value":9,"coarse":309,"rows":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-both-whole__q-Quarterly__r-2025Q2__A","item":{"code":"PTT_DIS_BOTH","id":"wrXAErJOkRS","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation both monthly, sex","periodType":"Monthly","orgUnits":["A","B"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation both quarterly, age","periodType":"Quarterly","orgUnits":["A","B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}]},"query":{"periodType":"Quarterly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":309},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":309,"coarse":309,"rows":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":309,"coarse":309,"rows":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":309,"coarse":309,"rows":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":309,"coarse":309,"rows":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":309,"coarse":309,"rows":1},"2.40.12":{"status":"VALUE","value":309,"coarse":309,"rows":1},"2.41.10":{"status":"VALUE","value":309,"coarse":309,"rows":1},"2.42.6":{"status":"VALUE","value":309,"coarse":309,"rows":1},"2.43.2":{"status":"VALUE","value":309,"coarse":309,"rows":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-female__q-Monthly__r-2025Q2__A","item":{"code":"PTT_DIS_PLACE.FEMALE","id":"T4Gk4A7PTRJ.l6y6maQF8He","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"female","id":"l6y6maQF8He","categoryCombo":"A"}},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.40.12":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.41.10":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.42.6":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.43.2":{"status":"VALUE","value":3,"coarse":3,"rows":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-female__q-Monthly__r-2025Q2__B","item":{"code":"PTT_DIS_PLACE.FEMALE","id":"T4Gk4A7PTRJ.l6y6maQF8He","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"female","id":"l6y6maQF8He","categoryCombo":"A"}},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"B","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.40.12":{"status":"EMPTY","value":null,"coarse":null},"2.41.10":{"status":"EMPTY","value":null,"coarse":null},"2.42.6":{"status":"EMPTY","value":null,"coarse":null},"2.43.2":{"status":"EMPTY","value":null,"coarse":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-female__q-Quarterly__r-2025Q2__A","item":{"code":"PTT_DIS_PLACE.FEMALE","id":"T4Gk4A7PTRJ.l6y6maQF8He","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"female","id":"l6y6maQF8He","categoryCombo":"A"}},"query":{"periodType":"Quarterly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.40.12":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.41.10":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.42.6":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.43.2":{"status":"VALUE","value":3,"coarse":3,"rows":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-female__q-Quarterly__r-2025Q2__B","item":{"code":"PTT_DIS_PLACE.FEMALE","id":"T4Gk4A7PTRJ.l6y6maQF8He","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"female","id":"l6y6maQF8He","categoryCombo":"A"}},"query":{"periodType":"Quarterly","period":"2025Q2","orgUnit":"B","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.40.12":{"status":"EMPTY","value":null,"coarse":null},"2.41.10":{"status":"EMPTY","value":null,"coarse":null},"2.42.6":{"status":"EMPTY","value":null,"coarse":null},"2.43.2":{"status":"EMPTY","value":null,"coarse":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-under5__q-Monthly__r-2025Q2__A","item":{"code":"PTT_DIS_PLACE.UNDER5","id":"T4Gk4A7PTRJ.MHtSLMctHku","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"under5","id":"MHtSLMctHku","categoryCombo":"B"}},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.40.12":{"status":"EMPTY","value":null,"coarse":null},"2.41.10":{"status":"EMPTY","value":null,"coarse":null},"2.42.6":{"status":"EMPTY","value":null,"coarse":null},"2.43.2":{"status":"EMPTY","value":null,"coarse":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-under5__q-Quarterly__r-2025Q2__A","item":{"code":"PTT_DIS_PLACE.UNDER5","id":"T4Gk4A7PTRJ.MHtSLMctHku","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"under5","id":"MHtSLMctHku","categoryCombo":"B"}},"query":{"periodType":"Quarterly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":null},"2.40.12":{"status":"EMPTY","value":null,"coarse":null},"2.41.10":{"status":"EMPTY","value":null,"coarse":null},"2.42.6":{"status":"EMPTY","value":null,"coarse":null},"2.43.2":{"status":"EMPTY","value":null,"coarse":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-under5__q-Quarterly__r-2025Q2__B","item":{"code":"PTT_DIS_PLACE.UNDER5","id":"T4Gk4A7PTRJ.MHtSLMctHku","dimensionItemType":"DATA_ELEMENT_OPERAND","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}],"categoryOptionCombo":{"key":"under5","id":"MHtSLMctHku","categoryCombo":"B"}},"query":{"periodType":"Quarterly","period":"2025Q2","orgUnit":"B","coarser":"Quarterly"},"expected":{"status":"VALUE","value":1000},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1000,"coarse":1000,"rows":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1000,"coarse":1000,"rows":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1000,"coarse":1000,"rows":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1000,"coarse":1000,"rows":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1000,"coarse":1000,"rows":1},"2.40.12":{"status":"VALUE","value":1000,"coarse":1000,"rows":1},"2.41.10":{"status":"VALUE","value":1000,"coarse":1000,"rows":1},"2.42.6":{"status":"VALUE","value":1000,"coarse":1000,"rows":1},"2.43.2":{"status":"VALUE","value":1000,"coarse":1000,"rows":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-whole__q-Monthly__r-2025Q2__A","item":{"code":"PTT_DIS_PLACE","id":"T4Gk4A7PTRJ","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}]},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":9},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":9,"coarse":9,"rows":3},"2.40.13-SNAPSHOT":{"status":"VALUE","value":9,"coarse":9,"rows":3},"2.41.11-SNAPSHOT":{"status":"VALUE","value":9,"coarse":9,"rows":3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":9,"coarse":9,"rows":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":9,"coarse":9,"rows":3},"2.40.12":{"status":"VALUE","value":9,"coarse":9,"rows":3},"2.41.10":{"status":"VALUE","value":9,"coarse":9,"rows":3},"2.42.6":{"status":"VALUE","value":9,"coarse":9,"rows":3},"2.43.2":{"status":"VALUE","value":9,"coarse":9,"rows":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-whole__q-Monthly__r-2025Q2__B","item":{"code":"PTT_DIS_PLACE","id":"T4Gk4A7PTRJ","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}]},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"B","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3000},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3000},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3000},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3000},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3000},"2.40.12":{"status":"EMPTY","value":null,"coarse":3000},"2.41.10":{"status":"EMPTY","value":null,"coarse":3000},"2.42.6":{"status":"EMPTY","value":null,"coarse":3000},"2.43.2":{"status":"EMPTY","value":null,"coarse":3000}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-whole__q-Monthly__r-2025Q2__region","item":{"code":"PTT_DIS_PLACE","id":"T4Gk4A7PTRJ","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}]},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"region","coarser":"Quarterly"},"expected":{"status":"PARTIAL","value":9},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":9,"coarse":3009,"rows":3},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":9,"coarse":3009,"rows":3},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":9,"coarse":3009,"rows":3},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":9,"coarse":3009,"rows":3},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":9,"coarse":3009,"rows":3},"2.40.12":{"status":"PARTIAL","value":9,"coarse":3009,"rows":3},"2.41.10":{"status":"PARTIAL","value":9,"coarse":3009,"rows":3},"2.42.6":{"status":"PARTIAL","value":9,"coarse":3009,"rows":3},"2.43.2":{"status":"PARTIAL","value":9,"coarse":3009,"rows":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"dis-place-whole__q-Quarterly__r-2025Q2__A","item":{"code":"PTT_DIS_PLACE","id":"T4Gk4A7PTRJ","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Quarterly"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"},"collectionSources":[{"dataSet":"PTT disaggregation place monthly, sex","periodType":"Monthly","orgUnits":["A"],"categoryCombo":{"key":"A","id":"EyESnzDvcwh"}},{"dataSet":"PTT disaggregation place quarterly, age","periodType":"Quarterly","orgUnits":["B"],"categoryCombo":{"key":"B","id":"GFe8Z3ErDol"}}]},"query":{"periodType":"Quarterly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":9},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":9,"coarse":9,"rows":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":9,"coarse":9,"rows":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":9,"coarse":9,"rows":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":9,"coarse":9,"rows":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":9,"coarse":9,"rows":1},"2.40.12":{"status":"VALUE","value":9,"coarse":9,"rows":1},"2.41.10":{"status":"VALUE","value":9,"coarse":9,"rows":1},"2.42.6":{"status":"VALUE","value":9,"coarse":9,"rows":1},"2.43.2":{"status":"VALUE","value":9,"coarse":9,"rows":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/period-types/indicators-and-expressions.json b/src/__fixtures__/period-types/indicators-and-expressions.json new file mode 100644 index 000000000..fbaca5af9 --- /dev/null +++ b/src/__fixtures__/period-types/indicators-and-expressions.json @@ -0,0 +1,175 @@ +{ + "schemaVersion": 1, + "group": "indicators-and-expressions", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "smoke": "119 of 2484 cases, one per pattern and 13 the library's tests name", + "cases": [ + {"id":"ind-constant__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_CONSTANT","dimensionItemType":"INDICATOR","numerator":"C{Wi6GdGCugf3}","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"VALUE","value":5},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"VALUE","value":5},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-constant__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_CONSTANT","dimensionItemType":"INDICATOR","numerator":"C{Wi6GdGCugf3}","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-constant__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_CONSTANT","dimensionItemType":"INDICATOR","numerator":"C{Wi6GdGCugf3}","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-constant__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_CONSTANT","dimensionItemType":"INDICATOR","numerator":"C{Wi6GdGCugf3}","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":5},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":5},"2.42.7-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":5},"2.42.6":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-coverage-averaged__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":0.20454545454545456},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0.2045454545},"2.40.13-SNAPSHOT":{"status":"VALUE","value":0.2045454545},"2.41.11-SNAPSHOT":{"status":"VALUE","value":0.2045454545},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0.2045454545},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0.2045454545},"2.40.12":{"status":"VALUE","value":0.2045454545},"2.41.10":{"status":"VALUE","value":0.2045454545},"2.42.6":{"status":"VALUE","value":0.2045454545},"2.43.2":{"status":"VALUE","value":0.2045454545}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-coverage-averaged__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-coverage-averaged__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0.2326958106},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0.2326958106},"2.43.2":{"status":"VALUE","value":0.2326958106}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"ind-coverage-averaged__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0.2991803279},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0.3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0.2991803279},"2.42.6":{"status":"VALUE","value":0.3},"2.43.2":{"status":"VALUE","value":0.2991803279}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-coverage-averaged__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0.3},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":0.3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0.3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0.3},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":0.3},"2.42.6":{"status":"VALUE","value":0.3},"2.43.2":{"status":"VALUE","value":0.3}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-coverage-averaged__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-coverage-averaged-annualized__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":true,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1.2654083205},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1.2654083205},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1.2654083205},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1.2654083205},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1.2654083205},"2.40.12":{"status":"VALUE","value":1.2654083205},"2.41.10":{"status":"VALUE","value":1.2654083205},"2.42.6":{"status":"VALUE","value":1.2654083205},"2.43.2":{"status":"VALUE","value":1.2654083205}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-coverage-averaged-annualized__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":true,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-coverage-averaged-annualized__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":true,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0.2320600297},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0.2320600297},"2.43.2":{"status":"VALUE","value":0.2320600297}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"ind-coverage-averaged-annualized__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":true,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0.2983628953},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0.2991803279},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0.2983628953},"2.42.6":{"status":"VALUE","value":0.2991803279},"2.43.2":{"status":"VALUE","value":0.2983628953}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-coverage-averaged-annualized__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":true,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1.1902173913},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1.1902173913},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1.1902173913},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1.1902173913},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":1.1902173913},"2.42.6":{"status":"VALUE","value":1.1902173913},"2.43.2":{"status":"VALUE","value":1.1902173913}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-coverage-averaged-annualized__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{UB785RAqE9h}","annualized":true,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"UB785RAqE9h","ref":"popAvg","dimensionItemType":"DATA_ELEMENT","aggregationType":"AVERAGE_SUM_ORG_UNIT","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-coverage-summed__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_COVERAGE_SUMMED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{nxyiifFYsbc}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-coverage-summed__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_COVERAGE_SUMMED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{nxyiifFYsbc}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-coverage-summed__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_COVERAGE_SUMMED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{nxyiifFYsbc}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-coverage-summed__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_COVERAGE_SUMMED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{nxyiifFYsbc}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-coverage-summed__q-Yearly__p-2024__A","item":{"code":"PTT_G4_IND_COVERAGE_SUMMED","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"#{nxyiifFYsbc}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"VALUE","value":0.65},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":0.65},"2.40.13-SNAPSHOT":{"status":"VALUE","value":0.65},"2.41.11-SNAPSHOT":{"status":"VALUE","value":0.65},"2.42.7-SNAPSHOT":{"status":"VALUE","value":0.65},"2.43.3-SNAPSHOT":{"status":"VALUE","value":0.65},"2.40.12":{"status":"VALUE","value":0.65},"2.41.10":{"status":"VALUE","value":0.65},"2.42.6":{"status":"VALUE","value":0.65},"2.43.2":{"status":"VALUE","value":0.65}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-days__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_DAYS","dimensionItemType":"INDICATOR","numerator":"[days]","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":59},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":59},"2.40.13-SNAPSHOT":{"status":"VALUE","value":59},"2.41.11-SNAPSHOT":{"status":"VALUE","value":59},"2.42.7-SNAPSHOT":{"status":"VALUE","value":59},"2.43.3-SNAPSHOT":{"status":"VALUE","value":59},"2.40.12":{"status":"VALUE","value":59},"2.41.10":{"status":"VALUE","value":59},"2.42.6":{"status":"VALUE","value":59},"2.43.2":{"status":"VALUE","value":59}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-days__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_DAYS","dimensionItemType":"INDICATOR","numerator":"[days]","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":366},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":366},"2.43.3-SNAPSHOT":{"status":"VALUE","value":366},"2.43.2":{"status":"VALUE","value":366}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-days__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_DAYS","dimensionItemType":"INDICATOR","numerator":"[days]","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":366},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":366},"2.42.7-SNAPSHOT":{"status":"VALUE","value":366},"2.43.3-SNAPSHOT":{"status":"VALUE","value":366},"2.42.6":{"status":"VALUE","value":366},"2.43.2":{"status":"VALUE","value":366}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-days__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_DAYS","dimensionItemType":"INDICATOR","numerator":"[days]","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":92},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":92},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":92},"2.42.7-SNAPSHOT":{"status":"VALUE","value":92},"2.43.3-SNAPSHOT":{"status":"VALUE","value":92},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":92},"2.42.6":{"status":"VALUE","value":92},"2.43.2":{"status":"VALUE","value":92}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-de__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_DE","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":27},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":27},"2.40.13-SNAPSHOT":{"status":"VALUE","value":27},"2.41.11-SNAPSHOT":{"status":"VALUE","value":27},"2.42.7-SNAPSHOT":{"status":"VALUE","value":27},"2.43.3-SNAPSHOT":{"status":"VALUE","value":27},"2.40.12":{"status":"VALUE","value":27},"2.41.10":{"status":"VALUE","value":27},"2.42.6":{"status":"VALUE","value":27},"2.43.2":{"status":"VALUE","value":27}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-de__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_IND_DE","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-de__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_DE","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":28},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":28},"2.43.3-SNAPSHOT":{"status":"VALUE","value":28},"2.43.2":{"status":"VALUE","value":28}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-de__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_DE","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":36},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":36},"2.42.7-SNAPSHOT":{"status":"VALUE","value":36},"2.43.3-SNAPSHOT":{"status":"VALUE","value":36},"2.42.6":{"status":"VALUE","value":36},"2.43.2":{"status":"VALUE","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-de__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_DE","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":36},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":36},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":36},"2.42.7-SNAPSHOT":{"status":"VALUE","value":36},"2.43.3-SNAPSHOT":{"status":"VALUE","value":36},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":36},"2.42.6":{"status":"VALUE","value":36},"2.43.2":{"status":"VALUE","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-de__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_IND_DE","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-de-coc__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_DE_COC","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF.HllvX50cXC0}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":27},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":27},"2.40.13-SNAPSHOT":{"status":"VALUE","value":27},"2.41.11-SNAPSHOT":{"status":"VALUE","value":27},"2.42.7-SNAPSHOT":{"status":"VALUE","value":27},"2.43.3-SNAPSHOT":{"status":"VALUE","value":27},"2.40.12":{"status":"VALUE","value":27},"2.41.10":{"status":"VALUE","value":27},"2.42.6":{"status":"VALUE","value":27},"2.43.2":{"status":"VALUE","value":27}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-de-coc__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_IND_DE_COC","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF.HllvX50cXC0}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-de-coc__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_DE_COC","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF.HllvX50cXC0}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":28},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":28},"2.43.3-SNAPSHOT":{"status":"VALUE","value":28},"2.43.2":{"status":"VALUE","value":28}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-de-coc__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_DE_COC","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF.HllvX50cXC0}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":36},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":36},"2.42.7-SNAPSHOT":{"status":"VALUE","value":36},"2.43.3-SNAPSHOT":{"status":"VALUE","value":36},"2.42.6":{"status":"VALUE","value":36},"2.43.2":{"status":"VALUE","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-de-coc__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_DE_COC","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF.HllvX50cXC0}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":36},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":36},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":36},"2.42.7-SNAPSHOT":{"status":"VALUE","value":36},"2.43.3-SNAPSHOT":{"status":"VALUE","value":36},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":36},"2.42.6":{"status":"VALUE","value":36},"2.43.2":{"status":"VALUE","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-de-coc__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_IND_DE_COC","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF.HllvX50cXC0}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-expression__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_EXPRESSION","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}*2","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":54},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":54},"2.40.13-SNAPSHOT":{"status":"VALUE","value":54},"2.41.11-SNAPSHOT":{"status":"VALUE","value":54},"2.42.7-SNAPSHOT":{"status":"VALUE","value":54},"2.43.3-SNAPSHOT":{"status":"VALUE","value":54},"2.40.12":{"status":"VALUE","value":54},"2.41.10":{"status":"VALUE","value":54},"2.42.6":{"status":"VALUE","value":54},"2.43.2":{"status":"VALUE","value":54}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_EXPRESSION","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}*2","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_EXPRESSION","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}*2","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":56},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":56},"2.43.3-SNAPSHOT":{"status":"VALUE","value":56},"2.43.2":{"status":"VALUE","value":56}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-expression__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_EXPRESSION","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}*2","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":72},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":72},"2.42.7-SNAPSHOT":{"status":"VALUE","value":72},"2.43.3-SNAPSHOT":{"status":"VALUE","value":72},"2.42.6":{"status":"VALUE","value":72},"2.43.2":{"status":"VALUE","value":72}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_EXPRESSION","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}*2","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":72},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":72},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":72},"2.42.7-SNAPSHOT":{"status":"VALUE","value":72},"2.43.3-SNAPSHOT":{"status":"VALUE","value":72},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":72},"2.42.6":{"status":"VALUE","value":72},"2.43.2":{"status":"VALUE","value":72}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_EXPRESSION","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}*2","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-never-skip__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_EXPRESSION_NEVER_SKIP","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"NEVER_SKIP","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"PARTIAL","value":27},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":27},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":27},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":27},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":27},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":27},"2.40.12":{"status":"PARTIAL","value":27},"2.41.10":{"status":"PARTIAL","value":27},"2.42.6":{"status":"PARTIAL","value":27},"2.43.2":{"status":"PARTIAL","value":27}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-never-skip__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_EXPRESSION_NEVER_SKIP","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"NEVER_SKIP","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-never-skip__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_EXPRESSION_NEVER_SKIP","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"NEVER_SKIP","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"PARTIAL","value":28},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":28},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":28},"2.43.2":{"status":"PARTIAL","value":28}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-never-skip__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_EXPRESSION_NEVER_SKIP","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"NEVER_SKIP","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"PARTIAL","value":36},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":36},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.6":{"status":"PARTIAL","value":36},"2.43.2":{"status":"PARTIAL","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-never-skip__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_EXPRESSION_NEVER_SKIP","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"NEVER_SKIP","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"PARTIAL","value":36},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":36},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":36},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":36},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"PARTIAL","value":36},"2.42.6":{"status":"PARTIAL","value":36},"2.43.2":{"status":"PARTIAL","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-never-skip__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_EXPRESSION_NEVER_SKIP","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"NEVER_SKIP","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-never-skip__q-Yearly__p-2024__A","item":{"code":"PTT_G4_EXPRESSION_NEVER_SKIP","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"NEVER_SKIP","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"VALUE","value":198},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":198},"2.40.13-SNAPSHOT":{"status":"VALUE","value":198},"2.41.11-SNAPSHOT":{"status":"VALUE","value":198},"2.42.7-SNAPSHOT":{"status":"VALUE","value":198},"2.43.3-SNAPSHOT":{"status":"VALUE","value":198},"2.40.12":{"status":"VALUE","value":198},"2.41.10":{"status":"VALUE","value":198},"2.42.6":{"status":"VALUE","value":198},"2.43.2":{"status":"VALUE","value":198}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-all__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ALL","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ALL_VALUES_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"PARTIAL","value":27},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":27},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":27},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":27},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":27},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":27},"2.40.12":{"status":"PARTIAL","value":27},"2.41.10":{"status":"PARTIAL","value":27},"2.42.6":{"status":"PARTIAL","value":27},"2.43.2":{"status":"PARTIAL","value":27}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-all__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ALL","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ALL_VALUES_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-all__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ALL","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ALL_VALUES_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"PARTIAL","value":28},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":28},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":28},"2.43.2":{"status":"PARTIAL","value":28}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-all__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ALL","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ALL_VALUES_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"PARTIAL","value":36},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":36},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.6":{"status":"PARTIAL","value":36},"2.43.2":{"status":"PARTIAL","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-all__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ALL","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ALL_VALUES_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"PARTIAL","value":36},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":36},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":36},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":36},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"PARTIAL","value":36},"2.42.6":{"status":"PARTIAL","value":36},"2.43.2":{"status":"PARTIAL","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-all__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ALL","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ALL_VALUES_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-all__q-Yearly__p-2024__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ALL","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ALL_VALUES_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"VALUE","value":198},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":198},"2.40.13-SNAPSHOT":{"status":"VALUE","value":198},"2.41.11-SNAPSHOT":{"status":"VALUE","value":198},"2.42.7-SNAPSHOT":{"status":"VALUE","value":198},"2.43.3-SNAPSHOT":{"status":"VALUE","value":198},"2.40.12":{"status":"VALUE","value":198},"2.41.10":{"status":"VALUE","value":198},"2.42.6":{"status":"VALUE","value":198},"2.43.2":{"status":"VALUE","value":198}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-any__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ANY","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ANY_VALUE_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"PARTIAL","value":27},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":27},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":27},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":27},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":27},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":27},"2.40.12":{"status":"PARTIAL","value":27},"2.41.10":{"status":"PARTIAL","value":27},"2.42.6":{"status":"PARTIAL","value":27},"2.43.2":{"status":"PARTIAL","value":27}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-any__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ANY","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ANY_VALUE_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-any__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ANY","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ANY_VALUE_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"PARTIAL","value":28},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":28},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":28},"2.43.2":{"status":"PARTIAL","value":28}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-any__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ANY","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ANY_VALUE_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"PARTIAL","value":36},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":36},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.6":{"status":"PARTIAL","value":36},"2.43.2":{"status":"PARTIAL","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-any__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ANY","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ANY_VALUE_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"PARTIAL","value":36},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":36},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":36},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":36},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"PARTIAL","value":36},"2.42.6":{"status":"PARTIAL","value":36},"2.43.2":{"status":"PARTIAL","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-any__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ANY","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ANY_VALUE_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-expression-skip-if-any__q-Yearly__p-2024__A","item":{"code":"PTT_G4_EXPRESSION_SKIP_IF_ANY","dimensionItemType":"EXPRESSION_DIMENSION_ITEM","expression":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","missingValueStrategy":"SKIP_IF_ANY_VALUE_MISSING","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"VALUE","value":198},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":198},"2.40.13-SNAPSHOT":{"status":"VALUE","value":198},"2.41.11-SNAPSHOT":{"status":"VALUE","value":198},"2.42.7-SNAPSHOT":{"status":"VALUE","value":198},"2.43.3-SNAPSHOT":{"status":"VALUE","value":198},"2.40.12":{"status":"VALUE","value":198},"2.41.10":{"status":"VALUE","value":198},"2.42.6":{"status":"VALUE","value":198},"2.43.2":{"status":"VALUE","value":198}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-indicator__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_INDICATOR","dimensionItemType":"INDICATOR","numerator":"N{qxTEoP6Na0L}","denominator":"1","annualized":false,"operands":[{"id":"qxTEoP6Na0L","ref":"indicator-de","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":27},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":27},"2.40.13-SNAPSHOT":{"status":"VALUE","value":27},"2.41.11-SNAPSHOT":{"status":"VALUE","value":27},"2.42.7-SNAPSHOT":{"status":"VALUE","value":27},"2.43.3-SNAPSHOT":{"status":"VALUE","value":27},"2.40.12":{"status":"VALUE","value":27},"2.41.10":{"status":"VALUE","value":27},"2.42.6":{"status":"VALUE","value":27},"2.43.2":{"status":"VALUE","value":27}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-indicator__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_IND_INDICATOR","dimensionItemType":"INDICATOR","numerator":"N{qxTEoP6Na0L}","denominator":"1","annualized":false,"operands":[{"id":"qxTEoP6Na0L","ref":"indicator-de","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-indicator__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_INDICATOR","dimensionItemType":"INDICATOR","numerator":"N{qxTEoP6Na0L}","denominator":"1","annualized":false,"operands":[{"id":"qxTEoP6Na0L","ref":"indicator-de","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":28},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":28},"2.43.3-SNAPSHOT":{"status":"VALUE","value":28},"2.43.2":{"status":"VALUE","value":28}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-indicator__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_INDICATOR","dimensionItemType":"INDICATOR","numerator":"N{qxTEoP6Na0L}","denominator":"1","annualized":false,"operands":[{"id":"qxTEoP6Na0L","ref":"indicator-de","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":36},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":36},"2.42.7-SNAPSHOT":{"status":"VALUE","value":36},"2.43.3-SNAPSHOT":{"status":"VALUE","value":36},"2.42.6":{"status":"VALUE","value":36},"2.43.2":{"status":"VALUE","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-indicator__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_INDICATOR","dimensionItemType":"INDICATOR","numerator":"N{qxTEoP6Na0L}","denominator":"1","annualized":false,"operands":[{"id":"qxTEoP6Na0L","ref":"indicator-de","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":36},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":36},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":36},"2.42.7-SNAPSHOT":{"status":"VALUE","value":36},"2.43.3-SNAPSHOT":{"status":"VALUE","value":36},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":36},"2.42.6":{"status":"VALUE","value":36},"2.43.2":{"status":"VALUE","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-indicator__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_IND_INDICATOR","dimensionItemType":"INDICATOR","numerator":"N{qxTEoP6Na0L}","denominator":"1","annualized":false,"operands":[{"id":"qxTEoP6Na0L","ref":"indicator-de","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}","denominator":"1","operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-org-unit-group__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_ORG_UNIT_GROUP","dimensionItemType":"INDICATOR","numerator":"OUG{PSXFPFGOyIb}","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"VALUE","value":1},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-org-unit-group__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_ORG_UNIT_GROUP","dimensionItemType":"INDICATOR","numerator":"OUG{PSXFPFGOyIb}","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"ind-org-unit-group__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_ORG_UNIT_GROUP","dimensionItemType":"INDICATOR","numerator":"OUG{PSXFPFGOyIb}","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-org-unit-group__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_ORG_UNIT_GROUP","dimensionItemType":"INDICATOR","numerator":"OUG{PSXFPFGOyIb}","denominator":"1","annualized":false,"operands":[]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-period-offset__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":23},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":23},"2.40.13-SNAPSHOT":{"status":"VALUE","value":23},"2.41.11-SNAPSHOT":{"status":"VALUE","value":23},"2.42.7-SNAPSHOT":{"status":"VALUE","value":23},"2.43.3-SNAPSHOT":{"status":"VALUE","value":23},"2.40.12":{"status":"VALUE","value":23},"2.41.10":{"status":"VALUE","value":23},"2.42.6":{"status":"VALUE","value":23},"2.43.2":{"status":"VALUE","value":23}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialAug__p-2023Aug__B","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"B"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialAug__p-2023Aug__region","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"region"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialAug__p-2024Aug__A","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialAug","period":"2024Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":28},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":28},"2.43.3-SNAPSHOT":{"status":"VALUE","value":28},"2.43.2":{"status":"VALUE","value":28}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialNov__p-2024Nov__A","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialNov","period":"2024Nov","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialNov__p-2024Nov__B","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialNov","period":"2024Nov","orgUnit":"B"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialNov__p-2024Nov__region","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialNov","period":"2024Nov","orgUnit":"region"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialOct__p-2023Oct__A","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialOct","period":"2023Oct","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialOct__p-2023Oct__B","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialOct","period":"2023Oct","orgUnit":"B"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialOct__p-2023Oct__region","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialOct","period":"2023Oct","orgUnit":"region"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialSep__p-2023Sep__B","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"B"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialSep__p-2023Sep__region","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"region"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-FinancialSep__p-2024Sep__A","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialSep","period":"2024Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":36},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":36},"2.42.7-SNAPSHOT":{"status":"VALUE","value":36},"2.43.3-SNAPSHOT":{"status":"VALUE","value":36},"2.42.6":{"status":"VALUE","value":36},"2.43.2":{"status":"VALUE","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":27},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":27},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":27},"2.42.7-SNAPSHOT":{"status":"VALUE","value":27},"2.43.3-SNAPSHOT":{"status":"VALUE","value":27},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":27},"2.42.6":{"status":"VALUE","value":27},"2.43.2":{"status":"VALUE","value":27}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-Yearly__p-2024__A","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-Yearly__p-2024__B","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"B"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-period-offset__q-Yearly__p-2024__region","item":{"code":"PTT_G4_IND_PERIOD_OFFSET","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}.periodOffset(-1)","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"region"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-reporting-rate__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_REPORTING_RATE","dimensionItemType":"INDICATOR","numerator":"R{FUvJSlEH9B3.REPORTING_RATE}","denominator":"1","annualized":false,"operands":[{"id":"FUvJSlEH9B3","ref":"rate","dimensionItemType":"REPORTING_RATE","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":100},"2.40.13-SNAPSHOT":{"status":"VALUE","value":100},"2.41.11-SNAPSHOT":{"status":"VALUE","value":100},"2.42.7-SNAPSHOT":{"status":"VALUE","value":100},"2.43.3-SNAPSHOT":{"status":"VALUE","value":100},"2.40.12":{"status":"VALUE","value":100},"2.41.10":{"status":"VALUE","value":100},"2.42.6":{"status":"VALUE","value":100},"2.43.2":{"status":"VALUE","value":100}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-reporting-rate__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_IND_REPORTING_RATE","dimensionItemType":"INDICATOR","numerator":"R{FUvJSlEH9B3.REPORTING_RATE}","denominator":"1","annualized":false,"operands":[{"id":"FUvJSlEH9B3","ref":"rate","dimensionItemType":"REPORTING_RATE","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":0},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"REPEATED","value":0},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-reporting-rate__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_REPORTING_RATE","dimensionItemType":"INDICATOR","numerator":"R{FUvJSlEH9B3.REPORTING_RATE}","denominator":"1","annualized":false,"operands":[{"id":"FUvJSlEH9B3","ref":"rate","dimensionItemType":"REPORTING_RATE","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":58.3333333333},"2.43.3-SNAPSHOT":{"status":"VALUE","value":58.3333333333},"2.43.2":{"status":"VALUE","value":58.3333333333}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"ind-reporting-rate__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_REPORTING_RATE","dimensionItemType":"INDICATOR","numerator":"R{FUvJSlEH9B3.REPORTING_RATE}","denominator":"1","annualized":false,"operands":[{"id":"FUvJSlEH9B3","ref":"rate","dimensionItemType":"REPORTING_RATE","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":66.6666666667},"2.42.7-SNAPSHOT":{"status":"VALUE","value":66.6666666667},"2.43.3-SNAPSHOT":{"status":"VALUE","value":66.6666666667},"2.42.6":{"status":"VALUE","value":66.6666666667},"2.43.2":{"status":"VALUE","value":66.6666666667}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-reporting-rate__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_REPORTING_RATE","dimensionItemType":"INDICATOR","numerator":"R{FUvJSlEH9B3.REPORTING_RATE}","denominator":"1","annualized":false,"operands":[{"id":"FUvJSlEH9B3","ref":"rate","dimensionItemType":"REPORTING_RATE","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":100},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":100},"2.42.7-SNAPSHOT":{"status":"VALUE","value":100},"2.43.3-SNAPSHOT":{"status":"VALUE","value":100},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":100},"2.42.6":{"status":"VALUE","value":100},"2.43.2":{"status":"VALUE","value":100}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-reporting-rate__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_IND_REPORTING_RATE","dimensionItemType":"INDICATOR","numerator":"R{FUvJSlEH9B3.REPORTING_RATE}","denominator":"1","annualized":false,"operands":[{"id":"FUvJSlEH9B3","ref":"rate","dimensionItemType":"REPORTING_RATE","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":null},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"ind-sum-missing__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_SUM_MISSING","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"PARTIAL","value":27},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":27},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":27},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":27},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":27},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":27},"2.40.12":{"status":"PARTIAL","value":27},"2.41.10":{"status":"PARTIAL","value":27},"2.42.6":{"status":"PARTIAL","value":27},"2.43.2":{"status":"PARTIAL","value":27}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-missing__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G4_IND_SUM_MISSING","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-missing__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_SUM_MISSING","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"PARTIAL","value":28},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":28},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":28},"2.43.2":{"status":"PARTIAL","value":28}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-missing__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_SUM_MISSING","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"PARTIAL","value":36},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":36},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.6":{"status":"PARTIAL","value":36},"2.43.2":{"status":"PARTIAL","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-missing__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_SUM_MISSING","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"PARTIAL","value":36},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":36},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":36},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":36},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":36},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"PARTIAL","value":36},"2.42.6":{"status":"PARTIAL","value":36},"2.43.2":{"status":"PARTIAL","value":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-missing__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_IND_SUM_MISSING","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-missing__q-Yearly__p-2024__A","item":{"code":"PTT_G4_IND_SUM_MISSING","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"1","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"VALUE","value":198},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":198},"2.40.13-SNAPSHOT":{"status":"VALUE","value":198},"2.41.11-SNAPSHOT":{"status":"VALUE","value":198},"2.42.7-SNAPSHOT":{"status":"VALUE","value":198},"2.43.3-SNAPSHOT":{"status":"VALUE","value":198},"2.40.12":{"status":"VALUE","value":198},"2.41.10":{"status":"VALUE","value":198},"2.42.6":{"status":"VALUE","value":198},"2.43.2":{"status":"VALUE","value":198}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-over-yearly__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_SUM_OVER_YEARLY","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"#{nxyiifFYsbc}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-over-yearly__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_SUM_OVER_YEARLY","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"#{nxyiifFYsbc}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-over-yearly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_SUM_OVER_YEARLY","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"#{nxyiifFYsbc}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-over-yearly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_SUM_OVER_YEARLY","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"#{nxyiifFYsbc}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-over-yearly__q-Yearly__p-2024__A","item":{"code":"PTT_G4_IND_SUM_OVER_YEARLY","dimensionItemType":"INDICATOR","numerator":"#{BeN8IzxwwJF}+#{nxyiifFYsbc}","denominator":"#{nxyiifFYsbc}","annualized":false,"operands":[{"id":"BeN8IzxwwJF","ref":"count","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Monthly"]},{"id":"nxyiifFYsbc","ref":"popSum","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Yearly"]}]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"VALUE","value":1.65},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1.65},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1.65},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1.65},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1.65},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1.65},"2.40.12":{"status":"VALUE","value":1.65},"2.41.10":{"status":"VALUE","value":1.65},"2.42.6":{"status":"VALUE","value":1.65},"2.43.2":{"status":"VALUE","value":1.65}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-weeks__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G4_IND_SUM_WEEKS","dimensionItemType":"INDICATOR","numerator":"#{gO2uYZJka4H}+#{qRPFmjPEVIw}","denominator":"1","annualized":false,"operands":[{"id":"gO2uYZJka4H","ref":"weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Weekly"]},{"id":"qRPFmjPEVIw","ref":"wednesday","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["WeeklyWednesday"]}]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":973},"2.40.13-SNAPSHOT":{"status":"VALUE","value":973},"2.41.11-SNAPSHOT":{"status":"VALUE","value":973},"2.42.7-SNAPSHOT":{"status":"VALUE","value":973},"2.43.3-SNAPSHOT":{"status":"VALUE","value":973},"2.40.12":{"status":"VALUE","value":973},"2.41.10":{"status":"VALUE","value":973},"2.42.6":{"status":"VALUE","value":973},"2.43.2":{"status":"VALUE","value":973}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-sum-weeks__q-Daily__p-20250101__A","item":{"code":"PTT_G4_IND_SUM_WEEKS","dimensionItemType":"INDICATOR","numerator":"#{gO2uYZJka4H}+#{qRPFmjPEVIw}","denominator":"1","annualized":false,"operands":[{"id":"gO2uYZJka4H","ref":"weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Weekly"]},{"id":"qRPFmjPEVIw","ref":"wednesday","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["WeeklyWednesday"]}]},"query":{"periodType":"Daily","period":"20250101","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"ind-sum-weeks__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G4_IND_SUM_WEEKS","dimensionItemType":"INDICATOR","numerator":"#{gO2uYZJka4H}+#{qRPFmjPEVIw}","denominator":"1","annualized":false,"operands":[{"id":"gO2uYZJka4H","ref":"weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Weekly"]},{"id":"qRPFmjPEVIw","ref":"wednesday","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["WeeklyWednesday"]}]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":961},"2.43.3-SNAPSHOT":{"status":"VALUE","value":961},"2.43.2":{"status":"VALUE","value":961}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}}, + {"id":"ind-sum-weeks__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G4_IND_SUM_WEEKS","dimensionItemType":"INDICATOR","numerator":"#{gO2uYZJka4H}+#{qRPFmjPEVIw}","denominator":"1","annualized":false,"operands":[{"id":"gO2uYZJka4H","ref":"weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Weekly"]},{"id":"qRPFmjPEVIw","ref":"wednesday","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["WeeklyWednesday"]}]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1296},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1296},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1296},"2.42.6":{"status":"VALUE","value":1296},"2.43.2":{"status":"VALUE","value":1296}},"verdict":{"2.44-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-sum-weeks__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G4_IND_SUM_WEEKS","dimensionItemType":"INDICATOR","numerator":"#{gO2uYZJka4H}+#{qRPFmjPEVIw}","denominator":"1","annualized":false,"operands":[{"id":"gO2uYZJka4H","ref":"weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Weekly"]},{"id":"qRPFmjPEVIw","ref":"wednesday","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["WeeklyWednesday"]}]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1326},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1326},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1326},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1326},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":1326},"2.42.6":{"status":"VALUE","value":1326},"2.43.2":{"status":"VALUE","value":1326}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"fail","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-sum-weeks__q-Weekly__p-2025W1__A","item":{"code":"PTT_G4_IND_SUM_WEEKS","dimensionItemType":"INDICATOR","numerator":"#{gO2uYZJka4H}+#{qRPFmjPEVIw}","denominator":"1","annualized":false,"operands":[{"id":"gO2uYZJka4H","ref":"weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Weekly"]},{"id":"qRPFmjPEVIw","ref":"wednesday","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["WeeklyWednesday"]}]},"query":{"periodType":"Weekly","period":"2025W1","orgUnit":"A"},"expected":{"status":"PARTIAL","value":null},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":53},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":53},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":53},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":53},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":53},"2.40.12":{"status":"PARTIAL","value":53},"2.41.10":{"status":"PARTIAL","value":53},"2.42.6":{"status":"PARTIAL","value":53},"2.43.2":{"status":"PARTIAL","value":53}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"ind-sum-weeks__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G4_IND_SUM_WEEKS","dimensionItemType":"INDICATOR","numerator":"#{gO2uYZJka4H}+#{qRPFmjPEVIw}","denominator":"1","annualized":false,"operands":[{"id":"gO2uYZJka4H","ref":"weekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["Weekly"]},{"id":"qRPFmjPEVIw","ref":"wednesday","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","collectionPeriodTypes":["WeeklyWednesday"]}]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/period-types/metadata-shapes.json b/src/__fixtures__/period-types/metadata-shapes.json new file mode 100644 index 000000000..96027559a --- /dev/null +++ b/src/__fixtures__/period-types/metadata-shapes.json @@ -0,0 +1,6823 @@ +{ + "schemaVersion": 1, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "versions": { + "2.44-SNAPSHOT": { + "instance": "dev", + "date": "2026-10-08", + "requests": [ + { + "name": "dataElements", + "path": "/api/dataElements.json?filter=code:$like:PTT_G3&filter=code:$like:PTT_DIS&rootJunction=OR&fields=id,code,name,aggregationType,valueType,domainType,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_DIS_BOTH", + "name": "PTT disaggregation both", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "MTEN4XmC0k3" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "DMfYb9cbUwP" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "wrXAErJOkRS", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_DIS_PLACE", + "name": "PTT disaggregation place", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "NlZrxX5S0X8" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "Ij6jwq1Ceiq" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "T4Gk4A7PTRJ", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_G3_HISTORY", + "name": "PTT G3 history", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "V0tylPzEYrt" + } + } + ], + "id": "hR0FkmDKXvh", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_MW", + "name": "PTT G3 mw", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "WeeklyWednesday", + "id": "wRXyMvEnlyA" + } + }, + { + "dataSet": { + "periodType": "Weekly", + "id": "YlravvdHwIj" + } + } + ], + "id": "hbv3rzk8Fne", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_ORPHAN", + "name": "PTT G3 orphan", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "aggregationType": "SUM", + "dataSetElements": [], + "id": "idqEIJ4ahkB", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + } + ] + } + }, + { + "name": "indicators", + "path": "/api/indicators.json?filter=code:$like:PTT_G4&fields=id,code,name,numerator,denominator,annualized,indicatorType[id,factor]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "indicators": [ + { + "code": "PTT_G4_IND_CONSTANT", + "name": "PTT G4 indicator constant", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "C{Wi6GdGCugf3}", + "denominator": "1", + "id": "CF8eNia3IC2" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED", + "name": "PTT G4 indicator coverage-averaged", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "BZznfLUT5h4" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED", + "name": "PTT G4 indicator coverage-averaged-annualized", + "annualized": true, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "LQIWkVZzf5R" + }, + { + "code": "PTT_G4_IND_COVERAGE_SUMMED", + "name": "PTT G4 indicator coverage-summed", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{nxyiifFYsbc}", + "id": "xA7tYxOjjM3" + } + ] + } + }, + { + "name": "dataSets", + "path": "/api/dataSets.json?filter=code:$like:PTT_G5&fields=id,code,periodType,dataSetElements[dataElement[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataSets": [ + { + "code": "PTT_G5_DS_Daily", + "periodType": "Daily", + "dataSetElements": [ + { + "dataElement": { + "id": "fUFgSP0AtUj" + } + } + ], + "id": "WE8srTzzhBZ" + }, + { + "code": "PTT_G5_DS_Monthly", + "periodType": "Monthly", + "dataSetElements": [ + { + "dataElement": { + "id": "Nhe8HFuemuw" + } + } + ], + "id": "hFQny4kjg5C" + }, + { + "code": "PTT_G5_DS_Quarterly", + "periodType": "Quarterly", + "dataSetElements": [ + { + "dataElement": { + "id": "Kd94qfjkpYx" + } + } + ], + "id": "SYkQTXY6EcA" + }, + { + "code": "PTT_G5_DS_Weekly", + "periodType": "Weekly", + "dataSetElements": [ + { + "dataElement": { + "id": "AFJ5IID9t6Z" + } + } + ], + "id": "S1yLlm7Hk2W" + } + ] + } + }, + { + "name": "expressionDimensionItems", + "path": "/api/expressionDimensionItems.json?filter=code:$like:PTT&fields=id,code,expression,missingValueStrategy&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "expressionDimensionItems": [ + { + "code": "PTT_G4_EXPRESSION", + "expression": "#{BeN8IzxwwJF}*2", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "gdmRgPhI76J" + }, + { + "code": "PTT_G4_EXPRESSION_NEVER_SKIP", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "NEVER_SKIP", + "id": "JzaPFPBpfRB" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ALL", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "pnmCVrG9qnE" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ANY", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ANY_VALUE_MISSING", + "id": "XqnQKWKRqzs" + } + ] + } + }, + { + "name": "periodTypes", + "path": "/api/periodTypes.json?fields=name,isoFormat,isoDuration,frequencyOrder", + "httpStatus": 200, + "response": { + "periodTypes": [ + { + "name": "BiMonthly", + "isoDuration": "P2M", + "isoFormat": "yyyyMMB", + "frequencyOrder": 61 + }, + { + "name": "BiWeekly", + "isoDuration": "P14D", + "isoFormat": "yyyyBiWn", + "frequencyOrder": 14 + }, + { + "name": "Daily", + "isoDuration": "P1D", + "isoFormat": "yyyyMMdd", + "frequencyOrder": 1 + }, + { + "name": "FinancialApril", + "isoDuration": "P1Y", + "isoFormat": "yyyyApril", + "frequencyOrder": 365 + } + ] + } + }, + { + "name": "categoryOptionCombos", + "path": "/api/categoryOptionCombos.json?filter=id:in:[HllvX50cXC0,l6y6maQF8He,eUlTvjHxjZF,MHtSLMctHku,eHq7UQzuwBc]&fields=id,categoryCombo[id]&paging=false&order=id:asc", + "httpStatus": 200, + "response": { + "categoryOptionCombos": [ + { + "categoryCombo": { + "id": "GFe8Z3ErDol" + }, + "id": "eHq7UQzuwBc" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "eUlTvjHxjZF" + }, + { + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "id": "HllvX50cXC0" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "l6y6maQF8He" + } + ] + } + }, + { + "name": "dataElements-aggregationLevels", + "path": "/api/dataElements.json?filter=code:$like:PTT_OU_AGG&fields=id,code,aggregationType,aggregationLevels,dataSetElements[dataSet[id,periodType]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_OU_AGG_D1_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "Yo1BsQNngHy" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "ZRYrXnbcbjJ" + }, + { + "code": "PTT_OU_AGG_F_2", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "b5xszkgbXVd" + } + } + ], + "aggregationLevels": [ + 2 + ], + "id": "RNhL3JmLlC0" + }, + { + "code": "PTT_OU_AGG_F_2_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "CGAbAPpLZTo" + } + } + ], + "aggregationLevels": [ + 2, + 3 + ], + "id": "WZ6aknVLD9A" + }, + { + "code": "PTT_OU_AGG_F_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "dM4sBCBFDDC" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "FPp01mLrknd" + } + ] + } + }, + { + "name": "programIndicators", + "path": "/api/programIndicators.json?filter=code:$like:PTT_PROG&fields=id,code,program[id],orgUnitField,analyticsType,analyticsPeriodBoundaries[id]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programIndicators": [ + { + "code": "PTT_PROG_PI_EVENT", + "program": { + "id": "KfzRtyEQHht" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "KbbhnxcYyyI" + }, + { + "id": "kDw2leu34XM" + } + ], + "id": "TafgHfMvqW7" + }, + { + "code": "PTT_PROG_PI_EVENT_PLACE", + "program": { + "id": "KfzRtyEQHht" + }, + "orgUnitField": "WJ1j79Dlubx", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "ogwwOlQzjpf" + }, + { + "id": "kri1Cn2kFUH" + } + ], + "id": "eSWGLPCy2ZK" + }, + { + "code": "PTT_PROG_PI_TRACKER", + "program": { + "id": "lAcD9QrX1xQ" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "ifZ0wDxMMIr" + }, + { + "id": "fVleo64GwdT" + } + ], + "id": "NTvweRnHeLC" + }, + { + "code": "PTT_PROG_PI_TRACKER_ENROLLMENT", + "program": { + "id": "lAcD9QrX1xQ" + }, + "orgUnitField": "ENROLLMENT", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "nEXl4ZLTShE" + }, + { + "id": "slmobGuSY4K" + } + ], + "id": "nYG1z4dFVnX" + } + ] + } + }, + { + "name": "programs", + "path": "/api/programs.json?filter=code:$like:PTT_PROG&fields=id,code,programType&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programs": [ + { + "code": "PTT_PROG_EVENT", + "programType": "WITHOUT_REGISTRATION", + "id": "KfzRtyEQHht" + }, + { + "code": "PTT_PROG_TRACKER", + "programType": "WITH_REGISTRATION", + "id": "lAcD9QrX1xQ" + } + ] + } + }, + { + "name": "organisationUnitLevels", + "path": "/api/organisationUnitLevels.json?fields=id,level,displayName&paging=false&order=level:asc", + "httpStatus": 200, + "response": { + "organisationUnitLevels": [ + { + "level": 1, + "displayName": "National", + "id": "H1KlN4QIauv" + }, + { + "level": 2, + "displayName": "District", + "id": "wjP19dkFeIk" + }, + { + "level": 3, + "displayName": "Chiefdom", + "id": "tTUf91fCytl" + }, + { + "level": 4, + "displayName": "Facility", + "id": "m9lBJogzE95" + } + ] + } + }, + { + "name": "count-level", + "path": "/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "pageSize": 1, + "total": 1169, + "pageCount": 1169, + "nextPage": "http://play.im.dhis2.org/dev/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1&page=2" + }, + "gist": true, + "organisationUnits": [ + { + "id": "rZxk3S0qN63" + } + ] + } + }, + { + "name": "count-path", + "path": "/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "pageSize": 1, + "total": 9, + "pageCount": 9, + "nextPage": "http://play.im.dhis2.org/dev/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1&page=2" + }, + "gist": true, + "organisationUnits": [ + { + "id": "RIinNUb6rg7" + } + ] + } + }, + { + "name": "count-dataSet", + "path": "/api/organisationUnits.json?filter=dataSets.id:eq:v200HCJsE6E&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev/api/organisationUnits.json?page=2&pageSize=1&filter=dataSets.id%3Aeq%3Av200HCJsE6E&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-program", + "path": "/api/organisationUnits.json?filter=programs.id:eq:KfzRtyEQHht&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev/api/organisationUnits.json?page=2&pageSize=1&filter=programs.id%3Aeq%3AKfzRtyEQHht&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-ids", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "pageSize": 1, + "total": 3, + "pageCount": 3, + "nextPage": "http://play.im.dhis2.org/dev/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1&page=2" + }, + "gist": true, + "organisationUnits": [ + { + "id": "THU3mEbE4b6" + } + ] + } + }, + { + "name": "count-group", + "path": "/api/organisationUnits.json?filter=organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev/api/organisationUnits.json?page=2&pageSize=1&filter=organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "ZBm5vBRXjeH" + } + ] + } + }, + { + "name": "count-grandparent-in-group", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:TTEvM2Zx7wF&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev/api/organisationUnits.json?page=2&pageSize=1&filter=parent.parent.organisationUnitGroups.id%3Aeq%3ATTEvM2Zx7wF&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-grandparent-in-group-none", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 0, + "pageSize": 1, + "pageCount": 0 + }, + "organisationUnits": [] + } + }, + { + "name": "count-child-in-group", + "path": "/api/organisationUnits.json?filter=children.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev/api/organisationUnits.json?page=2&pageSize=1&filter=children.organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "list-assigned-ancestors", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,Zkx2DMsGgi0,RIinNUb6rg7]&filter=dataSets.id:eq:pRfTWd7fDDO&fields=id&paging=false", + "httpStatus": 200, + "response": { + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "me", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd", + "id": "ImspTQPwCqd", + "level": 1 + } + ] + } + }, + { + "name": "me-ptt-user", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ] + } + } + ] + }, + "2.40.13-SNAPSHOT": { + "instance": "dev-2-40", + "date": "2026-10-08", + "requests": [ + { + "name": "dataElements", + "path": "/api/dataElements.json?filter=code:$like:PTT_G3&filter=code:$like:PTT_DIS&rootJunction=OR&fields=id,code,name,aggregationType,valueType,domainType,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_DIS_BOTH", + "name": "PTT disaggregation both", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Quarterly", + "id": "DMfYb9cbUwP" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + }, + { + "dataSet": { + "periodType": "Monthly", + "id": "MTEN4XmC0k3" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + } + ], + "id": "wrXAErJOkRS", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_DIS_PLACE", + "name": "PTT disaggregation place", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "NlZrxX5S0X8" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "Ij6jwq1Ceiq" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "T4Gk4A7PTRJ", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_G3_HISTORY", + "name": "PTT G3 history", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "V0tylPzEYrt" + } + } + ], + "id": "hR0FkmDKXvh", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_MW", + "name": "PTT G3 mw", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "WeeklyWednesday", + "id": "wRXyMvEnlyA" + } + }, + { + "dataSet": { + "periodType": "Weekly", + "id": "YlravvdHwIj" + } + } + ], + "id": "hbv3rzk8Fne", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_ORPHAN", + "name": "PTT G3 orphan", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [], + "id": "idqEIJ4ahkB", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + } + ] + } + }, + { + "name": "indicators", + "path": "/api/indicators.json?filter=code:$like:PTT_G4&fields=id,code,name,numerator,denominator,annualized,indicatorType[id,factor]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "indicators": [ + { + "code": "PTT_G4_IND_CONSTANT", + "name": "PTT G4 indicator constant", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "C{Wi6GdGCugf3}", + "denominator": "1", + "id": "CF8eNia3IC2" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED", + "name": "PTT G4 indicator coverage-averaged", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "BZznfLUT5h4" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED", + "name": "PTT G4 indicator coverage-averaged-annualized", + "annualized": true, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "LQIWkVZzf5R" + }, + { + "code": "PTT_G4_IND_COVERAGE_SUMMED", + "name": "PTT G4 indicator coverage-summed", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{nxyiifFYsbc}", + "id": "xA7tYxOjjM3" + } + ] + } + }, + { + "name": "dataSets", + "path": "/api/dataSets.json?filter=code:$like:PTT_G5&fields=id,code,periodType,dataSetElements[dataElement[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataSets": [ + { + "code": "PTT_G5_DS_Daily", + "periodType": "Daily", + "dataSetElements": [ + { + "dataElement": { + "id": "fUFgSP0AtUj" + } + } + ], + "id": "WE8srTzzhBZ" + }, + { + "code": "PTT_G5_DS_Monthly", + "periodType": "Monthly", + "dataSetElements": [ + { + "dataElement": { + "id": "Nhe8HFuemuw" + } + } + ], + "id": "hFQny4kjg5C" + }, + { + "code": "PTT_G5_DS_Quarterly", + "periodType": "Quarterly", + "dataSetElements": [ + { + "dataElement": { + "id": "Kd94qfjkpYx" + } + } + ], + "id": "SYkQTXY6EcA" + }, + { + "code": "PTT_G5_DS_Weekly", + "periodType": "Weekly", + "dataSetElements": [ + { + "dataElement": { + "id": "AFJ5IID9t6Z" + } + } + ], + "id": "S1yLlm7Hk2W" + } + ] + } + }, + { + "name": "expressionDimensionItems", + "path": "/api/expressionDimensionItems.json?filter=code:$like:PTT&fields=id,code,expression,missingValueStrategy&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "expressionDimensionItems": [ + { + "code": "PTT_G4_EXPRESSION", + "expression": "#{BeN8IzxwwJF}*2", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "gdmRgPhI76J" + }, + { + "code": "PTT_G4_EXPRESSION_NEVER_SKIP", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "NEVER_SKIP", + "id": "JzaPFPBpfRB" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ALL", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "pnmCVrG9qnE" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ANY", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ANY_VALUE_MISSING", + "id": "XqnQKWKRqzs" + } + ] + } + }, + { + "name": "periodTypes", + "path": "/api/periodTypes.json?fields=name,isoFormat,isoDuration,frequencyOrder", + "httpStatus": 200, + "response": { + "periodTypes": [ + { + "name": "Daily", + "isoDuration": "P1D", + "isoFormat": "yyyyMMdd", + "frequencyOrder": 1 + }, + { + "name": "Weekly", + "isoDuration": "P7D", + "isoFormat": "yyyyWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyWednesday", + "isoDuration": "P7D", + "isoFormat": "yyyyWedWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyThursday", + "isoDuration": "P7D", + "isoFormat": "yyyyThuWn", + "frequencyOrder": 7 + } + ] + } + }, + { + "name": "categoryOptionCombos", + "path": "/api/categoryOptionCombos.json?filter=id:in:[HllvX50cXC0,l6y6maQF8He,eUlTvjHxjZF,MHtSLMctHku,eHq7UQzuwBc]&fields=id,categoryCombo[id]&paging=false&order=id:asc", + "httpStatus": 200, + "response": { + "categoryOptionCombos": [ + { + "categoryCombo": { + "id": "GFe8Z3ErDol" + }, + "id": "eHq7UQzuwBc" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "eUlTvjHxjZF" + }, + { + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "id": "HllvX50cXC0" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "l6y6maQF8He" + } + ] + } + }, + { + "name": "dataElements-aggregationLevels", + "path": "/api/dataElements.json?filter=code:$like:PTT_OU_AGG&fields=id,code,aggregationType,aggregationLevels,dataSetElements[dataSet[id,periodType]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_OU_AGG_D1_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "Yo1BsQNngHy" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "ZRYrXnbcbjJ" + }, + { + "code": "PTT_OU_AGG_F_2", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "b5xszkgbXVd" + } + } + ], + "aggregationLevels": [ + 2 + ], + "id": "RNhL3JmLlC0" + }, + { + "code": "PTT_OU_AGG_F_2_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "CGAbAPpLZTo" + } + } + ], + "aggregationLevels": [ + 2, + 3 + ], + "id": "WZ6aknVLD9A" + }, + { + "code": "PTT_OU_AGG_F_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "dM4sBCBFDDC" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "FPp01mLrknd" + } + ] + } + }, + { + "name": "programIndicators", + "path": "/api/programIndicators.json?filter=code:$like:PTT_PROG&fields=id,code,program[id],orgUnitField,analyticsType,analyticsPeriodBoundaries[id]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programIndicators": [ + { + "code": "PTT_PROG_PI_EVENT", + "program": { + "id": "KfzRtyEQHht" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "bWpbLkGvMKg" + }, + { + "id": "mZ1I42oazPW" + } + ], + "id": "TafgHfMvqW7" + }, + { + "code": "PTT_PROG_PI_EVENT_PLACE", + "program": { + "id": "KfzRtyEQHht" + }, + "orgUnitField": "WJ1j79Dlubx", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "e4IqFCIyS16" + }, + { + "id": "G6VzwEZNJQw" + } + ], + "id": "eSWGLPCy2ZK" + }, + { + "code": "PTT_PROG_PI_TRACKER", + "program": { + "id": "lAcD9QrX1xQ" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "akf2L8cHjCy" + }, + { + "id": "ji7ahoeSEkz" + } + ], + "id": "NTvweRnHeLC" + }, + { + "code": "PTT_PROG_PI_TRACKER_ENROLLMENT", + "program": { + "id": "lAcD9QrX1xQ" + }, + "orgUnitField": "ENROLLMENT", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "D9wSbYZ4ZIE" + }, + { + "id": "TXaApL4lGhD" + } + ], + "id": "nYG1z4dFVnX" + } + ] + } + }, + { + "name": "programs", + "path": "/api/programs.json?filter=code:$like:PTT_PROG&fields=id,code,programType&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programs": [ + { + "code": "PTT_PROG_EVENT", + "programType": "WITHOUT_REGISTRATION", + "id": "KfzRtyEQHht" + }, + { + "code": "PTT_PROG_TRACKER", + "programType": "WITH_REGISTRATION", + "id": "lAcD9QrX1xQ" + } + ] + } + }, + { + "name": "organisationUnitLevels", + "path": "/api/organisationUnitLevels.json?fields=id,level,displayName&paging=false&order=level:asc", + "httpStatus": 200, + "response": { + "organisationUnitLevels": [ + { + "level": 1, + "displayName": "National", + "id": "H1KlN4QIauv" + }, + { + "level": 2, + "displayName": "District", + "id": "wjP19dkFeIk" + }, + { + "level": 3, + "displayName": "Chiefdom", + "id": "tTUf91fCytl" + }, + { + "level": 4, + "displayName": "Facility", + "id": "m9lBJogzE95" + } + ] + } + }, + { + "name": "count-level", + "path": "/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 1169, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-40/api/organisationUnits.json?page=2&pageSize=1&filter=level%3Aeq%3A4&fields=id", + "pageCount": 1169 + }, + "organisationUnits": [ + { + "id": "Rp268JB6Ne4" + } + ] + } + }, + { + "name": "count-path", + "path": "/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 9, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-40/api/organisationUnits.json?page=2&pageSize=1&filter=path%3Alike%3ARIinNUb6rg7&fields=id", + "pageCount": 9 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "count-dataSet", + "path": "/api/organisationUnits.json?filter=dataSets.id:eq:v200HCJsE6E&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-40/api/organisationUnits.json?page=2&pageSize=1&filter=dataSets.id%3Aeq%3Av200HCJsE6E&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-program", + "path": "/api/organisationUnits.json?filter=programs.id:eq:KfzRtyEQHht&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-40/api/organisationUnits.json?page=2&pageSize=1&filter=programs.id%3Aeq%3AKfzRtyEQHht&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-ids", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-40/api/organisationUnits.json?page=2&pageSize=1&filter=id%3Ain%3A%5BtsmDjF9bxzK%2CYcWWJD42rFM%2CTHU3mEbE4b6%5D&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "THU3mEbE4b6" + } + ] + } + }, + { + "name": "count-group", + "path": "/api/organisationUnits.json?filter=organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-40/api/organisationUnits.json?page=2&pageSize=1&filter=organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "ZBm5vBRXjeH" + } + ] + } + }, + { + "name": "count-grandparent-in-group", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:TTEvM2Zx7wF&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-40/api/organisationUnits.json?page=2&pageSize=1&filter=parent.parent.organisationUnitGroups.id%3Aeq%3ATTEvM2Zx7wF&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-grandparent-in-group-none", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 0, + "pageSize": 1, + "pageCount": 0 + }, + "organisationUnits": [] + } + }, + { + "name": "count-child-in-group", + "path": "/api/organisationUnits.json?filter=children.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-40/api/organisationUnits.json?page=2&pageSize=1&filter=children.organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "list-assigned-ancestors", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,Zkx2DMsGgi0,RIinNUb6rg7]&filter=dataSets.id:eq:pRfTWd7fDDO&fields=id&paging=false", + "httpStatus": 200, + "response": { + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "me", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd", + "id": "ImspTQPwCqd", + "level": 1 + } + ] + } + }, + { + "name": "me-ptt-user", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ] + } + } + ] + }, + "2.41.11-SNAPSHOT": { + "instance": "dev-2-41", + "date": "2026-10-08", + "requests": [ + { + "name": "dataElements", + "path": "/api/dataElements.json?filter=code:$like:PTT_G3&filter=code:$like:PTT_DIS&rootJunction=OR&fields=id,code,name,aggregationType,valueType,domainType,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_DIS_BOTH", + "name": "PTT disaggregation both", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "MTEN4XmC0k3" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "DMfYb9cbUwP" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "wrXAErJOkRS", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_DIS_PLACE", + "name": "PTT disaggregation place", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "NlZrxX5S0X8" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "Ij6jwq1Ceiq" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "T4Gk4A7PTRJ", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_G3_HISTORY", + "name": "PTT G3 history", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "V0tylPzEYrt" + } + } + ], + "id": "hR0FkmDKXvh", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_MW", + "name": "PTT G3 mw", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "YlravvdHwIj" + } + }, + { + "dataSet": { + "periodType": "WeeklyWednesday", + "id": "wRXyMvEnlyA" + } + } + ], + "id": "hbv3rzk8Fne", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_ORPHAN", + "name": "PTT G3 orphan", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [], + "id": "idqEIJ4ahkB", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + } + ] + } + }, + { + "name": "indicators", + "path": "/api/indicators.json?filter=code:$like:PTT_G4&fields=id,code,name,numerator,denominator,annualized,indicatorType[id,factor]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "indicators": [ + { + "code": "PTT_G4_IND_CONSTANT", + "name": "PTT G4 indicator constant", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "C{Wi6GdGCugf3}", + "denominator": "1", + "id": "CF8eNia3IC2" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED", + "name": "PTT G4 indicator coverage-averaged", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "BZznfLUT5h4" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED", + "name": "PTT G4 indicator coverage-averaged-annualized", + "annualized": true, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "LQIWkVZzf5R" + }, + { + "code": "PTT_G4_IND_COVERAGE_SUMMED", + "name": "PTT G4 indicator coverage-summed", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{nxyiifFYsbc}", + "id": "xA7tYxOjjM3" + } + ] + } + }, + { + "name": "dataSets", + "path": "/api/dataSets.json?filter=code:$like:PTT_G5&fields=id,code,periodType,dataSetElements[dataElement[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataSets": [ + { + "code": "PTT_G5_DS_Daily", + "periodType": "Daily", + "dataSetElements": [ + { + "dataElement": { + "id": "fUFgSP0AtUj" + } + } + ], + "id": "WE8srTzzhBZ" + }, + { + "code": "PTT_G5_DS_Monthly", + "periodType": "Monthly", + "dataSetElements": [ + { + "dataElement": { + "id": "Nhe8HFuemuw" + } + } + ], + "id": "hFQny4kjg5C" + }, + { + "code": "PTT_G5_DS_Quarterly", + "periodType": "Quarterly", + "dataSetElements": [ + { + "dataElement": { + "id": "Kd94qfjkpYx" + } + } + ], + "id": "SYkQTXY6EcA" + }, + { + "code": "PTT_G5_DS_Weekly", + "periodType": "Weekly", + "dataSetElements": [ + { + "dataElement": { + "id": "AFJ5IID9t6Z" + } + } + ], + "id": "S1yLlm7Hk2W" + } + ] + } + }, + { + "name": "expressionDimensionItems", + "path": "/api/expressionDimensionItems.json?filter=code:$like:PTT&fields=id,code,expression,missingValueStrategy&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "expressionDimensionItems": [ + { + "code": "PTT_G4_EXPRESSION", + "expression": "#{BeN8IzxwwJF}*2", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "gdmRgPhI76J" + }, + { + "code": "PTT_G4_EXPRESSION_NEVER_SKIP", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "NEVER_SKIP", + "id": "JzaPFPBpfRB" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ALL", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "pnmCVrG9qnE" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ANY", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ANY_VALUE_MISSING", + "id": "XqnQKWKRqzs" + } + ] + } + }, + { + "name": "periodTypes", + "path": "/api/periodTypes.json?fields=name,isoFormat,isoDuration,frequencyOrder", + "httpStatus": 200, + "response": { + "periodTypes": [ + { + "name": "Daily", + "isoDuration": "P1D", + "isoFormat": "yyyyMMdd", + "frequencyOrder": 1 + }, + { + "name": "Weekly", + "isoDuration": "P7D", + "isoFormat": "yyyyWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyWednesday", + "isoDuration": "P7D", + "isoFormat": "yyyyWedWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyThursday", + "isoDuration": "P7D", + "isoFormat": "yyyyThuWn", + "frequencyOrder": 7 + } + ] + } + }, + { + "name": "categoryOptionCombos", + "path": "/api/categoryOptionCombos.json?filter=id:in:[HllvX50cXC0,l6y6maQF8He,eUlTvjHxjZF,MHtSLMctHku,eHq7UQzuwBc]&fields=id,categoryCombo[id]&paging=false&order=id:asc", + "httpStatus": 200, + "response": { + "categoryOptionCombos": [ + { + "categoryCombo": { + "id": "GFe8Z3ErDol" + }, + "id": "eHq7UQzuwBc" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "eUlTvjHxjZF" + }, + { + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "id": "HllvX50cXC0" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "l6y6maQF8He" + } + ] + } + }, + { + "name": "dataElements-aggregationLevels", + "path": "/api/dataElements.json?filter=code:$like:PTT_OU_AGG&fields=id,code,aggregationType,aggregationLevels,dataSetElements[dataSet[id,periodType]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_OU_AGG_D1_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "Yo1BsQNngHy" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "ZRYrXnbcbjJ" + }, + { + "code": "PTT_OU_AGG_F_2", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "b5xszkgbXVd" + } + } + ], + "aggregationLevels": [ + 2 + ], + "id": "RNhL3JmLlC0" + }, + { + "code": "PTT_OU_AGG_F_2_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "CGAbAPpLZTo" + } + } + ], + "aggregationLevels": [ + 2, + 3 + ], + "id": "WZ6aknVLD9A" + }, + { + "code": "PTT_OU_AGG_F_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "dM4sBCBFDDC" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "FPp01mLrknd" + } + ] + } + }, + { + "name": "programIndicators", + "path": "/api/programIndicators.json?filter=code:$like:PTT_PROG&fields=id,code,program[id],orgUnitField,analyticsType,analyticsPeriodBoundaries[id]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programIndicators": [ + { + "code": "PTT_PROG_PI_EVENT", + "program": { + "id": "KfzRtyEQHht" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "wP2nVYgfVbm" + }, + { + "id": "Inea9bXVMNb" + } + ], + "id": "TafgHfMvqW7" + }, + { + "code": "PTT_PROG_PI_EVENT_PLACE", + "program": { + "id": "KfzRtyEQHht" + }, + "orgUnitField": "WJ1j79Dlubx", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "N3pw9hyl3Ip" + }, + { + "id": "iFDhj2eKVu8" + } + ], + "id": "eSWGLPCy2ZK" + }, + { + "code": "PTT_PROG_PI_TRACKER", + "program": { + "id": "lAcD9QrX1xQ" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "vg4mKXrmDqE" + }, + { + "id": "rzLulCoTFQ3" + } + ], + "id": "NTvweRnHeLC" + }, + { + "code": "PTT_PROG_PI_TRACKER_ENROLLMENT", + "program": { + "id": "lAcD9QrX1xQ" + }, + "orgUnitField": "ENROLLMENT", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "Kcw9g2B9kXx" + }, + { + "id": "xcv73v0DPgF" + } + ], + "id": "nYG1z4dFVnX" + } + ] + } + }, + { + "name": "programs", + "path": "/api/programs.json?filter=code:$like:PTT_PROG&fields=id,code,programType&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programs": [ + { + "code": "PTT_PROG_EVENT", + "programType": "WITHOUT_REGISTRATION", + "id": "KfzRtyEQHht" + }, + { + "code": "PTT_PROG_TRACKER", + "programType": "WITH_REGISTRATION", + "id": "lAcD9QrX1xQ" + } + ] + } + }, + { + "name": "organisationUnitLevels", + "path": "/api/organisationUnitLevels.json?fields=id,level,displayName&paging=false&order=level:asc", + "httpStatus": 200, + "response": { + "organisationUnitLevels": [ + { + "level": 1, + "displayName": "National", + "id": "H1KlN4QIauv" + }, + { + "level": 2, + "displayName": "District", + "id": "wjP19dkFeIk" + }, + { + "level": 3, + "displayName": "Chiefdom", + "id": "tTUf91fCytl" + }, + { + "level": 4, + "displayName": "Facility", + "id": "m9lBJogzE95" + } + ] + } + }, + { + "name": "count-level", + "path": "/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 1169, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-41/api/organisationUnits.json?page=2&pageSize=1&filter=level%3Aeq%3A4&fields=id", + "pageCount": 1169 + }, + "organisationUnits": [ + { + "id": "Rp268JB6Ne4" + } + ] + } + }, + { + "name": "count-path", + "path": "/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 9, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-41/api/organisationUnits.json?page=2&pageSize=1&filter=path%3Alike%3ARIinNUb6rg7&fields=id", + "pageCount": 9 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "count-dataSet", + "path": "/api/organisationUnits.json?filter=dataSets.id:eq:v200HCJsE6E&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-41/api/organisationUnits.json?page=2&pageSize=1&filter=dataSets.id%3Aeq%3Av200HCJsE6E&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-program", + "path": "/api/organisationUnits.json?filter=programs.id:eq:KfzRtyEQHht&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-41/api/organisationUnits.json?page=2&pageSize=1&filter=programs.id%3Aeq%3AKfzRtyEQHht&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-ids", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-41/api/organisationUnits.json?page=2&pageSize=1&filter=id%3Ain%3A%5BtsmDjF9bxzK%2CYcWWJD42rFM%2CTHU3mEbE4b6%5D&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "THU3mEbE4b6" + } + ] + } + }, + { + "name": "count-group", + "path": "/api/organisationUnits.json?filter=organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-41/api/organisationUnits.json?page=2&pageSize=1&filter=organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "ZBm5vBRXjeH" + } + ] + } + }, + { + "name": "count-grandparent-in-group", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:TTEvM2Zx7wF&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-41/api/organisationUnits.json?page=2&pageSize=1&filter=parent.parent.organisationUnitGroups.id%3Aeq%3ATTEvM2Zx7wF&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-grandparent-in-group-none", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 0, + "pageSize": 1, + "pageCount": 0 + }, + "organisationUnits": [] + } + }, + { + "name": "count-child-in-group", + "path": "/api/organisationUnits.json?filter=children.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-41/api/organisationUnits.json?page=2&pageSize=1&filter=children.organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "list-assigned-ancestors", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,Zkx2DMsGgi0,RIinNUb6rg7]&filter=dataSets.id:eq:pRfTWd7fDDO&fields=id&paging=false", + "httpStatus": 200, + "response": { + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "me", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd", + "id": "ImspTQPwCqd", + "level": 1 + } + ] + } + }, + { + "name": "me-ptt-user", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ] + } + } + ] + }, + "2.42.7-SNAPSHOT": { + "instance": "dev-2-42", + "date": "2026-10-08", + "requests": [ + { + "name": "dataElements", + "path": "/api/dataElements.json?filter=code:$like:PTT_G3&filter=code:$like:PTT_DIS&rootJunction=OR&fields=id,code,name,aggregationType,valueType,domainType,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_DIS_BOTH", + "name": "PTT disaggregation both", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "MTEN4XmC0k3" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "DMfYb9cbUwP" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "wrXAErJOkRS", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_DIS_PLACE", + "name": "PTT disaggregation place", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Quarterly", + "id": "Ij6jwq1Ceiq" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + }, + { + "dataSet": { + "periodType": "Monthly", + "id": "NlZrxX5S0X8" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + } + ], + "id": "T4Gk4A7PTRJ", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_G3_HISTORY", + "name": "PTT G3 history", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "V0tylPzEYrt" + } + } + ], + "id": "hR0FkmDKXvh", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_MW", + "name": "PTT G3 mw", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "WeeklyWednesday", + "id": "wRXyMvEnlyA" + } + }, + { + "dataSet": { + "periodType": "Weekly", + "id": "YlravvdHwIj" + } + } + ], + "id": "hbv3rzk8Fne", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_ORPHAN", + "name": "PTT G3 orphan", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [], + "id": "idqEIJ4ahkB", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + } + ] + } + }, + { + "name": "indicators", + "path": "/api/indicators.json?filter=code:$like:PTT_G4&fields=id,code,name,numerator,denominator,annualized,indicatorType[id,factor]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "indicators": [ + { + "code": "PTT_G4_IND_CONSTANT", + "name": "PTT G4 indicator constant", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "C{Wi6GdGCugf3}", + "denominator": "1", + "id": "CF8eNia3IC2" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED", + "name": "PTT G4 indicator coverage-averaged", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "BZznfLUT5h4" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED", + "name": "PTT G4 indicator coverage-averaged-annualized", + "annualized": true, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "LQIWkVZzf5R" + }, + { + "code": "PTT_G4_IND_COVERAGE_SUMMED", + "name": "PTT G4 indicator coverage-summed", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{nxyiifFYsbc}", + "id": "xA7tYxOjjM3" + } + ] + } + }, + { + "name": "dataSets", + "path": "/api/dataSets.json?filter=code:$like:PTT_G5&fields=id,code,periodType,dataSetElements[dataElement[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataSets": [ + { + "code": "PTT_G5_DS_Daily", + "periodType": "Daily", + "dataSetElements": [ + { + "dataElement": { + "id": "fUFgSP0AtUj" + } + } + ], + "id": "WE8srTzzhBZ" + }, + { + "code": "PTT_G5_DS_Monthly", + "periodType": "Monthly", + "dataSetElements": [ + { + "dataElement": { + "id": "Nhe8HFuemuw" + } + } + ], + "id": "hFQny4kjg5C" + }, + { + "code": "PTT_G5_DS_Quarterly", + "periodType": "Quarterly", + "dataSetElements": [ + { + "dataElement": { + "id": "Kd94qfjkpYx" + } + } + ], + "id": "SYkQTXY6EcA" + }, + { + "code": "PTT_G5_DS_Weekly", + "periodType": "Weekly", + "dataSetElements": [ + { + "dataElement": { + "id": "AFJ5IID9t6Z" + } + } + ], + "id": "S1yLlm7Hk2W" + } + ] + } + }, + { + "name": "expressionDimensionItems", + "path": "/api/expressionDimensionItems.json?filter=code:$like:PTT&fields=id,code,expression,missingValueStrategy&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "expressionDimensionItems": [ + { + "code": "PTT_G4_EXPRESSION", + "expression": "#{BeN8IzxwwJF}*2", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "gdmRgPhI76J" + }, + { + "code": "PTT_G4_EXPRESSION_NEVER_SKIP", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "NEVER_SKIP", + "id": "JzaPFPBpfRB" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ALL", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "pnmCVrG9qnE" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ANY", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ANY_VALUE_MISSING", + "id": "XqnQKWKRqzs" + } + ] + } + }, + { + "name": "periodTypes", + "path": "/api/periodTypes.json?fields=name,isoFormat,isoDuration,frequencyOrder", + "httpStatus": 200, + "response": { + "periodTypes": [ + { + "name": "Daily", + "isoDuration": "P1D", + "isoFormat": "yyyyMMdd", + "frequencyOrder": 1 + }, + { + "name": "Weekly", + "isoDuration": "P7D", + "isoFormat": "yyyyWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyWednesday", + "isoDuration": "P7D", + "isoFormat": "yyyyWedWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyThursday", + "isoDuration": "P7D", + "isoFormat": "yyyyThuWn", + "frequencyOrder": 7 + } + ] + } + }, + { + "name": "categoryOptionCombos", + "path": "/api/categoryOptionCombos.json?filter=id:in:[HllvX50cXC0,l6y6maQF8He,eUlTvjHxjZF,MHtSLMctHku,eHq7UQzuwBc]&fields=id,categoryCombo[id]&paging=false&order=id:asc", + "httpStatus": 200, + "response": { + "categoryOptionCombos": [ + { + "categoryCombo": { + "id": "GFe8Z3ErDol" + }, + "id": "eHq7UQzuwBc" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "eUlTvjHxjZF" + }, + { + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "id": "HllvX50cXC0" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "l6y6maQF8He" + } + ] + } + }, + { + "name": "dataElements-aggregationLevels", + "path": "/api/dataElements.json?filter=code:$like:PTT_OU_AGG&fields=id,code,aggregationType,aggregationLevels,dataSetElements[dataSet[id,periodType]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_OU_AGG_D1_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "Yo1BsQNngHy" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "ZRYrXnbcbjJ" + }, + { + "code": "PTT_OU_AGG_F_2", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "b5xszkgbXVd" + } + } + ], + "aggregationLevels": [ + 2 + ], + "id": "RNhL3JmLlC0" + }, + { + "code": "PTT_OU_AGG_F_2_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "CGAbAPpLZTo" + } + } + ], + "aggregationLevels": [ + 2, + 3 + ], + "id": "WZ6aknVLD9A" + }, + { + "code": "PTT_OU_AGG_F_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "dM4sBCBFDDC" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "FPp01mLrknd" + } + ] + } + }, + { + "name": "programIndicators", + "path": "/api/programIndicators.json?filter=code:$like:PTT_PROG&fields=id,code,program[id],orgUnitField,analyticsType,analyticsPeriodBoundaries[id]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programIndicators": [ + { + "code": "PTT_PROG_PI_EVENT", + "program": { + "id": "KfzRtyEQHht" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "ROyKtdN1Ob5" + }, + { + "id": "VWAcH9fhyXA" + } + ], + "id": "TafgHfMvqW7" + }, + { + "code": "PTT_PROG_PI_EVENT_PLACE", + "program": { + "id": "KfzRtyEQHht" + }, + "orgUnitField": "WJ1j79Dlubx", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "coovoh5QYa7" + }, + { + "id": "YBxA4B0pEhG" + } + ], + "id": "eSWGLPCy2ZK" + }, + { + "code": "PTT_PROG_PI_TRACKER", + "program": { + "id": "lAcD9QrX1xQ" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "JjPtC5h0wFG" + }, + { + "id": "YEfaD4k98Sg" + } + ], + "id": "NTvweRnHeLC" + }, + { + "code": "PTT_PROG_PI_TRACKER_ENROLLMENT", + "program": { + "id": "lAcD9QrX1xQ" + }, + "orgUnitField": "ENROLLMENT", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "Hv5fbUh1n1U" + }, + { + "id": "JuYOPkPPJ02" + } + ], + "id": "nYG1z4dFVnX" + } + ] + } + }, + { + "name": "programs", + "path": "/api/programs.json?filter=code:$like:PTT_PROG&fields=id,code,programType&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programs": [ + { + "code": "PTT_PROG_EVENT", + "programType": "WITHOUT_REGISTRATION", + "id": "KfzRtyEQHht" + }, + { + "code": "PTT_PROG_TRACKER", + "programType": "WITH_REGISTRATION", + "id": "lAcD9QrX1xQ" + } + ] + } + }, + { + "name": "organisationUnitLevels", + "path": "/api/organisationUnitLevels.json?fields=id,level,displayName&paging=false&order=level:asc", + "httpStatus": 200, + "response": { + "organisationUnitLevels": [ + { + "level": 1, + "displayName": "National", + "id": "H1KlN4QIauv" + }, + { + "level": 2, + "displayName": "District", + "id": "wjP19dkFeIk" + }, + { + "level": 3, + "displayName": "Chiefdom", + "id": "tTUf91fCytl" + }, + { + "level": 4, + "displayName": "Facility", + "id": "m9lBJogzE95" + } + ] + } + }, + { + "name": "count-level", + "path": "/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 1169, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-42/api/organisationUnits.json?page=2&pageSize=1&filter=level%3Aeq%3A4&fields=id", + "pageCount": 1169 + }, + "organisationUnits": [ + { + "id": "Rp268JB6Ne4" + } + ] + } + }, + { + "name": "count-path", + "path": "/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 9, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-42/api/organisationUnits.json?page=2&pageSize=1&filter=path%3Alike%3ARIinNUb6rg7&fields=id", + "pageCount": 9 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "count-dataSet", + "path": "/api/organisationUnits.json?filter=dataSets.id:eq:v200HCJsE6E&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-42/api/organisationUnits.json?page=2&pageSize=1&filter=dataSets.id%3Aeq%3Av200HCJsE6E&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-program", + "path": "/api/organisationUnits.json?filter=programs.id:eq:KfzRtyEQHht&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-42/api/organisationUnits.json?page=2&pageSize=1&filter=programs.id%3Aeq%3AKfzRtyEQHht&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-ids", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-42/api/organisationUnits.json?page=2&pageSize=1&filter=id%3Ain%3A%5BtsmDjF9bxzK%2CYcWWJD42rFM%2CTHU3mEbE4b6%5D&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "THU3mEbE4b6" + } + ] + } + }, + { + "name": "count-group", + "path": "/api/organisationUnits.json?filter=organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-42/api/organisationUnits.json?page=2&pageSize=1&filter=organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "ZBm5vBRXjeH" + } + ] + } + }, + { + "name": "count-grandparent-in-group", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:TTEvM2Zx7wF&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-42/api/organisationUnits.json?page=2&pageSize=1&filter=parent.parent.organisationUnitGroups.id%3Aeq%3ATTEvM2Zx7wF&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-grandparent-in-group-none", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 0, + "pageSize": 1, + "pageCount": 0 + }, + "organisationUnits": [] + } + }, + { + "name": "count-child-in-group", + "path": "/api/organisationUnits.json?filter=children.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-42/api/organisationUnits.json?page=2&pageSize=1&filter=children.organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "list-assigned-ancestors", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,Zkx2DMsGgi0,RIinNUb6rg7]&filter=dataSets.id:eq:pRfTWd7fDDO&fields=id&paging=false", + "httpStatus": 200, + "response": { + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "me", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd", + "id": "ImspTQPwCqd", + "level": 1 + } + ] + } + }, + { + "name": "me-ptt-user", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ] + } + } + ] + }, + "2.43.3-SNAPSHOT": { + "instance": "dev-2-43", + "date": "2026-10-08", + "requests": [ + { + "name": "dataElements", + "path": "/api/dataElements.json?filter=code:$like:PTT_G3&filter=code:$like:PTT_DIS&rootJunction=OR&fields=id,code,name,aggregationType,valueType,domainType,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_DIS_BOTH", + "name": "PTT disaggregation both", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "MTEN4XmC0k3" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "DMfYb9cbUwP" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "wrXAErJOkRS", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_DIS_PLACE", + "name": "PTT disaggregation place", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "NlZrxX5S0X8" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "Ij6jwq1Ceiq" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "T4Gk4A7PTRJ", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_G3_HISTORY", + "name": "PTT G3 history", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "V0tylPzEYrt" + } + } + ], + "id": "hR0FkmDKXvh", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_MW", + "name": "PTT G3 mw", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "YlravvdHwIj" + } + }, + { + "dataSet": { + "periodType": "WeeklyWednesday", + "id": "wRXyMvEnlyA" + } + } + ], + "id": "hbv3rzk8Fne", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_ORPHAN", + "name": "PTT G3 orphan", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [], + "id": "idqEIJ4ahkB", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + } + ] + } + }, + { + "name": "indicators", + "path": "/api/indicators.json?filter=code:$like:PTT_G4&fields=id,code,name,numerator,denominator,annualized,indicatorType[id,factor]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "indicators": [ + { + "code": "PTT_G4_IND_CONSTANT", + "name": "PTT G4 indicator constant", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "C{Wi6GdGCugf3}", + "denominator": "1", + "id": "CF8eNia3IC2" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED", + "name": "PTT G4 indicator coverage-averaged", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "BZznfLUT5h4" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED", + "name": "PTT G4 indicator coverage-averaged-annualized", + "annualized": true, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "LQIWkVZzf5R" + }, + { + "code": "PTT_G4_IND_COVERAGE_SUMMED", + "name": "PTT G4 indicator coverage-summed", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{nxyiifFYsbc}", + "id": "xA7tYxOjjM3" + } + ] + } + }, + { + "name": "dataSets", + "path": "/api/dataSets.json?filter=code:$like:PTT_G5&fields=id,code,periodType,dataSetElements[dataElement[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataSets": [ + { + "code": "PTT_G5_DS_Daily", + "periodType": "Daily", + "dataSetElements": [ + { + "dataElement": { + "id": "fUFgSP0AtUj" + } + } + ], + "id": "WE8srTzzhBZ" + }, + { + "code": "PTT_G5_DS_Monthly", + "periodType": "Monthly", + "dataSetElements": [ + { + "dataElement": { + "id": "Nhe8HFuemuw" + } + } + ], + "id": "hFQny4kjg5C" + }, + { + "code": "PTT_G5_DS_Quarterly", + "periodType": "Quarterly", + "dataSetElements": [ + { + "dataElement": { + "id": "Kd94qfjkpYx" + } + } + ], + "id": "SYkQTXY6EcA" + }, + { + "code": "PTT_G5_DS_Weekly", + "periodType": "Weekly", + "dataSetElements": [ + { + "dataElement": { + "id": "AFJ5IID9t6Z" + } + } + ], + "id": "S1yLlm7Hk2W" + } + ] + } + }, + { + "name": "expressionDimensionItems", + "path": "/api/expressionDimensionItems.json?filter=code:$like:PTT&fields=id,code,expression,missingValueStrategy&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "expressionDimensionItems": [ + { + "code": "PTT_G4_EXPRESSION", + "expression": "#{BeN8IzxwwJF}*2", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "gdmRgPhI76J" + }, + { + "code": "PTT_G4_EXPRESSION_NEVER_SKIP", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "NEVER_SKIP", + "id": "JzaPFPBpfRB" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ALL", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "pnmCVrG9qnE" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ANY", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ANY_VALUE_MISSING", + "id": "XqnQKWKRqzs" + } + ] + } + }, + { + "name": "periodTypes", + "path": "/api/periodTypes.json?fields=name,isoFormat,isoDuration,frequencyOrder", + "httpStatus": 200, + "response": { + "periodTypes": [ + { + "name": "BiMonthly", + "isoDuration": "P2M", + "isoFormat": "yyyyMMB", + "frequencyOrder": 61 + }, + { + "name": "BiWeekly", + "isoDuration": "P14D", + "isoFormat": "yyyyBiWn", + "frequencyOrder": 14 + }, + { + "name": "Daily", + "isoDuration": "P1D", + "isoFormat": "yyyyMMdd", + "frequencyOrder": 1 + }, + { + "name": "FinancialApril", + "isoDuration": "P1Y", + "isoFormat": "yyyyApril", + "frequencyOrder": 365 + } + ] + } + }, + { + "name": "categoryOptionCombos", + "path": "/api/categoryOptionCombos.json?filter=id:in:[HllvX50cXC0,l6y6maQF8He,eUlTvjHxjZF,MHtSLMctHku,eHq7UQzuwBc]&fields=id,categoryCombo[id]&paging=false&order=id:asc", + "httpStatus": 200, + "response": { + "categoryOptionCombos": [ + { + "categoryCombo": { + "id": "GFe8Z3ErDol" + }, + "id": "eHq7UQzuwBc" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "eUlTvjHxjZF" + }, + { + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "id": "HllvX50cXC0" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "l6y6maQF8He" + } + ] + } + }, + { + "name": "dataElements-aggregationLevels", + "path": "/api/dataElements.json?filter=code:$like:PTT_OU_AGG&fields=id,code,aggregationType,aggregationLevels,dataSetElements[dataSet[id,periodType]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_OU_AGG_D1_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "Yo1BsQNngHy" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "ZRYrXnbcbjJ" + }, + { + "code": "PTT_OU_AGG_F_2", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "b5xszkgbXVd" + } + } + ], + "aggregationLevels": [ + 2 + ], + "id": "RNhL3JmLlC0" + }, + { + "code": "PTT_OU_AGG_F_2_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "CGAbAPpLZTo" + } + } + ], + "aggregationLevels": [ + 2, + 3 + ], + "id": "WZ6aknVLD9A" + }, + { + "code": "PTT_OU_AGG_F_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "dM4sBCBFDDC" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "FPp01mLrknd" + } + ] + } + }, + { + "name": "programIndicators", + "path": "/api/programIndicators.json?filter=code:$like:PTT_PROG&fields=id,code,program[id],orgUnitField,analyticsType,analyticsPeriodBoundaries[id]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programIndicators": [ + { + "code": "PTT_PROG_PI_EVENT", + "program": { + "id": "KfzRtyEQHht" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "xpEUV6BEhzU" + }, + { + "id": "S606Zn8Wsu3" + } + ], + "id": "TafgHfMvqW7" + }, + { + "code": "PTT_PROG_PI_EVENT_PLACE", + "program": { + "id": "KfzRtyEQHht" + }, + "orgUnitField": "WJ1j79Dlubx", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "yXTRA3pTUqs" + }, + { + "id": "Bjkk5TJRlGh" + } + ], + "id": "eSWGLPCy2ZK" + }, + { + "code": "PTT_PROG_PI_TRACKER", + "program": { + "id": "lAcD9QrX1xQ" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "gTvRJyoCIQ1" + }, + { + "id": "Bn8Ubjk8iNc" + } + ], + "id": "NTvweRnHeLC" + }, + { + "code": "PTT_PROG_PI_TRACKER_ENROLLMENT", + "program": { + "id": "lAcD9QrX1xQ" + }, + "orgUnitField": "ENROLLMENT", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "bxhXSZNsfto" + }, + { + "id": "uZJfTAobu4D" + } + ], + "id": "nYG1z4dFVnX" + } + ] + } + }, + { + "name": "programs", + "path": "/api/programs.json?filter=code:$like:PTT_PROG&fields=id,code,programType&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programs": [ + { + "code": "PTT_PROG_EVENT", + "programType": "WITHOUT_REGISTRATION", + "id": "KfzRtyEQHht" + }, + { + "code": "PTT_PROG_TRACKER", + "programType": "WITH_REGISTRATION", + "id": "lAcD9QrX1xQ" + } + ] + } + }, + { + "name": "organisationUnitLevels", + "path": "/api/organisationUnitLevels.json?fields=id,level,displayName&paging=false&order=level:asc", + "httpStatus": 200, + "response": { + "organisationUnitLevels": [ + { + "level": 1, + "displayName": "National", + "id": "H1KlN4QIauv" + }, + { + "level": 2, + "displayName": "District", + "id": "wjP19dkFeIk" + }, + { + "level": 3, + "displayName": "Chiefdom", + "id": "tTUf91fCytl" + }, + { + "level": 4, + "displayName": "Facility", + "id": "m9lBJogzE95" + } + ] + } + }, + { + "name": "count-level", + "path": "/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 1169, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-43/api/organisationUnits.json?page=2&pageSize=1&filter=level%3Aeq%3A4&fields=id", + "pageCount": 1169 + }, + "organisationUnits": [ + { + "id": "Rp268JB6Ne4" + } + ] + } + }, + { + "name": "count-path", + "path": "/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 9, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-43/api/organisationUnits.json?page=2&pageSize=1&filter=path%3Alike%3ARIinNUb6rg7&fields=id", + "pageCount": 9 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "count-dataSet", + "path": "/api/organisationUnits.json?filter=dataSets.id:eq:v200HCJsE6E&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-43/api/organisationUnits.json?page=2&pageSize=1&filter=dataSets.id%3Aeq%3Av200HCJsE6E&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-program", + "path": "/api/organisationUnits.json?filter=programs.id:eq:KfzRtyEQHht&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-43/api/organisationUnits.json?page=2&pageSize=1&filter=programs.id%3Aeq%3AKfzRtyEQHht&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-ids", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-43/api/organisationUnits.json?page=2&pageSize=1&filter=id%3Ain%3A%5BtsmDjF9bxzK%2CYcWWJD42rFM%2CTHU3mEbE4b6%5D&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "THU3mEbE4b6" + } + ] + } + }, + { + "name": "count-group", + "path": "/api/organisationUnits.json?filter=organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-43/api/organisationUnits.json?page=2&pageSize=1&filter=organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "ZBm5vBRXjeH" + } + ] + } + }, + { + "name": "count-grandparent-in-group", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:TTEvM2Zx7wF&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-43/api/organisationUnits.json?page=2&pageSize=1&filter=parent.parent.organisationUnitGroups.id%3Aeq%3ATTEvM2Zx7wF&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-grandparent-in-group-none", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 0, + "pageSize": 1, + "pageCount": 0 + }, + "organisationUnits": [] + } + }, + { + "name": "count-child-in-group", + "path": "/api/organisationUnits.json?filter=children.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/dev-2-43/api/organisationUnits.json?page=2&pageSize=1&filter=children.organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "list-assigned-ancestors", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,Zkx2DMsGgi0,RIinNUb6rg7]&filter=dataSets.id:eq:pRfTWd7fDDO&fields=id&paging=false", + "httpStatus": 200, + "response": { + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "me", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd", + "id": "ImspTQPwCqd", + "level": 1 + } + ] + } + }, + { + "name": "me-ptt-user", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ] + } + } + ] + }, + "2.40.12": { + "instance": "stable-2-40-12", + "date": "2026-10-08", + "requests": [ + { + "name": "dataElements", + "path": "/api/dataElements.json?filter=code:$like:PTT_G3&filter=code:$like:PTT_DIS&rootJunction=OR&fields=id,code,name,aggregationType,valueType,domainType,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_DIS_BOTH", + "name": "PTT disaggregation both", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "MTEN4XmC0k3" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "DMfYb9cbUwP" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "wrXAErJOkRS", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_DIS_PLACE", + "name": "PTT disaggregation place", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Quarterly", + "id": "Ij6jwq1Ceiq" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + }, + { + "dataSet": { + "periodType": "Monthly", + "id": "NlZrxX5S0X8" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + } + ], + "id": "T4Gk4A7PTRJ", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_G3_HISTORY", + "name": "PTT G3 history", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "V0tylPzEYrt" + } + } + ], + "id": "hR0FkmDKXvh", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_MW", + "name": "PTT G3 mw", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "WeeklyWednesday", + "id": "wRXyMvEnlyA" + } + }, + { + "dataSet": { + "periodType": "Weekly", + "id": "YlravvdHwIj" + } + } + ], + "id": "hbv3rzk8Fne", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_ORPHAN", + "name": "PTT G3 orphan", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [], + "id": "idqEIJ4ahkB", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + } + ] + } + }, + { + "name": "indicators", + "path": "/api/indicators.json?filter=code:$like:PTT_G4&fields=id,code,name,numerator,denominator,annualized,indicatorType[id,factor]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "indicators": [ + { + "code": "PTT_G4_IND_CONSTANT", + "name": "PTT G4 indicator constant", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "C{Wi6GdGCugf3}", + "denominator": "1", + "id": "CF8eNia3IC2" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED", + "name": "PTT G4 indicator coverage-averaged", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "BZznfLUT5h4" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED", + "name": "PTT G4 indicator coverage-averaged-annualized", + "annualized": true, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "LQIWkVZzf5R" + }, + { + "code": "PTT_G4_IND_COVERAGE_SUMMED", + "name": "PTT G4 indicator coverage-summed", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{nxyiifFYsbc}", + "id": "xA7tYxOjjM3" + } + ] + } + }, + { + "name": "dataSets", + "path": "/api/dataSets.json?filter=code:$like:PTT_G5&fields=id,code,periodType,dataSetElements[dataElement[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataSets": [ + { + "code": "PTT_G5_DS_Daily", + "periodType": "Daily", + "dataSetElements": [ + { + "dataElement": { + "id": "fUFgSP0AtUj" + } + } + ], + "id": "WE8srTzzhBZ" + }, + { + "code": "PTT_G5_DS_Monthly", + "periodType": "Monthly", + "dataSetElements": [ + { + "dataElement": { + "id": "Nhe8HFuemuw" + } + } + ], + "id": "hFQny4kjg5C" + }, + { + "code": "PTT_G5_DS_Quarterly", + "periodType": "Quarterly", + "dataSetElements": [ + { + "dataElement": { + "id": "Kd94qfjkpYx" + } + } + ], + "id": "SYkQTXY6EcA" + }, + { + "code": "PTT_G5_DS_Weekly", + "periodType": "Weekly", + "dataSetElements": [ + { + "dataElement": { + "id": "AFJ5IID9t6Z" + } + } + ], + "id": "S1yLlm7Hk2W" + } + ] + } + }, + { + "name": "expressionDimensionItems", + "path": "/api/expressionDimensionItems.json?filter=code:$like:PTT&fields=id,code,expression,missingValueStrategy&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "expressionDimensionItems": [ + { + "code": "PTT_G4_EXPRESSION", + "expression": "#{BeN8IzxwwJF}*2", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "gdmRgPhI76J" + }, + { + "code": "PTT_G4_EXPRESSION_NEVER_SKIP", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "NEVER_SKIP", + "id": "JzaPFPBpfRB" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ALL", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "pnmCVrG9qnE" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ANY", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ANY_VALUE_MISSING", + "id": "XqnQKWKRqzs" + } + ] + } + }, + { + "name": "periodTypes", + "path": "/api/periodTypes.json?fields=name,isoFormat,isoDuration,frequencyOrder", + "httpStatus": 200, + "response": { + "periodTypes": [ + { + "name": "Daily", + "isoDuration": "P1D", + "isoFormat": "yyyyMMdd", + "frequencyOrder": 1 + }, + { + "name": "Weekly", + "isoDuration": "P7D", + "isoFormat": "yyyyWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyWednesday", + "isoDuration": "P7D", + "isoFormat": "yyyyWedWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyThursday", + "isoDuration": "P7D", + "isoFormat": "yyyyThuWn", + "frequencyOrder": 7 + } + ] + } + }, + { + "name": "categoryOptionCombos", + "path": "/api/categoryOptionCombos.json?filter=id:in:[HllvX50cXC0,l6y6maQF8He,eUlTvjHxjZF,MHtSLMctHku,eHq7UQzuwBc]&fields=id,categoryCombo[id]&paging=false&order=id:asc", + "httpStatus": 200, + "response": { + "categoryOptionCombos": [ + { + "categoryCombo": { + "id": "GFe8Z3ErDol" + }, + "id": "eHq7UQzuwBc" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "eUlTvjHxjZF" + }, + { + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "id": "HllvX50cXC0" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "l6y6maQF8He" + } + ] + } + }, + { + "name": "dataElements-aggregationLevels", + "path": "/api/dataElements.json?filter=code:$like:PTT_OU_AGG&fields=id,code,aggregationType,aggregationLevels,dataSetElements[dataSet[id,periodType]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_OU_AGG_D1_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "Yo1BsQNngHy" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "ZRYrXnbcbjJ" + }, + { + "code": "PTT_OU_AGG_F_2", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "b5xszkgbXVd" + } + } + ], + "aggregationLevels": [ + 2 + ], + "id": "RNhL3JmLlC0" + }, + { + "code": "PTT_OU_AGG_F_2_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "CGAbAPpLZTo" + } + } + ], + "aggregationLevels": [ + 2, + 3 + ], + "id": "WZ6aknVLD9A" + }, + { + "code": "PTT_OU_AGG_F_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "dM4sBCBFDDC" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "FPp01mLrknd" + } + ] + } + }, + { + "name": "programIndicators", + "path": "/api/programIndicators.json?filter=code:$like:PTT_PROG&fields=id,code,program[id],orgUnitField,analyticsType,analyticsPeriodBoundaries[id]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programIndicators": [ + { + "code": "PTT_PROG_PI_EVENT", + "program": { + "id": "KfzRtyEQHht" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "mvpy2gLFMsO" + }, + { + "id": "rz1qiY9ZtTM" + } + ], + "id": "TafgHfMvqW7" + }, + { + "code": "PTT_PROG_PI_EVENT_PLACE", + "program": { + "id": "KfzRtyEQHht" + }, + "orgUnitField": "WJ1j79Dlubx", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "MqVHknwCHgI" + }, + { + "id": "ZJiOjFW5ckN" + } + ], + "id": "eSWGLPCy2ZK" + }, + { + "code": "PTT_PROG_PI_TRACKER", + "program": { + "id": "lAcD9QrX1xQ" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "xEouvodlHu2" + }, + { + "id": "l2liAUGOIzL" + } + ], + "id": "NTvweRnHeLC" + }, + { + "code": "PTT_PROG_PI_TRACKER_ENROLLMENT", + "program": { + "id": "lAcD9QrX1xQ" + }, + "orgUnitField": "ENROLLMENT", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "Gjo1MEhYF00" + }, + { + "id": "ZVO1jdzRX1i" + } + ], + "id": "nYG1z4dFVnX" + } + ] + } + }, + { + "name": "programs", + "path": "/api/programs.json?filter=code:$like:PTT_PROG&fields=id,code,programType&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programs": [ + { + "code": "PTT_PROG_EVENT", + "programType": "WITHOUT_REGISTRATION", + "id": "KfzRtyEQHht" + }, + { + "code": "PTT_PROG_TRACKER", + "programType": "WITH_REGISTRATION", + "id": "lAcD9QrX1xQ" + } + ] + } + }, + { + "name": "organisationUnitLevels", + "path": "/api/organisationUnitLevels.json?fields=id,level,displayName&paging=false&order=level:asc", + "httpStatus": 200, + "response": { + "organisationUnitLevels": [ + { + "level": 1, + "displayName": "National", + "id": "H1KlN4QIauv" + }, + { + "level": 2, + "displayName": "District", + "id": "wjP19dkFeIk" + }, + { + "level": 3, + "displayName": "Chiefdom", + "id": "tTUf91fCytl" + }, + { + "level": 4, + "displayName": "Facility", + "id": "m9lBJogzE95" + } + ] + } + }, + { + "name": "count-level", + "path": "/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 1169, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-40-12/api/organisationUnits.json?page=2&pageSize=1&filter=level%3Aeq%3A4&fields=id", + "pageCount": 1169 + }, + "organisationUnits": [ + { + "id": "Rp268JB6Ne4" + } + ] + } + }, + { + "name": "count-path", + "path": "/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 9, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-40-12/api/organisationUnits.json?page=2&pageSize=1&filter=path%3Alike%3ARIinNUb6rg7&fields=id", + "pageCount": 9 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "count-dataSet", + "path": "/api/organisationUnits.json?filter=dataSets.id:eq:v200HCJsE6E&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-40-12/api/organisationUnits.json?page=2&pageSize=1&filter=dataSets.id%3Aeq%3Av200HCJsE6E&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-program", + "path": "/api/organisationUnits.json?filter=programs.id:eq:KfzRtyEQHht&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-40-12/api/organisationUnits.json?page=2&pageSize=1&filter=programs.id%3Aeq%3AKfzRtyEQHht&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-ids", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-40-12/api/organisationUnits.json?page=2&pageSize=1&filter=id%3Ain%3A%5BtsmDjF9bxzK%2CYcWWJD42rFM%2CTHU3mEbE4b6%5D&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "THU3mEbE4b6" + } + ] + } + }, + { + "name": "count-group", + "path": "/api/organisationUnits.json?filter=organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-40-12/api/organisationUnits.json?page=2&pageSize=1&filter=organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "ZBm5vBRXjeH" + } + ] + } + }, + { + "name": "count-grandparent-in-group", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:TTEvM2Zx7wF&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-40-12/api/organisationUnits.json?page=2&pageSize=1&filter=parent.parent.organisationUnitGroups.id%3Aeq%3ATTEvM2Zx7wF&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-grandparent-in-group-none", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 0, + "pageSize": 1, + "pageCount": 0 + }, + "organisationUnits": [] + } + }, + { + "name": "count-child-in-group", + "path": "/api/organisationUnits.json?filter=children.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-40-12/api/organisationUnits.json?page=2&pageSize=1&filter=children.organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "list-assigned-ancestors", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,Zkx2DMsGgi0,RIinNUb6rg7]&filter=dataSets.id:eq:pRfTWd7fDDO&fields=id&paging=false", + "httpStatus": 200, + "response": { + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "me", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd", + "id": "ImspTQPwCqd", + "level": 1 + } + ] + } + }, + { + "name": "me-ptt-user", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ] + } + } + ] + }, + "2.41.10": { + "instance": "stable-2-41-10", + "date": "2026-10-08", + "requests": [ + { + "name": "dataElements", + "path": "/api/dataElements.json?filter=code:$like:PTT_G3&filter=code:$like:PTT_DIS&rootJunction=OR&fields=id,code,name,aggregationType,valueType,domainType,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_DIS_BOTH", + "name": "PTT disaggregation both", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Quarterly", + "id": "DMfYb9cbUwP" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + }, + { + "dataSet": { + "periodType": "Monthly", + "id": "MTEN4XmC0k3" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + } + ], + "id": "wrXAErJOkRS", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_DIS_PLACE", + "name": "PTT disaggregation place", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Quarterly", + "id": "Ij6jwq1Ceiq" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + }, + { + "dataSet": { + "periodType": "Monthly", + "id": "NlZrxX5S0X8" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + } + ], + "id": "T4Gk4A7PTRJ", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_G3_HISTORY", + "name": "PTT G3 history", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "V0tylPzEYrt" + } + } + ], + "id": "hR0FkmDKXvh", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_MW", + "name": "PTT G3 mw", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "WeeklyWednesday", + "id": "wRXyMvEnlyA" + } + }, + { + "dataSet": { + "periodType": "Weekly", + "id": "YlravvdHwIj" + } + } + ], + "id": "hbv3rzk8Fne", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_ORPHAN", + "name": "PTT G3 orphan", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [], + "id": "idqEIJ4ahkB", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + } + ] + } + }, + { + "name": "indicators", + "path": "/api/indicators.json?filter=code:$like:PTT_G4&fields=id,code,name,numerator,denominator,annualized,indicatorType[id,factor]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "indicators": [ + { + "code": "PTT_G4_IND_CONSTANT", + "name": "PTT G4 indicator constant", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "C{Wi6GdGCugf3}", + "denominator": "1", + "id": "CF8eNia3IC2" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED", + "name": "PTT G4 indicator coverage-averaged", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "BZznfLUT5h4" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED", + "name": "PTT G4 indicator coverage-averaged-annualized", + "annualized": true, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "LQIWkVZzf5R" + }, + { + "code": "PTT_G4_IND_COVERAGE_SUMMED", + "name": "PTT G4 indicator coverage-summed", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{nxyiifFYsbc}", + "id": "xA7tYxOjjM3" + } + ] + } + }, + { + "name": "dataSets", + "path": "/api/dataSets.json?filter=code:$like:PTT_G5&fields=id,code,periodType,dataSetElements[dataElement[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataSets": [ + { + "code": "PTT_G5_DS_Daily", + "periodType": "Daily", + "dataSetElements": [ + { + "dataElement": { + "id": "fUFgSP0AtUj" + } + } + ], + "id": "WE8srTzzhBZ" + }, + { + "code": "PTT_G5_DS_Monthly", + "periodType": "Monthly", + "dataSetElements": [ + { + "dataElement": { + "id": "Nhe8HFuemuw" + } + } + ], + "id": "hFQny4kjg5C" + }, + { + "code": "PTT_G5_DS_Quarterly", + "periodType": "Quarterly", + "dataSetElements": [ + { + "dataElement": { + "id": "Kd94qfjkpYx" + } + } + ], + "id": "SYkQTXY6EcA" + }, + { + "code": "PTT_G5_DS_Weekly", + "periodType": "Weekly", + "dataSetElements": [ + { + "dataElement": { + "id": "AFJ5IID9t6Z" + } + } + ], + "id": "S1yLlm7Hk2W" + } + ] + } + }, + { + "name": "expressionDimensionItems", + "path": "/api/expressionDimensionItems.json?filter=code:$like:PTT&fields=id,code,expression,missingValueStrategy&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "expressionDimensionItems": [ + { + "code": "PTT_G4_EXPRESSION", + "expression": "#{BeN8IzxwwJF}*2", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "gdmRgPhI76J" + }, + { + "code": "PTT_G4_EXPRESSION_NEVER_SKIP", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "NEVER_SKIP", + "id": "JzaPFPBpfRB" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ALL", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "pnmCVrG9qnE" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ANY", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ANY_VALUE_MISSING", + "id": "XqnQKWKRqzs" + } + ] + } + }, + { + "name": "periodTypes", + "path": "/api/periodTypes.json?fields=name,isoFormat,isoDuration,frequencyOrder", + "httpStatus": 200, + "response": { + "periodTypes": [ + { + "name": "Daily", + "isoDuration": "P1D", + "isoFormat": "yyyyMMdd", + "frequencyOrder": 1 + }, + { + "name": "Weekly", + "isoDuration": "P7D", + "isoFormat": "yyyyWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyWednesday", + "isoDuration": "P7D", + "isoFormat": "yyyyWedWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyThursday", + "isoDuration": "P7D", + "isoFormat": "yyyyThuWn", + "frequencyOrder": 7 + } + ] + } + }, + { + "name": "categoryOptionCombos", + "path": "/api/categoryOptionCombos.json?filter=id:in:[HllvX50cXC0,l6y6maQF8He,eUlTvjHxjZF,MHtSLMctHku,eHq7UQzuwBc]&fields=id,categoryCombo[id]&paging=false&order=id:asc", + "httpStatus": 200, + "response": { + "categoryOptionCombos": [ + { + "categoryCombo": { + "id": "GFe8Z3ErDol" + }, + "id": "eHq7UQzuwBc" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "eUlTvjHxjZF" + }, + { + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "id": "HllvX50cXC0" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "l6y6maQF8He" + } + ] + } + }, + { + "name": "dataElements-aggregationLevels", + "path": "/api/dataElements.json?filter=code:$like:PTT_OU_AGG&fields=id,code,aggregationType,aggregationLevels,dataSetElements[dataSet[id,periodType]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_OU_AGG_D1_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "Yo1BsQNngHy" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "ZRYrXnbcbjJ" + }, + { + "code": "PTT_OU_AGG_F_2", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "b5xszkgbXVd" + } + } + ], + "aggregationLevels": [ + 2 + ], + "id": "RNhL3JmLlC0" + }, + { + "code": "PTT_OU_AGG_F_2_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "CGAbAPpLZTo" + } + } + ], + "aggregationLevels": [ + 2, + 3 + ], + "id": "WZ6aknVLD9A" + }, + { + "code": "PTT_OU_AGG_F_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "dM4sBCBFDDC" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "FPp01mLrknd" + } + ] + } + }, + { + "name": "programIndicators", + "path": "/api/programIndicators.json?filter=code:$like:PTT_PROG&fields=id,code,program[id],orgUnitField,analyticsType,analyticsPeriodBoundaries[id]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programIndicators": [ + { + "code": "PTT_PROG_PI_EVENT", + "program": { + "id": "KfzRtyEQHht" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "Su75hwxVkDt" + }, + { + "id": "mbjfRMuVRAN" + } + ], + "id": "TafgHfMvqW7" + }, + { + "code": "PTT_PROG_PI_EVENT_PLACE", + "program": { + "id": "KfzRtyEQHht" + }, + "orgUnitField": "WJ1j79Dlubx", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "qOGEFw6ae7c" + }, + { + "id": "RBEePZkXRzr" + } + ], + "id": "eSWGLPCy2ZK" + }, + { + "code": "PTT_PROG_PI_TRACKER", + "program": { + "id": "lAcD9QrX1xQ" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "AH5Wfye87pn" + }, + { + "id": "KkzLC2R2Msh" + } + ], + "id": "NTvweRnHeLC" + }, + { + "code": "PTT_PROG_PI_TRACKER_ENROLLMENT", + "program": { + "id": "lAcD9QrX1xQ" + }, + "orgUnitField": "ENROLLMENT", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "xJpwKeiAFht" + }, + { + "id": "CQ5h9CkEWpe" + } + ], + "id": "nYG1z4dFVnX" + } + ] + } + }, + { + "name": "programs", + "path": "/api/programs.json?filter=code:$like:PTT_PROG&fields=id,code,programType&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programs": [ + { + "code": "PTT_PROG_EVENT", + "programType": "WITHOUT_REGISTRATION", + "id": "KfzRtyEQHht" + }, + { + "code": "PTT_PROG_TRACKER", + "programType": "WITH_REGISTRATION", + "id": "lAcD9QrX1xQ" + } + ] + } + }, + { + "name": "organisationUnitLevels", + "path": "/api/organisationUnitLevels.json?fields=id,level,displayName&paging=false&order=level:asc", + "httpStatus": 200, + "response": { + "organisationUnitLevels": [ + { + "level": 1, + "displayName": "National", + "id": "H1KlN4QIauv" + }, + { + "level": 2, + "displayName": "District", + "id": "wjP19dkFeIk" + }, + { + "level": 3, + "displayName": "Chiefdom", + "id": "tTUf91fCytl" + }, + { + "level": 4, + "displayName": "Facility", + "id": "m9lBJogzE95" + } + ] + } + }, + { + "name": "count-level", + "path": "/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 1169, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-41-10/api/organisationUnits.json?page=2&pageSize=1&filter=level%3Aeq%3A4&fields=id", + "pageCount": 1169 + }, + "organisationUnits": [ + { + "id": "Rp268JB6Ne4" + } + ] + } + }, + { + "name": "count-path", + "path": "/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 9, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-41-10/api/organisationUnits.json?page=2&pageSize=1&filter=path%3Alike%3ARIinNUb6rg7&fields=id", + "pageCount": 9 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "count-dataSet", + "path": "/api/organisationUnits.json?filter=dataSets.id:eq:v200HCJsE6E&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-41-10/api/organisationUnits.json?page=2&pageSize=1&filter=dataSets.id%3Aeq%3Av200HCJsE6E&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-program", + "path": "/api/organisationUnits.json?filter=programs.id:eq:KfzRtyEQHht&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-41-10/api/organisationUnits.json?page=2&pageSize=1&filter=programs.id%3Aeq%3AKfzRtyEQHht&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-ids", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-41-10/api/organisationUnits.json?page=2&pageSize=1&filter=id%3Ain%3A%5BtsmDjF9bxzK%2CYcWWJD42rFM%2CTHU3mEbE4b6%5D&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "THU3mEbE4b6" + } + ] + } + }, + { + "name": "count-group", + "path": "/api/organisationUnits.json?filter=organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-41-10/api/organisationUnits.json?page=2&pageSize=1&filter=organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "ZBm5vBRXjeH" + } + ] + } + }, + { + "name": "count-grandparent-in-group", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:TTEvM2Zx7wF&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-41-10/api/organisationUnits.json?page=2&pageSize=1&filter=parent.parent.organisationUnitGroups.id%3Aeq%3ATTEvM2Zx7wF&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-grandparent-in-group-none", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 0, + "pageSize": 1, + "pageCount": 0 + }, + "organisationUnits": [] + } + }, + { + "name": "count-child-in-group", + "path": "/api/organisationUnits.json?filter=children.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-41-10/api/organisationUnits.json?page=2&pageSize=1&filter=children.organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "list-assigned-ancestors", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,Zkx2DMsGgi0,RIinNUb6rg7]&filter=dataSets.id:eq:pRfTWd7fDDO&fields=id&paging=false", + "httpStatus": 200, + "response": { + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "me", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd", + "id": "ImspTQPwCqd", + "level": 1 + } + ] + } + }, + { + "name": "me-ptt-user", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ] + } + } + ] + }, + "2.42.6": { + "instance": "stable-2-42-6", + "date": "2026-10-08", + "requests": [ + { + "name": "dataElements", + "path": "/api/dataElements.json?filter=code:$like:PTT_G3&filter=code:$like:PTT_DIS&rootJunction=OR&fields=id,code,name,aggregationType,valueType,domainType,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_DIS_BOTH", + "name": "PTT disaggregation both", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Quarterly", + "id": "DMfYb9cbUwP" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + }, + { + "dataSet": { + "periodType": "Monthly", + "id": "MTEN4XmC0k3" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + } + ], + "id": "wrXAErJOkRS", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_DIS_PLACE", + "name": "PTT disaggregation place", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "NlZrxX5S0X8" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "Ij6jwq1Ceiq" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "T4Gk4A7PTRJ", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_G3_HISTORY", + "name": "PTT G3 history", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "V0tylPzEYrt" + } + } + ], + "id": "hR0FkmDKXvh", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_MW", + "name": "PTT G3 mw", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "WeeklyWednesday", + "id": "wRXyMvEnlyA" + } + }, + { + "dataSet": { + "periodType": "Weekly", + "id": "YlravvdHwIj" + } + } + ], + "id": "hbv3rzk8Fne", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_ORPHAN", + "name": "PTT G3 orphan", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [], + "id": "idqEIJ4ahkB", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + } + ] + } + }, + { + "name": "indicators", + "path": "/api/indicators.json?filter=code:$like:PTT_G4&fields=id,code,name,numerator,denominator,annualized,indicatorType[id,factor]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "indicators": [ + { + "code": "PTT_G4_IND_CONSTANT", + "name": "PTT G4 indicator constant", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "C{Wi6GdGCugf3}", + "denominator": "1", + "id": "CF8eNia3IC2" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED", + "name": "PTT G4 indicator coverage-averaged", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "BZznfLUT5h4" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED", + "name": "PTT G4 indicator coverage-averaged-annualized", + "annualized": true, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "LQIWkVZzf5R" + }, + { + "code": "PTT_G4_IND_COVERAGE_SUMMED", + "name": "PTT G4 indicator coverage-summed", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{nxyiifFYsbc}", + "id": "xA7tYxOjjM3" + } + ] + } + }, + { + "name": "dataSets", + "path": "/api/dataSets.json?filter=code:$like:PTT_G5&fields=id,code,periodType,dataSetElements[dataElement[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataSets": [ + { + "code": "PTT_G5_DS_Daily", + "periodType": "Daily", + "dataSetElements": [ + { + "dataElement": { + "id": "fUFgSP0AtUj" + } + } + ], + "id": "WE8srTzzhBZ" + }, + { + "code": "PTT_G5_DS_Monthly", + "periodType": "Monthly", + "dataSetElements": [ + { + "dataElement": { + "id": "Nhe8HFuemuw" + } + } + ], + "id": "hFQny4kjg5C" + }, + { + "code": "PTT_G5_DS_Quarterly", + "periodType": "Quarterly", + "dataSetElements": [ + { + "dataElement": { + "id": "Kd94qfjkpYx" + } + } + ], + "id": "SYkQTXY6EcA" + }, + { + "code": "PTT_G5_DS_Weekly", + "periodType": "Weekly", + "dataSetElements": [ + { + "dataElement": { + "id": "AFJ5IID9t6Z" + } + } + ], + "id": "S1yLlm7Hk2W" + } + ] + } + }, + { + "name": "expressionDimensionItems", + "path": "/api/expressionDimensionItems.json?filter=code:$like:PTT&fields=id,code,expression,missingValueStrategy&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "expressionDimensionItems": [ + { + "code": "PTT_G4_EXPRESSION", + "expression": "#{BeN8IzxwwJF}*2", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "gdmRgPhI76J" + }, + { + "code": "PTT_G4_EXPRESSION_NEVER_SKIP", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "NEVER_SKIP", + "id": "JzaPFPBpfRB" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ALL", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "pnmCVrG9qnE" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ANY", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ANY_VALUE_MISSING", + "id": "XqnQKWKRqzs" + } + ] + } + }, + { + "name": "periodTypes", + "path": "/api/periodTypes.json?fields=name,isoFormat,isoDuration,frequencyOrder", + "httpStatus": 200, + "response": { + "periodTypes": [ + { + "name": "Daily", + "isoDuration": "P1D", + "isoFormat": "yyyyMMdd", + "frequencyOrder": 1 + }, + { + "name": "Weekly", + "isoDuration": "P7D", + "isoFormat": "yyyyWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyWednesday", + "isoDuration": "P7D", + "isoFormat": "yyyyWedWn", + "frequencyOrder": 7 + }, + { + "name": "WeeklyThursday", + "isoDuration": "P7D", + "isoFormat": "yyyyThuWn", + "frequencyOrder": 7 + } + ] + } + }, + { + "name": "categoryOptionCombos", + "path": "/api/categoryOptionCombos.json?filter=id:in:[HllvX50cXC0,l6y6maQF8He,eUlTvjHxjZF,MHtSLMctHku,eHq7UQzuwBc]&fields=id,categoryCombo[id]&paging=false&order=id:asc", + "httpStatus": 200, + "response": { + "categoryOptionCombos": [ + { + "categoryCombo": { + "id": "GFe8Z3ErDol" + }, + "id": "eHq7UQzuwBc" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "eUlTvjHxjZF" + }, + { + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "id": "HllvX50cXC0" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "l6y6maQF8He" + } + ] + } + }, + { + "name": "dataElements-aggregationLevels", + "path": "/api/dataElements.json?filter=code:$like:PTT_OU_AGG&fields=id,code,aggregationType,aggregationLevels,dataSetElements[dataSet[id,periodType]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_OU_AGG_D1_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "Yo1BsQNngHy" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "ZRYrXnbcbjJ" + }, + { + "code": "PTT_OU_AGG_F_2", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "b5xszkgbXVd" + } + } + ], + "aggregationLevels": [ + 2 + ], + "id": "RNhL3JmLlC0" + }, + { + "code": "PTT_OU_AGG_F_2_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "CGAbAPpLZTo" + } + } + ], + "aggregationLevels": [ + 2, + 3 + ], + "id": "WZ6aknVLD9A" + }, + { + "code": "PTT_OU_AGG_F_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "dM4sBCBFDDC" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "FPp01mLrknd" + } + ] + } + }, + { + "name": "programIndicators", + "path": "/api/programIndicators.json?filter=code:$like:PTT_PROG&fields=id,code,program[id],orgUnitField,analyticsType,analyticsPeriodBoundaries[id]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programIndicators": [ + { + "code": "PTT_PROG_PI_EVENT", + "program": { + "id": "KfzRtyEQHht" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "ankY1J1i2Kv" + }, + { + "id": "mOgEPfIDrBz" + } + ], + "id": "TafgHfMvqW7" + }, + { + "code": "PTT_PROG_PI_EVENT_PLACE", + "program": { + "id": "KfzRtyEQHht" + }, + "orgUnitField": "WJ1j79Dlubx", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "FqRPXHBIjSy" + }, + { + "id": "Q1vkdlPpkpD" + } + ], + "id": "eSWGLPCy2ZK" + }, + { + "code": "PTT_PROG_PI_TRACKER", + "program": { + "id": "lAcD9QrX1xQ" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "rWxVptSvyHO" + }, + { + "id": "eef5NP4wLn3" + } + ], + "id": "NTvweRnHeLC" + }, + { + "code": "PTT_PROG_PI_TRACKER_ENROLLMENT", + "program": { + "id": "lAcD9QrX1xQ" + }, + "orgUnitField": "ENROLLMENT", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "ihzqXRw1V3b" + }, + { + "id": "RSBdFt0OWqQ" + } + ], + "id": "nYG1z4dFVnX" + } + ] + } + }, + { + "name": "programs", + "path": "/api/programs.json?filter=code:$like:PTT_PROG&fields=id,code,programType&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programs": [ + { + "code": "PTT_PROG_EVENT", + "programType": "WITHOUT_REGISTRATION", + "id": "KfzRtyEQHht" + }, + { + "code": "PTT_PROG_TRACKER", + "programType": "WITH_REGISTRATION", + "id": "lAcD9QrX1xQ" + } + ] + } + }, + { + "name": "organisationUnitLevels", + "path": "/api/organisationUnitLevels.json?fields=id,level,displayName&paging=false&order=level:asc", + "httpStatus": 200, + "response": { + "organisationUnitLevels": [ + { + "level": 1, + "displayName": "National", + "id": "H1KlN4QIauv" + }, + { + "level": 2, + "displayName": "District", + "id": "wjP19dkFeIk" + }, + { + "level": 3, + "displayName": "Chiefdom", + "id": "tTUf91fCytl" + }, + { + "level": 4, + "displayName": "Facility", + "id": "m9lBJogzE95" + } + ] + } + }, + { + "name": "count-level", + "path": "/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 1169, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-42-6/api/organisationUnits.json?page=2&pageSize=1&filter=level%3Aeq%3A4&fields=id", + "pageCount": 1169 + }, + "organisationUnits": [ + { + "id": "Rp268JB6Ne4" + } + ] + } + }, + { + "name": "count-path", + "path": "/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 9, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-42-6/api/organisationUnits.json?page=2&pageSize=1&filter=path%3Alike%3ARIinNUb6rg7&fields=id", + "pageCount": 9 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "count-dataSet", + "path": "/api/organisationUnits.json?filter=dataSets.id:eq:v200HCJsE6E&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-42-6/api/organisationUnits.json?page=2&pageSize=1&filter=dataSets.id%3Aeq%3Av200HCJsE6E&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-program", + "path": "/api/organisationUnits.json?filter=programs.id:eq:KfzRtyEQHht&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-42-6/api/organisationUnits.json?page=2&pageSize=1&filter=programs.id%3Aeq%3AKfzRtyEQHht&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-ids", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-42-6/api/organisationUnits.json?page=2&pageSize=1&filter=id%3Ain%3A%5BtsmDjF9bxzK%2CYcWWJD42rFM%2CTHU3mEbE4b6%5D&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "THU3mEbE4b6" + } + ] + } + }, + { + "name": "count-group", + "path": "/api/organisationUnits.json?filter=organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-42-6/api/organisationUnits.json?page=2&pageSize=1&filter=organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "ZBm5vBRXjeH" + } + ] + } + }, + { + "name": "count-grandparent-in-group", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:TTEvM2Zx7wF&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-42-6/api/organisationUnits.json?page=2&pageSize=1&filter=parent.parent.organisationUnitGroups.id%3Aeq%3ATTEvM2Zx7wF&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-grandparent-in-group-none", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 0, + "pageSize": 1, + "pageCount": 0 + }, + "organisationUnits": [] + } + }, + { + "name": "count-child-in-group", + "path": "/api/organisationUnits.json?filter=children.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-42-6/api/organisationUnits.json?page=2&pageSize=1&filter=children.organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "list-assigned-ancestors", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,Zkx2DMsGgi0,RIinNUb6rg7]&filter=dataSets.id:eq:pRfTWd7fDDO&fields=id&paging=false", + "httpStatus": 200, + "response": { + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "me", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd", + "id": "ImspTQPwCqd", + "level": 1 + } + ] + } + }, + { + "name": "me-ptt-user", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ] + } + } + ] + }, + "2.43.2": { + "instance": "stable-2-43-2", + "date": "2026-10-08", + "requests": [ + { + "name": "dataElements", + "path": "/api/dataElements.json?filter=code:$like:PTT_G3&filter=code:$like:PTT_DIS&rootJunction=OR&fields=id,code,name,aggregationType,valueType,domainType,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_DIS_BOTH", + "name": "PTT disaggregation both", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "MTEN4XmC0k3" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "dataSet": { + "periodType": "Quarterly", + "id": "DMfYb9cbUwP" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + } + ], + "id": "wrXAErJOkRS", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_DIS_PLACE", + "name": "PTT disaggregation place", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Quarterly", + "id": "Ij6jwq1Ceiq" + }, + "categoryCombo": { + "id": "GFe8Z3ErDol" + } + }, + { + "dataSet": { + "periodType": "Monthly", + "id": "NlZrxX5S0X8" + }, + "categoryCombo": { + "id": "EyESnzDvcwh" + } + } + ], + "id": "T4Gk4A7PTRJ", + "categoryCombo": { + "id": "EyESnzDvcwh" + } + }, + { + "code": "PTT_G3_HISTORY", + "name": "PTT G3 history", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Weekly", + "id": "V0tylPzEYrt" + } + } + ], + "id": "hR0FkmDKXvh", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_MW", + "name": "PTT G3 mw", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [ + { + "dataSet": { + "periodType": "WeeklyWednesday", + "id": "wRXyMvEnlyA" + } + }, + { + "dataSet": { + "periodType": "Weekly", + "id": "YlravvdHwIj" + } + } + ], + "id": "hbv3rzk8Fne", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + }, + { + "code": "PTT_G3_ORPHAN", + "name": "PTT G3 orphan", + "aggregationType": "SUM", + "valueType": "INTEGER", + "domainType": "AGGREGATE", + "dataSetElements": [], + "id": "idqEIJ4ahkB", + "categoryCombo": { + "id": "bjDvmb4bfuf" + } + } + ] + } + }, + { + "name": "indicators", + "path": "/api/indicators.json?filter=code:$like:PTT_G4&fields=id,code,name,numerator,denominator,annualized,indicatorType[id,factor]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "indicators": [ + { + "code": "PTT_G4_IND_CONSTANT", + "name": "PTT G4 indicator constant", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "C{Wi6GdGCugf3}", + "denominator": "1", + "id": "CF8eNia3IC2" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED", + "name": "PTT G4 indicator coverage-averaged", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "BZznfLUT5h4" + }, + { + "code": "PTT_G4_IND_COVERAGE_AVERAGED_ANNUALIZED", + "name": "PTT G4 indicator coverage-averaged-annualized", + "annualized": true, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{UB785RAqE9h}", + "id": "LQIWkVZzf5R" + }, + { + "code": "PTT_G4_IND_COVERAGE_SUMMED", + "name": "PTT G4 indicator coverage-summed", + "annualized": false, + "indicatorType": { + "factor": 1, + "id": "c6blltlrGIm" + }, + "numerator": "#{BeN8IzxwwJF}", + "denominator": "#{nxyiifFYsbc}", + "id": "xA7tYxOjjM3" + } + ] + } + }, + { + "name": "dataSets", + "path": "/api/dataSets.json?filter=code:$like:PTT_G5&fields=id,code,periodType,dataSetElements[dataElement[id]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataSets": [ + { + "code": "PTT_G5_DS_Daily", + "periodType": "Daily", + "dataSetElements": [ + { + "dataElement": { + "id": "fUFgSP0AtUj" + } + } + ], + "id": "WE8srTzzhBZ" + }, + { + "code": "PTT_G5_DS_Monthly", + "periodType": "Monthly", + "dataSetElements": [ + { + "dataElement": { + "id": "Nhe8HFuemuw" + } + } + ], + "id": "hFQny4kjg5C" + }, + { + "code": "PTT_G5_DS_Quarterly", + "periodType": "Quarterly", + "dataSetElements": [ + { + "dataElement": { + "id": "Kd94qfjkpYx" + } + } + ], + "id": "SYkQTXY6EcA" + }, + { + "code": "PTT_G5_DS_Weekly", + "periodType": "Weekly", + "dataSetElements": [ + { + "dataElement": { + "id": "AFJ5IID9t6Z" + } + } + ], + "id": "S1yLlm7Hk2W" + } + ] + } + }, + { + "name": "expressionDimensionItems", + "path": "/api/expressionDimensionItems.json?filter=code:$like:PTT&fields=id,code,expression,missingValueStrategy&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "expressionDimensionItems": [ + { + "code": "PTT_G4_EXPRESSION", + "expression": "#{BeN8IzxwwJF}*2", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "gdmRgPhI76J" + }, + { + "code": "PTT_G4_EXPRESSION_NEVER_SKIP", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "NEVER_SKIP", + "id": "JzaPFPBpfRB" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ALL", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ALL_VALUES_MISSING", + "id": "pnmCVrG9qnE" + }, + { + "code": "PTT_G4_EXPRESSION_SKIP_IF_ANY", + "expression": "#{BeN8IzxwwJF}+#{nxyiifFYsbc}", + "missingValueStrategy": "SKIP_IF_ANY_VALUE_MISSING", + "id": "XqnQKWKRqzs" + } + ] + } + }, + { + "name": "periodTypes", + "path": "/api/periodTypes.json?fields=name,isoFormat,isoDuration,frequencyOrder", + "httpStatus": 200, + "response": { + "periodTypes": [ + { + "name": "BiMonthly", + "isoDuration": "P2M", + "isoFormat": "yyyyMMB", + "frequencyOrder": 61 + }, + { + "name": "BiWeekly", + "isoDuration": "P14D", + "isoFormat": "yyyyBiWn", + "frequencyOrder": 14 + }, + { + "name": "Daily", + "isoDuration": "P1D", + "isoFormat": "yyyyMMdd", + "frequencyOrder": 1 + }, + { + "name": "FinancialApril", + "isoDuration": "P1Y", + "isoFormat": "yyyyApril", + "frequencyOrder": 365 + } + ] + } + }, + { + "name": "categoryOptionCombos", + "path": "/api/categoryOptionCombos.json?filter=id:in:[HllvX50cXC0,l6y6maQF8He,eUlTvjHxjZF,MHtSLMctHku,eHq7UQzuwBc]&fields=id,categoryCombo[id]&paging=false&order=id:asc", + "httpStatus": 200, + "response": { + "categoryOptionCombos": [ + { + "categoryCombo": { + "id": "GFe8Z3ErDol" + }, + "id": "eHq7UQzuwBc" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "eUlTvjHxjZF" + }, + { + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "id": "HllvX50cXC0" + }, + { + "categoryCombo": { + "id": "EyESnzDvcwh" + }, + "id": "l6y6maQF8He" + } + ] + } + }, + { + "name": "dataElements-aggregationLevels", + "path": "/api/dataElements.json?filter=code:$like:PTT_OU_AGG&fields=id,code,aggregationType,aggregationLevels,dataSetElements[dataSet[id,periodType]]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "dataElements": [ + { + "code": "PTT_OU_AGG_D1_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "Yo1BsQNngHy" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "ZRYrXnbcbjJ" + }, + { + "code": "PTT_OU_AGG_F_2", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "b5xszkgbXVd" + } + } + ], + "aggregationLevels": [ + 2 + ], + "id": "RNhL3JmLlC0" + }, + { + "code": "PTT_OU_AGG_F_2_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "CGAbAPpLZTo" + } + } + ], + "aggregationLevels": [ + 2, + 3 + ], + "id": "WZ6aknVLD9A" + }, + { + "code": "PTT_OU_AGG_F_3", + "aggregationType": "SUM", + "dataSetElements": [ + { + "dataSet": { + "periodType": "Monthly", + "id": "dM4sBCBFDDC" + } + } + ], + "aggregationLevels": [ + 3 + ], + "id": "FPp01mLrknd" + } + ] + } + }, + { + "name": "programIndicators", + "path": "/api/programIndicators.json?filter=code:$like:PTT_PROG&fields=id,code,program[id],orgUnitField,analyticsType,analyticsPeriodBoundaries[id]&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programIndicators": [ + { + "code": "PTT_PROG_PI_EVENT", + "program": { + "id": "KfzRtyEQHht" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "kmr1NdBzf33" + }, + { + "id": "IzXvHBYAtcv" + } + ], + "id": "TafgHfMvqW7" + }, + { + "code": "PTT_PROG_PI_EVENT_PLACE", + "program": { + "id": "KfzRtyEQHht" + }, + "orgUnitField": "WJ1j79Dlubx", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "zvAGsuH5Egt" + }, + { + "id": "LXIRZgbEqSW" + } + ], + "id": "eSWGLPCy2ZK" + }, + { + "code": "PTT_PROG_PI_TRACKER", + "program": { + "id": "lAcD9QrX1xQ" + }, + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "ELqIT5BRbwK" + }, + { + "id": "DXcnYyaBnAm" + } + ], + "id": "NTvweRnHeLC" + }, + { + "code": "PTT_PROG_PI_TRACKER_ENROLLMENT", + "program": { + "id": "lAcD9QrX1xQ" + }, + "orgUnitField": "ENROLLMENT", + "analyticsType": "EVENT", + "analyticsPeriodBoundaries": [ + { + "id": "PA8vwXgskEo" + }, + { + "id": "hCpoBREzQ2U" + } + ], + "id": "nYG1z4dFVnX" + } + ] + } + }, + { + "name": "programs", + "path": "/api/programs.json?filter=code:$like:PTT_PROG&fields=id,code,programType&paging=false&order=code:asc", + "httpStatus": 200, + "response": { + "programs": [ + { + "code": "PTT_PROG_EVENT", + "programType": "WITHOUT_REGISTRATION", + "id": "KfzRtyEQHht" + }, + { + "code": "PTT_PROG_TRACKER", + "programType": "WITH_REGISTRATION", + "id": "lAcD9QrX1xQ" + } + ] + } + }, + { + "name": "organisationUnitLevels", + "path": "/api/organisationUnitLevels.json?fields=id,level,displayName&paging=false&order=level:asc", + "httpStatus": 200, + "response": { + "organisationUnitLevels": [ + { + "level": 1, + "displayName": "National", + "id": "H1KlN4QIauv" + }, + { + "level": 2, + "displayName": "District", + "id": "wjP19dkFeIk" + }, + { + "level": 3, + "displayName": "Chiefdom", + "id": "tTUf91fCytl" + }, + { + "level": 4, + "displayName": "Facility", + "id": "m9lBJogzE95" + } + ] + } + }, + { + "name": "count-level", + "path": "/api/organisationUnits.json?filter=level:eq:4&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 1169, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-43-2/api/organisationUnits.json?page=2&pageSize=1&filter=level%3Aeq%3A4&fields=id", + "pageCount": 1169 + }, + "organisationUnits": [ + { + "id": "Rp268JB6Ne4" + } + ] + } + }, + { + "name": "count-path", + "path": "/api/organisationUnits.json?filter=path:like:RIinNUb6rg7&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 9, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-43-2/api/organisationUnits.json?page=2&pageSize=1&filter=path%3Alike%3ARIinNUb6rg7&fields=id", + "pageCount": 9 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "count-dataSet", + "path": "/api/organisationUnits.json?filter=dataSets.id:eq:v200HCJsE6E&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-43-2/api/organisationUnits.json?page=2&pageSize=1&filter=dataSets.id%3Aeq%3Av200HCJsE6E&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-program", + "path": "/api/organisationUnits.json?filter=programs.id:eq:KfzRtyEQHht&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-43-2/api/organisationUnits.json?page=2&pageSize=1&filter=programs.id%3Aeq%3AKfzRtyEQHht&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-ids", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,YcWWJD42rFM,THU3mEbE4b6]&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-43-2/api/organisationUnits.json?page=2&pageSize=1&filter=id%3Ain%3A%5BtsmDjF9bxzK%2CYcWWJD42rFM%2CTHU3mEbE4b6%5D&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "THU3mEbE4b6" + } + ] + } + }, + { + "name": "count-group", + "path": "/api/organisationUnits.json?filter=organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-43-2/api/organisationUnits.json?page=2&pageSize=1&filter=organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "ZBm5vBRXjeH" + } + ] + } + }, + { + "name": "count-grandparent-in-group", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:TTEvM2Zx7wF&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 3, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-43-2/api/organisationUnits.json?page=2&pageSize=1&filter=parent.parent.organisationUnitGroups.id%3Aeq%3ATTEvM2Zx7wF&fields=id", + "pageCount": 3 + }, + "organisationUnits": [ + { + "id": "tsmDjF9bxzK" + } + ] + } + }, + { + "name": "count-grandparent-in-group-none", + "path": "/api/organisationUnits.json?filter=parent.parent.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 0, + "pageSize": 1, + "pageCount": 0 + }, + "organisationUnits": [] + } + }, + { + "name": "count-child-in-group", + "path": "/api/organisationUnits.json?filter=children.organisationUnitGroups.id:eq:VSMvSA8RdOa&fields=id&pageSize=1", + "httpStatus": 200, + "response": { + "pager": { + "page": 1, + "total": 2, + "pageSize": 1, + "nextPage": "https://play.im.dhis2.org/stable-2-43-2/api/organisationUnits.json?page=2&pageSize=1&filter=children.organisationUnitGroups.id%3Aeq%3AVSMvSA8RdOa&fields=id", + "pageCount": 2 + }, + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "list-assigned-ancestors", + "path": "/api/organisationUnits.json?filter=id:in:[tsmDjF9bxzK,Zkx2DMsGgi0,RIinNUb6rg7]&filter=dataSets.id:eq:pRfTWd7fDDO&fields=id&paging=false", + "httpStatus": 200, + "response": { + "organisationUnits": [ + { + "id": "Zkx2DMsGgi0" + } + ] + } + }, + { + "name": "me", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd", + "id": "ImspTQPwCqd", + "level": 1 + } + ] + } + }, + { + "name": "me-ptt-user", + "path": "/api/me.json?fields=organisationUnits[id,level,path],dataViewOrganisationUnits[id,level,path]", + "httpStatus": 200, + "response": { + "dataViewOrganisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ], + "organisationUnits": [ + { + "path": "/ImspTQPwCqd/RIinNUb6rg7", + "id": "RIinNUb6rg7", + "level": 2 + } + ] + } + } + ] + } + }, + "smoke": "Requests dataElements, indicators, dataSets, expressionDimensionItems, periodTypes, categoryOptionCombos, and the org unit requests; the first 4 objects of each list, and PTT_G3_MW and PTT_G3_ORPHAN and PTT_DIS_BOTH and PTT_DIS_PLACE in dataElements." +} diff --git a/src/__fixtures__/period-types/mixed-collection.json b/src/__fixtures__/period-types/mixed-collection.json new file mode 100644 index 000000000..fb734017e --- /dev/null +++ b/src/__fixtures__/period-types/mixed-collection.json @@ -0,0 +1,78 @@ +{ + "schemaVersion": 1, + "group": "mixed-collection", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "smoke": "22 of 105 cases, one per pattern", + "cases": [ + {"id":"mixed-history__q-BiWeekly__r-2024Q2__A","item":{"code":"PTT_G3_HISTORY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Weekly"],"notes":"Monthly in 2024, weekly in 2025; only the weekly data set is left.","collectionSources":[{"dataSet":"PTT G3 history data set Weekly","periodType":"Weekly","orgUnits":["A","B"]}]},"query":{"periodType":"BiWeekly","period":"2024Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.12":{"status":"EMPTY","value":null,"coarse":3},"2.41.10":{"status":"EMPTY","value":null,"coarse":3},"2.42.6":{"status":"EMPTY","value":null,"coarse":3},"2.43.2":{"status":"EMPTY","value":null,"coarse":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-history__q-BiWeekly__r-2025Q2__A","item":{"code":"PTT_G3_HISTORY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Weekly"],"notes":"Monthly in 2024, weekly in 2025; only the weekly data set is left.","collectionSources":[{"dataSet":"PTT G3 history data set Weekly","periodType":"Weekly","orgUnits":["A","B"]}]},"query":{"periodType":"BiWeekly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":12},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":12,"coarse":12,"rows":6},"2.40.13-SNAPSHOT":{"status":"VALUE","value":12,"coarse":12,"rows":6},"2.41.11-SNAPSHOT":{"status":"VALUE","value":12,"coarse":12,"rows":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":12,"coarse":12,"rows":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":12,"coarse":12,"rows":6},"2.40.12":{"status":"VALUE","value":12,"coarse":12,"rows":6},"2.41.10":{"status":"VALUE","value":12,"coarse":12,"rows":6},"2.42.6":{"status":"VALUE","value":12,"coarse":12,"rows":6},"2.43.2":{"status":"VALUE","value":12,"coarse":12,"rows":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-history__q-Daily__r-2024Q2__A","item":{"code":"PTT_G3_HISTORY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Weekly"],"notes":"Monthly in 2024, weekly in 2025; only the weekly data set is left.","collectionSources":[{"dataSet":"PTT G3 history data set Weekly","periodType":"Weekly","orgUnits":["A","B"]}]},"query":{"periodType":"Daily","period":"2024Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.12":{"status":"EMPTY","value":null,"coarse":3},"2.41.10":{"status":"EMPTY","value":null,"coarse":3},"2.42.6":{"status":"EMPTY","value":null,"coarse":3},"2.43.2":{"status":"EMPTY","value":null,"coarse":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-history__q-Weekly__r-2024Q2__A","item":{"code":"PTT_G3_HISTORY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Weekly"],"notes":"Monthly in 2024, weekly in 2025; only the weekly data set is left.","collectionSources":[{"dataSet":"PTT G3 history data set Weekly","periodType":"Weekly","orgUnits":["A","B"]}]},"query":{"periodType":"Weekly","period":"2024Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.12":{"status":"EMPTY","value":null,"coarse":3},"2.41.10":{"status":"EMPTY","value":null,"coarse":3},"2.42.6":{"status":"EMPTY","value":null,"coarse":3},"2.43.2":{"status":"EMPTY","value":null,"coarse":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-history__q-Weekly__r-2025Q2__A","item":{"code":"PTT_G3_HISTORY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Weekly"],"notes":"Monthly in 2024, weekly in 2025; only the weekly data set is left.","collectionSources":[{"dataSet":"PTT G3 history data set Weekly","periodType":"Weekly","orgUnits":["A","B"]}]},"query":{"periodType":"Weekly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":12},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":12,"coarse":12,"rows":12},"2.40.13-SNAPSHOT":{"status":"VALUE","value":12,"coarse":12,"rows":12},"2.41.11-SNAPSHOT":{"status":"VALUE","value":12,"coarse":12,"rows":12},"2.42.7-SNAPSHOT":{"status":"VALUE","value":12,"coarse":12,"rows":12},"2.43.3-SNAPSHOT":{"status":"VALUE","value":12,"coarse":12,"rows":12},"2.40.12":{"status":"VALUE","value":12,"coarse":12,"rows":12},"2.41.10":{"status":"VALUE","value":12,"coarse":12,"rows":12},"2.42.6":{"status":"VALUE","value":12,"coarse":12,"rows":12},"2.43.2":{"status":"VALUE","value":12,"coarse":12,"rows":12}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-history__q-WeeklyWednesday__r-2024Q2__A","item":{"code":"PTT_G3_HISTORY","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Weekly"],"notes":"Monthly in 2024, weekly in 2025; only the weekly data set is left.","collectionSources":[{"dataSet":"PTT G3 history data set Weekly","periodType":"Weekly","orgUnits":["A","B"]}]},"query":{"periodType":"WeeklyWednesday","period":"2024Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.12":{"status":"EMPTY","value":null,"coarse":3},"2.41.10":{"status":"EMPTY","value":null,"coarse":3},"2.42.6":{"status":"EMPTY","value":null,"coarse":3},"2.43.2":{"status":"EMPTY","value":null,"coarse":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-mw__q-BiWeekly__r-2025Q2__A","item":{"code":"PTT_G3_MW","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Weekly","WeeklyWednesday"],"notes":"In a Monday and a Wednesday weekly data set, both used at A and B.","collectionSources":[{"dataSet":"PTT G3 mw data set Weekly","periodType":"Weekly","orgUnits":["A","B"]},{"dataSet":"PTT G3 mw data set WeeklyWednesday","periodType":"WeeklyWednesday","orgUnits":["A","B"]}]},"query":{"periodType":"BiWeekly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":36},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":36,"coarse":36,"rows":7},"2.40.13-SNAPSHOT":{"status":"VALUE","value":36,"coarse":36,"rows":7},"2.41.11-SNAPSHOT":{"status":"VALUE","value":36,"coarse":36,"rows":7},"2.42.7-SNAPSHOT":{"status":"VALUE","value":36,"coarse":36,"rows":7},"2.43.3-SNAPSHOT":{"status":"VALUE","value":36,"coarse":36,"rows":7},"2.40.12":{"status":"VALUE","value":36,"coarse":36,"rows":7},"2.41.10":{"status":"VALUE","value":36,"coarse":36,"rows":7},"2.42.6":{"status":"VALUE","value":36,"coarse":36,"rows":7},"2.43.2":{"status":"VALUE","value":36,"coarse":36,"rows":7}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-mw__q-Daily__r-2025Q2__A","item":{"code":"PTT_G3_MW","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Weekly","WeeklyWednesday"],"notes":"In a Monday and a Wednesday weekly data set, both used at A and B.","collectionSources":[{"dataSet":"PTT G3 mw data set Weekly","periodType":"Weekly","orgUnits":["A","B"]},{"dataSet":"PTT G3 mw data set WeeklyWednesday","periodType":"WeeklyWednesday","orgUnits":["A","B"]}]},"query":{"periodType":"Daily","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":36},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":36},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":36},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":36},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":36},"2.40.12":{"status":"EMPTY","value":null,"coarse":36},"2.41.10":{"status":"EMPTY","value":null,"coarse":36},"2.42.6":{"status":"EMPTY","value":null,"coarse":36},"2.43.2":{"status":"EMPTY","value":null,"coarse":36}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-mw__q-Weekly__r-2025Q2__A","item":{"code":"PTT_G3_MW","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Weekly","WeeklyWednesday"],"notes":"In a Monday and a Wednesday weekly data set, both used at A and B.","collectionSources":[{"dataSet":"PTT G3 mw data set Weekly","periodType":"Weekly","orgUnits":["A","B"]},{"dataSet":"PTT G3 mw data set WeeklyWednesday","periodType":"WeeklyWednesday","orgUnits":["A","B"]}]},"query":{"periodType":"Weekly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"PARTIAL","value":12},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":12,"coarse":36,"rows":12},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":12,"coarse":36,"rows":12},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":12,"coarse":36,"rows":12},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":12,"coarse":36,"rows":12},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":12,"coarse":36,"rows":12},"2.40.12":{"status":"PARTIAL","value":12,"coarse":36,"rows":12},"2.41.10":{"status":"PARTIAL","value":12,"coarse":36,"rows":12},"2.42.6":{"status":"PARTIAL","value":12,"coarse":36,"rows":12},"2.43.2":{"status":"PARTIAL","value":12,"coarse":36,"rows":12}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-mw__q-WeeklyWednesday__r-2025Q2__A","item":{"code":"PTT_G3_MW","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Weekly","WeeklyWednesday"],"notes":"In a Monday and a Wednesday weekly data set, both used at A and B.","collectionSources":[{"dataSet":"PTT G3 mw data set Weekly","periodType":"Weekly","orgUnits":["A","B"]},{"dataSet":"PTT G3 mw data set WeeklyWednesday","periodType":"WeeklyWednesday","orgUnits":["A","B"]}]},"query":{"periodType":"WeeklyWednesday","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"PARTIAL","value":24},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":24,"coarse":36,"rows":12},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":24,"coarse":36,"rows":12},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":24,"coarse":36,"rows":12},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":24,"coarse":36,"rows":12},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":24,"coarse":36,"rows":12},"2.40.12":{"status":"PARTIAL","value":24,"coarse":36,"rows":12},"2.41.10":{"status":"PARTIAL","value":24,"coarse":36,"rows":12},"2.42.6":{"status":"PARTIAL","value":24,"coarse":36,"rows":12},"2.43.2":{"status":"PARTIAL","value":24,"coarse":36,"rows":12}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-orphan__q-BiWeekly__r-2025Q2__A","item":{"code":"PTT_G3_ORPHAN","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":[],"notes":"Monthly values, then removed from its only data set.","collectionSources":[]},"query":{"periodType":"BiWeekly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.12":{"status":"EMPTY","value":null,"coarse":3},"2.41.10":{"status":"EMPTY","value":null,"coarse":3},"2.42.6":{"status":"EMPTY","value":null,"coarse":3},"2.43.2":{"status":"EMPTY","value":null,"coarse":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-orphan__q-Monthly__r-2025Q2__A","item":{"code":"PTT_G3_ORPHAN","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":[],"notes":"Monthly values, then removed from its only data set.","collectionSources":[]},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.40.12":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.41.10":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.42.6":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.43.2":{"status":"VALUE","value":3,"coarse":3,"rows":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-place__q-BiWeekly__r-2025Q2__A","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B.","collectionSources":[{"dataSet":"PTT G3 place data set Monthly","periodType":"Monthly","orgUnits":["A"]},{"dataSet":"PTT G3 place data set Weekly","periodType":"Weekly","orgUnits":["B"]}]},"query":{"periodType":"BiWeekly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.12":{"status":"EMPTY","value":null,"coarse":3},"2.41.10":{"status":"EMPTY","value":null,"coarse":3},"2.42.6":{"status":"EMPTY","value":null,"coarse":3},"2.43.2":{"status":"EMPTY","value":null,"coarse":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-place__q-BiWeekly__r-2025Q2__B","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B.","collectionSources":[{"dataSet":"PTT G3 place data set Monthly","periodType":"Monthly","orgUnits":["A"]},{"dataSet":"PTT G3 place data set Weekly","periodType":"Weekly","orgUnits":["B"]}]},"query":{"periodType":"BiWeekly","period":"2025Q2","orgUnit":"B","coarser":"Quarterly"},"expected":{"status":"VALUE","value":120},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":120,"coarse":120,"rows":6},"2.40.13-SNAPSHOT":{"status":"VALUE","value":120,"coarse":120,"rows":6},"2.41.11-SNAPSHOT":{"status":"VALUE","value":120,"coarse":120,"rows":6},"2.42.7-SNAPSHOT":{"status":"VALUE","value":120,"coarse":120,"rows":6},"2.43.3-SNAPSHOT":{"status":"VALUE","value":120,"coarse":120,"rows":6},"2.40.12":{"status":"VALUE","value":120,"coarse":120,"rows":6},"2.41.10":{"status":"VALUE","value":120,"coarse":120,"rows":6},"2.42.6":{"status":"VALUE","value":120,"coarse":120,"rows":6},"2.43.2":{"status":"VALUE","value":120,"coarse":120,"rows":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-place__q-BiWeekly__r-2025Q2__region","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B.","collectionSources":[{"dataSet":"PTT G3 place data set Monthly","periodType":"Monthly","orgUnits":["A"]},{"dataSet":"PTT G3 place data set Weekly","periodType":"Weekly","orgUnits":["B"]}]},"query":{"periodType":"BiWeekly","period":"2025Q2","orgUnit":"region","coarser":"Quarterly"},"expected":{"status":"PARTIAL","value":120},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":120,"coarse":123,"rows":6},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":120,"coarse":123,"rows":6},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":120,"coarse":123,"rows":6},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":120,"coarse":123,"rows":6},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":120,"coarse":123,"rows":6},"2.40.12":{"status":"PARTIAL","value":120,"coarse":123,"rows":6},"2.41.10":{"status":"PARTIAL","value":120,"coarse":123,"rows":6},"2.42.6":{"status":"PARTIAL","value":120,"coarse":123,"rows":6},"2.43.2":{"status":"PARTIAL","value":120,"coarse":123,"rows":6}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-place__q-Daily__r-2025Q2__A","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B.","collectionSources":[{"dataSet":"PTT G3 place data set Monthly","periodType":"Monthly","orgUnits":["A"]},{"dataSet":"PTT G3 place data set Weekly","periodType":"Weekly","orgUnits":["B"]}]},"query":{"periodType":"Daily","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.12":{"status":"EMPTY","value":null,"coarse":3},"2.41.10":{"status":"EMPTY","value":null,"coarse":3},"2.42.6":{"status":"EMPTY","value":null,"coarse":3},"2.43.2":{"status":"EMPTY","value":null,"coarse":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-place__q-Monthly__r-2025Q2__A","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B.","collectionSources":[{"dataSet":"PTT G3 place data set Monthly","periodType":"Monthly","orgUnits":["A"]},{"dataSet":"PTT G3 place data set Weekly","periodType":"Weekly","orgUnits":["B"]}]},"query":{"periodType":"Monthly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.40.12":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.41.10":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.42.6":{"status":"VALUE","value":3,"coarse":3,"rows":3},"2.43.2":{"status":"VALUE","value":3,"coarse":3,"rows":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-place__q-Quarterly__r-2025Q2__A","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B.","collectionSources":[{"dataSet":"PTT G3 place data set Monthly","periodType":"Monthly","orgUnits":["A"]},{"dataSet":"PTT G3 place data set Weekly","periodType":"Weekly","orgUnits":["B"]}]},"query":{"periodType":"Quarterly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"VALUE","value":3},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.40.12":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.41.10":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.42.6":{"status":"VALUE","value":3,"coarse":3,"rows":1},"2.43.2":{"status":"VALUE","value":3,"coarse":3,"rows":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-place__q-Weekly__r-2025Q2__A","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B.","collectionSources":[{"dataSet":"PTT G3 place data set Monthly","periodType":"Monthly","orgUnits":["A"]},{"dataSet":"PTT G3 place data set Weekly","periodType":"Weekly","orgUnits":["B"]}]},"query":{"periodType":"Weekly","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.12":{"status":"EMPTY","value":null,"coarse":3},"2.41.10":{"status":"EMPTY","value":null,"coarse":3},"2.42.6":{"status":"EMPTY","value":null,"coarse":3},"2.43.2":{"status":"EMPTY","value":null,"coarse":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-place__q-Weekly__r-2025Q2__B","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B.","collectionSources":[{"dataSet":"PTT G3 place data set Monthly","periodType":"Monthly","orgUnits":["A"]},{"dataSet":"PTT G3 place data set Weekly","periodType":"Weekly","orgUnits":["B"]}]},"query":{"periodType":"Weekly","period":"2025Q2","orgUnit":"B","coarser":"Quarterly"},"expected":{"status":"VALUE","value":120},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":120,"coarse":120,"rows":12},"2.40.13-SNAPSHOT":{"status":"VALUE","value":120,"coarse":120,"rows":12},"2.41.11-SNAPSHOT":{"status":"VALUE","value":120,"coarse":120,"rows":12},"2.42.7-SNAPSHOT":{"status":"VALUE","value":120,"coarse":120,"rows":12},"2.43.3-SNAPSHOT":{"status":"VALUE","value":120,"coarse":120,"rows":12},"2.40.12":{"status":"VALUE","value":120,"coarse":120,"rows":12},"2.41.10":{"status":"VALUE","value":120,"coarse":120,"rows":12},"2.42.6":{"status":"VALUE","value":120,"coarse":120,"rows":12},"2.43.2":{"status":"VALUE","value":120,"coarse":120,"rows":12}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-place__q-Weekly__r-2025Q2__region","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B.","collectionSources":[{"dataSet":"PTT G3 place data set Monthly","periodType":"Monthly","orgUnits":["A"]},{"dataSet":"PTT G3 place data set Weekly","periodType":"Weekly","orgUnits":["B"]}]},"query":{"periodType":"Weekly","period":"2025Q2","orgUnit":"region","coarser":"Quarterly"},"expected":{"status":"PARTIAL","value":120},"observed":{"2.44-SNAPSHOT":{"status":"PARTIAL","value":120,"coarse":123,"rows":12},"2.40.13-SNAPSHOT":{"status":"PARTIAL","value":120,"coarse":123,"rows":12},"2.41.11-SNAPSHOT":{"status":"PARTIAL","value":120,"coarse":123,"rows":12},"2.42.7-SNAPSHOT":{"status":"PARTIAL","value":120,"coarse":123,"rows":12},"2.43.3-SNAPSHOT":{"status":"PARTIAL","value":120,"coarse":123,"rows":12},"2.40.12":{"status":"PARTIAL","value":120,"coarse":123,"rows":12},"2.41.10":{"status":"PARTIAL","value":120,"coarse":123,"rows":12},"2.42.6":{"status":"PARTIAL","value":120,"coarse":123,"rows":12},"2.43.2":{"status":"PARTIAL","value":120,"coarse":123,"rows":12}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"mixed-place__q-WeeklyWednesday__r-2025Q2__A","item":{"code":"PTT_G3_PLACE","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["Monthly","Weekly"],"notes":"Monthly at A, weekly at B.","collectionSources":[{"dataSet":"PTT G3 place data set Monthly","periodType":"Monthly","orgUnits":["A"]},{"dataSet":"PTT G3 place data set Weekly","periodType":"Weekly","orgUnits":["B"]}]},"query":{"periodType":"WeeklyWednesday","period":"2025Q2","orgUnit":"A","coarser":"Quarterly"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null,"coarse":3},"2.40.12":{"status":"EMPTY","value":null,"coarse":3},"2.41.10":{"status":"EMPTY","value":null,"coarse":3},"2.42.6":{"status":"EMPTY","value":null,"coarse":3},"2.43.2":{"status":"EMPTY","value":null,"coarse":3}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/__fixtures__/period-types/periods-that-dont-nest.json b/src/__fixtures__/period-types/periods-that-dont-nest.json new file mode 100644 index 000000000..c41cf2f66 --- /dev/null +++ b/src/__fixtures__/period-types/periods-that-dont-nest.json @@ -0,0 +1,1837 @@ +{ + "schemaVersion": 1, + "group": "periods-that-dont-nest", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "findings": { + "2.44-SNAPSHOT": { + "Weekly by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "Weekly by Quarterly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "Weekly by Yearly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyWednesday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyWednesday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyWednesday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyThursday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyThursday by Quarterly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyThursday by Yearly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyFriday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyFriday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyFriday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySaturday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySaturday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySaturday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySunday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySunday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySunday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "BiWeekly by Monthly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 24 + }, + "BiWeekly by Quarterly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 8 + }, + "BiWeekly by Yearly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 2 + }, + "QuarterlyNov by Quarterly": { + "rules": [], + "empty": 8, + "cases": 8 + }, + "QuarterlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyApril by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "FinancialApril by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialJuly by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialOct by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialNov by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialFeb by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialAug by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialSep by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + } + }, + "2.40.13-SNAPSHOT": { + "Weekly by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "Weekly by Quarterly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "Weekly by Yearly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyWednesday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyWednesday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyWednesday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyThursday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyThursday by Quarterly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyThursday by Yearly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySaturday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySaturday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySaturday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySunday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySunday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySunday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "BiWeekly by Monthly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 24 + }, + "BiWeekly by Quarterly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 8 + }, + "BiWeekly by Yearly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 2 + }, + "QuarterlyNov by Quarterly": { + "rules": [], + "empty": 8, + "cases": 8 + }, + "QuarterlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyApril by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "FinancialApril by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialJuly by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialOct by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialNov by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + } + }, + "2.41.11-SNAPSHOT": { + "Weekly by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "Weekly by Quarterly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "Weekly by Yearly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyWednesday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyWednesday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyWednesday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyThursday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyThursday by Quarterly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyThursday by Yearly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySaturday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySaturday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySaturday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySunday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySunday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySunday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "BiWeekly by Monthly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 24 + }, + "BiWeekly by Quarterly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 8 + }, + "BiWeekly by Yearly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 2 + }, + "QuarterlyNov by Quarterly": { + "rules": [], + "empty": 8, + "cases": 8 + }, + "QuarterlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyApril by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "FinancialApril by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialJuly by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialOct by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialNov by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + } + }, + "2.42.7-SNAPSHOT": { + "Weekly by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "Weekly by Quarterly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "Weekly by Yearly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyWednesday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyWednesday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyWednesday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyThursday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyThursday by Quarterly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyThursday by Yearly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySaturday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySaturday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySaturday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySunday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySunday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySunday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "BiWeekly by Monthly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 24 + }, + "BiWeekly by Quarterly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 8 + }, + "BiWeekly by Yearly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 2 + }, + "QuarterlyNov by Quarterly": { + "rules": [], + "empty": 8, + "cases": 8 + }, + "QuarterlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyApril by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "FinancialApril by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialJuly by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialOct by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialNov by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialSep by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + } + }, + "2.43.3-SNAPSHOT": { + "Weekly by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "Weekly by Quarterly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "Weekly by Yearly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyWednesday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyWednesday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyWednesday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyThursday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyThursday by Quarterly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyThursday by Yearly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyFriday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyFriday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyFriday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySaturday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySaturday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySaturday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySunday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySunday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySunday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "BiWeekly by Monthly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 24 + }, + "BiWeekly by Quarterly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 8 + }, + "BiWeekly by Yearly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 2 + }, + "QuarterlyNov by Quarterly": { + "rules": [], + "empty": 8, + "cases": 8 + }, + "QuarterlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyApril by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "FinancialApril by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialJuly by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialOct by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialNov by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialFeb by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialAug by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialSep by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + } + }, + "2.40.12": { + "Weekly by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "Weekly by Quarterly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "Weekly by Yearly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyWednesday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyWednesday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyWednesday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyThursday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyThursday by Quarterly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyThursday by Yearly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySaturday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySaturday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySaturday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySunday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySunday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySunday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "BiWeekly by Monthly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 24 + }, + "BiWeekly by Quarterly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 8 + }, + "BiWeekly by Yearly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 2 + }, + "QuarterlyNov by Quarterly": { + "rules": [], + "empty": 8, + "cases": 8 + }, + "QuarterlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyApril by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "FinancialApril by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialJuly by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialOct by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialNov by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + } + }, + "2.41.10": { + "Weekly by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "Weekly by Quarterly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "Weekly by Yearly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyWednesday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyWednesday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyWednesday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyThursday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyThursday by Quarterly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyThursday by Yearly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySaturday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySaturday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySaturday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySunday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySunday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySunday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "BiWeekly by Monthly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 24 + }, + "BiWeekly by Quarterly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 8 + }, + "BiWeekly by Yearly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 2 + }, + "QuarterlyNov by Quarterly": { + "rules": [], + "empty": 8, + "cases": 8 + }, + "QuarterlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyApril by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "FinancialApril by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialJuly by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialOct by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialNov by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + } + }, + "2.42.6": { + "Weekly by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "Weekly by Quarterly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "Weekly by Yearly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyWednesday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyWednesday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyWednesday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyThursday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyThursday by Quarterly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyThursday by Yearly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySaturday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySaturday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySaturday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySunday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySunday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySunday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "BiWeekly by Monthly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 24 + }, + "BiWeekly by Quarterly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 8 + }, + "BiWeekly by Yearly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 2 + }, + "QuarterlyNov by Quarterly": { + "rules": [], + "empty": 8, + "cases": 8 + }, + "QuarterlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyApril by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "FinancialApril by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialJuly by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialOct by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialNov by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialSep by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + } + }, + "2.43.2": { + "Weekly by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "Weekly by Quarterly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "Weekly by Yearly": { + "rules": [ + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyWednesday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyWednesday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyWednesday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyThursday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyThursday by Quarterly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyThursday by Yearly": { + "rules": [ + "start", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklyFriday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklyFriday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklyFriday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySaturday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySaturday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySaturday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "WeeklySunday by Monthly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 24 + }, + "WeeklySunday by Quarterly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 8 + }, + "WeeklySunday by Yearly": { + "rules": [ + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "BiWeekly by Monthly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 24 + }, + "BiWeekly by Quarterly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 8 + }, + "BiWeekly by Yearly": { + "rules": [ + "start" + ], + "empty": 0, + "cases": 2 + }, + "QuarterlyNov by Quarterly": { + "rules": [], + "empty": 8, + "cases": 8 + }, + "QuarterlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyApril by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "SixMonthlyNov by Yearly": { + "rules": [ + "start", + "end", + "mostDays" + ], + "empty": 0, + "cases": 2 + }, + "FinancialApril by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialJuly by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialOct by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialNov by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialFeb by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialAug by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + }, + "FinancialSep by Yearly": { + "rules": [], + "empty": 2, + "cases": 2 + } + } + }, + "smoke": "5 of 266 cases, one per pattern", + "cases": [ + {"id":"nest-BiWeekly__q-Monthly__p-202401__A","item":{"code":"PTT_G2_BiWeekly","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["BiWeekly"]},"query":{"periodType":"Monthly","period":"202401","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":3},"2.40.13-SNAPSHOT":{"status":"VALUE","value":3},"2.41.11-SNAPSHOT":{"status":"VALUE","value":3},"2.42.7-SNAPSHOT":{"status":"VALUE","value":3},"2.43.3-SNAPSHOT":{"status":"VALUE","value":3},"2.40.12":{"status":"VALUE","value":3},"2.41.10":{"status":"VALUE","value":3},"2.42.6":{"status":"VALUE","value":3},"2.43.2":{"status":"VALUE","value":3}},"verdict":{"2.44-SNAPSHOT":"recorded","2.40.13-SNAPSHOT":"recorded","2.41.11-SNAPSHOT":"recorded","2.42.7-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.40.12":"recorded","2.41.10":"recorded","2.42.6":"recorded","2.43.2":"recorded"}}, + {"id":"nest-FinancialApril__q-Yearly__p-2024__A","item":{"code":"PTT_G2_FinancialApril","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialApril"]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.13-SNAPSHOT":{"status":"EMPTY","value":null},"2.41.11-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.40.12":{"status":"EMPTY","value":null},"2.41.10":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"nest-FinancialAug__q-Yearly__p-2024__A","item":{"code":"PTT_G2_FinancialAug","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialAug"]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"nest-FinancialSep__q-Yearly__p-2024__A","item":{"code":"PTT_G2_FinancialSep","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["FinancialSep"]},"query":{"periodType":"Yearly","period":"2024","orgUnit":"A"},"expected":{"status":"EMPTY","value":null},"observed":{"2.44-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.7-SNAPSHOT":{"status":"EMPTY","value":null},"2.43.3-SNAPSHOT":{"status":"EMPTY","value":null},"2.42.6":{"status":"EMPTY","value":null},"2.43.2":{"status":"EMPTY","value":null}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"nest-WeeklyFriday__q-Monthly__p-202401__A","item":{"code":"PTT_G2_WeeklyFriday","dimensionItemType":"DATA_ELEMENT","aggregationType":"SUM","valueType":"INTEGER","collectionPeriodTypes":["WeeklyFriday"]},"query":{"periodType":"Monthly","period":"202401","orgUnit":"A"},"expected":{"status":"VALUE","value":null},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":5},"2.43.3-SNAPSHOT":{"status":"VALUE","value":5},"2.43.2":{"status":"VALUE","value":5}},"verdict":{"2.44-SNAPSHOT":"recorded","2.43.3-SNAPSHOT":"recorded","2.43.2":"recorded"}} + ] +} diff --git a/src/__fixtures__/period-types/reporting-rates.json b/src/__fixtures__/period-types/reporting-rates.json new file mode 100644 index 000000000..d33213a44 --- /dev/null +++ b/src/__fixtures__/period-types/reporting-rates.json @@ -0,0 +1,92 @@ +{ + "schemaVersion": 1, + "group": "reporting-rates", + "provisional": false, + "source": "maps-tools/test-data-item-profile (f47b258, with local changes)", + "runs": [ + { + "instance": "dev", + "version": "2.44-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-40", + "version": "2.40.13-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-41", + "version": "2.41.11-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-42", + "version": "2.42.7-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "dev-2-43", + "version": "2.43.3-SNAPSHOT", + "date": "2026-10-08" + }, + { + "instance": "stable-2-40-12", + "version": "2.40.12", + "date": "2026-10-08" + }, + { + "instance": "stable-2-41-10", + "version": "2.41.10", + "date": "2026-10-08" + }, + { + "instance": "stable-2-42-6", + "version": "2.42.6", + "date": "2026-10-08" + }, + { + "instance": "stable-2-43-2", + "version": "2.43.2", + "date": "2026-10-08" + } + ], + "smoke": "36 of 2070 cases, one per pattern", + "cases": [ + {"id":"rate-ACTUAL_REPORTS-Daily__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Daily"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":59},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":59},"2.40.13-SNAPSHOT":{"status":"VALUE","value":59},"2.41.11-SNAPSHOT":{"status":"VALUE","value":59},"2.42.7-SNAPSHOT":{"status":"VALUE","value":59},"2.43.3-SNAPSHOT":{"status":"VALUE","value":59},"2.40.12":{"status":"VALUE","value":59},"2.41.10":{"status":"VALUE","value":59},"2.42.6":{"status":"VALUE","value":59},"2.43.2":{"status":"VALUE","value":59}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Daily__q-Daily__p-20250101__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Daily"]},"query":{"periodType":"Daily","period":"20250101","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"VALUE","value":1},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Daily__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Daily"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":213},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":213},"2.43.3-SNAPSHOT":{"status":"VALUE","value":213},"2.43.2":{"status":"VALUE","value":213}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Daily__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Daily"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":244},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":244},"2.42.7-SNAPSHOT":{"status":"VALUE","value":244},"2.43.3-SNAPSHOT":{"status":"VALUE","value":244},"2.42.6":{"status":"VALUE","value":244},"2.43.2":{"status":"VALUE","value":244}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Daily__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Daily"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":92},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":92},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":92},"2.42.7-SNAPSHOT":{"status":"VALUE","value":92},"2.43.3-SNAPSHOT":{"status":"VALUE","value":92},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":92},"2.42.6":{"status":"VALUE","value":92},"2.43.2":{"status":"VALUE","value":92}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Monthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G5_DS_Monthly","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Monthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":0},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"REPEATED","value":0},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Monthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G5_DS_Monthly","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Monthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G5_DS_Quarterly","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Weekly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G5_DS_Weekly","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Weekly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Weekly__q-WeeklySaturday__p-2024SatW53__A","item":{"code":"PTT_G5_DS_Weekly","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Weekly"]},"query":{"periodType":"WeeklySaturday","period":"2024SatW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":0},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"REPEATED","value":0},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Yearly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G5_DS_Yearly","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Yearly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-ACTUAL_REPORTS-Yearly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G5_DS_Yearly","dimensionItemType":"REPORTING_RATE","metric":"ACTUAL_REPORTS","collectionPeriodTypes":["Yearly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Daily__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Daily"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":59},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":59},"2.40.13-SNAPSHOT":{"status":"VALUE","value":59},"2.41.11-SNAPSHOT":{"status":"VALUE","value":59},"2.42.7-SNAPSHOT":{"status":"VALUE","value":59},"2.43.3-SNAPSHOT":{"status":"VALUE","value":59},"2.40.12":{"status":"VALUE","value":59},"2.41.10":{"status":"VALUE","value":59},"2.42.6":{"status":"VALUE","value":59},"2.43.2":{"status":"VALUE","value":59}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Daily__q-Daily__p-20250101__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Daily"]},"query":{"periodType":"Daily","period":"20250101","orgUnit":"A"},"expected":{"status":"VALUE","value":1},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":1},"2.40.13-SNAPSHOT":{"status":"VALUE","value":1},"2.41.11-SNAPSHOT":{"status":"VALUE","value":1},"2.42.7-SNAPSHOT":{"status":"VALUE","value":1},"2.43.3-SNAPSHOT":{"status":"VALUE","value":1},"2.40.12":{"status":"VALUE","value":1},"2.41.10":{"status":"VALUE","value":1},"2.42.6":{"status":"VALUE","value":1},"2.43.2":{"status":"VALUE","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Daily__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Daily"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":366},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":366},"2.43.3-SNAPSHOT":{"status":"VALUE","value":366},"2.43.2":{"status":"VALUE","value":366}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Daily__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Daily"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":366},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":366},"2.42.7-SNAPSHOT":{"status":"VALUE","value":366},"2.43.3-SNAPSHOT":{"status":"VALUE","value":366},"2.42.6":{"status":"VALUE","value":366},"2.43.2":{"status":"VALUE","value":366}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Daily__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Daily"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":92},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":92},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":92},"2.42.7-SNAPSHOT":{"status":"VALUE","value":92},"2.43.3-SNAPSHOT":{"status":"VALUE","value":92},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":92},"2.42.6":{"status":"VALUE","value":92},"2.43.2":{"status":"VALUE","value":92}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Monthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G5_DS_Monthly","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Monthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":0},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"REPEATED","value":0},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Monthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G5_DS_Monthly","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Monthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G5_DS_Quarterly","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Weekly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G5_DS_Weekly","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Weekly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Weekly__q-WeeklySaturday__p-2024SatW53__A","item":{"code":"PTT_G5_DS_Weekly","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Weekly"]},"query":{"periodType":"WeeklySaturday","period":"2024SatW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":1},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.40.12":{"status":"REPEATED","value":1},"2.41.10":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Yearly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G5_DS_Yearly","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Yearly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":1},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":1},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":1},"2.42.6":{"status":"REPEATED","value":1},"2.43.2":{"status":"REPEATED","value":1}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-EXPECTED_REPORTS-Yearly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G5_DS_Yearly","dimensionItemType":"REPORTING_RATE","metric":"EXPECTED_REPORTS","collectionPeriodTypes":["Yearly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Daily__q-BiMonthly__p-202501B__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Daily"]},"query":{"periodType":"BiMonthly","period":"202501B","orgUnit":"A"},"expected":{"status":"VALUE","value":100},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":100},"2.40.13-SNAPSHOT":{"status":"VALUE","value":100},"2.41.11-SNAPSHOT":{"status":"VALUE","value":100},"2.42.7-SNAPSHOT":{"status":"VALUE","value":100},"2.43.3-SNAPSHOT":{"status":"VALUE","value":100},"2.40.12":{"status":"VALUE","value":100},"2.41.10":{"status":"VALUE","value":100},"2.42.6":{"status":"VALUE","value":100},"2.43.2":{"status":"VALUE","value":100}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Daily__q-Daily__p-20250101__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Daily"]},"query":{"periodType":"Daily","period":"20250101","orgUnit":"A"},"expected":{"status":"VALUE","value":100},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":100},"2.40.13-SNAPSHOT":{"status":"VALUE","value":100},"2.41.11-SNAPSHOT":{"status":"VALUE","value":100},"2.42.7-SNAPSHOT":{"status":"VALUE","value":100},"2.43.3-SNAPSHOT":{"status":"VALUE","value":100},"2.40.12":{"status":"VALUE","value":100},"2.41.10":{"status":"VALUE","value":100},"2.42.6":{"status":"VALUE","value":100},"2.43.2":{"status":"VALUE","value":100}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Daily__q-FinancialAug__p-2023Aug__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Daily"]},"query":{"periodType":"FinancialAug","period":"2023Aug","orgUnit":"A"},"expected":{"status":"VALUE","value":58.19672131147541},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":58.19672131147541},"2.43.3-SNAPSHOT":{"status":"VALUE","value":58.19672131147541},"2.43.2":{"status":"VALUE","value":58.19672131147541}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Daily__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Daily"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"VALUE","value":66.66666666666666},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":66.66666666666667},"2.42.7-SNAPSHOT":{"status":"VALUE","value":66.66666666666667},"2.43.3-SNAPSHOT":{"status":"VALUE","value":66.66666666666667},"2.42.6":{"status":"VALUE","value":66.66666666666667},"2.43.2":{"status":"VALUE","value":66.66666666666667}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Daily__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G5_DS_Daily","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Daily"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"VALUE","value":100},"observed":{"2.44-SNAPSHOT":{"status":"VALUE","value":100},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"VALUE","value":100},"2.42.7-SNAPSHOT":{"status":"VALUE","value":100},"2.43.3-SNAPSHOT":{"status":"VALUE","value":100},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"VALUE","value":100},"2.42.6":{"status":"VALUE","value":100},"2.43.2":{"status":"VALUE","value":100}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Monthly__q-BiWeekly__p-2025BiW1__A","item":{"code":"PTT_G5_DS_Monthly","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Monthly"]},"query":{"periodType":"BiWeekly","period":"2025BiW1","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":0},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"REPEATED","value":0},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Monthly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G5_DS_Monthly","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Monthly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Quarterly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G5_DS_Quarterly","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Quarterly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Weekly__q-WeeklyFriday__p-2024FriW53__A","item":{"code":"PTT_G5_DS_Weekly","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Weekly"]},"query":{"periodType":"WeeklyFriday","period":"2024FriW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Weekly__q-WeeklySaturday__p-2024SatW53__A","item":{"code":"PTT_G5_DS_Weekly","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Weekly"]},"query":{"periodType":"WeeklySaturday","period":"2024SatW53","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"REPEATED","value":0},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"REPEATED","value":0},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"pass","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"pass","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Yearly__q-FinancialSep__p-2023Sep__A","item":{"code":"PTT_G5_DS_Yearly","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Yearly"]},"query":{"periodType":"FinancialSep","period":"2023Sep","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.42.6":"pass","2.43.2":"pass"}}, + {"id":"rate-REPORTING_RATE-Yearly__q-QuarterlyNov__p-2025NovQ1__A","item":{"code":"PTT_G5_DS_Yearly","dimensionItemType":"REPORTING_RATE","metric":"REPORTING_RATE","collectionPeriodTypes":["Yearly"]},"query":{"periodType":"QuarterlyNov","period":"2025NovQ1","orgUnit":"A"},"expected":{"status":"REPEATED","value":0},"observed":{"2.44-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.13-SNAPSHOT":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.11-SNAPSHOT":{"status":"REPEATED","value":0},"2.42.7-SNAPSHOT":{"status":"REPEATED","value":0},"2.43.3-SNAPSHOT":{"status":"REPEATED","value":0},"2.40.12":{"status":"ERROR","value":null,"error":"500: Can't find resource for bundle java.util.PropertyResourceBundle, key format.QuarterlyNov.startDate"},"2.41.10":{"status":"REPEATED","value":0},"2.42.6":{"status":"REPEATED","value":0},"2.43.2":{"status":"REPEATED","value":0}},"verdict":{"2.44-SNAPSHOT":"pass","2.40.13-SNAPSHOT":"fail","2.41.11-SNAPSHOT":"pass","2.42.7-SNAPSHOT":"pass","2.43.3-SNAPSHOT":"pass","2.40.12":"fail","2.41.10":"pass","2.42.6":"pass","2.43.2":"pass"}} + ] +} diff --git a/src/api/dataItemProfile/__tests__/assignedOrgUnitCounts.spec.js b/src/api/dataItemProfile/__tests__/assignedOrgUnitCounts.spec.js new file mode 100644 index 000000000..1f1c1505a --- /dev/null +++ b/src/api/dataItemProfile/__tests__/assignedOrgUnitCounts.spec.js @@ -0,0 +1,79 @@ +import { createFakeOrgUnitServer } from '../../../__fixtures__/fakeOrgUnitServer.js' +import { + fetchAssignedOrgUnitCounts, + getDataItemProfileSourceKeys, +} from '../assignedOrgUnitCounts.js' + +/* A nation with 2 districts and 3 facilities. formMonth: 2 of the 3 + * facilities, and the nation. eventProgra: the 3 facilities. */ +const ORG_UNITS = [ + ['nationUnit1', 1, '/nationUnit1', ['formMonth']], + ['districtAAA', 2, '/nationUnit1/districtAAA', []], + ['districtBBB', 2, '/nationUnit1/districtBBB', []], + ['facilityAAA', 3, '/nationUnit1/districtAAA/facilityAAA', ['formMonth']], + ['facilityBBB', 3, '/nationUnit1/districtAAA/facilityBBB', ['formMonth']], + ['facilityCCC', 3, '/nationUnit1/districtBBB/facilityCCC', []], +].map(([id, level, path, dataSets]) => ({ + id, + level, + path, + dataSets, + programs: level === 3 ? ['eventProgra'] : [], +})) + +const { createEngine } = createFakeOrgUnitServer({ + orgUnits: ORG_UNITS, + levels: [3, 1, 2], +}) + +const dataSets = (...ids) => ids.map((id) => ({ id, field: 'dataSets' })) + +describe('getDataItemProfileSourceKeys', () => { + it('lists the data sets and programs behind profiles, once each', () => { + expect( + getDataItemProfileSourceKeys([ + { + sources: [ + { dataSet: { id: 'formA' } }, + { dataSet: null }, + { dataSet: null, program: { id: 'programA' } }, + { + dataSet: null, + program: { id: 'programB' }, + orgUnitField: 'REGISTRATION', + }, + ], + }, + { sources: [{ dataSet: { id: 'formA' } }] }, + undefined, + ]) + ).toEqual([ + { id: 'formA', field: 'dataSets' }, + { id: 'programA', field: 'programs' }, + ]) + expect(getDataItemProfileSourceKeys()).toEqual([]) + }) +}) + +describe('fetchAssignedOrgUnitCounts', () => { + it('fetches the levels, then counts each source per level', async () => { + const result = await fetchAssignedOrgUnitCounts(createEngine(), [ + ...dataSets('formMonth', 'formNone'), + { id: 'eventProgra', field: 'programs' }, + ]) + + expect(result).toEqual({ + levels: [ + { id: 'level1', level: 1, name: 'Level 1' }, + { id: 'level2', level: 2, name: 'Level 2' }, + { id: 'level3', level: 3, name: 'Level 3' }, + ], + assignedOrgUnitCounts: { + formMonth: { 1: 1, 3: 2 }, + formNone: {}, + eventProgra: { 3: 3 }, + }, + requests: 9, + }) + }) +}) diff --git a/src/api/dataItemProfile/__tests__/coverageCounts.spec.js b/src/api/dataItemProfile/__tests__/coverageCounts.spec.js new file mode 100644 index 000000000..89f176435 --- /dev/null +++ b/src/api/dataItemProfile/__tests__/coverageCounts.spec.js @@ -0,0 +1,74 @@ +import { isCounted, mergeCounts, recordCount } from '../coverageCounts.js' + +describe('coverageCounts', () => { + it('records totals, source counts per level, and ancestors that add up', () => { + const counts = {} + + recordCount(counts, ['districtAAA', 'total', 3], 4) + recordCount(counts, ['districtAAA', 'formMonth', 3], 2) + recordCount(counts, ['groupKey', 'formMonth', 'ancestors'], 1) + recordCount(counts, ['groupKey', 'formMonth', 'ancestors'], 2) + + expect(counts).toEqual({ + districtAAA: { + totals: { 3: 4 }, + sources: { formMonth: { byLevel: { 3: 2 } } }, + }, + groupKey: { + totals: {}, + sources: { formMonth: { byLevel: {}, ancestors: 3 } }, + }, + }) + }) + + it('tells a count of 0 from one not fetched', () => { + const counts = {} + + recordCount(counts, ['districtAAA', 'formMonth', 3], 0) + recordCount(counts, ['districtAAA', 'formMonth', 'ancestors'], 0) + + expect(isCounted(counts, ['districtAAA', 'formMonth', 3])).toBe(true) + expect( + isCounted(counts, ['districtAAA', 'formMonth', 'ancestors']) + ).toBe(true) + expect(isCounted(counts, ['districtAAA', 'formMonth', 2])).toBe(false) + expect(isCounted(counts, ['districtAAA', 'formQuart', 3])).toBe(false) + expect(isCounted(counts, ['districtAAA', 'total', 3])).toBe(false) + expect(isCounted(undefined, ['districtAAA', 'total', 3])).toBe(false) + }) + + it('merges counts source by source and level by level', () => { + expect( + mergeCounts( + { + districtAAA: { + totals: { 3: 4 }, + sources: { + formMonth: { byLevel: { 3: 2 }, ancestors: 1 }, + }, + }, + }, + { + districtAAA: { + totals: { 2: 1 }, + sources: { + formMonth: { byLevel: { 2: 0 } }, + formQuart: { byLevel: { 2: 1 } }, + }, + }, + districtBBB: { totals: {}, sources: {} }, + } + ) + ).toEqual({ + districtAAA: { + totals: { 2: 1, 3: 4 }, + sources: { + formMonth: { byLevel: { 2: 0, 3: 2 }, ancestors: 1 }, + formQuart: { byLevel: { 2: 1 } }, + }, + }, + districtBBB: { totals: {}, sources: {} }, + }) + expect(mergeCounts()).toEqual({}) + }) +}) diff --git a/src/api/dataItemProfile/__tests__/fetchDataItemProfileMetadata.spec.js b/src/api/dataItemProfile/__tests__/fetchDataItemProfileMetadata.spec.js new file mode 100644 index 000000000..08e402f01 --- /dev/null +++ b/src/api/dataItemProfile/__tests__/fetchDataItemProfileMetadata.spec.js @@ -0,0 +1,209 @@ +import { getDataItemProfile } from '../../../modules/dataItemProfile/getDataItemProfile.js' +import { fetchDataItemProfileMetadata } from '../fetchDataItemProfileMetadata.js' +import { normalizeDataItemProfileMetadata } from '../metadataQueries.js' + +// The metadata responses the test tool recorded on every version +describe('fetchDataItemProfileMetadata', () => { + const server = { + dataElements: { + deA: { + aggregationType: 'SUM', + dataSetElements: [ + { dataSet: { id: 'dsMonthly', periodType: 'Monthly' } }, + ], + }, + dePop: { + aggregationType: 'AVERAGE', + dataSetElements: [ + { dataSet: { id: 'dsYearly', periodType: 'Yearly' } }, + ], + }, + }, + dataSets: { dsA: { periodType: 'Weekly' } }, + indicators: { + coverage: { numerator: '#{deA.coc}', denominator: '#{dePop}' }, + outer: { + numerator: 'N{coverage} + R{dsA.REPORTING_RATE}', + denominator: 'N{outer}', + }, + }, + expressionDimensionItems: { + edi: { expression: '#{deA} + I{pi} + D{prB.de}' }, + }, + programIndicators: { + pi: { program: { id: 'prA' } }, + piByRegist: { + program: { id: 'prA' }, + orgUnitField: 'REGISTRATION', + }, + }, + programs: { + prA: { programType: 'WITH_REGISTRATION' }, + prB: { programType: 'WITHOUT_REGISTRATION' }, + }, + categoryOptionCombos: { coc: { categoryCombo: { id: 'comboA' } } }, + } + + const createEngine = (objects = server) => ({ + query: jest.fn(async (query, { variables: { ids } }) => { + const [resource] = Object.keys(query) + + return { + [resource]: { + [resource]: ids + .filter((id) => objects[resource][id]) + .map((id) => ({ id, ...objects[resource][id] })), + }, + } + }), + }) + + const fetchMetadata = (engine, items) => + fetchDataItemProfileMetadata(engine, items) + + const requestsOf = (engine) => + engine.query.mock.calls.map(([query, { variables }]) => [ + Object.keys(query)[0], + variables.ids, + ]) + + it('fetches operands round by round, each object once', async () => { + const engine = createEngine() + const metadata = await fetchMetadata(engine, [ + { id: 'outer', dimensionItemType: 'INDICATOR' }, + { id: 'edi', dimensionItemType: 'EXPRESSION_DIMENSION_ITEM' }, + { id: 'pi', dimensionItemType: 'PROGRAM_INDICATOR' }, + ]) + + expect(requestsOf(engine)).toEqual([ + ['indicators', ['outer']], + ['expressionDimensionItems', ['edi']], + ['programIndicators', ['pi']], + ['dataElements', ['deA']], + ['indicators', ['coverage']], + ['dataSets', ['dsA']], + ['programs', ['prB', 'prA']], + ['dataElements', ['dePop']], + // The disaggregation of #{deA.coc}, to tell which data sets collect it + ['categoryOptionCombos', ['coc']], + ]) + expect( + getDataItemProfile( + { id: 'outer', dimensionItemType: 'INDICATOR' }, + metadata + ) + ).toMatchObject({ + unknown: false, + assignedPeriodTypes: { + types: ['Weekly', 'Monthly', 'Yearly'], + shortestDirectType: 'Yearly', + hasSeveral: true, + }, + }) + }) + + it('reads where a program indicator places its values', async () => { + const metadata = await fetchMetadata(createEngine(), [ + { id: 'pi', dimensionItemType: 'PROGRAM_INDICATOR' }, + { id: 'piByRegist', dimensionItemType: 'PROGRAM_INDICATOR' }, + ]) + + expect(metadata.programIndicators).toEqual({ + pi: { program: 'prA' }, + piByRegist: { program: 'prA', orgUnitField: 'REGISTRATION' }, + }) + }) + + it('reads data elements, operands and reporting rates by their object', async () => { + const engine = createEngine() + + await fetchMetadata(engine, [ + { id: 'deA', dimensionItemType: 'DATA_ELEMENT' }, + { id: 'dePop.coc', dimensionItemType: 'DATA_ELEMENT_OPERAND' }, + { id: 'dsA.REPORTING_RATE', dimensionItemType: 'REPORTING_RATE' }, + ]) + + expect(requestsOf(engine)).toEqual([ + ['dataElements', ['deA', 'dePop']], + ['dataSets', ['dsA']], + ['categoryOptionCombos', ['coc']], + ]) + }) + + it('sends nothing without items that need metadata', async () => { + const engine = createEngine() + + expect(await fetchMetadata(engine)).toEqual( + normalizeDataItemProfileMetadata() + ) + expect(engine.query).not.toHaveBeenCalled() + }) + + it('follows nested indicators until nothing new is referred to', async () => { + const chain = Object.fromEntries( + Array.from({ length: 20 }, (_, i) => [ + `i${i}`, + { numerator: `N{i${i + 1}}`, denominator: '1' }, + ]) + ) + const engine = createEngine({ ...server, indicators: chain }) + + await fetchMetadata(engine, [ + { id: 'i0', dimensionItemType: 'INDICATOR' }, + ]) + + // i0 to i19, then i20, which isn't on the server + expect(engine.query).toHaveBeenCalledTimes(21) + }) + + it('fetches indicators that refer to each other once', async () => { + const engine = createEngine({ + ...server, + indicators: { + loopA: { numerator: 'N{loopB}', denominator: '1' }, + loopB: { numerator: 'N{loopA}', denominator: '1' }, + }, + }) + + await fetchMetadata(engine, [ + { id: 'loopA', dimensionItemType: 'INDICATOR' }, + ]) + + expect(requestsOf(engine)).toEqual([ + ['indicators', ['loopA']], + ['indicators', ['loopB']], + ]) + }) + + it('fails when a request fails', async () => { + const engine = { + query: jest.fn().mockRejectedValue(new Error('offline')), + } + + await expect( + fetchDataItemProfileMetadata(engine, [ + { id: 'deA', dimensionItemType: 'DATA_ELEMENT' }, + ]) + ).rejects.toThrow('offline') + }) + + it('fetches only what the known metadata lacks', async () => { + const engine = createEngine() + const known = await fetchMetadata(engine, [ + { id: 'deA', dimensionItemType: 'DATA_ELEMENT' }, + ]) + + engine.query.mockClear() + const metadata = await fetchDataItemProfileMetadata( + engine, + [ + { id: 'deA', dimensionItemType: 'DATA_ELEMENT' }, + { id: 'dePop', dimensionItemType: 'DATA_ELEMENT' }, + ], + { known } + ) + + expect(requestsOf(engine)).toEqual([['dataElements', ['dePop']]]) + expect(Object.keys(metadata.dataElements)).toEqual(['deA', 'dePop']) + }) +}) diff --git a/src/api/dataItemProfile/__tests__/fetchOrgUnitCoverage.spec.js b/src/api/dataItemProfile/__tests__/fetchOrgUnitCoverage.spec.js new file mode 100644 index 000000000..19b3148ac --- /dev/null +++ b/src/api/dataItemProfile/__tests__/fetchOrgUnitCoverage.spec.js @@ -0,0 +1,343 @@ +import { createFakeOrgUnitServer } from '../../../__fixtures__/fakeOrgUnitServer.js' +import { fetchOrgUnitCoverage } from '../fetchOrgUnitCoverage.js' + +/* A nation with 2 districts and 3 facilities. formMonth: 2 of the 3 + * facilities, and the nation. formQuart: the districts. eventProgra: the 3 + * facilities. clinicGroup: facilityAAA and facilityCCC. mixedGroupA: + * districtBBB and facilityAAA. */ +const GROUPS = { + clinicGroup: ['facilityAAA', 'facilityCCC'], + mixedGroupA: ['districtBBB', 'facilityAAA'], +} + +const UNITS = [ + ['nationUnit1', 1, '/nationUnit1', ['formMonth']], + ['districtAAA', 2, '/nationUnit1/districtAAA', ['formQuart']], + ['districtBBB', 2, '/nationUnit1/districtBBB', ['formQuart']], + ['facilityAAA', 3, '/nationUnit1/districtAAA/facilityAAA', ['formMonth']], + ['facilityBBB', 3, '/nationUnit1/districtAAA/facilityBBB', ['formMonth']], + ['facilityCCC', 3, '/nationUnit1/districtBBB/facilityCCC', []], +].map(([id, level, path, dataSets]) => ({ + id, + level, + path, + dataSets, + programs: level === 3 ? ['eventProgra'] : [], +})) + +const { createEngine } = createFakeOrgUnitServer({ + orgUnits: UNITS, + groups: GROUPS, + user: { + organisationUnits: ['nationUnit1'], + dataViewOrganisationUnits: ['districtAAA'], + }, + // Out of order, as a server may list them + levels: [3, 1, 2], +}) + +const dataSets = (...ids) => ids.map((id) => ({ id, field: 'dataSets' })) + +const fetchFor = (orgUnits, sourceKeys = dataSets('formMonth', 'formQuart')) => + fetchOrgUnitCoverage(createEngine(), { sourceKeys, orgUnits }) + +describe('fetchOrgUnitCoverage', () => { + it('counts the assignments under an org unit, per level, and its assigned ancestors', async () => { + const coverage = await fetchFor(['districtAAA']) + + expect(coverage.levels.map(({ level }) => level)).toEqual([1, 2, 3]) + expect(coverage.orgUnits.districtAAA).toEqual({ + id: 'districtAAA', + level: 2, + path: '/nationUnit1/districtAAA', + name: undefined, + }) + expect(coverage.assignedOrgUnitCounts).toEqual({ + formMonth: { 1: 1, 3: 2 }, + formQuart: { 2: 2 }, + }) + // Ancestors are counted only for a data set assigned higher somewhere + expect(coverage.counts.districtAAA).toEqual({ + totals: {}, + sources: { + formMonth: { byLevel: { 3: 2 }, ancestors: 1 }, + formQuart: { byLevel: { 2: 1 } }, + }, + }) + expect(coverage).toMatchObject({ + rootIds: ['nationUnit1'], + userOrgUnitIds: null, + }) + }) + + it('counts the org units under it too, with assignment totals', async () => { + const coverage = await fetchOrgUnitCoverage(createEngine(), { + sourceKeys: dataSets('formMonth', 'formQuart'), + orgUnits: ['districtAAA'], + withAssignmentTotals: true, + }) + + expect(coverage.counts.districtAAA.totals).toEqual({ 2: 1, 3: 2 }) + }) + + it('reads the only root from the counts across the hierarchy', async () => { + const coverage = await fetchFor(['nationUnit1'], dataSets('formQuart')) + + expect(coverage.counts.nationUnit1).toEqual({ + totals: {}, + sources: { formQuart: { byLevel: { 2: 2 } } }, + }) + // Levels, org unit and roots, then 3 assigned counts, and none under the nation + expect(coverage.requests).toBe(3 + 3) + }) + + it('reuses the level counts it is given', async () => { + const engine = createEngine() + const coverage = await fetchOrgUnitCoverage(engine, { + sourceKeys: dataSets('formQuart'), + orgUnits: ['districtAAA'], + assignedOrgUnitCounts: { formQuart: { 2: 2 } }, + }) + + expect(coverage.assignedOrgUnitCounts).toEqual({ formQuart: { 2: 2 } }) + // Levels, org unit and roots, then the one count under the district + expect(coverage.requests).toBe(3 + 1) + }) + + it('loads the roots, and counts under them for a level alone', async () => { + const coverage = await fetchOrgUnitCoverage(createEngine(), { + sourceKeys: dataSets('formMonth', 'formQuart'), + orgUnits: ['LEVEL-3'], + withAssignmentTotals: true, + }) + + expect(coverage.rootIds).toEqual(['nationUnit1']) + expect(coverage.counts.nationUnit1.totals).toEqual({ 1: 1, 2: 2, 3: 3 }) + }) + + it('loads the user org units, from the data view ones first', async () => { + const coverage = await fetchFor(['USER_ORGUNIT_CHILDREN']) + + expect(coverage.userOrgUnitIds).toEqual(['districtAAA']) + }) + + it('falls back to the user data capture org units', async () => { + const engine = createEngine() + const query = engine.query + + engine.query = jest.fn(async (request) => { + const response = await query(request) + + return response.me + ? { ...response, me: { organisationUnits: [UNITS[0]] } } + : response + }) + + const coverage = await fetchOrgUnitCoverage(engine, { + sourceKeys: [], + orgUnits: ['USER_ORGUNIT'], + }) + + expect(coverage.userOrgUnitIds).toEqual(['nationUnit1']) + expect(coverage.counts).toEqual({}) + }) + + it('counts a group per level its members are at, with its members', async () => { + const coverage = await fetchFor(['OU_GROUP-mixedGroupA']) + + expect(coverage.groups).toEqual({ mixedGroupA: { 2: 1, 3: 1 } }) + expect(coverage.counts).toEqual({ + 'mixedGroupA:2:': { + totals: { 2: 1 }, + sources: { + formMonth: { byLevel: { 3: 0 }, ancestors: 1 }, + formQuart: { byLevel: { 2: 1 } }, + }, + }, + 'mixedGroupA:3:': { + totals: { 3: 1 }, + sources: { + formMonth: { byLevel: { 3: 1 }, ancestors: 1 }, + formQuart: { byLevel: {}, ancestors: 1 }, + }, + }, + }) + }) + + it('counts the org units under the members, with assignment totals', async () => { + const coverage = await fetchOrgUnitCoverage(createEngine(), { + sourceKeys: dataSets('formMonth', 'formQuart'), + orgUnits: ['OU_GROUP-mixedGroupA'], + withAssignmentTotals: true, + }) + + expect(coverage.counts['mixedGroupA:2:'].totals).toEqual({ 2: 1, 3: 1 }) + }) + + it('counts a group under each parent at or above its members', async () => { + const coverage = await fetchFor( + ['districtAAA', 'facilityCCC', 'OU_GROUP-clinicGroup'], + dataSets('formMonth') + ) + + expect(coverage.counts['clinicGroup:3:districtAAA']).toEqual({ + totals: { 3: 1 }, + sources: { formMonth: { byLevel: { 3: 1 }, ancestors: 1 } }, + }) + expect(coverage.counts['clinicGroup:3:facilityCCC']).toEqual({ + totals: { 3: 1 }, + sources: { formMonth: { byLevel: { 3: 0 }, ancestors: 1 } }, + }) + }) + + it('counts a group under the user org units as parents', async () => { + const coverage = await fetchFor( + ['USER_ORGUNIT', 'OU_GROUP-clinicGroup'], + dataSets('formMonth') + ) + + expect(coverage.counts['clinicGroup:3:districtAAA']).toEqual({ + totals: { 3: 1 }, + sources: { formMonth: { byLevel: { 3: 1 }, ancestors: 1 } }, + }) + }) + + it('sends no count without org units or data sets', async () => { + expect(await fetchOrgUnitCoverage(createEngine(), {})).toMatchObject({ + orgUnits: {}, + counts: {}, + requests: 0, + }) + }) +}) + +describe('fetchOrgUnitCoverage, for a large selection', () => { + // 60 data sets assigned as formMonth is: over 100 counts under the nation + const formIds = Array.from({ length: 60 }, (_, i) => `form${i}`) + const { createEngine: createLargeEngine } = createFakeOrgUnitServer({ + orgUnits: UNITS.map((orgUnit) => ({ + ...orgUnit, + dataSets: orgUnit.dataSets.includes('formMonth') ? formIds : [], + })), + groups: GROUPS, + }) + + it('counts from lists of each data set’s org units, as the server would', async () => { + const orgUnits = ['nationUnit1', 'OU_GROUP-mixedGroupA'] + const engine = createLargeEngine() + const coverage = await fetchOrgUnitCoverage(engine, { + sourceKeys: dataSets(...formIds), + orgUnits, + }) + const expected = await fetchFor(orgUnits, dataSets('formMonth')) + const sourcesOf = (counted) => + Object.fromEntries( + Object.entries(counted).map(([key, { totals, sources }]) => [ + key, + { totals, sources: sources.form59 ?? sources.formMonth }, + ]) + ) + const listRequests = engine.query.mock.calls.filter(([query]) => + Object.values(query).some(({ params }) => params?.fields === 'path') + ) + + expect(sourcesOf(coverage.counts)).toEqual(sourcesOf(expected.counts)) + expect(listRequests).not.toHaveLength(0) + }) + + it('keeps the lists for the next selection', async () => { + const engine = createLargeEngine() + const previous = await fetchOrgUnitCoverage(engine, { + sourceKeys: dataSets(...formIds), + orgUnits: ['OU_GROUP-mixedGroupA'], + }) + + engine.query.mockClear() + const coverage = await fetchOrgUnitCoverage(engine, { + sourceKeys: dataSets(...formIds), + orgUnits: ['OU_GROUP-mixedGroupA', 'districtAAA', 'districtBBB'], + previous, + }) + const listRequests = engine.query.mock.calls.filter(([query]) => + Object.values(query).some(({ params }) => params?.fields === 'path') + ) + + expect(Object.keys(previous.lists.sources)).toHaveLength(60) + expect(coverage.counts.districtAAA.sources.form0.byLevel).toEqual({ + 3: 2, + }) + expect(listRequests).toHaveLength(0) + }) +}) + +describe('fetchOrgUnitCoverage, after an earlier selection', () => { + it('fetches only what the earlier coverage lacks', async () => { + const engine = createEngine() + const previous = await fetchOrgUnitCoverage(engine, { + sourceKeys: dataSets('formMonth'), + orgUnits: ['districtAAA'], + }) + + engine.query.mockClear() + const coverage = await fetchOrgUnitCoverage(engine, { + sourceKeys: dataSets('formMonth'), + orgUnits: ['districtAAA', 'districtBBB'], + previous, + }) + const sent = engine.query.mock.calls.flatMap(([query]) => + Object.values(query) + ) + + expect(coverage.counts.districtAAA).toEqual(previous.counts.districtAAA) + expect(coverage.counts.districtBBB).toBeDefined() + expect( + sent.some(({ resource }) => resource !== 'organisationUnits') + ).toBe(false) + expect( + sent.some(({ params }) => + params.filter.includes?.('path:like:districtAAA') + ) + ).toBe(false) + }) + + it('counts only the new data set when the sources change', async () => { + const engine = createEngine() + const previous = await fetchOrgUnitCoverage(engine, { + sourceKeys: dataSets('formMonth'), + orgUnits: ['districtAAA'], + }) + + engine.query.mockClear() + const coverage = await fetchOrgUnitCoverage(engine, { + sourceKeys: dataSets('formMonth', 'formQuart'), + orgUnits: ['districtAAA'], + previous, + }) + const sentFilters = engine.query.mock.calls.flatMap(([query]) => + Object.values(query).flatMap(({ params }) => params?.filter ?? []) + ) + + expect(coverage.counts.districtAAA.sources.formQuart).toBeDefined() + expect(coverage.counts.districtAAA.sources.formMonth).toEqual( + previous.counts.districtAAA.sources.formMonth + ) + expect(sentFilters).toContain('dataSets.id:eq:formQuart') + expect(sentFilters).not.toContain('dataSets.id:eq:formMonth') + }) + + it('reuses the roots and user org units it knows', async () => { + const engine = createEngine() + const previous = await fetchOrgUnitCoverage(engine, { + orgUnits: ['LEVEL-2', 'USER_ORGUNIT'], + }) + + engine.query.mockClear() + const coverage = await fetchOrgUnitCoverage(engine, { + orgUnits: ['LEVEL-3', 'USER_ORGUNIT'], + previous, + }) + + expect(engine.query).not.toHaveBeenCalled() + expect(coverage.userOrgUnitIds).toEqual(['districtAAA']) + }) +}) diff --git a/src/api/dataItemProfile/__tests__/metadataQueries.spec.js b/src/api/dataItemProfile/__tests__/metadataQueries.spec.js new file mode 100644 index 000000000..4eb265477 --- /dev/null +++ b/src/api/dataItemProfile/__tests__/metadataQueries.spec.js @@ -0,0 +1,301 @@ +import metadataShapes from '../../../__fixtures__/period-types/metadata-shapes.json' +import { PERIOD_TYPE_FREQUENCY_ORDER } from '../../../modules/dataItemProfile/constants.js' +import { getDataItemProfile } from '../../../modules/dataItemProfile/getDataItemProfile.js' +import { + dataItemProfileMetadataQueries, + normalizeDataItemProfileMetadata, +} from '../metadataQueries.js' +import { getTotal } from '../orgUnitQueries.js' + +const getResponses = ({ requests }) => + Object.fromEntries(requests.map(({ name, response }) => [name, response])) + +const getRecordedFields = ({ path }) => + new URLSearchParams(path.split('?')[1]).get('fields') + +// The top-level fields of a field list: `a,b[c,d]` gives a and b[c,d] +const splitFields = (fields) => { + const result = [] + let depth = 0 + let current = '' + + for (const character of fields) { + if (character === ',' && depth === 0) { + result.push(current) + current = '' + } else { + depth += { '[': 1, ']': -1 }[character] ?? 0 + current += character + } + } + + return [...result, current] +} + +/* Fields the test tool's requests named after a resource don't ask for: + * aggregationLevels has a request of its own (dataElements-aggregationLevels) */ +const NOT_RECORDED = ['aggregationLevels'] + +describe('normalizeDataItemProfileMetadata', () => { + describe.each(Object.entries(metadataShapes.versions))( + 'the responses of %s', + (_, shapes) => { + const responses = getResponses(shapes) + const metadata = normalizeDataItemProfileMetadata(responses) + const idOfCode = (code) => + responses.dataElements.dataElements.find( + (dataElement) => dataElement.code === code + ).id + + it('give each data element its aggregation type and data sets', () => { + Object.values(metadata.dataElements).forEach((dataElement) => { + expect(typeof dataElement.aggregationType).toBe('string') + dataElement.dataSets.forEach((dataSet) => { + expect(typeof dataSet.id).toBe('string') + expect(typeof dataSet.periodType).toBe('string') + }) + }) + }) + + it('keep one data set per period type, and none for an element in no data set', () => { + expect( + metadata.dataElements[idOfCode('PTT_G3_MW')].dataSets + .map(({ periodType }) => periodType) + .sort() + ).toEqual(['Weekly', 'WeeklyWednesday']) + expect( + metadata.dataElements[idOfCode('PTT_G3_ORPHAN')].dataSets + ).toEqual([]) + }) + + it('give each indicator its expressions', () => { + Object.values(metadata.indicators).forEach((indicator) => { + expect(typeof indicator.numerator).toBe('string') + expect(typeof indicator.denominator).toBe('string') + }) + }) + + it('give each data set its period type', () => { + Object.values(metadata.dataSets).forEach((dataSet) => { + expect(typeof dataSet.periodType).toBe('string') + }) + }) + + it('give each expression dimension item its expression', () => { + Object.values(metadata.expressionDimensionItems).forEach( + (item) => expect(typeof item.expression).toBe('string') + ) + }) + + it('give a disaggregation only the data sets whose category combo holds it', () => { + const element = idOfCode('PTT_DIS_BOTH') + const quarterlyDataSet = metadata.dataElements[ + element + ].dataSets.find(({ periodType }) => periodType === 'Quarterly') + const optionCombo = Object.entries( + metadata.categoryOptionCombos + ).find( + ([, { categoryComboId }]) => + categoryComboId === quarterlyDataSet.categoryComboId + )[0] + const profileOf = (id) => + getDataItemProfile( + { id, dimensionItemType: 'DATA_ELEMENT_OPERAND' }, + metadata + ) + + expect( + profileOf(`${element}.${optionCombo}`).assignedPeriodTypes + .types + ).toEqual(['Quarterly']) + expect( + getDataItemProfile( + { id: element, dimensionItemType: 'DATA_ELEMENT' }, + metadata + ).assignedPeriodTypes.types + ).toEqual(['Monthly', 'Quarterly']) + }) + + // The smoke subset keeps a few of each version's types; the full export matched all of them + it('list period types with the frequency order the library keeps', () => { + const { periodTypes } = responses.periodTypes + + expect(periodTypes.length).toBeGreaterThan(0) + periodTypes.forEach(({ name, frequencyOrder }) => + expect([name, PERIOD_TYPE_FREQUENCY_ORDER[name]]).toEqual([ + name, + frequencyOrder, + ]) + ) + }) + + it('give each org unit count in the pager', () => { + const counts = shapes.requests.filter(({ name }) => + name.startsWith('count-') + ) + + expect(counts.length).toBeGreaterThan(0) + counts.forEach(({ name, response }) => + expect([name, getTotal(response)]).toEqual([ + name, + response.pager.total, + ]) + ) + counts.forEach(({ response }) => + expect(typeof response.pager.total).toBe('number') + ) + }) + + it('were recorded with every field the library asks for', () => { + shapes.requests + .filter(({ name }) => dataItemProfileMetadataQueries[name]) + .forEach((request) => { + const recorded = splitFields(getRecordedFields(request)) + const asked = splitFields( + dataItemProfileMetadataQueries[request.name].params( + { + ids: [], + } + ).fields + ).filter((field) => !NOT_RECORDED.includes(field)) + + expect(recorded).toEqual(expect.arrayContaining(asked)) + }) + }) + } + ) + + it('tells whether a program indicator has period boundaries', () => { + const { programIndicators } = normalizeDataItemProfileMetadata({ + programIndicators: [ + { id: 'bounded', analyticsPeriodBoundaries: [{ id: 'start' }] }, + { id: 'unbounded', analyticsPeriodBoundaries: [] }, + { id: 'notAsked' }, + ], + }) + + expect(programIndicators.bounded.hasPeriodBoundaries).toBe(true) + expect(programIndicators.unbounded.hasPeriodBoundaries).toBe(false) + expect(programIndicators.notAsked).not.toHaveProperty( + 'hasPeriodBoundaries' + ) + }) + + it('keeps the aggregation levels of a data element that has some', () => { + const { dataElements } = normalizeDataItemProfileMetadata({ + dataElements: [ + { id: 'capped', aggregationLevels: [2] }, + { id: 'free', aggregationLevels: [] }, + ], + }) + + expect(dataElements.capped.aggregationLevels).toEqual([2]) + expect(dataElements.free).not.toHaveProperty('aggregationLevels') + }) + + it('accepts lists, period types as objects and missing fields', () => { + expect( + normalizeDataItemProfileMetadata({ + dataElements: [ + { + id: 'a', + aggregationType: 'SUM', + dataSetElements: [ + { + dataSet: { + id: 'w1', + periodType: { name: 'Weekly' }, + }, + }, + { dataSet: { id: 'w1', periodType: 'Weekly' } }, + { dataSet: { id: 'w2', periodType: 'Weekly' } }, + { dataSet: {} }, + {}, + ], + }, + { id: 'b', aggregationType: 'SUM' }, + ], + dataSets: { gist: true, dataSets: [{ id: 'ds' }] }, + }) + ).toEqual({ + dataElements: { + a: { + aggregationType: 'SUM', + dataSets: [ + { id: 'w1', periodType: 'Weekly' }, + { id: 'w2', periodType: 'Weekly' }, + ], + }, + b: { + aggregationType: 'SUM', + dataSets: [], + }, + }, + dataSets: { ds: { periodType: undefined } }, + indicators: {}, + expressionDimensionItems: {}, + programIndicators: {}, + programs: {}, + categoryOptionCombos: {}, + }) + }) + + it('keeps the category combo each data set gives an element, its own by default', () => { + expect( + normalizeDataItemProfileMetadata({ + dataElements: { + dataElements: [ + { + id: 'deathsUnder5', + aggregationType: 'SUM', + categoryCombo: { id: 'defaultComb' }, + dataSetElements: [ + { + dataSet: { + id: 'mortality', + periodType: 'Monthly', + }, + }, + { + dataSet: { + id: 'byAgeGroup', + periodType: 'Monthly', + }, + categoryCombo: { id: 'ageGroupsCo' }, + }, + ], + }, + ], + }, + categoryOptionCombos: { + categoryOptionCombos: [ + { + id: 'under1Year1', + categoryCombo: { id: 'ageGroupsCo' }, + }, + ], + }, + }) + ).toMatchObject({ + dataElements: { + deathsUnder5: { + dataSets: [ + { + id: 'mortality', + periodType: 'Monthly', + categoryComboId: 'defaultComb', + }, + { + id: 'byAgeGroup', + periodType: 'Monthly', + categoryComboId: 'ageGroupsCo', + }, + ], + }, + }, + categoryOptionCombos: { + under1Year1: { categoryComboId: 'ageGroupsCo' }, + }, + }) + }) +}) diff --git a/src/api/dataItemProfile/__tests__/orgUnitGroupCounts.spec.js b/src/api/dataItemProfile/__tests__/orgUnitGroupCounts.spec.js new file mode 100644 index 000000000..3809dcb69 --- /dev/null +++ b/src/api/dataItemProfile/__tests__/orgUnitGroupCounts.spec.js @@ -0,0 +1,130 @@ +import { createFakeOrgUnitServer } from '../../../__fixtures__/fakeOrgUnitServer.js' +import { + fetchGroupMembersByLevel, + getGroupCountQueries, +} from '../orgUnitGroupCounts.js' + +/* A nation (1) with a district (2) holding two facilities (3). The group's + * members: the district and one facility. formMonth: the facilities. */ +const ORG_UNITS = [ + ['nationUnit1', 1, '/nationUnit1', []], + ['districtAAA', 2, '/nationUnit1/districtAAA', []], + ['facilityAAA', 3, '/nationUnit1/districtAAA/facilityAAA', ['formMonth']], + ['facilityBBB', 3, '/nationUnit1/districtAAA/facilityBBB', ['formMonth']], +].map(([id, level, path, dataSets]) => ({ + id, + level, + path, + dataSets, + programs: [], +})) +const GROUPS = { groupAAAAAA: ['districtAAA', 'facilityAAA'], emptyGroupA: [] } +const LEVELS = [1, 2, 3].map((level) => ({ id: `level${level}`, level })) +const FORM_MONTH = { id: 'formMonth', field: 'dataSets' } + +const filtersOf = (queries) => + Object.fromEntries( + queries.map(([key, query]) => [key.join('|'), query.params.filter]) + ) + +describe('fetchGroupMembersByLevel', () => { + it('counts each group’s members per level, leaving out empty levels', async () => { + const { createEngine } = createFakeOrgUnitServer({ + orgUnits: ORG_UNITS, + groups: GROUPS, + }) + + expect( + await fetchGroupMembersByLevel(createEngine(), { + groupIds: ['groupAAAAAA', 'emptyGroupA'], + levels: LEVELS, + }) + ).toEqual({ + groups: { groupAAAAAA: { 2: 1, 3: 1 }, emptyGroupA: {} }, + requests: 6, + }) + }) +}) + +describe('getGroupCountQueries', () => { + const orgUnitsById = Object.fromEntries( + ORG_UNITS.map((orgUnit) => [orgUnit.id, orgUnit]) + ) + const queriesFor = (parentIds, withTotals = true) => + getGroupCountQueries({ + withTotals, + groups: { groupAAAAAA: { 2: 1 } }, + parents: + parentIds?.map((id) => ({ + orgUnitId: id, + minLevel: orgUnitsById[id].level, + })) ?? null, + orgUnits: orgUnitsById, + sourceKeys: [FORM_MONTH], + assignedOrgUnitCounts: { formMonth: { 1: 1, 3: 2 } }, + }) + + it('counts org units below the members, and the sources above them', () => { + expect(filtersOf(queriesFor())).toEqual({ + 'groupAAAAAA:2:|total|2': [ + 'organisationUnitGroups.id:eq:groupAAAAAA', + 'level:eq:2', + ], + 'groupAAAAAA:2:|total|3': [ + 'parent.organisationUnitGroups.id:eq:groupAAAAAA', + 'level:eq:3', + ], + 'groupAAAAAA:2:|formMonth|ancestors': [ + 'children.organisationUnitGroups.id:eq:groupAAAAAA', + 'level:eq:1', + 'dataSets.id:eq:formMonth', + ], + 'groupAAAAAA:2:|formMonth|3': [ + 'parent.organisationUnitGroups.id:eq:groupAAAAAA', + 'level:eq:3', + 'dataSets.id:eq:formMonth', + ], + }) + }) + + it('counts only the members, not the org units below them, without totals', () => { + expect( + Object.keys(filtersOf(queriesFor(undefined, false))).filter((key) => + key.includes('|total|') + ) + ).toEqual(['groupAAAAAA:2:|total|2']) + }) + + it('keeps the members, and the org units above them, under each parent at or above them', () => { + const filters = filtersOf(queriesFor(['nationUnit1', 'facilityAAA'])) + + expect(filters['groupAAAAAA:2:nationUnit1|total|2']).toEqual([ + 'path:like:nationUnit1', + 'organisationUnitGroups.id:eq:groupAAAAAA', + 'level:eq:2', + ]) + expect( + filters['groupAAAAAA:2:nationUnit1|formMonth|ancestors'] + ).toEqual([ + 'path:like:nationUnit1', + 'children.organisationUnitGroups.id:eq:groupAAAAAA', + 'level:eq:1', + 'dataSets.id:eq:formMonth', + ]) + expect( + Object.keys(filters).some((key) => key.includes('facilityAAA')) + ).toBe(false) + }) + + it('takes the ancestors above a parent from its path', () => { + const filters = filtersOf(queriesFor(['districtAAA'])) + + expect( + filters['groupAAAAAA:2:districtAAA|formMonth|ancestors'] + ).toEqual([ + 'id:in:[nationUnit1]', + 'level:eq:1', + 'dataSets.id:eq:formMonth', + ]) + }) +}) diff --git a/src/api/dataItemProfile/__tests__/orgUnitListCounts.spec.js b/src/api/dataItemProfile/__tests__/orgUnitListCounts.spec.js new file mode 100644 index 000000000..91734bba7 --- /dev/null +++ b/src/api/dataItemProfile/__tests__/orgUnitListCounts.spec.js @@ -0,0 +1,73 @@ +import { createFakeOrgUnitServer } from '../../../__fixtures__/fakeOrgUnitServer.js' +import { createListCounter } from '../orgUnitListCounts.js' + +/* A nation with 2 districts and 3 facilities; formMonth: the nation and 2 + * facilities. The counter must agree with the server on every filter. */ +const UNITS = [ + ['nationUnit1', 1, '/nationUnit1', ['formMonth']], + ['districtAAA', 2, '/nationUnit1/districtAAA', []], + ['districtBBB', 2, '/nationUnit1/districtBBB', []], + ['facilityAAA', 3, '/nationUnit1/districtAAA/facilityAAA', ['formMonth']], + ['facilityBBB', 3, '/nationUnit1/districtAAA/facilityBBB', ['formMonth']], + ['facilityCCC', 3, '/nationUnit1/districtBBB/facilityCCC', []], +].map(([id, level, path, dataSets]) => ({ + id, + level, + path, + dataSets, + programs: [], +})) +const GROUPS = { + clinicGroup: ['facilityAAA', 'facilityCCC'], + mixedGroupA: ['districtBBB', 'facilityAAA'], +} + +const { answer } = createFakeOrgUnitServer({ orgUnits: UNITS, groups: GROUPS }) + +const listOf = (filter) => + answer({ + resource: 'organisationUnits', + params: { filter }, + }).organisationUnits.map(({ path }) => path) + +const ASSIGNED = 'dataSets.id:eq:formMonth' + +describe('createListCounter', () => { + const count = createListCounter( + Object.fromEntries( + Object.keys(GROUPS).map((groupId) => [ + groupId, + listOf(`organisationUnitGroups.id:eq:${groupId}`), + ]) + ) + ) + + it.each([ + [['level:eq:3']], + [['path:like:districtAAA', 'level:eq:3']], + [['id:in:[nationUnit1,districtAAA]']], + [['organisationUnitGroups.id:eq:clinicGroup', 'level:eq:3']], + [['parent.organisationUnitGroups.id:eq:mixedGroupA', 'level:eq:3']], + [['children.organisationUnitGroups.id:eq:clinicGroup', 'level:eq:2']], + [ + [ + 'children.children.organisationUnitGroups.id:eq:mixedGroupA', + 'level:eq:1', + ], + ], + [ + [ + 'path:like:nationUnit1', + 'parent.parent.organisationUnitGroups.id:eq:mixedGroupA', + ], + ], + ])('counts %j as the server does', (filter) => { + expect(count(listOf(ASSIGNED), filter)).toBe( + listOf([...filter, ASSIGNED]).length + ) + }) + + it('counts nothing for a filter it cannot evaluate', () => { + expect(count(listOf(ASSIGNED), ['name:eq:Nation'])).toBe(0) + }) +}) diff --git a/src/api/dataItemProfile/__tests__/orgUnitQueries.spec.js b/src/api/dataItemProfile/__tests__/orgUnitQueries.spec.js new file mode 100644 index 000000000..7ddb11d1f --- /dev/null +++ b/src/api/dataItemProfile/__tests__/orgUnitQueries.spec.js @@ -0,0 +1,125 @@ +import { + assignedTo, + countQuery, + getTotal, + inGroup, + queryAll, + readLevels, +} from '../orgUnitQueries.js' + +describe('orgUnitQueries', () => { + it('counts with one org unit per page', () => { + expect(countQuery(['level:eq:2'])).toEqual({ + resource: 'organisationUnits', + params: { filter: ['level:eq:2'], fields: 'id', pageSize: 1 }, + }) + }) + + it('reads the total from the pager', () => { + expect(getTotal({ pager: { total: 1166 } })).toBe(1166) + expect(getTotal({ organisationUnits: [] })).toBe(0) + expect(getTotal(undefined)).toBe(0) + }) + + it('filters by assignment and by group', () => { + expect(assignedTo({ id: 'formAAAAAAA', field: 'dataSets' })).toBe( + 'dataSets.id:eq:formAAAAAAA' + ) + expect(inGroup('groupAAAAAA')).toBe( + 'organisationUnitGroups.id:eq:groupAAAAAA' + ) + }) + + const createEngine = () => ({ + query: jest.fn(async (query) => + Object.fromEntries( + Object.entries(query).map(([key, { params }]) => [ + key, + { pager: { total: params.filter.length } }, + ]) + ) + ), + }) + + it('gives the responses in the order of the queries', async () => { + const engine = createEngine() + const signal = new AbortController().signal + + expect( + await queryAll( + engine, + [ + ['a', countQuery(['level:eq:1', 'level:eq:2'])], + ['b', countQuery(['level:eq:3'])], + ], + { signal } + ) + ).toEqual({ + responses: [{ pager: { total: 2 } }, { pager: { total: 1 } }], + requests: 2, + }) + expect(engine.query).toHaveBeenCalledWith( + { + query0: countQuery(['level:eq:1', 'level:eq:2']), + query1: countQuery(['level:eq:3']), + }, + { signal } + ) + }) + + it('sends identical queries once', async () => { + const engine = createEngine() + const { responses, requests } = await queryAll(engine, [ + ['a', countQuery(['level:eq:1'])], + ['b', countQuery(['level:eq:1'])], + ]) + + expect(responses).toEqual([ + { pager: { total: 1 } }, + { pager: { total: 1 } }, + ]) + expect(requests).toBe(1) + }) + + it('sends batches of 100 queries, one after the other', async () => { + const engine = createEngine() + const queries = Array.from({ length: 250 }, (_, i) => [ + i, + countQuery([`level:eq:${i}`]), + ]) + const { responses, requests } = await queryAll(engine, queries) + + expect(requests).toBe(250) + expect(responses).toHaveLength(250) + expect( + engine.query.mock.calls.map(([query]) => Object.keys(query).length) + ).toEqual([100, 100, 50]) + }) + + it('sends nothing without queries', async () => { + const engine = createEngine() + + expect(await queryAll(engine, [])).toEqual({ + responses: [], + requests: 0, + }) + expect(engine.query).not.toHaveBeenCalled() + }) + + it('sorts the levels', () => { + expect( + readLevels({ + levels: { + organisationUnitLevels: [ + { id: 'levelTwo', level: 2, displayName: 'District' }, + { id: 'levelOne', level: 1, displayName: 'National' }, + ], + }, + }) + ).toEqual([ + { id: 'levelOne', level: 1, name: 'National' }, + { id: 'levelTwo', level: 2, name: 'District' }, + ]) + expect(readLevels(undefined)).toEqual([]) + }) +}) diff --git a/src/api/dataItemProfile/assignedOrgUnitCounts.js b/src/api/dataItemProfile/assignedOrgUnitCounts.js new file mode 100644 index 000000000..6a4ddc21c --- /dev/null +++ b/src/api/dataItemProfile/assignedOrgUnitCounts.js @@ -0,0 +1,76 @@ +import { + canBeAtAnyOrgUnit, + getAssignmentField, + getSourceId, +} from '../../modules/dataItemProfile/sources.js' +import { + assignedTo, + countQuery, + getTotal, + levelsQuery, + queryAll, + readLevels, +} from './orgUnitQueries.js' + +/** + * The source keys of profiles (getDataItemProfile results): the data sets and + * programs whose assignment can be counted, as `[{ id, field }]`, `field` + * being the org unit field that lists them (dataSets or programs). Program + * indicators whose values can be at any org unit are left out. + */ +export const getDataItemProfileSourceKeys = (profiles = []) => [ + ...new Map( + profiles + .flatMap((profile) => profile?.sources ?? []) + .filter( + (source) => getSourceId(source) && !canBeAtAnyOrgUnit(source) + ) + .map((source) => [ + getSourceId(source), + { id: getSourceId(source), field: getAssignmentField(source) }, + ]) + ).values(), +] + +/** + * The number of org units each data set or program (`sourceKeys`, from + * getDataItemProfileSourceKeys) is assigned to, per level, across the hierarchy: one + * count per source and level. `levels` are fetched when not given; `signal` + * cancels the requests. Gives + * `{ levels, assignedOrgUnitCounts: { [sourceId]: { [level]: count } }, + * requests }`. + */ +export const fetchAssignedOrgUnitCounts = async ( + engine, + sourceKeys, + { levels, signal } = {} +) => { + const knownLevels = + levels ?? readLevels(await engine.query(levelsQuery, { signal })) + const queries = sourceKeys.flatMap((sourceKey) => + knownLevels.map(({ level }) => [ + [sourceKey.id, level], + countQuery([`level:eq:${level}`, assignedTo(sourceKey)]), + ]) + ) + const { responses, requests } = await queryAll(engine, queries, { + signal, + }) + const assignedOrgUnitCounts = Object.fromEntries( + sourceKeys.map(({ id }) => [id, {}]) + ) + + queries.forEach(([[sourceId, level]], i) => { + const total = getTotal(responses[i]) + + if (total) { + assignedOrgUnitCounts[sourceId][level] = total + } + }) + + return { + levels: knownLevels, + assignedOrgUnitCounts, + requests, + } +} diff --git a/src/api/dataItemProfile/coverageCounts.js b/src/api/dataItemProfile/coverageCounts.js new file mode 100644 index 000000000..6950cacfc --- /dev/null +++ b/src/api/dataItemProfile/coverageCounts.js @@ -0,0 +1,79 @@ +/* A coverage's counts, by org unit id or group key (getGroupCountsKey): + * `{ totals: { [level]: n }, sources: { [sourceId]: { byLevel: { [level]: n }, + * ancestors } } }`. A count query is keyed `[countsKey, what, level]`: `what` + * is 'total' or a source id, `level` a level or 'ancestors'. A count missing + * from the counts hasn't been fetched; 0 has. */ + +export const recordCount = (counts, [countsKey, what, level], total) => { + counts[countsKey] ??= { totals: {}, sources: {} } + + const counted = counts[countsKey] + + if (what === 'total') { + counted.totals[level] = total + return + } + + counted.sources[what] ??= { byLevel: {} } + + const source = counted.sources[what] + + // A group's ancestors are counted level by level, and add up + if (level === 'ancestors') { + source.ancestors = (source.ancestors ?? 0) + total + } else { + source.byLevel[level] = total + } +} + +// Whether a count query is answered in `counts` already +export const isCounted = (counts, [countsKey, what, level]) => { + const counted = counts?.[countsKey] + + if (what === 'total') { + return counted?.totals?.[level] !== undefined + } + + const source = counted?.sources?.[what] + + return level === 'ancestors' + ? source?.ancestors !== undefined + : source?.byLevel?.[level] !== undefined +} + +const mergeSources = (sources = {}, newSources = {}) => + Object.fromEntries( + [...new Set([...Object.keys(sources), ...Object.keys(newSources)])].map( + (id) => [ + id, + { + ...sources[id], + ...newSources[id], + byLevel: { + ...sources[id]?.byLevel, + ...newSources[id]?.byLevel, + }, + }, + ] + ) + ) + +// The counts of both, the new ones last +export const mergeCounts = (counts = {}, newCounts = {}) => + Object.fromEntries( + [...new Set([...Object.keys(counts), ...Object.keys(newCounts)])].map( + (countsKey) => [ + countsKey, + { + totals: { + ...counts[countsKey]?.totals, + ...newCounts[countsKey]?.totals, + }, + sources: mergeSources( + counts[countsKey]?.sources, + newCounts[countsKey]?.sources + ), + }, + ] + ) + ) diff --git a/src/api/dataItemProfile/fetchDataItemProfileMetadata.js b/src/api/dataItemProfile/fetchDataItemProfileMetadata.js new file mode 100644 index 000000000..fae883f5a --- /dev/null +++ b/src/api/dataItemProfile/fetchDataItemProfileMetadata.js @@ -0,0 +1,200 @@ +import { + getCategoryOptionComboId, + parseExpressionOperands, +} from '../../modules/dataItemProfile/expressionOperands.js' +import { REPORTING_RATE } from '../../modules/dataSets.js' +import { + DIMENSION_TYPE_DATA_ELEMENT, + DIMENSION_TYPE_DATA_ELEMENT_OPERAND, + DIMENSION_TYPE_EVENT_DATA_ITEM, + DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM, + DIMENSION_TYPE_INDICATOR, + DIMENSION_TYPE_PROGRAM_ATTRIBUTE, + DIMENSION_TYPE_PROGRAM_ATTRIBUTE_OPTION, + DIMENSION_TYPE_PROGRAM_DATA_ELEMENT, + DIMENSION_TYPE_PROGRAM_DATA_ELEMENT_OPTION, + DIMENSION_TYPE_PROGRAM_INDICATOR, +} from '../../modules/dataTypes.js' +import { + dataItemProfileMetadataQueries, + METADATA_RESOURCES, + normalizeDataItemProfileMetadata, +} from './metadataQueries.js' + +const createPending = () => + Object.fromEntries( + METADATA_RESOURCES.map((resource) => [resource, new Set()]) + ) + +// The program of program.element or program.attribute, if the id names one +const addProgramOfItem = (pending, id) => { + if (id.includes('.')) { + pending.programs.add(id.split('.')[0]) + } +} + +// The category option combo of a disaggregation, to tell which data sets collect it +const addCategoryOptionCombo = (pending, operand) => { + const id = getCategoryOptionComboId(operand) + + if (id) { + pending.categoryOptionCombos.add(id) + } +} + +const addItem = (pending, { id, dimensionItemType }) => { + switch (dimensionItemType) { + case DIMENSION_TYPE_DATA_ELEMENT: + case DIMENSION_TYPE_DATA_ELEMENT_OPERAND: + pending.dataElements.add(id.split('.')[0]) + addCategoryOptionCombo(pending, id) + break + case REPORTING_RATE: + pending.dataSets.add(id.split('.')[0]) + break + case DIMENSION_TYPE_INDICATOR: + pending.indicators.add(id) + break + case DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM: + pending.expressionDimensionItems.add(id) + break + case DIMENSION_TYPE_PROGRAM_INDICATOR: + pending.programIndicators.add(id) + break + case DIMENSION_TYPE_PROGRAM_DATA_ELEMENT: + case DIMENSION_TYPE_PROGRAM_DATA_ELEMENT_OPTION: + case DIMENSION_TYPE_PROGRAM_ATTRIBUTE: + case DIMENSION_TYPE_PROGRAM_ATTRIBUTE_OPTION: + case DIMENSION_TYPE_EVENT_DATA_ITEM: + addProgramOfItem(pending, id) + break + default: + // Other items need no metadata + } +} + +const RESOURCE_BY_OPERAND_TYPE = { + [DIMENSION_TYPE_DATA_ELEMENT]: 'dataElements', + [REPORTING_RATE]: 'dataSets', + [DIMENSION_TYPE_INDICATOR]: 'indicators', + [DIMENSION_TYPE_PROGRAM_INDICATOR]: 'programIndicators', +} + +const PROGRAM_ITEM_OPERAND_TYPES = new Set([ + DIMENSION_TYPE_PROGRAM_DATA_ELEMENT, + DIMENSION_TYPE_PROGRAM_ATTRIBUTE, +]) + +const addOperands = (pending, expression) => + parseExpressionOperands(expression).forEach(({ type, id, operand }) => { + const resource = RESOURCE_BY_OPERAND_TYPE[type] + + if (resource) { + pending[resource].add(id) + addCategoryOptionCombo(pending, operand) + } else if (PROGRAM_ITEM_OPERAND_TYPES.has(type)) { + addProgramOfItem(pending, id) + } + }) + +// What the fetched objects refer to: operands of expressions, programs of program indicators +const getReferences = (fetched) => { + const pending = createPending() + + Object.values(fetched.indicators).forEach(({ numerator, denominator }) => { + addOperands(pending, numerator) + addOperands(pending, denominator) + }) + Object.values(fetched.expressionDimensionItems).forEach(({ expression }) => + addOperands(pending, expression) + ) + Object.values(fetched.programIndicators).forEach( + ({ program }) => program && pending.programs.add(program) + ) + + return pending +} + +const mergeMetadata = (metadata, fetched) => + Object.fromEntries( + METADATA_RESOURCES.map((resource) => [ + resource, + { ...metadata[resource], ...fetched[resource] }, + ]) + ) + +/* One round: fetch what is pending and not fetched yet, then what it refers + * to (indicators nest through N{}). Each id is fetched once, so the rounds + * end when nothing new is referred to. */ +const fetchRound = async ( + dataEngine, + { metadata, pending, requested, signal } +) => { + const toFetch = METADATA_RESOURCES.map((resource) => [ + resource, + [...pending[resource]].filter((id) => !requested[resource].has(id)), + ]).filter(([, ids]) => ids.length) + + if (!toFetch.length) { + return metadata + } + + const responses = await Promise.all( + toFetch.map(([resource, ids]) => { + ids.forEach((id) => requested[resource].add(id)) + + return dataEngine.query( + { [resource]: dataItemProfileMetadataQueries[resource] }, + { variables: { ids }, signal } + ) + }) + ) + const fetched = normalizeDataItemProfileMetadata( + Object.assign({}, ...responses) + ) + + return fetchRound(dataEngine, { + metadata: mergeMetadata(metadata, fetched), + pending: getReferences(fetched), + requested, + signal, + }) +} + +// What `known` metadata already holds counts as requested +const getRequested = (known) => + Object.fromEntries( + METADATA_RESOURCES.map((resource) => [ + resource, + new Set(Object.keys(known?.[resource] ?? {})), + ]) + ) + +/** + * Fetches the metadata getDataItemProfile needs for `items` + * ({ id, dimensionItemType }): data elements, data sets, indicators and their + * operands, nested indicators, expression dimension items, program + * indicators and programs. `known`, metadata fetched before, is reused: only + * what it lacks is fetched. `signal` cancels the requests. Where data sets + * and programs are assigned is fetched apart (fetchOrgUnitCoverage), only + * when org units are asked. + */ +export const fetchDataItemProfileMetadata = async ( + dataEngine, + items = [], + { known, signal } = {} +) => { + const pending = createPending() + + items.forEach((item) => addItem(pending, item)) + + return fetchRound(dataEngine, { + metadata: mergeMetadata( + normalizeDataItemProfileMetadata(), + known ?? {} + ), + pending, + requested: getRequested(known), + signal, + }) +} diff --git a/src/api/dataItemProfile/fetchOrgUnitCoverage.js b/src/api/dataItemProfile/fetchOrgUnitCoverage.js new file mode 100644 index 000000000..e409b1111 --- /dev/null +++ b/src/api/dataItemProfile/fetchOrgUnitCoverage.js @@ -0,0 +1,281 @@ +import { + getOrgUnitsToFetch, + readOrgUnitSelection, + resolveParents, +} from '../../modules/dataItemProfile/orgUnits/orgUnitSelection.js' +import { fetchAssignedOrgUnitCounts } from './assignedOrgUnitCounts.js' +import { isCounted, mergeCounts, recordCount } from './coverageCounts.js' +import { + fetchGroupMembersByLevel, + getGroupCountQueries, +} from './orgUnitGroupCounts.js' +import { countFromLists } from './orgUnitListCounts.js' +import { + assignedTo, + getAncestorIds, + countQuery, + getTotal, + queryAll, +} from './orgUnitQueries.js' +import { fetchSelectionOrgUnits } from './selectionOrgUnits.js' + +/* The counts of one org unit: per level a source is assigned at (at or + * below the org unit), how many org units under it the source is assigned + * to, and how many of its ancestors when the source is assigned higher + * somewhere; with `withTotals`, how many org units each of those levels has + * under it. */ +const getOrgUnitQueries = ( + orgUnit, + { sourceKeys, assignedOrgUnitCounts, withTotals } +) => { + const under = `path:like:${orgUnit.id}` + const ancestorIds = getAncestorIds(orgUnit) + const assignedLevelsOf = ({ id }) => + Object.keys(assignedOrgUnitCounts[id] ?? {}).map(Number) + const levelsUnder = (source) => + assignedLevelsOf(source).filter((level) => level >= orgUnit.level) + const isAssignedHigher = (source) => + assignedLevelsOf(source).some((level) => level < orgUnit.level) + const getAncestorsQuery = (source) => [ + [orgUnit.id, source.id, 'ancestors'], + countQuery([`id:in:[${ancestorIds.join(',')}]`, assignedTo(source)]), + ] + + return [ + ...(withTotals + ? [...new Set(sourceKeys.flatMap(levelsUnder))].map((level) => [ + [orgUnit.id, 'total', level], + countQuery([under, `level:eq:${level}`]), + ]) + : []), + ...sourceKeys.flatMap((source) => + levelsUnder(source).map((level) => [ + [orgUnit.id, source.id, level], + countQuery([under, `level:eq:${level}`, assignedTo(source)]), + ]) + ), + ...sourceKeys + .filter((source) => ancestorIds.length && isAssignedHigher(source)) + .map(getAncestorsQuery), + ] +} + +/* Under the only root, a source's org units are those across the hierarchy: + * the counts already fetched answer it, with no ancestors */ +const getSoleRootCounts = ( + countedOrgUnits, + { rootIds, sourceKeys, assignedOrgUnitCounts } +) => { + const counts = {} + const isCountedRoot = countedOrgUnits.some(({ id }) => id === rootIds[0]) + + if (rootIds.length === 1 && isCountedRoot) { + sourceKeys.forEach(({ id }) => + Object.entries(assignedOrgUnitCounts[id] ?? {}).forEach( + ([level, count]) => + recordCount(counts, [rootIds[0], id, Number(level)], count) + ) + ) + } + + return counts +} + +// Above this many source counts, lists of each source's org units are cheaper +const LIST_THRESHOLD = 100 + +/* Counts the queries; above LIST_THRESHOLD source counts, from lists of each + * source's org units, kept in `lists` for the next selection. Totals are + * always server counts. */ +const fetchCounts = async ( + engine, + { queries, sourceKeys, groupIds, lists, signal } +) => { + const counts = {} + const totalQueries = queries.filter(([[, what]]) => what === 'total') + const sourceQueries = queries.filter(([[, what]]) => what !== 'total') + const useLists = sourceQueries.length > LIST_THRESHOLD + const [fetched, listed] = await Promise.all([ + queryAll(engine, useLists ? totalQueries : queries, { signal }), + useLists + ? countFromLists(engine, { + sourceQueries, + sourceKeys, + groupIds, + lists, + signal, + }) + : { totals: [], lists, requests: 0 }, + ]) + + ;(useLists ? totalQueries : queries).forEach(([key], i) => + recordCount(counts, key, getTotal(fetched.responses[i])) + ) + + if (useLists) { + sourceQueries.forEach(([key], i) => + recordCount(counts, key, listed.totals[i]) + ) + } + + return { + counts, + lists: listed.lists, + requests: fetched.requests + listed.requests, + } +} + +const EMPTY_COVERAGE = { + levels: [], + orgUnits: {}, + rootIds: [], + userOrgUnitIds: null, + groups: {}, + assignedOrgUnitCounts: {}, + counts: {}, + lists: {}, + requests: 0, +} + +// The org units whose counts a selection reads: its own, the user's, and the roots for a level alone +const getCountedOrgUnits = ( + orgUnitItems, + { orgUnits, rootIds, userOrgUnitIds } +) => { + const { orgUnitIds, needsRoots, needsUserOrgUnits } = + getOrgUnitsToFetch(orgUnitItems) + const ids = new Set([ + ...orgUnitIds, + ...(needsUserOrgUnits ? userOrgUnitIds ?? [] : []), + ...(needsRoots ? rootIds : []), + ]) + + return [...ids].map((id) => orgUnits[id]).filter(Boolean) +} + +/** + * Where data sets and programs (`sourceKeys`, getDataItemProfileSourceKeys) + * are assigned, for an org unit selection (`orgUnits`, DV's org unit items). + * Gives: + * - `levels`, and `orgUnits` by id (the selection's, the roots, the user's), + * with `rootIds` and `userOrgUnitIds`; + * - `groups`: each group's members per level; + * - `assignedOrgUnitCounts`: each source's assigned org units per level, + * across the hierarchy (those given are reused); + * - `counts`, by org unit id (and by getGroupCountsKey for groups): per level + * a source is assigned at, how many org units under it the source is + * assigned to, and how many of its ancestors; with `withAssignmentTotals`, + * also how many org units each level has under it (for "x of y" and + * PARTLY_ASSIGNED); for a group, its members under each parent; + * - `lists`: the lists of org units counted from, for large selections; + * - `requests`: how many requests were sent. + * All metadata. Identical counts are sent once, in batches. Above + * LIST_THRESHOLD source counts, one list per source of its org units (and + * one per group of its members) answers them instead. `previous`, the + * coverage of an earlier selection, gives what it already counted: its org + * units, levels, groups, lists and counts, source by source. `signal` + * cancels the requests. getDataItemProfileOrgUnitCompatibility reads the + * result. + */ +export const fetchOrgUnitCoverage = async ( + engine, + { + sourceKeys = [], + orgUnits: orgUnitItems = [], + assignedOrgUnitCounts = {}, + withAssignmentTotals = false, + previous, + signal, + } +) => { + if (!orgUnitItems.length) { + return { + ...EMPTY_COVERAGE, + ...previous, + assignedOrgUnitCounts: { + ...previous?.assignedOrgUnitCounts, + ...assignedOrgUnitCounts, + }, + requests: 0, + } + } + + const fetched = await fetchSelectionOrgUnits(engine, { + orgUnitItems, + previous, + signal, + }) + const { levels, orgUnits, rootIds } = fetched + const knownCounts = { + ...previous?.assignedOrgUnitCounts, + ...assignedOrgUnitCounts, + } + const knownGroups = previous?.groups ?? {} + const { groupIds } = getOrgUnitsToFetch(orgUnitItems) + const [assigned, grouped] = await Promise.all([ + fetchAssignedOrgUnitCounts( + engine, + sourceKeys.filter(({ id }) => !knownCounts[id]), + { levels, signal } + ), + fetchGroupMembersByLevel(engine, { + groupIds: groupIds.filter((groupId) => !knownGroups[groupId]), + levels, + signal, + }), + ]) + const allAssignedOrgUnitCounts = { + ...knownCounts, + ...assigned.assignedOrgUnitCounts, + } + const groups = { ...knownGroups, ...grouped.groups } + const context = { + sourceKeys, + assignedOrgUnitCounts: allAssignedOrgUnitCounts, + withTotals: withAssignmentTotals, + } + const countedOrgUnits = getCountedOrgUnits(orgUnitItems, fetched) + const known = mergeCounts( + previous?.counts, + getSoleRootCounts(countedOrgUnits, { ...context, rootIds }) + ) + const { parentItems } = readOrgUnitSelection(orgUnitItems) + const queries = [ + ...countedOrgUnits.flatMap((orgUnit) => + getOrgUnitQueries(orgUnit, context) + ), + ...getGroupCountQueries({ + ...context, + groups: Object.fromEntries( + groupIds.map((groupId) => [groupId, groups[groupId]]) + ), + parents: parentItems.length + ? resolveParents(parentItems, fetched) ?? [] + : null, + orgUnits, + }), + ].filter(([key]) => !isCounted(known, key)) + const counted = await fetchCounts(engine, { + queries, + sourceKeys, + groupIds, + lists: previous?.lists, + signal, + }) + + return { + levels, + orgUnits, + rootIds, + userOrgUnitIds: fetched.userOrgUnitIds, + groups, + assignedOrgUnitCounts: allAssignedOrgUnitCounts, + counts: mergeCounts(known, counted.counts), + lists: counted.lists ?? {}, + requests: + fetched.requests + + assigned.requests + + grouped.requests + + counted.requests, + } +} diff --git a/src/api/dataItemProfile/metadataQueries.js b/src/api/dataItemProfile/metadataQueries.js new file mode 100644 index 000000000..f4f3d7ff3 --- /dev/null +++ b/src/api/dataItemProfile/metadataQueries.js @@ -0,0 +1,119 @@ +const byIds = (fields) => ({ + params: ({ ids }) => ({ + fields, + filter: `id:in:[${ids.join(',')}]`, + paging: false, + }), +}) + +export const dataItemProfileMetadataQueries = { + dataElements: { + resource: 'dataElements', + ...byIds( + 'id,aggregationType,aggregationLevels,categoryCombo[id],dataSetElements[dataSet[id,periodType],categoryCombo[id]]' + ), + }, + indicators: { + resource: 'indicators', + ...byIds('id,numerator,denominator'), + }, + dataSets: { + resource: 'dataSets', + ...byIds('id,periodType'), + }, + expressionDimensionItems: { + resource: 'expressionDimensionItems', + ...byIds('id,expression'), + }, + programIndicators: { + resource: 'programIndicators', + ...byIds('id,program[id],orgUnitField,analyticsPeriodBoundaries[id]'), + }, + programs: { + resource: 'programs', + ...byIds('id'), + }, + categoryOptionCombos: { + resource: 'categoryOptionCombos', + ...byIds('id,categoryCombo[id]'), + }, +} + +export const METADATA_RESOURCES = Object.keys(dataItemProfileMetadataQueries) + +// A period type comes as a name, or as an object on some versions +const getPeriodTypeName = (periodType) => + typeof periodType === 'string' ? periodType : periodType?.name + +const getList = (response, resource) => + Array.isArray(response) ? response : response?.[resource] ?? [] + +const uniqueDataSets = (dataSets) => [ + ...new Map(dataSets.map((dataSet) => [dataSet.id, dataSet])).values(), +] + +const normalizers = { + /* A data set can give an element another category combo than its own: + * each data set keeps the one its values are entered with */ + dataElements: ({ + aggregationType, + aggregationLevels, + categoryCombo, + dataSetElements, + }) => ({ + aggregationType, + ...(aggregationLevels?.length && { aggregationLevels }), + dataSets: uniqueDataSets( + (dataSetElements ?? []) + .filter(({ dataSet }) => dataSet?.periodType) + .map(({ dataSet, categoryCombo: dataSetCategoryCombo }) => { + const categoryComboId = + dataSetCategoryCombo?.id ?? categoryCombo?.id + + return { + id: dataSet.id, + periodType: getPeriodTypeName(dataSet.periodType), + ...(categoryComboId && { categoryComboId }), + } + }) + ), + }), + indicators: ({ numerator, denominator }) => ({ numerator, denominator }), + dataSets: ({ periodType }) => ({ + periodType: getPeriodTypeName(periodType), + }), + expressionDimensionItems: ({ expression }) => ({ expression }), + programIndicators: ({ + program, + orgUnitField, + analyticsPeriodBoundaries, + }) => ({ + program: program?.id, + ...(orgUnitField && { orgUnitField }), + ...(analyticsPeriodBoundaries && { + hasPeriodBoundaries: analyticsPeriodBoundaries.length > 0, + }), + }), + programs: () => ({}), + categoryOptionCombos: ({ categoryCombo }) => ({ + categoryComboId: categoryCombo?.id, + }), +} + +/** + * The lookups getDataItemProfile reads, by resource and id, from the + * responses of dataItemProfileMetadataQueries. Accepts a gist response and + * period types as objects. + */ +export const normalizeDataItemProfileMetadata = (responses = {}) => + Object.fromEntries( + METADATA_RESOURCES.map((resource) => [ + resource, + Object.fromEntries( + getList(responses[resource], resource).map((object) => [ + object.id, + normalizers[resource](object), + ]) + ), + ]) + ) diff --git a/src/api/dataItemProfile/orgUnitGroupCounts.js b/src/api/dataItemProfile/orgUnitGroupCounts.js new file mode 100644 index 000000000..71f7da845 --- /dev/null +++ b/src/api/dataItemProfile/orgUnitGroupCounts.js @@ -0,0 +1,161 @@ +import { getGroupCountsKey } from '../../modules/dataItemProfile/orgUnits/orgUnitSelection.js' +import { + assignedTo, + getAncestorIds, + countQuery, + getTotal, + inGroup, + queryAll, +} from './orgUnitQueries.js' + +/* Org units `depth` levels below a group's members (parent.parent…), or + * `height` levels above them (children.children…). ancestors.* doesn't + * filter; these work on 2.40 to 2.44 (checked by the test tool). */ +const belowMembers = (groupId, depth) => + 'parent.'.repeat(depth) + inGroup(groupId) +const aboveMembers = (groupId, height) => + 'children.'.repeat(height) + inGroup(groupId) + +/** + * Each group's members per level: `{ groups: { [groupId]: { [level]: count } }, + * requests }`. + */ +export const fetchGroupMembersByLevel = async ( + engine, + { groupIds, levels, signal } +) => { + const queries = groupIds.flatMap((groupId) => + levels.map(({ level }) => [ + [groupId, level], + countQuery([inGroup(groupId), `level:eq:${level}`]), + ]) + ) + const { responses, requests } = await queryAll(engine, queries, { + signal, + }) + const groups = Object.fromEntries(groupIds.map((groupId) => [groupId, {}])) + + queries.forEach(([[groupId, level]], i) => { + const total = getTotal(responses[i]) + + if (total) { + groups[groupId][level] = total + } + }) + + return { groups, requests } +} + +const NO_PARENT = { orgUnitId: null, minLevel: 1 } + +/* Each level a group's members are at, under each parent that holds that + * level (resolveParents), or anywhere without parents */ +const getGroupLevelsUnderParents = ({ groups, parents }) => + Object.entries(groups).flatMap(([groupId, membersByLevel]) => + Object.keys(membersByLevel) + .map(Number) + .flatMap((memberLevel) => + (parents ?? [NO_PARENT]) + .filter(({ minLevel }) => minLevel <= memberLevel) + .map(({ orgUnitId }) => ({ + groupId, + memberLevel, + parentId: orgUnitId, + })) + ) + ) + +/* The org units above the members at `level`, kept under the parent: below + * the parent's level, the parent's own ancestors */ +const getAboveMembersFilters = ( + { groupId, memberLevel, parentId }, + level, + orgUnits +) => { + const parent = parentId && orgUnits[parentId] + + if (parent && level < parent.level) { + return [`id:in:[${getAncestorIds(parent).join(',')}]`] + } + + return [ + ...(parent ? [`path:like:${parentId}`] : []), + aboveMembers(groupId, memberLevel - level), + ] +} + +/* The counts of one group level under one parent, as for an org unit: the + * members under the parent (to know whether any lie there), those each + * source is assigned to, and the ones above the members each source is + * assigned to; with `withTotals`, the org units at each level under them */ +const getGroupLevelQueries = ( + groupLevel, + { sourceKeys, assignedOrgUnitCounts, orgUnits, withTotals } +) => { + const { groupId, memberLevel, parentId } = groupLevel + const key = getGroupCountsKey(groupId, memberLevel, parentId) + const underParent = parentId ? [`path:like:${parentId}`] : [] + const levelsOf = ({ id }) => + Object.keys(assignedOrgUnitCounts[id] ?? {}).map(Number) + const atLevel = (level) => [ + ...underParent, + belowMembers(groupId, level - memberLevel), + `level:eq:${level}`, + ] + const totalLevels = new Set([ + memberLevel, + ...(withTotals + ? sourceKeys + .flatMap(levelsOf) + .filter((level) => level >= memberLevel) + : []), + ]) + const getSourceQuery = (sourceKey, level) => + level >= memberLevel + ? [ + [key, sourceKey.id, level], + countQuery([...atLevel(level), assignedTo(sourceKey)]), + ] + : [ + [key, sourceKey.id, 'ancestors'], + countQuery([ + ...getAboveMembersFilters(groupLevel, level, orgUnits), + `level:eq:${level}`, + assignedTo(sourceKey), + ]), + ] + + return [ + ...[...totalLevels].map((level) => [ + [key, 'total', level], + countQuery(atLevel(level)), + ]), + ...sourceKeys.flatMap((sourceKey) => + levelsOf(sourceKey).map((level) => getSourceQuery(sourceKey, level)) + ), + ] +} + +/** + * The count queries for groups (`groups`, from fetchGroupMembersByLevel), + * under the selection's parents (`parents`, from resolveParents; null for + * none), kept by getGroupCountsKey, in the shape fetchOrgUnitCoverage reads. + * The org units at each level under the members are counted only + * `withTotals`. + */ +export const getGroupCountQueries = ({ + groups, + parents, + orgUnits, + sourceKeys, + assignedOrgUnitCounts, + withTotals = false, +}) => + getGroupLevelsUnderParents({ groups, parents }).flatMap((groupLevel) => + getGroupLevelQueries(groupLevel, { + sourceKeys, + assignedOrgUnitCounts, + orgUnits, + withTotals, + }) + ) diff --git a/src/api/dataItemProfile/orgUnitListCounts.js b/src/api/dataItemProfile/orgUnitListCounts.js new file mode 100644 index 000000000..48476e2d0 --- /dev/null +++ b/src/api/dataItemProfile/orgUnitListCounts.js @@ -0,0 +1,156 @@ +import { assignedTo, inGroup, queryAll } from './orgUnitQueries.js' + +/* Counts answered from lists instead of the server: for a large selection, + * one list of the org units each source is assigned to (with their paths) + * and one of each group's members replace hundreds of pageSize=1 counts. The + * filters of a count are evaluated on the list as the server would. */ + +const getPathIds = (path) => path.split('/').filter(Boolean) + +const GROUP_FILTER = /^((?:parent\.|children\.)*)organisationUnitGroups\.id$/ + +// For a group: its members' ids, and the ids of the org units `height` levels above a member +const indexGroup = (memberPaths) => { + const members = memberPaths.map(getPathIds) + const aboveMembers = (height) => + new Set( + members + .filter((ids) => ids.length > height) + .map((ids) => ids.at(-1 - height)) + ) + const aboveByHeight = new Map() + + return { + memberIds: new Set(members.map((ids) => ids.at(-1))), + isAboveMembers: (id, height) => { + if (!aboveByHeight.has(height)) { + aboveByHeight.set(height, aboveMembers(height)) + } + + return aboveByHeight.get(height).has(id) + }, + } +} + +// Whether the org unit of `ids` (its path) passes a group filter behind parent. and children. steps +const passesGroupFilter = (ids, steps, group) => { + const parents = (steps.match(/parent\./g) ?? []).length + const children = (steps.match(/children\./g) ?? []).length + + if (children) { + return group.isAboveMembers(ids.at(-1), children) + } + + const ancestor = ids.at(-1 - parents) + + return Boolean(ancestor) && group.memberIds.has(ancestor) +} + +const passesFilter = (ids, condition, groups) => { + const [field, operator, ...rest] = condition.split(':') + const value = rest.join(':') + const groupSteps = field.match(GROUP_FILTER) + + if (groupSteps) { + return passesGroupFilter(ids, groupSteps[1], groups[value]) + } + + switch (`${field}:${operator}`) { + case 'level:eq': + return ids.length === Number(value) + case 'path:like': + return ids.includes(value) + case 'id:in': + return value.slice(1, -1).split(',').includes(ids.at(-1)) + default: + return false + } +} + +/** + * The count of `filter` (a count query's filters, without the source one) + * among the org units of a source (`paths`), with the members of the groups + * the filters name (`groupMemberPaths`, by group id). + */ +export const createListCounter = (groupMemberPaths) => { + const groups = Object.fromEntries( + Object.entries(groupMemberPaths).map(([groupId, paths]) => [ + groupId, + indexGroup(paths), + ]) + ) + + return (paths, filter) => + paths + .map(getPathIds) + .filter((ids) => + filter.every((condition) => + passesFilter(ids, condition, groups) + ) + ).length +} + +const listQuery = (filter) => ({ + resource: 'organisationUnits', + params: { filter, fields: 'path', paging: false }, +}) + +const getPaths = (response) => + (response?.organisationUnits ?? []).map(({ path }) => path) + +/** + * The source count queries (`sourceQueries`, `[key, query]` pairs) answered + * from one list per source of the org units it is assigned to, and one per + * group of its members. `lists` (`{ sources, groups }`, path lists by id) + * are those already fetched: only the missing ones are. Gives + * `{ totals, lists, requests }`, the totals in the order of the queries. + */ +export const countFromLists = async ( + engine, + { sourceQueries, sourceKeys, groupIds, lists = {}, signal } +) => { + const knownSources = lists.sources ?? {} + const knownGroups = lists.groups ?? {} + const toFetch = [ + ...sourceKeys + .filter(({ id }) => !knownSources[id]) + .map((sourceKey) => [ + ['sources', sourceKey.id], + listQuery(assignedTo(sourceKey)), + ]), + ...groupIds + .filter((groupId) => !knownGroups[groupId]) + .map((groupId) => [ + ['groups', groupId], + listQuery(inGroup(groupId)), + ]), + ] + const { responses, requests } = await queryAll(engine, toFetch, { signal }) + const fetchedOf = (kind) => + Object.fromEntries( + toFetch + .map(([[listKind, id]], i) => [listKind, id, responses[i]]) + .filter(([listKind]) => listKind === kind) + .map(([, id, response]) => [id, getPaths(response)]) + ) + const allLists = { + sources: { ...knownSources, ...fetchedOf('sources') }, + groups: { ...knownGroups, ...fetchedOf('groups') }, + } + const count = createListCounter(allLists.groups) + const sourceFilterOf = (sourceId) => + assignedTo(sourceKeys.find(({ id }) => id === sourceId)) + + return { + totals: sourceQueries.map(([[, sourceId], query]) => + count( + allLists.sources[sourceId], + query.params.filter.filter( + (condition) => condition !== sourceFilterOf(sourceId) + ) + ) + ), + lists: allLists, + requests, + } +} diff --git a/src/api/dataItemProfile/orgUnitQueries.js b/src/api/dataItemProfile/orgUnitQueries.js new file mode 100644 index 000000000..816abf927 --- /dev/null +++ b/src/api/dataItemProfile/orgUnitQueries.js @@ -0,0 +1,79 @@ +import { orgUnitLevelsQuery } from '../organisationUnits.js' + +/* Requests on organisationUnits, all metadata. Counts use pageSize=1: the + * total is in the pager, so a large hierarchy costs no more per count. */ + +// A count with no list +export const countQuery = (filter) => ({ + resource: 'organisationUnits', + params: { filter, fields: 'id', pageSize: 1 }, +}) + +export const getTotal = (response) => response?.pager?.total ?? 0 + +export const getAncestorIds = ({ id, path }) => + path.split('/').filter((ancestorId) => ancestorId && ancestorId !== id) + +// The filter on org units a data set or program ({ id, field }) is assigned to +export const assignedTo = ({ id, field }) => `${field}.id:eq:${id}` + +export const inGroup = (groupId) => `organisationUnitGroups.id:eq:${groupId}` + +// Requests sent at once: a few hundred in one go make the server queue them +const BATCH_SIZE = 100 + +const getQueryKey = ({ resource, params }) => JSON.stringify([resource, params]) + +const queryBatch = async (engine, batch, signal) => { + const response = await engine.query( + Object.fromEntries(batch.map((query, i) => [`query${i}`, query])), + { signal } + ) + + return batch.map((_, i) => response[`query${i}`]) +} + +/** + * Sends the queries of `[key, query]` pairs and gives `{ responses, requests }`: + * the responses in the same order, and how many requests were sent. Each + * distinct query is sent once (siblings share their ancestors' counts), in + * batches of BATCH_SIZE one after the other; the data engine sends one + * request per query. + */ +export const queryAll = async (engine, queries, { signal } = {}) => { + const indexByKey = new Map() + const distinct = [] + const positions = queries.map(([, query]) => { + const key = getQueryKey(query) + + if (!indexByKey.has(key)) { + indexByKey.set(key, distinct.length) + distinct.push(query) + } + + return indexByKey.get(key) + }) + const batches = Array.from( + { length: Math.ceil(distinct.length / BATCH_SIZE) }, + (_, i) => distinct.slice(i * BATCH_SIZE, (i + 1) * BATCH_SIZE) + ) + const responses = await batches.reduce( + async (done, batch) => [ + ...(await done), + ...(await queryBatch(engine, batch, signal)), + ], + Promise.resolve([]) + ) + + return { + responses: positions.map((index) => responses[index]), + requests: distinct.length, + } +} + +export const levelsQuery = { levels: orgUnitLevelsQuery } + +export const readLevels = (response) => + (response?.levels?.organisationUnitLevels ?? []) + .map(({ id, level, displayName }) => ({ id, level, name: displayName })) + .sort((a, b) => a.level - b.level) diff --git a/src/api/dataItemProfile/selectionOrgUnits.js b/src/api/dataItemProfile/selectionOrgUnits.js new file mode 100644 index 000000000..71f37cf78 --- /dev/null +++ b/src/api/dataItemProfile/selectionOrgUnits.js @@ -0,0 +1,75 @@ +import { getOrgUnitsToFetch } from '../../modules/dataItemProfile/orgUnits/orgUnitSelection.js' +import { levelsQuery, readLevels } from './orgUnitQueries.js' + +const ORG_UNIT_FIELDS = 'id,level,path,displayName' + +const orgUnitsQuery = (filter) => ({ + resource: 'organisationUnits', + params: { filter, fields: ORG_UNIT_FIELDS, paging: false }, +}) + +const userOrgUnitsQuery = { + resource: 'me', + params: { + fields: `organisationUnits[${ORG_UNIT_FIELDS}],dataViewOrganisationUnits[${ORG_UNIT_FIELDS}]`, + }, +} + +const byId = (orgUnits = []) => + Object.fromEntries( + orgUnits.map(({ id, level, path, displayName }) => [ + id, + { id, level, path, name: displayName }, + ]) + ) + +/** + * The org units a selection (DV's org unit items) needs, in one request, + * beyond those `previous` (an earlier coverage) knows: the levels, the + * selection's org units, the roots and the user's org units. The roots are + * always loaded: with a single root, its counts are the counts across the + * hierarchy. Gives `{ levels, orgUnits, rootIds, userOrgUnitIds, requests }`. + */ +export const fetchSelectionOrgUnits = async ( + engine, + { orgUnitItems, previous, signal } +) => { + const { orgUnitIds, needsUserOrgUnits } = getOrgUnitsToFetch(orgUnitItems) + const known = previous?.orgUnits ?? {} + const missingIds = orgUnitIds.filter((id) => !known[id]) + const fetchRoots = !previous?.rootIds?.length + const fetchUser = needsUserOrgUnits && !previous?.userOrgUnitIds + const query = { + ...(!previous?.levels?.length && levelsQuery), + ...(missingIds.length && { + orgUnits: orgUnitsQuery(`id:in:[${missingIds.join(',')}]`), + }), + ...(fetchRoots && { roots: orgUnitsQuery('level:eq:1') }), + ...(fetchUser && { me: userOrgUnitsQuery }), + } + const requests = Object.keys(query).length + const response = requests ? await engine.query(query, { signal }) : {} + // Analytics reads the user's data view org units when there are some + const userOrgUnits = response.me?.dataViewOrganisationUnits?.length + ? response.me.dataViewOrganisationUnits + : response.me?.organisationUnits + const rootIds = fetchRoots + ? (response.roots?.organisationUnits ?? []).map(({ id }) => id) + : previous.rootIds + const userOrgUnitIds = fetchUser + ? (userOrgUnits ?? []).map(({ id }) => id) + : previous?.userOrgUnitIds ?? null + + return { + levels: response.levels ? readLevels(response) : previous.levels, + orgUnits: { + ...known, + ...byId(response.orgUnits?.organisationUnits), + ...byId(response.roots?.organisationUnits), + ...byId(userOrgUnits), + }, + rootIds, + userOrgUnitIds, + requests, + } +} diff --git a/src/api/organisationUnits.js b/src/api/organisationUnits.js index 47d074b69..ce41e74a8 100644 --- a/src/api/organisationUnits.js +++ b/src/api/organisationUnits.js @@ -1,6 +1,6 @@ import { onError } from './index.js' -const orgUnitLevelsQuery = { +export const orgUnitLevelsQuery = { resource: 'organisationUnitLevels', params: ({ displayNameProp = 'displayName' } = {}) => ({ fields: `id,level,${displayNameProp}~rename(displayName),name`, diff --git a/src/components/DataItemProfile/__tests__/useDataItemProfiles.spec.js b/src/components/DataItemProfile/__tests__/useDataItemProfiles.spec.js new file mode 100644 index 000000000..4370ed796 --- /dev/null +++ b/src/components/DataItemProfile/__tests__/useDataItemProfiles.spec.js @@ -0,0 +1,517 @@ +import { CustomDataProvider } from '@dhis2/app-runtime' +import { act, renderHook, waitFor } from '@testing-library/react' +import PropTypes from 'prop-types' +import React from 'react' +import { useDataItemProfiles } from '../useDataItemProfiles.js' + +let mockConfig = { systemInfo: {} } + +jest.mock('@dhis2/app-runtime', () => ({ + ...jest.requireActual('@dhis2/app-runtime'), + useConfig: () => mockConfig, +})) + +afterEach(() => { + mockConfig = { systemInfo: {} } +}) + +const OBJECTS = { + dataElements: { + monthly: { + aggregationType: 'SUM', + dataSetElements: [ + { dataSet: { id: 'formMonthly', periodType: 'Monthly' } }, + ], + }, + weekly: { + aggregationType: 'SUM', + dataSetElements: [ + { dataSet: { id: 'formWeeklyA', periodType: 'Weekly' } }, + ], + }, + population: { + aggregationType: 'AVERAGE', + // An object, as some versions send it + dataSetElements: [ + { + dataSet: { + id: 'formYearlyA', + periodType: { name: 'Yearly' }, + }, + }, + ], + }, + assigned: { + aggregationType: 'SUM', + dataSetElements: [ + { dataSet: { id: 'formAAAAAAA', periodType: 'Monthly' } }, + ], + }, + }, + indicators: { + coverage: { numerator: '#{monthly}', denominator: '#{population}' }, + }, + dataSets: {}, + expressionDimensionItems: {}, +} + +const byIdFilter = (resource) => + jest.fn((type, { params }) => { + const ids = params.filter.match(/\[(.*)\]/)[1].split(',') + + return { + // A gist response, as 2.44 sends for some fields + gist: true, + [resource]: ids + .filter((id) => OBJECTS[resource][id]) + .map((id) => ({ id, ...OBJECTS[resource][id] })), + } + }) + +const isAssignedCount = ({ filter }) => + filter.some((condition) => condition.startsWith('dataSets.id')) + +const createData = (overrides = {}) => ({ + dataElements: byIdFilter('dataElements'), + indicators: byIdFilter('indicators'), + dataSets: byIdFilter('dataSets'), + expressionDimensionItems: byIdFilter('expressionDimensionItems'), + 'systemSettings/analyticsWeeklyStart': { + analyticsWeeklyStart: 'WEEKLY', + }, + 'systemSettings/analyticsFinancialYearStart': { + analyticsFinancialYearStart: 'FINANCIAL_YEAR_OCTOBER', + }, + organisationUnitLevels: { + organisationUnitLevels: [{ id: 'levelOne111', level: 1 }], + }, + // Counts with pageSize=1: 3 org units, 2 of them assigned the data set + organisationUnits: (type, { params }) => + params.pageSize === 1 + ? { pager: { total: isAssignedCount(params) ? 2 : 3 } } + : { + organisationUnits: [ + { id: 'nationUnit1', level: 1, path: '/nationUnit1' }, + ], + }, + ...overrides, +}) + +const createWrapper = (data) => { + const Wrapper = ({ children }) => ( + {children} + ) + Wrapper.propTypes = { children: PropTypes.node } + + return Wrapper +} + +const MONTHLY = { id: 'monthly', dimensionItemType: 'DATA_ELEMENT' } +const WEEKLY = { id: 'weekly', dimensionItemType: 'DATA_ELEMENT' } +const COVERAGE = { id: 'coverage', dimensionItemType: 'INDICATOR' } + +describe('useDataItemProfiles', () => { + const renderProfiles = (items, data = createData(), options) => + renderHook((props) => useDataItemProfiles(props, options), { + initialProps: items, + wrapper: createWrapper(data), + }) + + it('loads the profile of each item', async () => { + const { result } = renderProfiles([MONTHLY, COVERAGE]) + + expect(result.current.loading).toBe(true) + + await waitFor(() => expect(result.current.loading).toBe(false)) + + expect(result.current.error).toBeUndefined() + expect(result.current.profiles.monthly).toMatchObject({ + unknown: false, + assignedPeriodTypes: { shortestDirectType: 'Monthly' }, + }) + expect(result.current.profiles.coverage).toMatchObject({ + assignedPeriodTypes: { + types: ['Monthly', 'Yearly'], + shortestDirectType: 'Yearly', + hasSeveral: true, + }, + }) + }) + + it('checks periods, with the settings for relative periods', async () => { + const { result } = renderProfiles([WEEKLY]) + + await waitFor(() => expect(result.current.profiles).toBeDefined()) + + expect(result.current.relativePeriodTypes).toEqual({ + weeklyPeriodType: 'Weekly', + financialYearPeriodType: 'FinancialOct', + }) + expect( + result.current.getDataItemCompatibility('weekly', { + periods: ['LAST_4_WEEKS', '202501'], + }) + ).toMatchObject({ + status: 'full', + periods: [ + { status: 'full', alignsWithData: null }, + { status: 'full', alignsWithData: false }, + ], + }) + expect( + result.current.getDataItemCompatibility('weekly', { + periods: ['20250115'], + }).status + ).toBe('none') + expect( + result.current.getDataItemCompatibility('other', { + periods: ['202501'], + }) + ).toBe(undefined) + }) + + it('judges org units from where data sets are assigned', async () => { + const assigned = [{ id: 'assigned', dimensionItemType: 'DATA_ELEMENT' }] + const resultAt = async (options) => { + const { result } = renderProfiles(assigned, createData(), { + orgUnits: ['nationUnit1'], + ...options, + }) + + await waitFor(() => + expect(result.current.orgUnitCoverage).toBeDefined() + ) + expect(result.current.loading).toBe(false) + + return result.current.getDataItemCompatibility('assigned', { + orgUnits: ['nationUnit1'], + }).orgUnits[0] + } + + expect(await resultAt()).toEqual({ + id: 'nationUnit1', + status: 'full', + reasons: [], + assignment: { assigned: 2, level: 1 }, + }) + expect(await resultAt({ withAssignmentTotals: true })).toEqual({ + id: 'nationUnit1', + status: 'full', + reasons: ['PARTLY_ASSIGNED'], + assignment: { assigned: 2, total: 3, level: 1 }, + }) + }) + + it('gives profiles their assigned org unit levels once org units are loaded', async () => { + const assigned = [{ id: 'assigned', dimensionItemType: 'DATA_ELEMENT' }] + const withoutOrgUnits = renderProfiles(assigned) + + await waitFor(() => + expect(withoutOrgUnits.result.current.profiles).toBeDefined() + ) + + expect( + withoutOrgUnits.result.current.profiles.assigned + .assignedOrgUnitLevels + ).toBeUndefined() + + const withOrgUnits = renderProfiles(assigned, createData(), { + orgUnits: ['nationUnit1'], + }) + + await waitFor(() => + expect(withOrgUnits.result.current.orgUnitCoverage).toBeDefined() + ) + + expect( + withOrgUnits.result.current.profiles.assigned.assignedOrgUnitLevels + ).toEqual({ + levels: [1], + deepestLevel: 1, + hasSeveral: false, + }) + }) + + it('gives the error of a failed org unit request', async () => { + const { result } = renderProfiles( + [{ id: 'assigned', dimensionItemType: 'DATA_ELEMENT' }], + createData({ + organisationUnits: { organisationUnits: [] }, + organisationUnitLevels: () => + Promise.reject(new Error('no levels')), + }), + { orgUnits: ['nationUnit1'] } + ) + + await waitFor(() => expect(result.current.error).toBeDefined()) + + expect(result.current.error.message).toBe('no levels') + expect(result.current.orgUnitCoverage).toBeUndefined() + }) + + it('is unknown for relative weeks on a version without the setting', async () => { + const data = createData({ + 'systemSettings/analyticsWeeklyStart': () => + Promise.reject( + Object.assign(new Error('Setting does not exist'), { + details: { httpStatusCode: 404 }, + }) + ), + }) + const { result } = renderProfiles([WEEKLY], data) + + await waitFor(() => expect(result.current.profiles).toBeDefined()) + + expect(result.current.relativePeriodTypes.weeklyPeriodType).toBe( + undefined + ) + expect( + result.current.getDataItemCompatibility('weekly', { + periods: ['LAST_4_WEEKS'], + }).status + ).toBe('unknown') + }) + + it('is unknown for an item the server does not have', async () => { + const { result } = renderProfiles([ + { id: 'gone', dimensionItemType: 'DATA_ELEMENT' }, + ]) + + await waitFor(() => expect(result.current.profiles).toBeDefined()) + + expect(result.current.profiles.gone).toMatchObject({ + unknown: true, + reasons: [{ code: 'MISSING_METADATA', id: 'gone' }], + }) + expect( + result.current.getDataItemCompatibility('gone', { + periods: ['202501'], + }).status + ).toBe('unknown') + }) + + it('gives the error of a failed request', async () => { + const { result } = renderProfiles( + [MONTHLY], + createData({ + dataElements: () => Promise.reject(new Error('offline')), + }) + ) + + await waitFor(() => expect(result.current.loading).toBe(false)) + + expect(result.current.error.message).toBe('offline') + expect(result.current.profiles).toBeUndefined() + }) + + it('sends nothing without items, but the settings', async () => { + const data = createData() + const { result } = renderProfiles([], data) + + expect(result.current).toMatchObject({ + loading: false, + profiles: undefined, + }) + + await waitFor(() => + expect(result.current.relativePeriodTypes.weeklyPeriodType).toBe( + 'Weekly' + ) + ) + + expect(data.dataElements).not.toHaveBeenCalled() + }) + + it('sends nothing again for the same items in a new array', async () => { + const data = createData() + const { result, rerender } = renderProfiles([MONTHLY], data) + + await waitFor(() => expect(result.current.profiles).toBeDefined()) + rerender([{ ...MONTHLY }]) + + expect(result.current.loading).toBe(false) + expect(data.dataElements).toHaveBeenCalledTimes(1) + }) + + it('loads again when the items change, and drops a stale answer', async () => { + const { result, rerender } = renderProfiles([MONTHLY]) + + rerender([WEEKLY]) + + await waitFor(() => + expect(result.current.profiles?.weekly).toBeDefined() + ) + + expect(result.current.profiles.monthly).toBeUndefined() + }) + + it('keeps the loaded profiles while new items load, and fetches only those', async () => { + const data = createData() + const { result, rerender } = renderProfiles([MONTHLY], data) + + await waitFor(() => expect(result.current.profiles).toBeDefined()) + + const monthlyProfile = result.current.profiles.monthly + + rerender([MONTHLY, WEEKLY]) + + expect(result.current.loading).toBe(true) + expect(result.current.profiles).toEqual({ monthly: monthlyProfile }) + + await waitFor(() => + expect(result.current.profiles?.weekly).toMatchObject({ + unknown: false, + }) + ) + + const filters = data.dataElements.mock.calls.map( + ([, { params }]) => params.filter + ) + + expect(filters[1]).toContain('weekly') + expect(filters[1]).not.toContain('monthly') + }) + + it('fetches the settings once', async () => { + const settings = jest.fn(() => ({ analyticsWeeklyStart: 'WEEKLY' })) + const { result, rerender } = renderProfiles( + [MONTHLY], + createData({ 'systemSettings/analyticsWeeklyStart': settings }) + ) + + await waitFor(() => expect(result.current.profiles).toBeDefined()) + rerender([WEEKLY]) + await waitFor(() => + expect(result.current.profiles?.weekly).toBeDefined() + ) + + expect(settings).toHaveBeenCalledTimes(1) + }) + + it('gives the error of a failed setting request', async () => { + const { result } = renderProfiles( + [MONTHLY], + createData({ + 'systemSettings/analyticsWeeklyStart': () => + Promise.reject(new Error('Unauthorized')), + }) + ) + + await waitFor(() => expect(result.current.error).toBeDefined()) + + expect(result.current.error.message).toBe('Unauthorized') + }) + + it('gives the same result for the same selection', async () => { + const { result } = renderProfiles([MONTHLY]) + + await waitFor(() => expect(result.current.profiles).toBeDefined()) + + const check = () => + result.current.getDataItemCompatibility('monthly', { + periods: ['202501'], + }) + + expect(check()).toBe(check()) + }) + + it('gives no coverage of earlier org units while new ones load', async () => { + const { result, rerender } = renderHook( + ({ orgUnits }) => + useDataItemProfiles( + [{ id: 'assigned', dimensionItemType: 'DATA_ELEMENT' }], + { orgUnits } + ), + { + initialProps: { orgUnits: ['nationUnit1'] }, + wrapper: createWrapper(createData()), + } + ) + + await waitFor(() => + expect(result.current.orgUnitCoverage).toBeDefined() + ) + + rerender({ orgUnits: ['LEVEL-1'] }) + + expect(result.current.orgUnitCoverage).toBeUndefined() + + await waitFor(() => + expect(result.current.orgUnitCoverage).toBeDefined() + ) + + expect( + result.current.orgUnitCoverage.orgUnits.nationUnit1 + ).toBeDefined() + }) + + it('ignores a failure that came after the items changed', async () => { + let rejectFirst + const data = createData({ + dataElements: jest + .fn() + .mockImplementationOnce( + () => + new Promise((_, reject) => { + rejectFirst = reject + }) + ) + .mockImplementation(byIdFilter('dataElements')), + }) + const { result, rerender } = renderProfiles([MONTHLY], data) + + await waitFor(() => expect(rejectFirst).toBeDefined()) + rerender([WEEKLY]) + await waitFor(() => + expect(result.current.profiles?.weekly).toBeDefined() + ) + await act(async () => rejectFirst(new Error('late'))) + + expect(result.current.error).toBeUndefined() + }) + + it('passes the server version: 2.40 has no QuarterlyNov', async () => { + mockConfig = { systemInfo: {}, serverVersion: { major: 2, minor: 40 } } + const { result } = renderProfiles([MONTHLY]) + + await waitFor(() => expect(result.current.profiles).toBeDefined()) + + expect( + result.current.getDataItemCompatibility('monthly', { + periods: ['2025NovQ1'], + }).status + ).toBe('unknown') + expect( + result.current.getDataItemCompatibility('monthly', { + periods: ['2025Q1'], + }).status + ).toBe('full') + }) + + it('uses the system calendar', async () => { + mockConfig = { systemInfo: { calendar: 'nepali' } } + const { result } = renderProfiles([MONTHLY]) + + await waitFor(() => expect(result.current.profiles).toBeDefined()) + + expect( + result.current.getDataItemCompatibility('monthly', { + periods: ['2081Q1'], + }).periods[0].alignsWithData + ).toBe(true) + }) + + it('uses the calendar it is given', async () => { + const { result } = renderProfiles([MONTHLY], createData(), { + calendar: 'nepali', + }) + + await waitFor(() => expect(result.current.profiles).toBeDefined()) + + expect( + result.current.getDataItemCompatibility('monthly', { + periods: ['2081Q1'], + }).periods[0].alignsWithData + ).toBe(true) + }) +}) diff --git a/src/components/DataItemProfile/__tests__/utils.spec.js b/src/components/DataItemProfile/__tests__/utils.spec.js new file mode 100644 index 000000000..53e73dbd0 --- /dev/null +++ b/src/components/DataItemProfile/__tests__/utils.spec.js @@ -0,0 +1,85 @@ +import { + fetchRelativePeriodTypeOptions, + getItemsKey, + parseItemsKey, +} from '../utils.js' + +const settingsEngine = (settings) => ({ + query: jest.fn(async ({ setting }) => { + const key = setting.resource.split('/')[1] + + if (!(key in settings)) { + throw Object.assign(new Error('Setting does not exist'), { + details: { httpStatusCode: 404 }, + }) + } + + return { setting: { [key]: settings[key] } } + }), +}) + +describe('fetchRelativePeriodTypeOptions', () => { + it('reads the period types of relative weeks and financial years from the settings', async () => { + expect( + await fetchRelativePeriodTypeOptions( + settingsEngine({ + analyticsWeeklyStart: 'WEEKLY_WEDNESDAY', + analyticsFinancialYearStart: 'FINANCIAL_YEAR_APRIL', + }) + ) + ).toEqual({ + weeklyPeriodType: 'WeeklyWednesday', + financialYearPeriodType: 'FinancialApril', + }) + }) + + it('leaves out a setting the server doesn’t have', async () => { + expect( + await fetchRelativePeriodTypeOptions( + settingsEngine({ analyticsWeeklyStart: 'WEEKLY' }) + ) + ).toEqual({ + weeklyPeriodType: 'Weekly', + financialYearPeriodType: undefined, + }) + }) + + it('fails on any other error', async () => { + const engine = { + query: jest.fn().mockRejectedValue(new Error('Unauthorized')), + } + + await expect(fetchRelativePeriodTypeOptions(engine)).rejects.toThrow( + 'Unauthorized' + ) + }) +}) + +describe('items keys', () => { + it('compare items by value, and read them back', () => { + const items = [{ id: 'elementAAAA', dimensionItemType: 'DATA_ELEMENT' }] + const key = getItemsKey(items) + + expect(getItemsKey([...items])).toBe(key) + expect(parseItemsKey(key)).toEqual(items) + }) + + it('ignore the order of items', () => { + const elementA = { + id: 'elementAAAA', + dimensionItemType: 'DATA_ELEMENT', + } + const elementB = { + id: 'elementBBBB', + dimensionItemType: 'DATA_ELEMENT', + } + + expect(getItemsKey([elementB, elementA])).toBe( + getItemsKey([elementA, elementB]) + ) + }) + + it('accept no items', () => { + expect(getItemsKey()).toBe('[]') + }) +}) diff --git a/src/components/DataItemProfile/useDataItemProfiles.js b/src/components/DataItemProfile/useDataItemProfiles.js new file mode 100644 index 000000000..06113a0e3 --- /dev/null +++ b/src/components/DataItemProfile/useDataItemProfiles.js @@ -0,0 +1,293 @@ +import { useConfig } from '@dhis2/app-runtime' +import { useEffect, useMemo, useRef, useState } from 'react' +import { getDataItemProfileSourceKeys } from '../../api/dataItemProfile/assignedOrgUnitCounts.js' +import { fetchDataItemProfileMetadata } from '../../api/dataItemProfile/fetchDataItemProfileMetadata.js' +import { fetchOrgUnitCoverage } from '../../api/dataItemProfile/fetchOrgUnitCoverage.js' +import { getDataItemProfile } from '../../modules/dataItemProfile/getDataItemProfile.js' +import { getDataItemProfileCompatibility } from '../../modules/dataItemProfile/getDataItemProfileCompatibility.js' +import { addAssignedOrgUnitLevels } from '../../modules/dataItemProfile/profile/assignedOrgUnitLevels.js' +import { + fetchRelativePeriodTypeOptions, + getItemsKey, + parseItemsKey, + useCalendar, + useEngineRef, +} from './utils.js' + +/** + * The profiles of data items, and whether a selection suits them. + * + * `items` are { id, dimensionItemType }, as in a visualization's dx items. + * `profiles` are keyed by item id. Once `orgUnits` are given and their + * coverage is loaded, each also has its assigned org unit levels. + * + * `getDataItemCompatibility(itemId, { periods, orgUnits })` runs + * getDataItemProfileCompatibility on the item's profile, with the server's + * settings for relative weeks and financial years, its calendar and its + * version, and `relativePeriodDate` for relative periods (today by default); + * it gives undefined for an item not loaded. Its results are kept until the + * profiles or options change. + * + * Periods need no request, so they are only passed to + * getDataItemCompatibility. Org units do: `orgUnits` (DV's org unit items) + * loads where the items' data sets and programs are assigned under them + * (fetchOrgUnitCoverage, `orgUnitCoverage`), so getDataItemCompatibility can + * judge any selection whose org units it loaded, such as a level under one of + * them. `withAssignmentTotals` also counts the org units under them, for "x + * of y" and PARTLY_ASSIGNED (fetchOrgUnitCoverage). + * + * Changes fetch only what is missing: metadata of new items, counts of new + * org units. While new items load, the loaded ones keep their profiles. + */ +export const useDataItemProfiles = ( + items, + { + calendar, + orgUnits, + relativePeriodDate, + withAssignmentTotals = false, + } = {} +) => { + const engineRef = useEngineRef() + const itemsKey = getItemsKey(items) + const resolvedCalendar = useCalendar(calendar) + const { serverVersion } = useConfig() + const [settingsState, setSettingsState] = useState({ + loading: true, + error: undefined, + options: {}, + }) + const [state, setState] = useState({ + loading: false, + error: undefined, + metadata: undefined, + metadataItemsKey: undefined, + }) + const [coverageState, setCoverageState] = useState({ + loading: false, + error: undefined, + coverage: undefined, + coverageKey: undefined, + }) + const metadataRef = useRef() + const coverageRef = useRef() + const orgUnitsKey = JSON.stringify(orgUnits ?? []) + + metadataRef.current = state.metadata + coverageRef.current = coverageState.coverage + + // The settings don't change with the items: fetched once + useEffect(() => { + const controller = new AbortController() + + fetchRelativePeriodTypeOptions(engineRef.current, { + signal: controller.signal, + }) + .then((options) => setSettingsState({ loading: false, options })) + .catch((error) => { + if (!controller.signal.aborted) { + setSettingsState({ loading: false, error, options: {} }) + } + }) + + return () => controller.abort() + }, [engineRef]) + + useEffect(() => { + const requestedItems = parseItemsKey(itemsKey) + const controller = new AbortController() + + if (!requestedItems.length) { + setState({ loading: false, metadata: metadataRef.current }) + return undefined + } + + setState((previous) => ({ + ...previous, + loading: true, + error: undefined, + })) + + fetchDataItemProfileMetadata(engineRef.current, requestedItems, { + known: metadataRef.current, + signal: controller.signal, + }) + .then((metadata) => { + if (!controller.signal.aborted) { + setState({ + loading: false, + metadata, + metadataItemsKey: itemsKey, + }) + } + }) + .catch((error) => { + if (!controller.signal.aborted) { + setState((previous) => ({ + ...previous, + loading: false, + error, + metadataItemsKey: undefined, + })) + } + }) + + return () => controller.abort() + }, [engineRef, itemsKey]) + + /* Profiles from the metadata of the items it was fetched for: while new + * items load, the others keep theirs */ + const metadataProfiles = useMemo(() => { + const loadedIds = new Set( + state.metadataItemsKey + ? parseItemsKey(state.metadataItemsKey).map(({ id }) => id) + : [] + ) + const loadedItems = parseItemsKey(itemsKey).filter(({ id }) => + loadedIds.has(id) + ) + + return loadedItems.length + ? Object.fromEntries( + loadedItems.map((item) => [ + item.id, + getDataItemProfile(item, state.metadata), + ]) + ) + : undefined + }, [itemsKey, state.metadata, state.metadataItemsKey]) + + const sourceKeysKey = JSON.stringify( + metadataProfiles + ? getDataItemProfileSourceKeys(Object.values(metadataProfiles)) + : null + ) + const coverageKey = `${sourceKeysKey}|${orgUnitsKey}|${withAssignmentTotals}` + + useEffect(() => { + const sourceKeys = JSON.parse(sourceKeysKey) + const requestedOrgUnits = JSON.parse(orgUnitsKey) + const controller = new AbortController() + + if (!sourceKeys || !requestedOrgUnits.length) { + setCoverageState({ loading: false, coverage: coverageRef.current }) + return undefined + } + + setCoverageState((previous) => ({ + ...previous, + loading: true, + error: undefined, + })) + + fetchOrgUnitCoverage(engineRef.current, { + sourceKeys, + orgUnits: requestedOrgUnits, + withAssignmentTotals, + previous: coverageRef.current, + signal: controller.signal, + }) + .then((coverage) => { + if (!controller.signal.aborted) { + setCoverageState({ + loading: false, + coverage, + coverageKey: `${sourceKeysKey}|${orgUnitsKey}|${withAssignmentTotals}`, + }) + } + }) + .catch((error) => { + if (!controller.signal.aborted) { + setCoverageState((previous) => ({ + ...previous, + loading: false, + error, + coverageKey: undefined, + })) + } + }) + + return () => controller.abort() + }, [engineRef, sourceKeysKey, orgUnitsKey, withAssignmentTotals]) + + // Only the coverage of these sources and org units, never an earlier one + const coverage = + coverageState.coverageKey === coverageKey + ? coverageState.coverage + : undefined + + /* None before the settings, which relative periods need. The coverage + * gives the assigned org unit levels. */ + const profiles = useMemo(() => { + if (settingsState.loading || !metadataProfiles) { + return undefined + } + + return Object.fromEntries( + Object.entries(metadataProfiles).map(([id, profile]) => [ + id, + !coverage + ? profile + : addAssignedOrgUnitLevels( + profile, + coverage.assignedOrgUnitCounts + ), + ]) + ) + }, [settingsState.loading, metadataProfiles, coverage]) + + const options = useMemo( + () => ({ + ...settingsState.options, + calendar: resolvedCalendar, + relativePeriodDate, + serverVersion, + orgUnitCoverage: coverage, + }), + [ + settingsState.options, + resolvedCalendar, + relativePeriodDate, + serverVersion, + coverage, + ] + ) + + // A list of items asks for the same results on every render + const getDataItemCompatibility = useMemo(() => { + const results = new Map() + + return (itemId, selection) => { + if (!profiles?.[itemId]) { + return undefined + } + + const key = JSON.stringify([itemId, selection]) + + if (!results.has(key)) { + results.set( + key, + getDataItemProfileCompatibility( + profiles[itemId], + selection, + options + ) + ) + } + + return results.get(key) + } + }, [profiles, options]) + + return { + loading: + state.loading || + coverageState.loading || + (settingsState.loading && itemsKey !== '[]'), + profiles, + error: settingsState.error ?? state.error ?? coverageState.error, + orgUnitCoverage: coverage, + relativePeriodTypes: settingsState.options, + getDataItemCompatibility, + } +} diff --git a/src/components/DataItemProfile/utils.js b/src/components/DataItemProfile/utils.js new file mode 100644 index 000000000..5a0adf7fd --- /dev/null +++ b/src/components/DataItemProfile/utils.js @@ -0,0 +1,66 @@ +import { useConfig, useDataEngine } from '@dhis2/app-runtime' +import { useRef } from 'react' +import { getRelativePeriodTypeOptions } from '../../modules/dataItemProfile/periods/periodTypes.js' + +const SETTING_KEYS = ['analyticsWeeklyStart', 'analyticsFinancialYearStart'] + +// The server answers 404 (E1005) for a setting its version doesn't have +const isMissingSetting = (error) => error?.details?.httpStatusCode === 404 + +// A setting a version doesn't have is left out, never guessed +const fetchSetting = (engine, key, signal) => + engine + .query({ setting: { resource: `systemSettings/${key}` } }, { signal }) + .then(({ setting }) => setting?.[key]) + .catch((error) => { + if (isMissingSetting(error)) { + return undefined + } + + throw error + }) + +export const fetchRelativePeriodTypeOptions = async ( + engine, + { signal } = {} +) => { + const values = await Promise.all( + SETTING_KEYS.map((key) => fetchSetting(engine, key, signal)) + ) + + return getRelativePeriodTypeOptions( + Object.fromEntries(SETTING_KEYS.map((key, i) => [key, values[i]])) + ) +} + +export const useCalendar = (calendar) => { + const { systemInfo } = useConfig() + + return calendar ?? systemInfo?.calendar ?? 'gregory' +} + +/* Items ({ id, dimensionItemType }) are compared by value, in any order, so + * a new array with the same items sends no request */ +export const getItemsKey = (items = []) => + JSON.stringify( + items + .map(({ id, dimensionItemType }) => [id, dimensionItemType]) + .sort(([a], [b]) => a.localeCompare(b)) + ) + +export const parseItemsKey = (itemsKey) => + JSON.parse(itemsKey).map(([id, dimensionItemType]) => ({ + id, + dimensionItemType, + })) + +/* The latest engine, without making requests depend on its identity: a test + * provider can give a new one on each render */ +export const useEngineRef = () => { + const engine = useDataEngine() + const engineRef = useRef(engine) + + engineRef.current = engine + + return engineRef +} diff --git a/src/components/PeriodDimension/useDataOutputPeriodTypes.js b/src/components/PeriodDimension/useDataOutputPeriodTypes.js index f76031fdb..719e09fd9 100644 --- a/src/components/PeriodDimension/useDataOutputPeriodTypes.js +++ b/src/components/PeriodDimension/useDataOutputPeriodTypes.js @@ -1,5 +1,9 @@ import { useConfig, useDataQuery } from '@dhis2/app-runtime' import { useEffect, useMemo } from 'react' +import { + FINANCIAL_YEAR_START_TO_PERIOD_TYPE, + WEEKLY_START_TO_PERIOD_TYPE, +} from './utils/enabledPeriodTypes.js' const v43Query = { enabledPeriodTypes: { @@ -18,27 +22,6 @@ const v43Query = { }, } -// v43-only: analyticsFinancialYearStart is removed in v44 -const FY_SETTING_TO_SERVER_PT = { - FINANCIAL_YEAR_FEBRUARY: 'FinancialFeb', - FINANCIAL_YEAR_APRIL: 'FinancialApril', - FINANCIAL_YEAR_JULY: 'FinancialJuly', - FINANCIAL_YEAR_AUGUST: 'FinancialAug', - FINANCIAL_YEAR_SEPTEMBER: 'FinancialSep', - FINANCIAL_YEAR_OCTOBER: 'FinancialOct', - FINANCIAL_YEAR_NOVEMBER: 'FinancialNov', -} - -// v43-only: analyticsWeeklyStart is removed in v44 -const WEEKLY_START_TO_SERVER_PT = { - WEEKLY: 'Weekly', - WEEKLY_WEDNESDAY: 'WeeklyWednesday', - WEEKLY_THURSDAY: 'WeeklyThursday', - WEEKLY_FRIDAY: 'WeeklyFriday', - WEEKLY_SATURDAY: 'WeeklySaturday', - WEEKLY_SUNDAY: 'WeeklySunday', -} - const useDataOutputPeriodTypes = () => { const { serverVersion } = useConfig() const supportsEnabledPeriodTypes = serverVersion.minor >= 43 @@ -82,7 +65,7 @@ const useDataOutputPeriodTypes = () => { const fyStartValue = v43Data.financialYearStart.analyticsFinancialYearStart - const mappedFyPt = FY_SETTING_TO_SERVER_PT[fyStartValue] + const mappedFyPt = FINANCIAL_YEAR_START_TO_PERIOD_TYPE[fyStartValue] const matchingPt = enabledTypes.find((pt) => pt.name === mappedFyPt) if (matchingPt) { financialYearStart = fyStartValue @@ -97,7 +80,7 @@ const useDataOutputPeriodTypes = () => { if (v43Data.weeklyStart?.analyticsWeeklyStart) { const weeklyStartValue = v43Data.weeklyStart.analyticsWeeklyStart - const mappedWeeklyPt = WEEKLY_START_TO_SERVER_PT[weeklyStartValue] + const mappedWeeklyPt = WEEKLY_START_TO_PERIOD_TYPE[weeklyStartValue] const matchingWeeklyPt = enabledTypes.find( (pt) => pt.name === mappedWeeklyPt ) diff --git a/src/components/PeriodDimension/utils/enabledPeriodTypes.js b/src/components/PeriodDimension/utils/enabledPeriodTypes.js index 7cadc0833..383be1d04 100644 --- a/src/components/PeriodDimension/utils/enabledPeriodTypes.js +++ b/src/components/PeriodDimension/utils/enabledPeriodTypes.js @@ -25,6 +25,28 @@ export const SERVER_PT_TO_MULTI_CALENDAR_PT = { FinancialNov: 'FYNOV', } +// VERSION-TOGGLE: remove when 44 is the lowest supported version (v44 removes the analyticsWeeklyStart and analyticsFinancialYearStart settings) +// The period type of relative weeks, by the analyticsWeeklyStart setting +export const WEEKLY_START_TO_PERIOD_TYPE = { + WEEKLY: 'Weekly', + WEEKLY_WEDNESDAY: 'WeeklyWednesday', + WEEKLY_THURSDAY: 'WeeklyThursday', + WEEKLY_FRIDAY: 'WeeklyFriday', + WEEKLY_SATURDAY: 'WeeklySaturday', + WEEKLY_SUNDAY: 'WeeklySunday', +} + +// The period type of relative financial years, by the analyticsFinancialYearStart setting +export const FINANCIAL_YEAR_START_TO_PERIOD_TYPE = { + FINANCIAL_YEAR_FEBRUARY: 'FinancialFeb', + FINANCIAL_YEAR_APRIL: 'FinancialApril', + FINANCIAL_YEAR_JULY: 'FinancialJuly', + FINANCIAL_YEAR_AUGUST: 'FinancialAug', + FINANCIAL_YEAR_SEPTEMBER: 'FinancialSep', + FINANCIAL_YEAR_OCTOBER: 'FinancialOct', + FINANCIAL_YEAR_NOVEMBER: 'FinancialNov', +} + // Mapping from relative period categories to their corresponding fixed period types export const RP_CATEGORY_TO_FP_DEPENDENCIES = { DAILY: ['Daily'], diff --git a/src/index.js b/src/index.js index 976210f68..90f90ea2b 100644 --- a/src/index.js +++ b/src/index.js @@ -7,6 +7,8 @@ export { default as PeriodDimension } from './components/PeriodDimension/PeriodD export { default as FixedPeriodSelect } from './components/PeriodDimension/FixedPeriodSelect.js' export { useDataOutputPeriodTypes } from './components/PeriodDimension/useDataOutputPeriodTypes.js' +export { useDataItemProfiles } from './components/DataItemProfile/useDataItemProfiles.js' + export { default as OrgUnitDimension } from './components/OrgUnitDimension/OrgUnitDimension.js' export { @@ -330,6 +332,57 @@ export { export { renderValue as formatValue } from './modules/renderValue.js' +// Modules: dataItemProfile + +export { getDataItemProfile } from './modules/dataItemProfile/getDataItemProfile.js' +export { getPeriodAggregationType } from './modules/dataItemProfile/profile/collectSources.js' +export { addAssignedOrgUnitLevels } from './modules/dataItemProfile/profile/assignedOrgUnitLevels.js' +export { getDataItemProfileCompatibility } from './modules/dataItemProfile/getDataItemProfileCompatibility.js' +export { getDataItemProfilePeriodCompatibility } from './modules/dataItemProfile/compatibility/getDataItemProfilePeriodCompatibility.js' +export { getDataItemProfileOrgUnitCompatibility } from './modules/dataItemProfile/compatibility/getDataItemProfileOrgUnitCompatibility.js' +export { getPeriodAtOrgUnitResults } from './modules/dataItemProfile/compatibility/periodAtOrgUnitResults.js' +export { + COMPATIBILITY_FULL, + COMPATIBILITY_PARTIAL, + COMPATIBILITY_NONE, + COMPATIBILITY_UNKNOWN, + REASON_OPERAND_EMPTY, + REASON_OPERAND_PARTIAL, + REASON_PERIOD_TOO_SHORT, + REASON_PERIOD_TYPE_MISMATCH, + REASON_REPORTING_RATE_TOO_SHORT, + REASON_NO_EARLIER_PERIOD_VALUE, + REASON_REPEATED_VALUE, + REASON_EARLIER_PERIOD_VALUE, + REASON_NOT_ASSIGNED, + REASON_ASSIGNED_AT_HIGHER_LEVEL, + REASON_STOPPED_BY_AGGREGATION_LEVEL, + REASON_NO_ORG_UNITS_AT_LEVEL, + REASON_EMPTY_GROUP, + REASON_PARTLY_ASSIGNED, + REASON_ANY_ORG_UNIT, + REASON_PROFILE_UNKNOWN, + REASON_UNKNOWN_PERIOD, + REASON_SETTING_MISSING, + REASON_UNSUPPORTED_VERSION, + REASON_UNKNOWN_ORG_UNIT, + PROFILE_REASON_MISSING_METADATA, + PROFILE_REASON_MISSING_PROGRAM, + PROFILE_REASON_UNKNOWN_OPERAND, + PROFILE_REASON_UNKNOWN_PERIOD_TYPE, + PROFILE_REASON_UNSUPPORTED_ITEM_TYPE, + PROFILE_REASON_NO_DATA_SET, + PROFILE_REASON_NOT_AGGREGATABLE, + SKIP_IF_ANY_VALUE_MISSING, + SKIP_IF_ALL_VALUES_MISSING, +} from './modules/dataItemProfile/constants.js' +export { fetchDataItemProfileMetadata } from './api/dataItemProfile/fetchDataItemProfileMetadata.js' +export { + fetchAssignedOrgUnitCounts, + getDataItemProfileSourceKeys, +} from './api/dataItemProfile/assignedOrgUnitCounts.js' +export { fetchOrgUnitCoverage } from './api/dataItemProfile/fetchOrgUnitCoverage.js' + // Modules: response export { transformResponse as transformEventAggregateResponse } from './modules/response/event/response.js' diff --git a/src/modules/dataItemProfile/__tests__/expressionOperands.spec.js b/src/modules/dataItemProfile/__tests__/expressionOperands.spec.js new file mode 100644 index 000000000..b1bdc68a3 --- /dev/null +++ b/src/modules/dataItemProfile/__tests__/expressionOperands.spec.js @@ -0,0 +1,82 @@ +import { + getCategoryOptionComboId, + parseExpressionOperands, +} from '../expressionOperands.js' + +const summarize = (expression) => + parseExpressionOperands(expression).map( + ({ type, id, operand, aggregationType }) => ({ + type, + ...(id !== undefined && { id }), + ...(operand && { operand }), + ...(aggregationType && { aggregationType }), + }) + ) + +describe('parseExpressionOperands', () => { + it.each([ + ['#{deA}', [{ type: 'DATA_ELEMENT', id: 'deA' }]], + [ + '#{deA.cocA}', + [{ type: 'DATA_ELEMENT', id: 'deA', operand: 'deA.cocA' }], + ], + [ + '#{deA.cocA.aocA}', + [{ type: 'DATA_ELEMENT', id: 'deA', operand: 'deA.cocA.aocA' }], + ], + ['#{deA.*}', [{ type: 'DATA_ELEMENT', id: 'deA' }]], + ['R{dsA.REPORTING_RATE}', [{ type: 'REPORTING_RATE', id: 'dsA' }]], + ['N{indA}', [{ type: 'INDICATOR', id: 'indA' }]], + ['I{piA}', [{ type: 'PROGRAM_INDICATOR', id: 'piA' }]], + ['D{prA.deA}', [{ type: 'PROGRAM_DATA_ELEMENT', id: 'prA.deA' }]], + ['A{prA.atA}', [{ type: 'PROGRAM_ATTRIBUTE', id: 'prA.atA' }]], + ['C{cA}', [{ type: 'CONSTANT', id: 'cA' }]], + ['OUG{ougA}', [{ type: 'ORG_UNIT_GROUP', id: 'ougA' }]], + ['[days]', [{ type: 'DAYS' }]], + ['S{subA}', [{ type: 'UNKNOWN', id: 'subA' }]], + ])('reads %s', (expression, expected) => { + expect(summarize(expression)).toEqual(expected) + }) + + it('reads every operand of an expression, in order', () => { + expect( + summarize( + '(#{deA.cocA} + #{deB}) * C{cA} / [days] - R{dsA.ACTUAL_REPORTS}' + ) + ).toEqual([ + { type: 'DATA_ELEMENT', id: 'deA', operand: 'deA.cocA' }, + { type: 'DATA_ELEMENT', id: 'deB' }, + { type: 'CONSTANT', id: 'cA' }, + { type: 'DAYS' }, + { type: 'REPORTING_RATE', id: 'dsA' }, + ]) + }) + + it('reads the functions chained after an operand', () => { + const [operand] = parseExpressionOperands( + '#{deA}.periodOffset(-1).aggregationType( LAST )' + ) + + expect(operand.functions).toEqual([ + { name: 'periodOffset', arg: '-1' }, + { name: 'aggregationType', arg: 'LAST' }, + ]) + expect(operand.aggregationType).toBe('LAST') + }) + + it('reads nothing from an empty expression', () => { + expect(parseExpressionOperands()).toEqual([]) + expect(parseExpressionOperands(null)).toEqual([]) + expect(parseExpressionOperands('1 + 2')).toEqual([]) + }) +}) + +describe('getCategoryOptionComboId', () => { + it('reads the option combo of a disaggregation', () => { + expect(getCategoryOptionComboId('de.coc')).toBe('coc') + expect(getCategoryOptionComboId('de.coc.aoc')).toBe('coc') + expect(getCategoryOptionComboId('de.*.aoc')).toBeUndefined() + expect(getCategoryOptionComboId('de')).toBeUndefined() + expect(getCategoryOptionComboId(undefined)).toBeUndefined() + }) +}) diff --git a/src/modules/dataItemProfile/__tests__/getDataItemProfile.spec.js b/src/modules/dataItemProfile/__tests__/getDataItemProfile.spec.js new file mode 100644 index 000000000..75fe2eafc --- /dev/null +++ b/src/modules/dataItemProfile/__tests__/getDataItemProfile.spec.js @@ -0,0 +1,629 @@ +import { inDataSets } from '../../../__fixtures__/dataItemProfileMetadata.js' +import { getDataItemProfile } from '../getDataItemProfile.js' +import { getPeriodAggregationType } from '../profile/collectSources.js' + +const dataElement = (periodTypes, aggregationType = 'SUM') => ({ + aggregationType, + valueType: 'INTEGER', + domainType: 'AGGREGATE', + dataSets: inDataSets(periodTypes), +}) + +const metadata = { + dataElements: { + monthly: dataElement(['Monthly']), + weekly: dataElement(['Weekly']), + mondayAndWednesday: dataElement(['Weekly', 'WeeklyWednesday']), + weeklyAndMonthly: dataElement(['Monthly', 'Weekly']), + population: dataElement(['Yearly'], 'AVERAGE'), + stock: dataElement(['Monthly'], 'AVERAGE_SUM_ORG_UNIT'), + noAggregation: dataElement(['Monthly'], 'NONE'), + noDataSet: dataElement([]), + oddType: dataElement(['Hourly']), + }, + dataSets: { + weeklyForm: { periodType: 'Weekly' }, + oddForm: { periodType: 'Hourly' }, + }, + indicators: { + coverage: { + numerator: '#{monthly.cocA}', + denominator: '#{population}', + }, + weeklyShare: { numerator: '#{weekly}', denominator: '#{monthly}' }, + nested: { numerator: 'N{coverage}', denominator: '1' }, + loopA: { numerator: 'N{loopB}', denominator: '1' }, + loopB: { numerator: 'N{loopA} + #{weekly}', denominator: '1' }, + withMissing: { numerator: '#{missing}', denominator: '1' }, + withUnknown: { numerator: 'S{sub}', denominator: '1' }, + eventsOnly: { numerator: 'I{pi} + D{pr.de}', denominator: 'C{c}' }, + reportingRate: { + numerator: 'R{weeklyForm.REPORTING_RATE}', + denominator: '1', + }, + lastOverride: { + numerator: '#{population}.aggregationType(LAST)', + denominator: '1', + }, + withMissingNested: { numerator: 'N{gone}', denominator: '1' }, + withMissingDataSet: { + numerator: 'R{goneForm.REPORTING_RATE}', + denominator: '1', + }, + }, + programIndicators: { + pi: { program: 'pr' }, + piByOwner: { program: 'pr', orgUnitField: 'OWNER_AT_START' }, + piByRegist: { program: 'pr', orgUnitField: 'REGISTRATION' }, + }, + programs: { pr: { programType: 'WITHOUT_REGISTRATION' } }, + expressionDimensionItems: { + weeklyPlusMonthly: { expression: '#{weekly} + #{monthly}' }, + }, +} + +const profile = (id, dimensionItemType, data = metadata) => + getDataItemProfile({ id, dimensionItemType }, data) + +describe('getDataItemProfile', () => { + describe('data elements', () => { + it('takes the data set type', () => { + expect(profile('monthly', 'DATA_ELEMENT')).toEqual({ + unknown: false, + reasons: [], + sources: [ + { + dataSet: { id: 'MonthlyForm', periodType: 'Monthly' }, + elements: [ + { + id: 'monthly', + aggregationType: 'SUM', + periodAggregationType: 'SUM', + }, + ], + reportingRate: false, + }, + ], + assignedPeriodTypes: { + types: ['Monthly'], + shortestDirectType: 'Monthly', + hasSeveral: false, + }, + }) + }) + + it('has one source per data set', () => { + expect(profile('weeklyAndMonthly', 'DATA_ELEMENT').sources).toEqual( + [ + { + dataSet: { id: 'MonthlyForm', periodType: 'Monthly' }, + elements: [ + { + id: 'weeklyAndMonthly', + aggregationType: 'SUM', + periodAggregationType: 'SUM', + }, + ], + reportingRate: false, + }, + { + dataSet: { id: 'WeeklyForm', periodType: 'Weekly' }, + elements: [ + { + id: 'weeklyAndMonthly', + aggregationType: 'SUM', + periodAggregationType: 'SUM', + }, + ], + reportingRate: false, + }, + ] + ) + }) + + it('reads an operand by its data element, and keeps it', () => { + const operand = profile('monthly.cocA', 'DATA_ELEMENT_OPERAND') + + expect(operand.assignedPeriodTypes.shortestDirectType).toBe( + 'Monthly' + ) + expect(operand.sources[0].elements).toEqual([ + expect.objectContaining({ + id: 'monthly', + operand: 'monthly.cocA', + }), + ]) + }) + + it('lists several types, and the shortest direct type is the longest', () => { + expect(profile('weeklyAndMonthly', 'DATA_ELEMENT')).toMatchObject({ + assignedPeriodTypes: { + types: ['Weekly', 'Monthly'], + shortestDirectType: 'Monthly', + hasSeveral: true, + }, + }) + }) + + it('goes up a type when two types have the same length', () => { + /* Analytics fills BiWeekly from Wednesday weeks though they don't + * nest: the test tool's fixtures show values on all 8 versions, + * for every aggregation type but NONE */ + expect(profile('mondayAndWednesday', 'DATA_ELEMENT')).toMatchObject( + { + assignedPeriodTypes: { + types: ['Weekly', 'WeeklyWednesday'], + shortestDirectType: 'BiWeekly', + hasSeveral: true, + }, + } + ) + }) + + it.each([ + ['population', 'AVERAGE', 'Yearly'], + ['stock', 'AVERAGE', 'Monthly'], + ])( + 'counts averaged data in the shortest direct type: %s', + (id, periodAggregationType, shortestDirectType) => { + expect(profile(id, 'DATA_ELEMENT')).toMatchObject({ + unknown: false, + sources: [{ elements: [{ periodAggregationType }] }], + assignedPeriodTypes: { shortestDirectType }, + }) + } + ) + + it('is unknown when not aggregatable', () => { + expect(profile('noAggregation', 'DATA_ELEMENT')).toMatchObject({ + unknown: true, + reasons: [{ code: 'NOT_AGGREGATABLE', id: 'noAggregation' }], + }) + }) + + it('is unknown in no data set', () => { + expect(profile('noDataSet', 'DATA_ELEMENT')).toMatchObject({ + unknown: true, + reasons: [{ code: 'NO_DATA_SET', id: 'noDataSet' }], + sources: [ + { + dataSet: null, + elements: [{ id: 'noDataSet' }], + }, + ], + assignedPeriodTypes: { types: [], shortestDirectType: null }, + }) + }) + + it('is unknown with a period type it does not know', () => { + expect(profile('oddType', 'DATA_ELEMENT')).toMatchObject({ + unknown: true, + reasons: [ + { + code: 'UNKNOWN_PERIOD_TYPE', + id: 'oddType', + periodType: 'Hourly', + }, + ], + assignedPeriodTypes: { types: [] }, + }) + }) + + it('is unknown without metadata', () => { + expect(profile('missing', 'DATA_ELEMENT', {})).toMatchObject({ + unknown: true, + reasons: [{ code: 'MISSING_METADATA', id: 'missing' }], + }) + }) + }) + + describe('disaggregations', () => { + // As on the demo database: one element, three data sets, three category combos + const deathsMetadata = { + dataElements: { + deaths: { + aggregationType: 'SUM', + dataSets: [ + { + id: 'mortality', + periodType: 'Monthly', + categoryComboId: 'defaultComb', + }, + { + id: 'byAgeGroup', + periodType: 'Quarterly', + categoryComboId: 'ageGroupsCo', + }, + { + id: 'byGender', + periodType: 'Yearly', + categoryComboId: 'genderCombo', + }, + ], + }, + }, + categoryOptionCombos: { + under1Year1: { categoryComboId: 'ageGroupsCo' }, + otherCombo1: { categoryComboId: 'notInAnySet' }, + }, + } + const dataSetsOf = (id, data = deathsMetadata) => + profile(id, 'DATA_ELEMENT_OPERAND', data).sources.map( + ({ dataSet }) => dataSet?.id + ) + + it('count only the data sets whose category combo holds the option combo', () => { + expect(dataSetsOf('deaths.under1Year1')).toEqual(['byAgeGroup']) + expect( + profile( + 'deaths.under1Year1', + 'DATA_ELEMENT_OPERAND', + deathsMetadata + ).assignedPeriodTypes.types + ).toEqual(['Quarterly']) + }) + + it('count every data set for the whole element, a wildcard, or an option combo not known', () => { + expect(dataSetsOf('deaths')).toEqual([ + 'mortality', + 'byAgeGroup', + 'byGender', + ]) + expect(dataSetsOf('deaths.unknownComb')).toHaveLength(3) + }) + + it('are unknown when no data set collects the option combo', () => { + expect( + profile( + 'deaths.otherCombo1', + 'DATA_ELEMENT_OPERAND', + deathsMetadata + ) + ).toMatchObject({ + unknown: true, + reasons: [{ code: 'NO_DATA_SET', id: 'deaths' }], + }) + }) + + it('count the same way in expressions', () => { + expect( + profile('deathsRatio', 'INDICATOR', { + ...deathsMetadata, + indicators: { + deathsRatio: { + numerator: '#{deaths.under1Year1}', + denominator: '1', + }, + }, + }).sources.map(({ dataSet }) => dataSet.id) + ).toEqual(['byAgeGroup']) + }) + }) + + describe('reporting rates', () => { + it('take the data set type', () => { + expect( + profile('weeklyForm.REPORTING_RATE', 'REPORTING_RATE') + ).toMatchObject({ + sources: [ + { + dataSet: { id: 'weeklyForm', periodType: 'Weekly' }, + elements: [], + reportingRate: true, + }, + ], + assignedPeriodTypes: { + types: ['Weekly'], + shortestDirectType: 'Weekly', + }, + }) + }) + + it('are unknown without the data set', () => { + expect( + profile('goneForm.ACTUAL_REPORTS', 'REPORTING_RATE') + ).toMatchObject({ unknown: true }) + }) + + it('are unknown with a period type it does not know', () => { + expect( + profile('oddForm.REPORTING_RATE', 'REPORTING_RATE') + ).toMatchObject({ + unknown: true, + assignedPeriodTypes: { types: [] }, + }) + }) + }) + + describe('indicators', () => { + it('read numerator and denominator', () => { + // The yearly population is measured directly by year only + expect(profile('coverage', 'INDICATOR')).toMatchObject({ + assignedPeriodTypes: { + types: ['Monthly', 'Yearly'], + shortestDirectType: 'Yearly', + hasSeveral: true, + }, + }) + }) + + it('group their data elements by data set, with their disaggregations', () => { + const { sources } = getDataItemProfile( + { id: 'sum', dimensionItemType: 'INDICATOR' }, + { + ...metadata, + indicators: { + sum: { + numerator: '#{monthly} + #{stock} + #{monthly.coc}', + denominator: 'R{MonthlyForm.REPORTING_RATE}', + }, + }, + dataSets: { MonthlyForm: { periodType: 'Monthly' } }, + } + ) + + expect(sources).toEqual([ + { + dataSet: { id: 'MonthlyForm', periodType: 'Monthly' }, + elements: [ + { + id: 'monthly', + aggregationType: 'SUM', + periodAggregationType: 'SUM', + }, + { + id: 'stock', + aggregationType: 'AVERAGE_SUM_ORG_UNIT', + periodAggregationType: 'AVERAGE', + }, + { + id: 'monthly', + operand: 'monthly.coc', + aggregationType: 'SUM', + periodAggregationType: 'SUM', + }, + ], + reportingRate: true, + }, + ]) + }) + + it('mix the types of their data elements', () => { + expect(profile('weeklyShare', 'INDICATOR')).toMatchObject({ + assignedPeriodTypes: { + shortestDirectType: 'Monthly', + hasSeveral: true, + }, + }) + }) + + it('read nested indicators', () => { + expect( + profile('nested', 'INDICATOR').assignedPeriodTypes + .shortestDirectType + ).toBe('Yearly') + }) + + it('say how their operands combine: both sides, any item of a side', () => { + const side = (...keys) => ({ + missingValueStrategy: 'SKIP_IF_ALL_VALUES_MISSING', + parts: keys.map((key) => ({ operand: key })), + }) + + expect(profile('nested', 'INDICATOR').expression).toEqual({ + missingValueStrategy: 'SKIP_IF_ANY_VALUE_MISSING', + parts: [ + { + missingValueStrategy: 'SKIP_IF_ALL_VALUES_MISSING', + parts: [ + { + missingValueStrategy: + 'SKIP_IF_ANY_VALUE_MISSING', + parts: [ + side('element:monthly:SUM'), + side('element:population:AVERAGE'), + ], + }, + ], + }, + side(), + ], + }) + expect(profile('eventsOnly', 'INDICATOR').expression.parts).toEqual( + [side('program:pr::', 'program:pr::'), side()] + ) + }) + + it('read indicators that refer to each other once', () => { + expect(profile('loopA', 'INDICATOR')).toMatchObject({ + unknown: false, + assignedPeriodTypes: { shortestDirectType: 'Weekly' }, + }) + }) + + it('take an aggregation type set in the expression', () => { + expect(profile('lastOverride', 'INDICATOR')).toMatchObject({ + sources: [ + { + elements: [ + { + aggregationType: 'LAST', + periodAggregationType: 'LAST', + }, + ], + }, + ], + assignedPeriodTypes: { shortestDirectType: 'Yearly' }, + }) + }) + + it('take a reporting rate operand', () => { + expect( + profile('reportingRate', 'INDICATOR').assignedPeriodTypes + .shortestDirectType + ).toBe('Weekly') + }) + + it('are not limited by event data, constants or days', () => { + expect(profile('eventsOnly', 'INDICATOR')).toMatchObject({ + unknown: false, + assignedPeriodTypes: { types: [], shortestDirectType: null }, + }) + }) + + it('read the programs of their event data', () => { + expect(profile('eventsOnly', 'INDICATOR').sources).toEqual([ + { + dataSet: null, + program: { id: 'pr' }, + elements: [], + reportingRate: false, + }, + ]) + }) + + it.each([ + ['withMissing', 'MISSING_METADATA'], + ['withMissingNested', 'MISSING_METADATA'], + ['withMissingDataSet', 'MISSING_METADATA'], + ['withUnknown', 'UNKNOWN_OPERAND'], + ['gone', 'MISSING_METADATA'], + ])('%s is unknown: %s', (id, code) => { + expect(profile(id, 'INDICATOR')).toMatchObject({ + unknown: true, + reasons: [expect.objectContaining({ code })], + }) + }) + }) + + describe('expression dimension items', () => { + it('read their expression', () => { + expect( + profile('weeklyPlusMonthly', 'EXPRESSION_DIMENSION_ITEM') + ).toMatchObject({ + assignedPeriodTypes: { + shortestDirectType: 'Monthly', + hasSeveral: true, + }, + }) + }) + + it('skip only when all their values are missing, whatever strategy they are saved with', () => { + const strategyOf = (missingValueStrategy) => + profile('sum', 'EXPRESSION_DIMENSION_ITEM', { + ...metadata, + expressionDimensionItems: { + sum: { + expression: '#{weekly} + #{monthly}', + missingValueStrategy, + }, + }, + }).expression.missingValueStrategy + + expect(strategyOf(undefined)).toBe('SKIP_IF_ALL_VALUES_MISSING') + expect(strategyOf('SKIP_IF_ANY_VALUE_MISSING')).toBe( + 'SKIP_IF_ALL_VALUES_MISSING' + ) + }) + + it('are unknown without metadata', () => { + expect(profile('gone', 'EXPRESSION_DIMENSION_ITEM').unknown).toBe( + true + ) + }) + }) + + describe('event and tracker items', () => { + it.each([ + ['pi', 'PROGRAM_INDICATOR'], + ['pr.de', 'PROGRAM_DATA_ELEMENT'], + ['pr.de.option', 'PROGRAM_DATA_ELEMENT_OPTION'], + ['pr.at', 'PROGRAM_ATTRIBUTE'], + ['pr.de', 'EVENT_DATA_ITEM'], + ])( + '%s (%s) has its program as source, and no period type', + (id, type) => { + expect(profile(id, type)).toMatchObject({ + unknown: false, + sources: [{ program: { id: 'pr' } }], + assignedPeriodTypes: { + types: [], + shortestDirectType: null, + }, + }) + } + ) + + it('keeps a program indicator placed by registration or an attribute apart from its program', () => { + expect(profile('piByRegist', 'PROGRAM_INDICATOR').sources).toEqual([ + { + dataSet: null, + program: { id: 'pr' }, + orgUnitField: 'REGISTRATION', + elements: [], + reportingRate: false, + }, + ]) + expect(profile('piByOwner', 'PROGRAM_INDICATOR').sources).toEqual([ + { + dataSet: null, + program: { id: 'pr' }, + elements: [], + reportingRate: false, + }, + ]) + }) + + it('is unknown without a program in its id', () => { + expect(profile('de', 'EVENT_DATA_ITEM')).toMatchObject({ + unknown: true, + reasons: [{ code: 'MISSING_PROGRAM', id: 'de' }], + sources: [], + }) + }) + + it('is unknown without the metadata of its program indicator or program', () => { + expect(profile('gone', 'PROGRAM_INDICATOR')).toMatchObject({ + unknown: true, + reasons: [{ code: 'MISSING_METADATA', id: 'gone' }], + }) + expect(profile('nope.de', 'PROGRAM_DATA_ELEMENT')).toMatchObject({ + unknown: true, + reasons: [{ code: 'MISSING_METADATA', id: 'nope' }], + }) + }) + }) + + it('is unknown for an item type it does not read', () => { + expect(profile('any', 'ORGANISATION_UNIT')).toMatchObject({ + unknown: true, + reasons: [ + { + code: 'UNSUPPORTED_ITEM_TYPE', + id: 'any', + dimensionItemType: 'ORGANISATION_UNIT', + }, + ], + }) + expect(getDataItemProfile({ id: 'any' }).unknown).toBe(true) + }) +}) + +describe('getPeriodAggregationType', () => { + it.each([ + ['SUM', 'SUM'], + ['AVERAGE', 'AVERAGE'], + ['AVERAGE_SUM_ORG_UNIT', 'AVERAGE'], + ['LAST', 'LAST'], + ['LAST_AVERAGE_ORG_UNIT', 'LAST'], + ['LAST_LAST_ORG_UNIT', 'LAST'], + ['LAST_IN_PERIOD_AVERAGE_ORG_UNIT', 'LAST_IN_PERIOD'], + ['FIRST_AVERAGE_ORG_UNIT', 'FIRST'], + ['FIRST_FIRST_ORG_UNIT', 'FIRST'], + ['MAX_SUM_ORG_UNIT', 'MAX'], + ['MIN_SUM_ORG_UNIT', 'MIN'], + [undefined, undefined], + ])('%s aggregates over time as %s', (aggregationType, expected) => { + expect(getPeriodAggregationType(aggregationType)).toBe(expected) + }) +}) diff --git a/src/modules/dataItemProfile/__tests__/getDataItemProfileCompatibility.spec.js b/src/modules/dataItemProfile/__tests__/getDataItemProfileCompatibility.spec.js new file mode 100644 index 000000000..feb09f6d3 --- /dev/null +++ b/src/modules/dataItemProfile/__tests__/getDataItemProfileCompatibility.spec.js @@ -0,0 +1,740 @@ +import { inDataSets } from '../../../__fixtures__/dataItemProfileMetadata.js' +import { + ORG_UNIT_COVERAGE, + orgUnitProfileOf, +} from '../../../__fixtures__/dataItemProfileOrgUnits.js' +import { getDataItemProfile } from '../getDataItemProfile.js' +import { getDataItemProfileCompatibility } from '../getDataItemProfileCompatibility.js' + +const dataElement = (periodTypes, aggregationType = 'SUM') => ({ + aggregationType, + dataSets: inDataSets(periodTypes), +}) + +const metadata = { + dataElements: { + monthly: dataElement(['Monthly']), + weekly: dataElement(['Weekly']), + wednesday: dataElement(['WeeklyWednesday']), + yearly: dataElement(['Yearly']), + financialOct: dataElement(['FinancialOct']), + population: dataElement(['Yearly'], 'AVERAGE'), + stock: dataElement(['Monthly'], 'LAST'), + firstMonthly: dataElement(['Monthly'], 'FIRST'), + firstDaily: dataElement(['Daily'], 'FIRST'), + lastFinancialApril: dataElement(['FinancialApril'], 'LAST'), + lastYearly: dataElement(['Yearly'], 'LAST'), + lastTwoYearly: dataElement(['TwoYearly'], 'LAST'), + twoYearly: dataElement(['TwoYearly']), + mondayWednesday: dataElement(['Weekly', 'WeeklyWednesday']), + }, + indicators: { + coverage: { numerator: '#{monthly}', denominator: '#{population}' }, + share: { numerator: '#{weekly}', denominator: '#{monthly}' }, + stockPerHead: { numerator: '#{stock}', denominator: '#{population}' }, + weeklyShareOfMonthly: { + numerator: '#{mondayWednesday}', + denominator: '#{weekly}', + }, + timesTwelve: { numerator: '#{monthly} * 12', denominator: '1' }, + // A missing item of a side counts as 0 + monthlyPlusYearly: { + numerator: '#{monthly} + #{yearly}', + denominator: '1', + }, + weeklyPlusWeekly: { + numerator: '#{weekly} + #{wednesday}', + denominator: '1', + }, + sumOverRatio: { + numerator: 'N{monthlyPlusYearly}', + denominator: '#{yearly}', + }, + }, + expressionDimensionItems: { + sumByDefault: { expression: '#{monthly} + #{yearly}' }, + sumNeedingAll: { + expression: '#{monthly} + #{yearly}', + missingValueStrategy: 'SKIP_IF_ANY_VALUE_MISSING', + }, + sumNeverSkipped: { + expression: '#{monthly} + #{yearly}', + missingValueStrategy: 'NEVER_SKIP', + }, + }, +} + +const indicator = (id) => ({ id, dimensionItemType: 'INDICATOR' }) + +// A data element id, or an item +const profileOf = (item) => + getDataItemProfile( + typeof item === 'string' + ? { id: item, dimensionItemType: 'DATA_ELEMENT' } + : item, + metadata + ) + +const compatibilityOf = (item, periods, options) => + getDataItemProfileCompatibility(profileOf(item), { periods }, options) + +// The overall status and reasons +const outcomeOf = (...args) => { + const { status, reasons } = compatibilityOf(...args) + + return { status, reasons } +} + +const full = (reasons = []) => ({ status: 'full', reasons }) +const partial = (reasons) => ({ status: 'partial', reasons }) +const none = (reasons) => ({ status: 'none', reasons }) +const unknown = (reasons) => ({ status: 'unknown', reasons }) + +describe('getDataItemProfileCompatibility', () => { + it('gives results per period, per source and overall, which add up', () => { + expect(compatibilityOf('monthly', ['2025W2', '202501'])).toEqual({ + status: 'partial', + reasons: ['PERIOD_TOO_SHORT'], + sources: [ + { + sourceId: 'MonthlyForm', + status: 'partial', + reasons: ['PERIOD_TOO_SHORT'], + }, + ], + periods: [ + { + id: '2025W2', + periodTypes: ['Weekly'], + status: 'none', + reasons: ['PERIOD_TOO_SHORT'], + alignsWithData: null, + sources: [ + { + sourceId: 'MonthlyForm', + status: 'none', + reasons: ['PERIOD_TOO_SHORT'], + }, + ], + }, + { + id: '202501', + periodTypes: ['Monthly'], + status: 'full', + reasons: [], + alignsWithData: true, + sources: [ + { + sourceId: 'MonthlyForm', + status: 'full', + reasons: [], + }, + ], + }, + ], + }) + }) + + it('has no status without periods', () => { + expect(getDataItemProfileCompatibility(profileOf('monthly'))).toEqual({ + status: null, + reasons: [], + sources: [{ sourceId: 'MonthlyForm', status: null, reasons: [] }], + periods: [], + }) + }) + + it('takes period types', () => { + expect(outcomeOf('monthly', ['Quarterly'])).toEqual(full()) + expect(outcomeOf('monthly', ['Daily'])).toEqual( + none(['PERIOD_TOO_SHORT']) + ) + }) + + it('gives nothing for another type of the same length', () => { + expect(outcomeOf('wednesday', ['2025W2'])).toEqual( + none(['PERIOD_TYPE_MISMATCH']) + ) + expect(outcomeOf('yearly', ['2025April'])).toEqual( + none(['PERIOD_TYPE_MISMATCH']) + ) + }) + + describe('values not measured for the period', () => { + it('are averaged for averaged data in shorter periods', () => { + expect(outcomeOf('population', ['202501'])).toEqual( + full(['REPEATED_VALUE']) + ) + expect(outcomeOf('population', ['2025'])).toEqual(full()) + }) + + describe('FIRST and LAST', () => { + it('LAST takes the latest data period of the years touched', () => { + // June's value, for a day in July + expect(outcomeOf('stock', ['20250715'])).toEqual( + full(['EARLIER_PERIOD_VALUE']) + ) + // December 2024 is outside the years 1 January 2025 touches + expect(outcomeOf('stock', ['20250101'])).toEqual( + none(['NO_EARLIER_PERIOD_VALUE']) + ) + expect(outcomeOf('stock', ['2025WedW1'])).toEqual( + none(['NO_EARLIER_PERIOD_VALUE']) + ) + }) + + it('LAST is measured for the period when its data adds up into it', () => { + expect(outcomeOf('stock', ['2025Q3'])).toEqual(full()) + expect(outcomeOf('stock', ['2025'])).toEqual(full()) + }) + + it('FIRST takes the earliest data period of the years touched', () => { + // January's value, for July and for the third quarter + expect(outcomeOf('firstMonthly', ['202507'])).toEqual( + full(['EARLIER_PERIOD_VALUE']) + ) + expect(outcomeOf('firstMonthly', ['2025Q3'])).toEqual( + full(['EARLIER_PERIOD_VALUE']) + ) + expect(outcomeOf('firstMonthly', ['2025'])).toEqual(full()) + expect(outcomeOf('firstMonthly', ['20250101'])).toEqual( + none(['NO_EARLIER_PERIOD_VALUE']) + ) + // 1 January's value, not the day's own + expect(outcomeOf('firstDaily', ['20250715'])).toEqual( + full(['EARLIER_PERIOD_VALUE']) + ) + expect(outcomeOf('firstDaily', ['20250101'])).toEqual(full()) + expect(outcomeOf('firstDaily', ['2025WedW1'])).toEqual(full()) + }) + + it('read every period of the selection as one request', () => { + // With 2024 in the request, December 2024 counts on 1 January + const withYear = compatibilityOf('stock', ['20250101', '2024']) + + expect(withYear.periods[0]).toMatchObject( + full(['EARLIER_PERIOD_VALUE']) + ) + }) + + it('read the year in a data period id', () => { + // 2024April (April 2024 to March 2025) is a 2024 period + expect(outcomeOf('lastFinancialApril', ['20250715'])).toEqual( + none(['NO_EARLIER_PERIOD_VALUE']) + ) + // …but it counts when the request touches 2024 + expect( + compatibilityOf('lastFinancialApril', ['20250715', '2024']) + .periods[0] + ).toMatchObject(full(['EARLIER_PERIOD_VALUE'])) + }) + + it('judges a period type by type alone, as it has no dates', () => { + expect(outcomeOf('stock', ['Weekly'])).toEqual( + full(['EARLIER_PERIOD_VALUE']) + ) + expect(outcomeOf('stock', ['Quarterly'])).toEqual(full()) + }) + + describe('with relative periods, resolved on relativePeriodDate', () => { + const ON_15_JUNE_2025 = { relativePeriodDate: '2025-06-15' } + + it('judges each fixed period they cover', () => { + // June 2024 to May 2025: each month has its own value + expect( + outcomeOf('stock', ['LAST_12_MONTHS'], ON_15_JUNE_2025) + ).toEqual(full()) + // FIRST gives January 2024's value to every month + expect( + outcomeOf( + 'firstMonthly', + ['LAST_12_MONTHS'], + ON_15_JUNE_2025 + ) + ).toEqual(full(['EARLIER_PERIOD_VALUE'])) + }) + + it('count the years they touch for the fixed periods beside them', () => { + expect( + compatibilityOf('stock', ['20250101']).periods[0] + ).toMatchObject(none(['NO_EARLIER_PERIOD_VALUE'])) + // LAST_12_MONTHS adds 2024: December 2024 counts + expect( + compatibilityOf( + 'stock', + ['20250101', 'LAST_12_MONTHS'], + ON_15_JUNE_2025 + ).periods[0] + ).toMatchObject(full(['EARLIER_PERIOD_VALUE'])) + }) + + it('is partial when only some of their fixed periods have a value', () => { + /* The months of 2025 touch only 2025: the 2025 value ends in + * December, and 2024's year isn't in the request */ + expect( + outcomeOf( + 'lastYearly', + ['MONTHS_THIS_YEAR'], + ON_15_JUNE_2025 + ) + ).toEqual({ + status: 'partial', + reasons: [ + 'NO_EARLIER_PERIOD_VALUE', + 'EARLIER_PERIOD_VALUE', + ], + }) + }) + }) + + it('may take an earlier value when the data type has no dates', () => { + expect(outcomeOf('lastTwoYearly', ['2025'])).toEqual( + full(['EARLIER_PERIOD_VALUE']) + ) + }) + }) + + it('show in each source', () => { + expect(compatibilityOf('stock', ['20250715']).sources).toEqual([ + { + sourceId: 'MonthlyForm', + status: 'full', + reasons: ['EARLIER_PERIOD_VALUE'], + }, + ]) + }) + }) + + describe('expressions', () => { + it('are complete with an averaged denominator, which they report', () => { + expect(outcomeOf(indicator('coverage'), ['202501'])).toEqual( + full(['REPEATED_VALUE']) + ) + expect(outcomeOf(indicator('coverage'), ['2025'])).toEqual(full()) + }) + + it('are empty when one operand gives nothing, and say so', () => { + expect(outcomeOf(indicator('coverage'), ['2025W2'])).toEqual( + none(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT', 'REPEATED_VALUE']) + ) + expect(outcomeOf(indicator('share'), ['2025W2'])).toEqual( + none(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT']) + ) + }) + + it('are partial from a partial operand, and say so', () => { + expect( + outcomeOf(indicator('weeklyShareOfMonthly'), ['2025W2']) + ).toEqual({ + status: 'partial', + reasons: ['OPERAND_PARTIAL', 'PERIOD_TYPE_MISMATCH'], + }) + }) + + it('are partial when some items of a side give nothing, which count as 0', () => { + expect( + outcomeOf(indicator('monthlyPlusYearly'), ['202501']) + ).toEqual(partial(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT'])) + expect(outcomeOf(indicator('monthlyPlusYearly'), ['2025'])).toEqual( + full() + ) + }) + + it('are empty when all items of a side give nothing', () => { + expect( + outcomeOf(indicator('weeklyPlusWeekly'), ['20250115']) + ).toEqual(none(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT'])) + }) + + it('need both sides of a nested indicator', () => { + expect(outcomeOf(indicator('sumOverRatio'), ['202501'])).toEqual( + none(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT']) + ) + }) + + it('add up the operands of an expression dimension item, whatever its strategy', () => { + const expressionItem = (id) => ({ + id, + dimensionItemType: 'EXPRESSION_DIMENSION_ITEM', + }) + + expect( + outcomeOf(expressionItem('sumByDefault'), ['202501']) + ).toEqual(partial(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT'])) + expect( + outcomeOf(expressionItem('sumNeverSkipped'), ['202501']) + ).toEqual(partial(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT'])) + // Analytics ignores SKIP_IF_ANY_VALUE_MISSING: a value comes back + expect( + outcomeOf(expressionItem('sumNeedingAll'), ['202501']) + ).toEqual(partial(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT'])) + }) + + it('say nothing more with one operand', () => { + expect(outcomeOf(indicator('timesTwelve'), ['2025W2'])).toEqual( + none(['PERIOD_TOO_SHORT']) + ) + }) + + it('report every kind of indirect value', () => { + expect(outcomeOf(indicator('stockPerHead'), ['20250715'])).toEqual( + full(['REPEATED_VALUE', 'EARLIER_PERIOD_VALUE']) + ) + }) + }) + + describe('an element in several data sets', () => { + const malaria = (aggregationType) => + getDataItemProfile( + { id: 'malaria', dimensionItemType: 'DATA_ELEMENT' }, + { + dataElements: { + malaria: { + aggregationType, + dataSets: [ + { id: 'surveillance', periodType: 'Weekly' }, + { id: 'report', periodType: 'Monthly' }, + ], + }, + }, + } + ) + + it('is partial when some data sets give nothing', () => { + expect( + getDataItemProfileCompatibility(malaria('SUM'), { + periods: ['2025W2', '202501'], + }) + ).toMatchObject({ + status: 'partial', + reasons: ['PERIOD_TOO_SHORT'], + sources: [ + { sourceId: 'surveillance', status: 'full' }, + { sourceId: 'report', status: 'partial' }, + ], + periods: [ + { + status: 'partial', + reasons: ['PERIOD_TOO_SHORT'], + sources: [ + { + sourceId: 'surveillance', + status: 'full', + reasons: [], + }, + { + sourceId: 'report', + status: 'none', + reasons: ['PERIOD_TOO_SHORT'], + }, + ], + }, + full(), + ], + }) + }) + + it('is complete when the others give averaged values', () => { + expect( + getDataItemProfileCompatibility(malaria('AVERAGE'), { + periods: ['2025W2'], + }) + ).toMatchObject(full(['REPEATED_VALUE'])) + }) + + it('is empty when every data set gives nothing', () => { + expect( + getDataItemProfileCompatibility(malaria('SUM'), { + periods: ['20250115'], + }) + ).toMatchObject(none(['PERIOD_TOO_SHORT'])) + }) + }) + + it('reads a reporting rate in a shorter period as empty', () => { + const profile = getDataItemProfile( + { id: 'form.REPORTING_RATE', dimensionItemType: 'REPORTING_RATE' }, + { dataSets: { form: { periodType: 'Monthly' } } } + ) + + expect( + getDataItemProfileCompatibility(profile, { periods: ['2025W2'] }) + ).toMatchObject({ + ...none(['REPORTING_RATE_TOO_SHORT']), + sources: [ + { sourceId: 'form', ...none(['REPORTING_RATE_TOO_SHORT']) }, + ], + }) + expect( + getDataItemProfileCompatibility(profile, { periods: ['2025Q1'] }) + ).toMatchObject(full()) + }) + + describe('a program indicator without period boundaries', () => { + const profile = getDataItemProfile( + { id: 'pi', dimensionItemType: 'PROGRAM_INDICATOR' }, + { + programIndicators: { + pi: { program: 'pr', hasPeriodBoundaries: false }, + }, + programs: { pr: {} }, + } + ) + const judge = (serverVersion) => + getDataItemProfileCompatibility( + profile, + { periods: ['2025Q1'] }, + { serverVersion } + ) + + it('is unknown before 2.43, which can’t query it', () => { + expect(judge({ major: 2, minor: 42 })).toMatchObject({ + status: 'unknown', + reasons: ['UNSUPPORTED_VERSION'], + }) + }) + + it('is full from 2.43, or without a server version', () => { + expect(judge({ major: 2, minor: 43 })).toMatchObject(full()) + expect(judge()).toMatchObject(full()) + }) + }) + + it('is full for event data, placed by its own dates', () => { + const profile = getDataItemProfile( + { id: 'pi', dimensionItemType: 'PROGRAM_INDICATOR' }, + { + programIndicators: { pi: { program: 'pr' } }, + programs: { pr: {} }, + } + ) + + expect( + getDataItemProfileCompatibility(profile, { periods: ['20250115'] }) + ).toMatchObject({ + ...full(), + sources: [{ sourceId: 'pr', status: 'full', reasons: [] }], + }) + }) + + describe('unknown', () => { + it('when the profile is, for the item and each source', () => { + const profile = getDataItemProfile( + { id: 'odd', dimensionItemType: 'DATA_ELEMENT' }, + { + dataElements: { + odd: { + aggregationType: 'SUM', + dataSets: [{ id: 'hourly', periodType: 'Hourly' }], + }, + }, + } + ) + + expect( + getDataItemProfileCompatibility(profile, { + periods: ['202501'], + }) + ).toMatchObject({ + ...unknown(['PROFILE_UNKNOWN']), + sources: [ + { sourceId: 'hourly', ...unknown(['PROFILE_UNKNOWN']) }, + ], + }) + expect(outcomeOf('missing', ['202501'])).toEqual( + unknown(['PROFILE_UNKNOWN']) + ) + }) + + it('for a period it cannot read', () => { + expect(compatibilityOf('monthly', ['NEXT_CENTURY'])).toMatchObject({ + ...unknown(['UNKNOWN_PERIOD']), + periods: [{ periodTypes: [], alignsWithData: null }], + }) + }) + + it('for QuarterlyNov before 2.41', () => { + const on = (minor) => ({ serverVersion: { major: 2, minor } }) + + expect(outcomeOf('monthly', ['2025NovQ1'], on(40))).toEqual( + unknown(['UNSUPPORTED_VERSION']) + ) + expect(outcomeOf('monthly', ['2025NovQ1'], on(41))).toEqual(full()) + expect(outcomeOf('monthly', ['2025NovQ1'])).toEqual(full()) + expect(outcomeOf('monthly', ['2025Q1'], on(40))).toEqual(full()) + }) + }) + + it('adds up periods: none when all are, partial when some give values', () => { + expect(outcomeOf('monthly', ['2025W2', '2025W3'])).toEqual( + none(['PERIOD_TOO_SHORT']) + ) + expect(outcomeOf('monthly', ['202501', '2025W2'])).toEqual( + partial(['PERIOD_TOO_SHORT']) + ) + expect(outcomeOf('monthly', ['202501', 'NEXT_CENTURY'])).toEqual( + unknown(['UNKNOWN_PERIOD']) + ) + // Nothing from one, and the other can't be told + expect(outcomeOf('monthly', ['NEXT_CENTURY', '2025W2'])).toEqual( + unknown(['PERIOD_TOO_SHORT', 'UNKNOWN_PERIOD']) + ) + }) + + describe('relative periods', () => { + it('read their type', () => { + expect(outcomeOf('monthly', ['LAST_12_MONTHS'])).toEqual(full()) + expect(outcomeOf('monthly', ['LAST_7_DAYS'])).toEqual( + none(['PERIOD_TOO_SHORT']) + ) + }) + + it('hold when every type they could be agrees', () => { + expect(outcomeOf('monthly', ['LAST_4_WEEKS'])).toEqual( + none(['PERIOD_TOO_SHORT']) + ) + expect(outcomeOf('monthly', ['THIS_FINANCIAL_YEAR'])).toEqual( + full() + ) + // Yearly data gives nothing in any financial year + expect(outcomeOf('yearly', ['THIS_FINANCIAL_YEAR'])).toEqual( + none(['PERIOD_TYPE_MISMATCH']) + ) + }) + + it('are unknown when their type depends on a setting not given', () => { + expect(outcomeOf('weekly', ['LAST_4_WEEKS'])).toEqual( + unknown(['SETTING_MISSING']) + ) + expect(outcomeOf('financialOct', ['THIS_FINANCIAL_YEAR'])).toEqual( + unknown(['SETTING_MISSING']) + ) + }) + + it('take the settings as options', () => { + expect( + outcomeOf('weekly', ['LAST_4_WEEKS'], { + weeklyPeriodType: 'Weekly', + }) + ).toEqual(full()) + expect( + outcomeOf('weekly', ['LAST_4_WEEKS'], { + weeklyPeriodType: 'WeeklySunday', + }) + ).toEqual(none(['PERIOD_TYPE_MISMATCH'])) + expect( + outcomeOf('financialOct', ['THIS_FINANCIAL_YEAR'], { + financialYearPeriodType: 'FinancialOct', + }) + ).toEqual(full()) + }) + + it('do not tell whether they align with the data', () => { + expect( + compatibilityOf('monthly', ['LAST_12_MONTHS']).periods[0] + .alignsWithData + ).toBeNull() + }) + }) + + describe('alignsWithData', () => { + const alignsOf = (id, period, options) => + compatibilityOf(id, [period], options).periods[0].alignsWithData + + it('is true when the period is whole data periods', () => { + expect(alignsOf('monthly', '2025Q1')).toBe(true) + expect(alignsOf('population', '2025')).toBe(true) + }) + + it('is false when data periods cross its edges', () => { + expect(alignsOf('weekly', '202501')).toBe(false) + expect(alignsOf('weekly', '2025')).toBe(false) + }) + + it('is null when it cannot be told', () => { + expect(alignsOf('monthly', 'Yearly')).toBeNull() + expect(alignsOf('monthly', '2025W2')).toBeNull() + expect(alignsOf('twoYearly', 'TwoYearly')).toBeNull() + }) + + it('works in other calendars', () => { + expect(alignsOf('monthly', '2081Q1', { calendar: 'nepali' })).toBe( + true + ) + expect(alignsOf('weekly', '208101', { calendar: 'nepali' })).toBe( + false + ) + }) + + it('is null when a data type has no dates', () => { + const profile = getDataItemProfile( + { id: 'mixed', dimensionItemType: 'DATA_ELEMENT' }, + { + dataElements: { + mixed: dataElement(['Monthly', 'TwoYearly']), + }, + } + ) + + expect( + getDataItemProfileCompatibility(profile, { periods: ['2025'] }) + .periods[0] + ).toMatchObject({ status: 'partial', alignsWithData: true }) + }) + }) +}) + +describe('getDataItemProfileCompatibility, with org units', () => { + it('judges periods and org units apart, and adds them up overall', () => { + const result = getDataItemProfileCompatibility( + orgUnitProfileOf('facility'), + { periods: ['2025Q1'], orgUnits: ['nationUnit1', 'facilityDDD'] }, + { orgUnitCoverage: ORG_UNIT_COVERAGE } + ) + + expect(result).toMatchObject({ + status: 'partial', + reasons: ['ASSIGNED_AT_HIGHER_LEVEL', 'PARTLY_ASSIGNED'], + periods: [{ id: '2025Q1', status: 'full' }], + orgUnits: [ + { id: 'nationUnit1', status: 'full' }, + { id: 'facilityDDD', status: 'none' }, + ], + }) + }) + + it('judges each period at each org unit overall, with only the data sets assigned there', () => { + const result = getDataItemProfileCompatibility( + orgUnitProfileOf('twoForms'), + { periods: ['2025W2'], orgUnits: ['facilityAAA'] }, + { orgUnitCoverage: ORG_UNIT_COVERAGE } + ) + + // Apart: the weekly data set fills weeks; the monthly one is assigned at facilityAAA + expect(result.periods[0].status).toBe('partial') + expect(result.orgUnits[0].status).toBe('full') + // Together: at facilityAAA, only the monthly one counts, and it can't fill a week + expect(result).toMatchObject({ + status: 'none', + reasons: ['PERIOD_TOO_SHORT'], + }) + }) + + it('leaves org units out when none are asked', () => { + expect( + getDataItemProfileCompatibility(orgUnitProfileOf('facility'), { + periods: ['2025Q1'], + }) + ).not.toHaveProperty('orgUnits') + }) + + it('judges org units alone', () => { + expect( + getDataItemProfileCompatibility( + orgUnitProfileOf('facility'), + { orgUnits: ['districtAAA'] }, + { orgUnitCoverage: ORG_UNIT_COVERAGE } + ) + ).toMatchObject({ status: 'full', periods: [] }) + }) +}) diff --git a/src/modules/dataItemProfile/__tests__/orgUnitFixtures.spec.js b/src/modules/dataItemProfile/__tests__/orgUnitFixtures.spec.js new file mode 100644 index 000000000..1bb588ae7 --- /dev/null +++ b/src/modules/dataItemProfile/__tests__/orgUnitFixtures.spec.js @@ -0,0 +1,324 @@ +import fs from 'fs' +import path from 'path' +import { createFakeOrgUnitServer } from '../../../__fixtures__/fakeOrgUnitServer.js' +import { getDataItemProfileSourceKeys } from '../../../api/dataItemProfile/assignedOrgUnitCounts.js' +import { fetchOrgUnitCoverage } from '../../../api/dataItemProfile/fetchOrgUnitCoverage.js' +import { normalizeDataItemProfileMetadata } from '../../../api/dataItemProfile/metadataQueries.js' +import { getDataItemProfileOrgUnitCompatibility } from '../compatibility/getDataItemProfileOrgUnitCompatibility.js' +import { getDataItemProfile } from '../getDataItemProfile.js' + +/* The fixtures come from the test tool in dhis2/maps-tools + * (test-data-item-profile, org unit groups): analytics' answers on 2.40 to + * 2.44 for data sets and programs assigned at different levels, on the + * tool's own org units. Each case is rebuilt here: its hierarchy and + * assignments become a fake server, and the library judges the selection + * from metadata as it would on a real one. */ +const FIXTURES_DIR = path.join(__dirname, '../../../__fixtures__/org-units') + +const readFixture = (name) => + JSON.parse(fs.readFileSync(path.join(FIXTURES_DIR, `${name}.json`))) + +const CASE_GROUPS = [ + 'entered-above', + 'partly-assigned', + 'mixed-levels', + 'aggregation-levels', + 'org-unit-groups', + 'user-org-units', + 'programs', +] + +/* Where the tool's prediction differs from the library's on purpose (the + * analytics answers agree with both) */ +const PREDICTION_DIFFERENCES = { + // One operand: the library gives the element's reason, OPERAND_PARTIAL is for expressions of several + 'ou-mixed-indicator__F1': { + status: 'partial', + reasons: ['ASSIGNED_AT_HIGHER_LEVEL'], + }, +} + +/* Cases at the region, where the tool leaves out PARTLY_ASSIGNED (only some + * of its districts or facilities are assigned): the library notes it */ +const TOOL_LEAVES_OUT_PARTLY_ASSIGNED = new Set([ + 'ou-above__level-3-region', + 'ou-above__region', + 'ou-agg-d1-3__region', + 'ou-prog-event__region', +]) + +// The tool's names for the library's reasons +const REASON_BY_TOOL_NAME = { + BELOW_COLLECTION: 'ASSIGNED_AT_HIGHER_LEVEL', + AGGREGATION_LEVEL: 'STOPPED_BY_AGGREGATION_LEVEL', + ORG_UNIT_FIELD: 'ANY_ORG_UNIT', +} + +// Ids the library reads as org unit uids (11 characters) +const toUid = (prefix, key) => `${prefix}${key}xxxxxxxxxxx`.slice(0, 11) +const orgUnitUid = (key) => toUid('orgUnit', key) +const groupUid = (key) => toUid('groupOf', key) +const sourceUid = (name) => + toUid('src', name.replace(/[^a-zA-Z0-9]/g, '').slice(-8)) + +// The tool's root region sits under a level 1 org unit, as on the server +const ROOT = 'root' + +const getPath = (key, orgUnits) => + key === ROOT + ? `/${orgUnitUid(ROOT)}` + : `${getPath(orgUnits[key].parent ?? ROOT, orgUnits)}/${orgUnitUid( + key + )}` + +const getSources = ({ collectionSources = [], operands = [] }) => [ + ...collectionSources, + ...operands.flatMap(getSources), +] + +const createServer = (hierarchy, item) => { + const sources = getSources(item) + const assignedTo = (key, field) => + sources + .filter((source) => source[field] && source.orgUnits.includes(key)) + .map((source) => sourceUid(source[field])) + const orgUnits = Object.entries({ + [ROOT]: { level: 1 }, + ...hierarchy.orgUnits, + }).map(([key, { level }]) => ({ + id: orgUnitUid(key), + level, + path: getPath(key, hierarchy.orgUnits), + dataSets: assignedTo(key, 'dataSet'), + programs: assignedTo(key, 'program'), + })) + const groups = Object.fromEntries( + Object.entries(hierarchy.groups).map(([key, members]) => [ + groupUid(key), + members.map(orgUnitUid), + ]) + ) + const userOrgUnits = [orgUnitUid('region')] + + return createFakeOrgUnitServer({ + orgUnits, + groups, + user: { + organisationUnits: userOrgUnits, + dataViewOrganisationUnits: userOrgUnits, + }, + }) +} + +const toDataElement = ({ aggregationType = 'SUM', collectionSources }) => ({ + aggregationType, + ...(collectionSources.find(({ aggregationLevels }) => aggregationLevels) + ?.aggregationLevels && { + aggregationLevels: collectionSources.find( + ({ aggregationLevels }) => aggregationLevels + ).aggregationLevels, + }), + dataSetElements: collectionSources.map(({ dataSet, periodType }) => ({ + dataSet: { id: sourceUid(dataSet), periodType }, + })), +}) + +// An org unit data element's id, for a program indicator placed by one +const ORG_UNIT_DATA_ELEMENT = 'orgUnitDeAA' + +// The metadata the library would fetch for the case's item +const getMetadata = (itemId, item) => { + const [source] = item.collectionSources ?? [] + + switch (item.dimensionItemType) { + case 'INDICATOR': + return normalizeDataItemProfileMetadata({ + indicators: [ + { + id: itemId, + numerator: item.numerator, + denominator: item.denominator, + }, + ], + dataElements: item.operands.map((operand) => ({ + id: operand.id, + ...toDataElement(operand), + })), + }) + case 'PROGRAM_INDICATOR': + return normalizeDataItemProfileMetadata({ + programIndicators: [ + { + id: itemId, + program: { id: sourceUid(source.program) }, + orgUnitField: + source.orgUnitField === 'DATA_ELEMENT' + ? ORG_UNIT_DATA_ELEMENT + : source.orgUnitField, + }, + ], + programs: [{ id: sourceUid(source.program) }], + }) + default: + return normalizeDataItemProfileMetadata({ + dataElements: [{ id: itemId, ...toDataElement(item) }], + }) + } +} + +const toSelectionItem = (key, hierarchy) => { + if (hierarchy.orgUnits[key]) { + return orgUnitUid(key) + } + + return key.startsWith('OU_GROUP-') + ? `OU_GROUP-${groupUid(key.slice('OU_GROUP-'.length))}` + : key +} + +const judgeCase = async (hierarchy, { item, query }) => { + const itemId = 'itemUnderTe' + const profile = getDataItemProfile( + { id: itemId, dimensionItemType: item.dimensionItemType }, + getMetadata(itemId, item) + ) + const orgUnits = query.orgUnits.map((key) => + toSelectionItem(key, hierarchy) + ) + const coverage = await fetchOrgUnitCoverage( + createServer(hierarchy, item).createEngine(), + // With the totals, to check PARTLY_ASSIGNED too + { + sourceKeys: getDataItemProfileSourceKeys([profile]), + orgUnits, + withAssignmentTotals: true, + } + ) + + return getDataItemProfileOrgUnitCompatibility( + profile, + { orgUnits }, + { orgUnitCoverage: coverage } + )[0] +} + +const getExpected = ({ id, expected, observed }) => { + if (PREDICTION_DIFFERENCES[id]) { + return PREDICTION_DIFFERENCES[id] + } + + const isRefused = Object.values(observed).every(({ error }) => + error?.startsWith('E7143') + ) + + if (isRefused) { + return { status: 'none', reasons: ['EMPTY_GROUP'] } + } + + const reasons = expected.reasons.map( + (reason) => REASON_BY_TOOL_NAME[reason] ?? reason + ) + + return { + status: expected.compatibility, + reasons: TOOL_LEAVES_OUT_PARTLY_ASSIGNED.has(id) + ? [...reasons, 'PARTLY_ASSIGNED'] + : reasons, + } +} + +/* What analytics must have returned on every version for the library's + * status: none, nothing (or the refusal of an empty group); partial, some + * values (the ones that reach the org unit); full, never an error. A full + * result says nothing is left out, not that there is data: a program with no + * event in an org unit gives nothing there. */ +const ANSWERS_BY_STATUS = { + none: ['EMPTY'], + partial: ['VALUE'], + full: ['VALUE', 'EMPTY'], +} + +const agreesWithAnalytics = ({ status, reasons }, observed) => + Object.values(observed).every((answer) => + reasons.includes('EMPTY_GROUP') + ? answer.status === 'ERROR' + : ANSWERS_BY_STATUS[status].includes(answer.status) + ) + +describe('org unit fixtures', () => { + describe.each(CASE_GROUPS)('%s', (group) => { + const { hierarchy, cases } = readFixture(group) + + it.each(cases.map((fixtureCase) => [fixtureCase.id, fixtureCase]))( + '%s: the library judges as the tool expects, and as analytics answered', + async (_, fixtureCase) => { + const result = await judgeCase(hierarchy, fixtureCase) + + expect({ + status: result.status, + reasons: result.reasons, + }).toEqual(getExpected(fixtureCase)) + expect(agreesWithAnalytics(result, fixtureCase.observed)).toBe( + true + ) + } + ) + }) + + // The org unit requests are recorded with the period ones, in metadata-shapes.json + describe('the metadata requests, as each version answered them', () => { + const { versions } = JSON.parse( + fs.readFileSync( + path.join(FIXTURES_DIR, '../period-types/metadata-shapes.json') + ) + ) + + describe.each(Object.entries(versions))('%s', (_, { requests }) => { + const responseOf = (name) => + requests.find((request) => request.name === name).response + + it('give data elements their aggregation levels', () => { + const { dataElements } = normalizeDataItemProfileMetadata({ + dataElements: responseOf('dataElements-aggregationLevels'), + }) + + expect( + Object.values(dataElements).map( + ({ aggregationLevels }) => aggregationLevels + ) + ).toContainEqual([2, 3]) + }) + + it('give program indicators their program and orgUnitField', () => { + const response = responseOf('programIndicators') + const { programIndicators } = normalizeDataItemProfileMetadata({ + programIndicators: response, + }) + const read = Object.entries(programIndicators).map( + ([id, { program, orgUnitField }]) => ({ + id, + program, + orgUnitField, + }) + ) + + expect(read).toEqual( + response.programIndicators.map( + ({ id, program, orgUnitField }) => ({ + id, + program: program.id, + orgUnitField, + }) + ) + ) + expect(read.some(({ orgUnitField }) => orgUnitField)).toBe(true) + }) + + it('give the user data view org units', () => { + expect( + responseOf('me-ptt-user').dataViewOrganisationUnits + ).toHaveLength(1) + }) + }) + }) +}) diff --git a/src/modules/dataItemProfile/__tests__/periodFixtures.spec.js b/src/modules/dataItemProfile/__tests__/periodFixtures.spec.js new file mode 100644 index 000000000..571d2fdff --- /dev/null +++ b/src/modules/dataItemProfile/__tests__/periodFixtures.spec.js @@ -0,0 +1,592 @@ +import fs from 'fs' +import path from 'path' +import { inDataSets } from '../../../__fixtures__/dataItemProfileMetadata.js' +import { getDataItemProfile } from '../getDataItemProfile.js' +import { getDataItemProfileCompatibility } from '../getDataItemProfileCompatibility.js' +import { getYear } from '../periods/calendarDates.js' +import { + getFirstOrLastValuePeriod, + getYearsTouched, +} from '../periods/firstLastValues.js' +import { + getFixedPeriodOfTypeByDate, + getPeriodDates, +} from '../periods/periodRanges.js' +import { getPeriodTypeOfPeriodId } from '../periods/periodTypes.js' +import { getPeriodAggregationType } from '../profile/collectSources.js' + +/* The fixtures come from the test tool in dhis2/maps-tools + * (test-data-item-profile). PERIOD_TYPES_FIXTURES_DIR points the test at the + * tool's full export; a folder in it holds one group split in parts. */ +const FIXTURES_DIR = + process.env.PERIOD_TYPES_FIXTURES_DIR ?? + path.join(__dirname, '../../../__fixtures__/period-types') + +const readFixtures = (dir) => + fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { + const entryPath = path.join(dir, entry.name) + + if (entry.isDirectory()) { + return readFixtures(entryPath) + } + + return entry.name.endsWith('.json') && + entry.name !== 'metadata-shapes.json' + ? [JSON.parse(fs.readFileSync(entryPath, 'utf8'))] + : [] + }) + +const LIBRARY_STATUS = { + VALUE: 'full', + REPEATED: 'full', + EMPTY: 'none', + PARTIAL: 'partial', + // Analytics refuses the query: aggregation type NONE, or QuarterlyNov on 2.40 + ERROR: 'unknown', +} + +const FIRST_OR_LAST_AGGREGATION = + /^(FIRST|LAST)(_AVERAGE_ORG_UNIT|_FIRST_ORG_UNIT|_LAST_ORG_UNIT)?$/ + +const getItemParts = (item) => [item, ...(item.operands ?? [])] + +const takesFirstOrLast = (item) => + getItemParts(item).some(({ aggregationType }) => + FIRST_OR_LAST_AGGREGATION.test(aggregationType) + ) + +const hasReportingRate = (item) => + getItemParts(item).some( + ({ dimensionItemType }) => dimensionItemType === 'REPORTING_RATE' + ) + +/* What the library should answer, as a status and the reason it must give, + * if any. The tool calls any value at a shorter period REPEATED; the library + * tells apart: + * - averaged values, repeated from the data period that holds the period: + * full, REPEATED_VALUE; + * - the value FIRST and LAST take from an earlier data period: full, + * EARLIER_PERIOD_VALUE; when there is none, none, NO_EARLIER_PERIOD_VALUE; + * - the meaningless value a reporting rate gives (0, or the expected reports + * count for another type of the same length): none, + * REPORTING_RATE_TOO_SHORT. + * FIRST also takes earlier values in periods its data adds up into + * (January's value for July), which the tool calls VALUE: any reason is + * accepted there. */ +const toExpected = ({ item }, { status }) => { + if (status === 'REPEATED') { + if (hasReportingRate(item)) { + return { status: 'none', reason: 'REPORTING_RATE_TOO_SHORT' } + } + + return takesFirstOrLast(item) + ? { status: 'full', reason: 'EARLIER_PERIOD_VALUE' } + : { status: 'full', reason: 'REPEATED_VALUE' } + } + + if (status === 'EMPTY' && takesFirstOrLast(item)) { + return { status: 'none', reason: 'NO_EARLIER_PERIOD_VALUE' } + } + + return { status: LIBRARY_STATUS[status] } +} + +const agrees = (expected, library) => + expected.status === library.status && + (!expected.reason || library.reasons.includes(expected.reason)) + +const describeExpected = ({ status, reason }) => + reason ? `${status} with ${reason}` : status + +const describeLibrary = ({ status, reasons }) => + reasons.length ? `${status} [${reasons.join(', ')}]` : status + +/* Cases the metadata can't see: the library's answer differs from what + * analytics returns, on purpose, so they are not compared. The empty-result + * check after Update is the way to find them. */ +// The test data covers the periods of 2024 and 2025 +const TEST_DATA_START = '2024-01-01' + +// The periods asked in one request: the case's, and in the carry-windows group the other one of the pair +const getRequestPeriods = ({ query }) => + [query.period, query.withPeriod].filter(Boolean) + +const isFirstOrLast = ({ aggregationType }) => + ['FIRST', 'LAST'].includes(getPeriodAggregationType(aggregationType)) + +/* The data period whose value the library says FIRST or LAST data takes for + * the case's period, by the dates of the request's periods; null when none, + * undefined when it doesn't apply. `fromYear` leaves out the years before it, + * as when they hold no data. */ +const predictFirstOrLastValuePeriod = ( + fixtureCase, + { periodAggregationType, fromYear = -Infinity } = {} +) => { + const { item, query } = fixtureCase + const requestDates = getRequestPeriods(fixtureCase).map((period) => + getPeriodDates(period) + ) + + if ( + !isFirstOrLast(item) || + (item.collectionPeriodTypes ?? []).length !== 1 || + requestDates.includes(null) + ) { + return undefined + } + + const years = [...new Set(requestDates.flatMap(getYearsTouched))].filter( + (year) => year >= fromYear + ) + + return years.length + ? getFirstOrLastValuePeriod({ + periodAggregationType: + periodAggregationType ?? + getPeriodAggregationType(item.aggregationType), + periodType: item.collectionPeriodTypes[0], + dates: getPeriodDates(query.period), + years, + }) + : null +} + +/* What analytics can answer when FIRST or LAST should take a period before + * the test data: nothing, or (where it names the data period) the first one + * with data among the years the request touches. That is the period holding + * the start of the test data (it overlaps 2024, so it holds data), or the + * first that counts in a year after it. Any other answer is compared, so a + * wrong prediction fails. */ +const answersWithoutEarlierData = (fixtureCase) => { + const firstDataPeriods = [ + getFixedPeriodOfTypeByDate( + fixtureCase.item.collectionPeriodTypes[0], + TEST_DATA_START + ), + predictFirstOrLastValuePeriod(fixtureCase, { + periodAggregationType: 'FIRST', + fromYear: getYear(TEST_DATA_START), + }), + ].map((period) => period?.startDate) + + return getOutcomes(fixtureCase).every(([, { value, source }]) => + source + ? firstDataPeriods.includes(getPeriodDates(source)?.startDate) + : value === null || value === undefined + ) +} + +const METADATA_BLIND_SPOTS = [ + { + pattern: /^mixed-history__.*__r-2024/, + reason: 'the metadata only shows the data sets of today', + }, + { + pattern: /^mixed-orphan__/, + reason: 'without a data set, the metadata gives no period type', + }, + { + pattern: /^ind-period-offset__/, + /* The test data starts with the periods that overlap 2024: the period + * before one that starts by then has none */ + applies: ({ query }) => + getPeriodDates(query.period)?.startDate <= TEST_DATA_START, + reason: 'periodOffset(-1) reads a period before the test data', + }, + { + pattern: /^(agg|carry-dense|carry-pair)-/, + applies: (fixtureCase) => { + const source = predictFirstOrLastValuePeriod(fixtureCase) + + return ( + Boolean(source) && + source.endDate < TEST_DATA_START && + answersWithoutEarlierData(fixtureCase) + ) + }, + reason: 'FIRST or LAST takes a period before the test data', + }, + { + pattern: /^carry-sparse-/, + reason: 'the library does not know which periods hold data', + // Not in every subset: its patterns can all be dense ones + optional: true, + }, + { + pattern: /^carry-/, + applies: ({ query }) => + getPeriodDates(query.period)?.endDate < TEST_DATA_START, + reason: 'the period ends before the test data', + }, +] + +const isBlindSpot = (fixtureCase) => + METADATA_BLIND_SPOTS.some( + ({ pattern, applies = () => true }) => + pattern.test(fixtureCase.id) && applies(fixtureCase) + ) + +// collectionSources is optional in the fixtures: one data set per period type otherwise +// With the category combo each data set gives the element, when the case names it +const getDataSets = ({ collectionSources, collectionPeriodTypes }) => + collectionSources + ? collectionSources.map(({ dataSet, periodType, categoryCombo }) => ({ + id: dataSet, + periodType, + ...(categoryCombo && { categoryComboId: categoryCombo.id }), + })) + : inDataSets(collectionPeriodTypes) + +/* A disaggregation (group 16): the operand asked, and the category combo of + * its option combo, which the case names by key */ +const getDisaggregation = (item) => { + const optionCombo = item.categoryOptionCombo + + if (!optionCombo) { + return { id: 'de', categoryOptionCombos: {} } + } + + const combos = [item.categoryCombo, ...item.collectionSources].map( + (source) => source.categoryCombo ?? source + ) + const categoryComboId = combos.find( + ({ key }) => key === optionCombo.categoryCombo + )?.id + + return { + id: `de.${optionCombo.id}`, + categoryOptionCombos: { [optionCombo.id]: { categoryComboId } }, + } +} + +// Indicator operands need the id their expression uses +const addOperands = (metadata, operands = []) => { + operands.forEach((operand) => { + if (!operand.id) { + throw new Error('an operand has no id') + } + + if (operand.dimensionItemType === 'REPORTING_RATE') { + metadata.dataSets[operand.id] = { + periodType: operand.collectionPeriodTypes[0], + } + } else if (operand.dimensionItemType === 'INDICATOR') { + metadata.indicators[operand.id] = { + numerator: operand.numerator, + denominator: operand.denominator, + } + addOperands(metadata, operand.operands) + } else { + metadata.dataElements[operand.id] = { + aggregationType: operand.aggregationType, + dataSets: getDataSets(operand), + } + } + }) +} + +const toMetadata = ({ item }) => { + const metadata = { + dataElements: {}, + dataSets: {}, + indicators: {}, + expressionDimensionItems: {}, + } + + switch (item.dimensionItemType) { + case 'REPORTING_RATE': + metadata.dataSets.ds = { periodType: item.collectionPeriodTypes[0] } + return { id: `ds.${item.metric ?? 'REPORTING_RATE'}`, metadata } + case 'INDICATOR': + metadata.indicators.item = { + numerator: item.numerator, + denominator: item.denominator, + } + addOperands(metadata, item.operands) + return { id: 'item', metadata } + case 'EXPRESSION_DIMENSION_ITEM': + metadata.expressionDimensionItems.item = { + expression: item.expression, + } + addOperands(metadata, item.operands) + return { id: 'item', metadata } + default: { + const { id, categoryOptionCombos } = getDisaggregation(item) + + metadata.dataElements.de = { + aggregationType: item.aggregationType, + valueType: item.valueType, + dataSets: getDataSets(item), + } + metadata.categoryOptionCombos = categoryOptionCombos + return { id, metadata } + } + } +} + +// What analytics returned on each version, or what is expected before a run +const getOutcomes = (fixtureCase) => { + const observed = Object.entries(fixtureCase.observed ?? {}) + + return observed.length ? observed : [['expected', fixtureCase.expected]] +} + +// '2.40.12' or '2.43.3-SNAPSHOT' to { major, minor } +const toServerVersion = (version) => { + const [major, minor] = version.split('.').map(Number) + + return Number.isInteger(minor) ? { major, minor } : undefined +} + +// Ids the library reads as org unit uids (11 characters) +const toOrgUnitUid = (key) => `place${key}xxxxxxxxxxx`.slice(0, 11) + +/* A case asked at an org unit, with its data sets assigned to some org units + * (by place: monthly at A, weekly at B): a coverage of those org units at + * level 2, under the one asked when it isn't one of them (the region) */ +const getPlaceCoverage = ({ item, query }) => { + const sources = item.collectionSources ?? [] + + if (!query.orgUnit || !sources.some(({ orgUnits }) => orgUnits)) { + return null + } + + const keys = [...new Set(sources.flatMap(({ orgUnits = [] }) => orgUnits))] + const parentKey = keys.includes(query.orgUnit) ? 'Root' : query.orgUnit + const parent = { + id: toOrgUnitUid(parentKey), + level: 1, + path: `/${toOrgUnitUid(parentKey)}`, + } + const assignedAmong = (dataSetKeys, orgUnits) => + dataSetKeys.filter((key) => orgUnits.includes(key)).length + const countsOf = (unitKeys) => ({ + totals: { 2: unitKeys.length }, + sources: Object.fromEntries( + sources.map(({ dataSet, orgUnits = [] }) => [ + dataSet, + { byLevel: { 2: assignedAmong(unitKeys, orgUnits) } }, + ]) + ), + }) + + return { + levels: [{ level: 1 }, { level: 2 }], + orgUnits: { + [parent.id]: parent, + ...Object.fromEntries( + keys.map((key) => [ + toOrgUnitUid(key), + { + id: toOrgUnitUid(key), + level: 2, + path: `${parent.path}/${toOrgUnitUid(key)}`, + }, + ]) + ), + }, + counts: { + [parent.id]: countsOf(keys), + ...Object.fromEntries( + keys.map((key) => [toOrgUnitUid(key), countsOf([key])]) + ), + }, + } +} + +const computeLibraryAnswer = (fixtureCase, serverVersion) => { + const { id, metadata } = toMetadata(fixtureCase) + const profile = getDataItemProfile( + { id, dimensionItemType: fixtureCase.item.dimensionItemType }, + metadata + ) + const { period, periodType } = fixtureCase.query + /* `period` is a period of the query type, or the range the query type is + * asked over (the weeks of 2025Q2) */ + const asked = + getPeriodTypeOfPeriodId(period) === periodType ? period : periodType + + const { withPeriod } = fixtureCase.query + const placeCoverage = getPlaceCoverage(fixtureCase) + + // Asked at an org unit: the period judged there, with only the data sets assigned to it + if (placeCoverage) { + const { status, reasons } = getDataItemProfileCompatibility( + profile, + { + periods: [asked], + orgUnits: [toOrgUnitUid(fixtureCase.query.orgUnit)], + }, + { serverVersion, orgUnitCoverage: placeCoverage } + ) + + return { status, reasons } + } + + const { periods } = getDataItemProfileCompatibility( + profile, + { periods: withPeriod ? [asked, withPeriod] : [asked] }, + { serverVersion } + ) + const { status, reasons } = periods[0] + + return { status, reasons } +} + +/* The versions only differ for QuarterlyNov, which 2.40 can't answer: one + * answer for 2.40, one for the others */ +const libraryAnswers = new Map() + +const getLibraryAnswer = (fixtureCase, version) => { + const serverVersion = toServerVersion(version) + const key = `${fixtureCase.id}:${serverVersion?.minor < 41}` + + if (!libraryAnswers.has(key)) { + libraryAnswers.set( + key, + computeLibraryAnswer(fixtureCase, serverVersion) + ) + } + + return libraryAnswers.get(key) +} + +/* A case the metadata check can't read: a request without a period type + * (the detection requests, for the after-Update check), or operands without + * ids */ +const canRead = (fixtureCase) => { + try { + return ( + Boolean(fixtureCase.item?.dimensionItemType) && + Boolean(fixtureCase.query?.periodType) && + toMetadata(fixtureCase) + ) + } catch { + return false + } +} + +const describeCase = ({ item, query }) => + [ + item.dimensionItemType, + item.aggregationType ?? item.metric, + (item.collectionPeriodTypes ?? []).join('+'), + `q ${query.periodType}`, + ].join(' ') + +/* One line per pattern, not per case: the full export has hundreds of + * thousands of outcomes */ +const summarize = (mismatches) => + Object.values( + mismatches.reduce((patterns, mismatch) => { + const key = `${describeCase(mismatch.fixtureCase)}: analytics ${ + mismatch.status + } (${describeExpected( + mismatch.expected + )}), library ${describeLibrary(mismatch.library)}` + const pattern = patterns[key] ?? { key, count: 0, example: '' } + + pattern.count++ + pattern.example ||= `${mismatch.fixtureCase.id} (${mismatch.version})` + patterns[key] = pattern + + return patterns + }, {}) + ).map(({ key, count, example }) => `${count}× ${key}, e.g. ${example}`) + +const fixtures = readFixtures(FIXTURES_DIR) +const allCases = fixtures.flatMap(({ cases }) => cases) +const casesOf = (group) => + fixtures + .filter((fixture) => fixture.group === group) + .flatMap((fixture) => fixture.cases) +const allGroups = [...new Set(fixtures.map(({ group }) => group))] +// The detection requests are for the after-Update check: nothing to compare here +const NOT_COMPARED_GROUPS = ['detection-requests'] +const groups = allGroups.filter((group) => !NOT_COMPARED_GROUPS.includes(group)) + +describe('period type fixtures', () => { + it('are there', () => { + expect(allCases.length).toBeGreaterThan(0) + }) + + it('use only statuses the library maps', () => { + const statuses = allCases.flatMap((fixtureCase) => + getOutcomes(fixtureCase).map(([, { status }]) => status) + ) + + expect( + [...new Set(statuses)].filter( + (status) => !(status in LIBRARY_STATUS) + ) + ).toEqual([]) + }) + + it('list only blind spots that exist', () => { + expect( + METADATA_BLIND_SPOTS.filter( + ({ pattern, applies = () => true, optional }) => + !optional && + !allCases.some( + (fixtureCase) => + pattern.test(fixtureCase.id) && applies(fixtureCase) + ) + ).map(({ reason }) => reason) + ).toEqual([]) + }) + + /* The carry-windows group names the data period each FIRST or LAST value + * comes from. Where every period holds data (the dense layout), the + * library must pick the same one. */ + it('pick the data period analytics names for FIRST and LAST', () => { + const cases = allCases.filter( + (fixtureCase) => + fixtureCase.id.startsWith('carry-') && + !isBlindSpot(fixtureCase) && + predictFirstOrLastValuePeriod(fixtureCase) !== undefined + ) + const startOf = (period) => + period ? getPeriodDates(period)?.startDate ?? period : null + const mismatches = cases.flatMap((fixtureCase) => { + const predicted = + predictFirstOrLastValuePeriod(fixtureCase)?.startDate ?? null + + return getOutcomes(fixtureCase) + .filter(([, { source }]) => startOf(source) !== predicted) + .map( + ([version, { source }]) => + `${fixtureCase.id} (${version}): analytics ${source}, library ${predicted}` + ) + }) + + expect(cases.length).toBeGreaterThan(0) + expect(mismatches.slice(0, 20)).toEqual([]) + }) + + it('leave out only the groups the metadata check can’t read', () => { + expect( + allGroups.filter((group) => !casesOf(group).some(canRead)) + ).toEqual(NOT_COMPARED_GROUPS) + }) + + it.each(groups)('%s: the library agrees with analytics', (group) => { + const cases = casesOf(group).filter( + (fixtureCase) => canRead(fixtureCase) && !isBlindSpot(fixtureCase) + ) + + expect(cases.length).toBeGreaterThan(0) + const mismatches = cases.flatMap((fixtureCase) => + getOutcomes(fixtureCase) + .map(([version, outcome]) => ({ + fixtureCase, + version, + status: outcome.status, + expected: toExpected(fixtureCase, outcome), + library: getLibraryAnswer(fixtureCase, version), + })) + .filter(({ expected, library }) => !agrees(expected, library)) + ) + + expect(summarize(mismatches)).toEqual([]) + }) +}) diff --git a/src/modules/dataItemProfile/__tests__/sources.spec.js b/src/modules/dataItemProfile/__tests__/sources.spec.js new file mode 100644 index 000000000..66bfba2ea --- /dev/null +++ b/src/modules/dataItemProfile/__tests__/sources.spec.js @@ -0,0 +1,131 @@ +import { + canBeAtAnyOrgUnit, + getAssignmentField, + getItemOperands, + getSourceId, + isProgramSource, + usesProgramOrgUnits, +} from '../sources.js' + +const dataSetSource = (id, elements = [], reportingRate = false) => ({ + dataSet: { id, periodType: 'Monthly' }, + elements, + reportingRate, +}) +const programSource = (id, extra = {}) => ({ + dataSet: null, + program: { id }, + elements: [], + reportingRate: false, + ...extra, +}) +const unassignedSource = (elements) => ({ + dataSet: null, + elements, + reportingRate: false, +}) +const element = (id, aggregationType = 'SUM') => ({ id, aggregationType }) + +describe('sources', () => { + it('tells a program from a data set or an element in no data set', () => { + expect(isProgramSource(programSource('programAAA'))).toBe(true) + expect(isProgramSource(dataSetSource('dataSetAAA'))).toBe(false) + expect(isProgramSource(unassignedSource([]))).toBe(false) + }) + + it('gives the id of the data set or program, or null', () => { + expect(getSourceId(dataSetSource('dataSetAAA'))).toBe('dataSetAAA') + expect(getSourceId(programSource('programAAA'))).toBe('programAAA') + expect(getSourceId(unassignedSource([]))).toBeNull() + }) + + it('gives the org unit field that lists where a source is assigned', () => { + expect(getAssignmentField(dataSetSource('dataSetAAA'))).toBe('dataSets') + expect(getAssignmentField(programSource('programAAA'))).toBe('programs') + }) + + it.each([ + undefined, + 'EVENT', + 'ENROLLMENT', + 'OWNER_AT_START', + 'OWNER_AT_END', + ])( + 'places values where the program is assigned with orgUnitField %s', + (orgUnitField) => { + expect(usesProgramOrgUnits(orgUnitField)).toBe(true) + expect( + canBeAtAnyOrgUnit(programSource('p', { orgUnitField })) + ).toBe(false) + } + ) + + it.each(['REGISTRATION', 'orgUnitDeAA'])( + 'places values at any org unit with orgUnitField %s', + (orgUnitField) => { + expect(usesProgramOrgUnits(orgUnitField)).toBe(false) + expect( + canBeAtAnyOrgUnit(programSource('p', { orgUnitField })) + ).toBe(true) + } + ) + + describe('getItemOperands', () => { + it('groups an element over the sources it is in', () => { + const monthly = dataSetSource('monthlyForm', [element('elementA')]) + const weekly = dataSetSource('weeklyForm', [element('elementA')]) + + expect(getItemOperands({ sources: [monthly, weekly] })).toEqual([ + { + key: 'element:elementA:SUM', + element: element('elementA'), + sources: [monthly, weekly], + }, + ]) + }) + + it('keeps an element with another aggregation type apart', () => { + const source = dataSetSource('monthlyForm', [ + element('elementA'), + element('elementA', 'LAST'), + ]) + + expect(getItemOperands({ sources: [source] })).toHaveLength(2) + }) + + it('adds each reporting rate and each program as an operand', () => { + const rate = dataSetSource('monthlyForm', [], true) + const program = programSource('programAAA') + + expect(getItemOperands({ sources: [rate, program] })).toEqual([ + { + key: 'reportingRate:monthlyForm', + reportingRate: true, + sources: [rate], + }, + { + key: 'program:programAAA::', + program: true, + sources: [program], + }, + ]) + }) + + it('keys a program apart by where and how its indicators place values', () => { + expect( + getItemOperands({ + sources: [ + programSource('programAAA', { + orgUnitField: 'REGISTRATION', + missingPeriodBoundaries: true, + }), + ], + })[0].key + ).toBe('program:programAAA:REGISTRATION:missingPeriodBoundaries') + }) + + it('has no operand without sources', () => { + expect(getItemOperands({ sources: [] })).toEqual([]) + }) + }) +}) diff --git a/src/modules/dataItemProfile/compatibility/__tests__/combineResults.spec.js b/src/modules/dataItemProfile/compatibility/__tests__/combineResults.spec.js new file mode 100644 index 000000000..86c8a838d --- /dev/null +++ b/src/modules/dataItemProfile/compatibility/__tests__/combineResults.spec.js @@ -0,0 +1,201 @@ +import { + combineAddedUpResults, + combineExpressionResults, + combineOperandResults, + combineResults, + createResult, + getMostSevere, + getUnknownResult, + unionOfReasons, +} from '../combineResults.js' + +const full = (reasons) => createResult('full', reasons) +const partial = (reasons) => createResult('partial', reasons) +const none = (reasons) => createResult('none', reasons) + +describe('combineResults', () => { + it('creates a result with no reason by default', () => { + expect(createResult('full')).toEqual({ status: 'full', reasons: [] }) + expect(getUnknownResult('UNKNOWN_PERIOD')).toEqual({ + status: 'unknown', + reasons: ['UNKNOWN_PERIOD'], + }) + }) + + it('lists every reason once, in the reason order', () => { + expect( + unionOfReasons([ + full(['REPEATED_VALUE']), + none(['PERIOD_TOO_SHORT', 'REPEATED_VALUE']), + ]) + ).toEqual(['PERIOD_TOO_SHORT', 'REPEATED_VALUE']) + }) + + it('picks the most severe result: none, partial, unknown, full', () => { + const unknown = getUnknownResult('UNKNOWN_PERIOD') + + expect(getMostSevere([full(), unknown, partial()])).toEqual(partial()) + expect(getMostSevere([full(), unknown])).toBe(unknown) + expect(getMostSevere([])).toBeUndefined() + }) + + it('combines into the most severe status with every reason', () => { + expect( + combineResults([ + full(['REPEATED_VALUE']), + none(['PERIOD_TOO_SHORT']), + ]) + ).toEqual(none(['PERIOD_TOO_SHORT', 'REPEATED_VALUE'])) + expect(combineResults([])).toEqual(full()) + }) + + describe('combineAddedUpResults', () => { + it('is none when all are, partial when some are none or partial', () => { + expect( + combineAddedUpResults([ + none(['PERIOD_TOO_SHORT']), + none(['NO_EARLIER_PERIOD_VALUE']), + ]) + ).toEqual(none(['PERIOD_TOO_SHORT', 'NO_EARLIER_PERIOD_VALUE'])) + expect( + combineAddedUpResults([full(), none(['PERIOD_TOO_SHORT'])]) + ).toEqual(partial(['PERIOD_TOO_SHORT'])) + expect( + combineAddedUpResults([full(), partial(['OPERAND_PARTIAL'])]) + ).toEqual(partial(['OPERAND_PARTIAL'])) + }) + + it('is unknown when the results without none are all unknown', () => { + expect( + combineAddedUpResults([ + none(['PERIOD_TOO_SHORT']), + getUnknownResult('UNKNOWN_PERIOD'), + ]) + ).toEqual( + createResult('unknown', ['PERIOD_TOO_SHORT', 'UNKNOWN_PERIOD']) + ) + expect( + combineAddedUpResults([ + full(), + none(['PERIOD_TOO_SHORT']), + getUnknownResult('UNKNOWN_PERIOD'), + ]) + ).toEqual(partial(['PERIOD_TOO_SHORT', 'UNKNOWN_PERIOD'])) + }) + + it('is otherwise the most severe of the rest, and full for none', () => { + expect( + combineAddedUpResults([ + full(), + getUnknownResult('UNSUPPORTED_VERSION'), + ]) + ).toEqual(getUnknownResult('UNSUPPORTED_VERSION')) + expect(combineAddedUpResults([])).toEqual(full()) + }) + }) + + describe('combineOperandResults', () => { + it('says first when an operand of an expression gives none or leaves values out', () => { + expect( + combineOperandResults([full(), none(['PERIOD_TOO_SHORT'])]) + ).toEqual(none(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT'])) + expect( + combineOperandResults([ + full(), + partial(['PERIOD_TYPE_MISMATCH']), + ]) + ).toEqual(partial(['OPERAND_PARTIAL', 'PERIOD_TYPE_MISMATCH'])) + }) + + it('adds operands up when a missing value counts as 0', () => { + expect( + combineOperandResults( + [full(), none(['PERIOD_TOO_SHORT'])], + 'SKIP_IF_ALL_VALUES_MISSING' + ) + ).toEqual(partial(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT'])) + expect( + combineOperandResults( + [none(['PERIOD_TOO_SHORT']), partial(['REPEATED_VALUE'])], + 'SKIP_IF_ALL_VALUES_MISSING' + ) + ).toEqual( + partial([ + 'OPERAND_EMPTY', + 'OPERAND_PARTIAL', + 'PERIOD_TOO_SHORT', + 'REPEATED_VALUE', + ]) + ) + expect( + combineOperandResults( + [none(['PERIOD_TOO_SHORT']), none(['PERIOD_TOO_SHORT'])], + 'SKIP_IF_ALL_VALUES_MISSING' + ) + ).toEqual(none(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT'])) + }) + + it('says nothing more for a single operand, or a full result', () => { + expect(combineOperandResults([none(['PERIOD_TOO_SHORT'])])).toEqual( + none(['PERIOD_TOO_SHORT']) + ) + expect(combineOperandResults([full(), full()])).toEqual(full()) + }) + }) + + describe('combineExpressionResults', () => { + const results = { + a: full(), + b: none(['PERIOD_TOO_SHORT']), + } + const resultOf = (key) => results[key] + + it('needs every operand without an expression', () => { + expect( + combineExpressionResults(undefined, ['a', 'b'], resultOf) + ).toEqual(none(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT'])) + }) + + it('combines nested parts by their strategies', () => { + const sum = { + missingValueStrategy: 'SKIP_IF_ALL_VALUES_MISSING', + parts: [{ operand: 'a' }, { operand: 'b' }], + } + + expect(combineExpressionResults(sum, [], resultOf)).toEqual( + partial(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT']) + ) + expect( + combineExpressionResults( + { + missingValueStrategy: 'SKIP_IF_ANY_VALUE_MISSING', + parts: [sum, { operand: 'b' }], + }, + [], + resultOf + ) + ).toEqual(none(['OPERAND_EMPTY', 'PERIOD_TOO_SHORT'])) + }) + + it('leaves out parts with no operand, and is full without any', () => { + const constants = { + missingValueStrategy: 'SKIP_IF_ALL_VALUES_MISSING', + parts: [], + } + + expect( + combineExpressionResults( + { + missingValueStrategy: 'SKIP_IF_ANY_VALUE_MISSING', + parts: [{ operand: 'b' }, constants], + }, + [], + resultOf + ) + ).toEqual(none(['PERIOD_TOO_SHORT'])) + expect(combineExpressionResults(undefined, [], resultOf)).toEqual( + full() + ) + }) + }) +}) diff --git a/src/modules/dataItemProfile/compatibility/__tests__/getDataItemProfileOrgUnitCompatibility.spec.js b/src/modules/dataItemProfile/compatibility/__tests__/getDataItemProfileOrgUnitCompatibility.spec.js new file mode 100644 index 000000000..c69be6864 --- /dev/null +++ b/src/modules/dataItemProfile/compatibility/__tests__/getDataItemProfileOrgUnitCompatibility.spec.js @@ -0,0 +1,464 @@ +import { + ORG_UNIT_COVERAGE as COVERAGE, + orgUnitProfileOf as profileOf, +} from '../../../../__fixtures__/dataItemProfileOrgUnits.js' +import { getDataItemProfileOrgUnitCompatibility } from '../getDataItemProfileOrgUnitCompatibility.js' + +const judge = (id, orgUnits, { type, coverage = COVERAGE } = {}) => + getDataItemProfileOrgUnitCompatibility( + profileOf(id, type), + { orgUnits }, + { orgUnitCoverage: coverage } + ) + +describe('getDataItemProfileOrgUnitCompatibility', () => { + it('is full where every org unit at the deepest level assigned is', () => { + expect(judge('facility', ['districtAAA'])).toEqual([ + { + id: 'districtAAA', + status: 'full', + reasons: [], + assignment: { assigned: 2, total: 2, level: 3 }, + }, + ]) + }) + + it('is full where only some are, since the others aren’t assigned', () => { + expect(judge('facility', ['nationUnit1'])).toEqual([ + { + id: 'nationUnit1', + status: 'full', + reasons: ['PARTLY_ASSIGNED'], + assignment: { assigned: 3, total: 4, level: 3 }, + }, + ]) + }) + + it('gives no total, nor PARTLY_ASSIGNED, when the org units weren’t counted', () => { + const withoutTotals = { + ...COVERAGE, + counts: Object.fromEntries( + Object.entries(COVERAGE.counts).map(([key, counts]) => [ + key, + { ...counts, totals: {} }, + ]) + ), + } + + expect( + judge('facility', ['nationUnit1'], { coverage: withoutTotals }) + ).toEqual([ + { + id: 'nationUnit1', + status: 'full', + reasons: [], + assignment: { assigned: 3, level: 3 }, + }, + ]) + expect( + judge('facility', ['LEVEL-2'], { coverage: withoutTotals })[0] + .assignment + ).toEqual({ assigned: 3, level: 3 }) + }) + + it('is none, assigned higher, where only an ancestor of the org unit is assigned', () => { + expect(judge('facility', ['facilityDDD'])).toMatchObject([ + { + status: 'none', + reasons: ['ASSIGNED_AT_HIGHER_LEVEL'], + assignment: null, + }, + ]) + }) + + it('is none, not assigned, where neither the org unit nor its ancestors are', () => { + expect( + judge('pi', ['facilityDDD'], { type: 'PROGRAM_INDICATOR' }) + ).toMatchObject([ + { status: 'none', reasons: ['NOT_ASSIGNED'], assignment: null }, + ]) + }) + + it('is none below the levels it is assigned at', () => { + expect(judge('district', ['facilityAAA'])).toMatchObject([ + { status: 'none', reasons: ['ASSIGNED_AT_HIGHER_LEVEL'] }, + ]) + expect(judge('district', ['nationUnit1', 'LEVEL-3'])).toMatchObject([ + { + id: 'LEVEL-3', + status: 'none', + reasons: ['ASSIGNED_AT_HIGHER_LEVEL'], + }, + ]) + }) + + it('counts an element where any of its data sets is assigned', () => { + // The monthly form is assigned to the nation above facilityDDD: its values are left out there + expect(judge('twoForms', ['facilityDDD'])).toMatchObject([ + { status: 'partial', reasons: ['ASSIGNED_AT_HIGHER_LEVEL'] }, + ]) + expect(judge('twoForms', ['nationUnit1'])).toMatchObject([ + { + status: 'full', + reasons: ['PARTLY_ASSIGNED'], + assignment: { assigned: 3, total: 4 }, + }, + ]) + }) + + it('is not partly assigned when one data set is assigned to every org unit', () => { + const coverage = { + ...COVERAGE, + counts: { + ...COVERAGE.counts, + districtBBB: { + totals: { 2: 1, 3: 2 }, + sources: { + MonthlyForm: { byLevel: { 3: 2 } }, + WeeklyForm: { byLevel: { 3: 1 } }, + }, + }, + }, + } + + expect(judge('twoForms', ['districtBBB'], { coverage })).toEqual([ + { + id: 'districtBBB', + status: 'full', + reasons: [], + assignment: { assigned: 2, total: 2, level: 3 }, + }, + ]) + }) + + it('is partial when another data set is assigned at a higher level: its values are left out', () => { + expect(judge('twoLevels', ['facilityAAA'])).toEqual([ + { + id: 'facilityAAA', + status: 'partial', + reasons: ['ASSIGNED_AT_HIGHER_LEVEL'], + assignment: { assigned: 1, total: 1, level: 3 }, + }, + ]) + }) + + it('needs every operand of an expression', () => { + expect( + judge('ratio', ['facilityAAA'], { type: 'INDICATOR' }) + ).toMatchObject([ + { + status: 'none', + reasons: ['OPERAND_EMPTY', 'ASSIGNED_AT_HIGHER_LEVEL'], + }, + ]) + expect( + judge('MonthlyForm.REPORTING_RATE', ['districtAAA'], { + type: 'REPORTING_RATE', + }) + ).toMatchObject([{ status: 'full' }]) + expect( + judge('completeness', ['facilityDDD'], { type: 'INDICATOR' }) + ).toMatchObject([ + { + status: 'none', + reasons: ['OPERAND_EMPTY', 'ASSIGNED_AT_HIGHER_LEVEL'], + }, + ]) + }) + + it('is partial for a sum where one item has no value, which counts as 0', () => { + expect( + judge('facilityPlusDistrict', ['facilityAAA'], { + type: 'INDICATOR', + }) + ).toMatchObject([ + { + status: 'partial', + reasons: ['OPERAND_EMPTY', 'ASSIGNED_AT_HIGHER_LEVEL'], + }, + ]) + }) + + it('says an expression is computed from a partial operand', () => { + expect( + judge('partOfTotal', ['facilityAAA'], { type: 'INDICATOR' }) + ).toMatchObject([ + { + status: 'partial', + reasons: ['OPERAND_PARTIAL', 'ASSIGNED_AT_HIGHER_LEVEL'], + }, + ]) + }) + + it('stops values below an aggregation level from reaching it', () => { + expect(judge('cappedAtDistrict', ['districtAAA'])).toEqual([ + { + id: 'districtAAA', + status: 'none', + reasons: ['STOPPED_BY_AGGREGATION_LEVEL'], + assignment: null, + }, + ]) + expect(judge('cappedAtDistrict', ['facilityAAA'])).toMatchObject([ + { status: 'full', reasons: [] }, + ]) + }) + + it('counts values from the aggregation level or above it', () => { + expect(judge('cappedAtDistrict', ['nationUnit1'])).toMatchObject([ + { + status: 'full', + assignment: { assigned: 1, total: 1, level: 1 }, + }, + ]) + }) + + it('is partial when the values of one data set are stopped', () => { + expect(judge('cappedWithDistrictForm', ['districtAAA'])).toMatchObject([ + { status: 'partial', reasons: ['STOPPED_BY_AGGREGATION_LEVEL'] }, + ]) + }) + + it('judges a level under parent org units, adding up their counts', () => { + expect( + judge('facility', ['districtAAA', 'districtBBB', 'LEVEL-3']) + ).toEqual([ + { + id: 'LEVEL-3', + status: 'full', + reasons: ['PARTLY_ASSIGNED'], + assignment: { assigned: 3, total: 4, level: 3 }, + }, + ]) + }) + + it('judges a level under the roots, and the user org units', () => { + expect(judge('district', ['LEVEL-2'])).toMatchObject([ + { status: 'full', assignment: { assigned: 2, total: 2 } }, + ]) + expect(judge('facility', ['USER_ORGUNIT_CHILDREN'])).toMatchObject([ + { status: 'full', assignment: { assigned: 1, total: 2 } }, + ]) + }) + + it('is none, with no org units there, for a level above every parent or below the hierarchy', () => { + expect(judge('facility', ['facilityAAA', 'LEVEL-2'])).toEqual([ + { + id: 'LEVEL-2', + status: 'none', + reasons: ['NO_ORG_UNITS_AT_LEVEL'], + assignment: null, + }, + ]) + expect(judge('facility', ['nationUnit1', 'LEVEL-9'])).toMatchObject([ + { status: 'none', reasons: ['NO_ORG_UNITS_AT_LEVEL'] }, + ]) + }) + + it('adds up a level under several parents: one with nothing assigned only lowers the counts', () => { + expect( + judge('pi', ['districtAAA', 'districtBBB', 'LEVEL-3'], { + type: 'PROGRAM_INDICATOR', + }) + ).toEqual([ + { + id: 'LEVEL-3', + status: 'full', + reasons: ['PARTLY_ASSIGNED'], + assignment: { assigned: 2, total: 4, level: 3 }, + }, + ]) + }) + + it('is partial for a level under several parents where values are left out', () => { + expect( + judge('twoLevels', ['districtAAA', 'districtBBB', 'LEVEL-3']) + ).toMatchObject([ + { + status: 'partial', + reasons: ['ASSIGNED_AT_HIGHER_LEVEL', 'PARTLY_ASSIGNED'], + assignment: { assigned: 3, total: 4, level: 3 }, + }, + ]) + }) + + it('is partial for a level under several parents where an operand has no value under one', () => { + // districtBBB: facilities collect the numerator, nothing the denominator + const coverage = { + ...COVERAGE, + counts: { + ...COVERAGE.counts, + districtBBB: { + totals: { 2: 1, 3: 2 }, + sources: { + MonthlyForm: { byLevel: { 3: 1 } }, + QuarterlyForm: { byLevel: {} }, + }, + }, + }, + } + + expect( + judge('ratio', ['LEVEL-2', 'districtAAA', 'districtBBB'], { + type: 'INDICATOR', + coverage, + }) + ).toMatchObject([ + { + status: 'partial', + reasons: ['OPERAND_EMPTY', 'PARTLY_ASSIGNED'], + }, + ]) + }) + + it('takes the user org units as parents of a level', () => { + expect(judge('facility', ['USER_ORGUNIT', 'LEVEL-3'])).toEqual([ + { + id: 'LEVEL-3', + status: 'full', + reasons: ['PARTLY_ASSIGNED'], + assignment: { assigned: 1, total: 2, level: 3 }, + }, + ]) + }) + + it('judges event data where its program is assigned', () => { + expect( + judge('pi', ['nationUnit1'], { type: 'PROGRAM_INDICATOR' }) + ).toEqual([ + { + id: 'nationUnit1', + status: 'full', + reasons: ['PARTLY_ASSIGNED'], + assignment: { assigned: 2, total: 4, level: 3 }, + }, + ]) + expect( + judge('pi', ['facilityDDD'], { type: 'PROGRAM_INDICATOR' }) + ).toMatchObject([{ status: 'none', reasons: ['NOT_ASSIGNED'] }]) + expect( + judge('eventProgra.someElement', ['facilityDDD'], { + type: 'PROGRAM_DATA_ELEMENT', + }) + ).toMatchObject([{ status: 'none', reasons: ['NOT_ASSIGNED'] }]) + }) + + it('needs the program of an indicator too', () => { + expect( + judge('casesPerFacility', ['facilityDDD'], { type: 'INDICATOR' }) + ).toMatchObject([ + { + status: 'none', + reasons: [ + 'OPERAND_EMPTY', + 'NOT_ASSIGNED', + 'ASSIGNED_AT_HIGHER_LEVEL', + ], + }, + ]) + }) + + it('judges a group where its members are', () => { + expect(judge('facility', ['OU_GROUP-clinicGroup'])).toEqual([ + { + id: 'OU_GROUP-clinicGroup', + status: 'full', + reasons: ['PARTLY_ASSIGNED'], + assignment: { assigned: 1, total: 2, level: 3 }, + }, + ]) + expect(judge('district', ['OU_GROUP-clinicGroup'])).toMatchObject([ + { status: 'none', reasons: ['ASSIGNED_AT_HIGHER_LEVEL'] }, + ]) + }) + + it('adds up a group over the levels its members are at', () => { + expect(judge('facility', ['OU_GROUP-mixedGroupA'])).toMatchObject([ + { + status: 'full', + reasons: ['PARTLY_ASSIGNED'], + assignment: { assigned: 2, total: 3, level: 3 }, + }, + ]) + }) + + it('leaves out the levels with no member under the parent org units', () => { + expect( + judge('facility', ['districtAAA', 'OU_GROUP-mixedGroupA']) + ).toEqual([ + { + id: 'OU_GROUP-mixedGroupA', + status: 'full', + reasons: [], + assignment: { assigned: 1, total: 1, level: 3 }, + }, + ]) + }) + + it('is none for a group with no members, which analytics refuses', () => { + expect(judge('facility', ['OU_GROUP-emptyGroupA'])).toEqual([ + { + id: 'OU_GROUP-emptyGroupA', + status: 'none', + reasons: ['EMPTY_GROUP'], + assignment: null, + }, + ]) + }) + + it('is full for an item with no source, nothing limits where it has values', () => { + expect( + judge('constantsOnly', ['facilityDDD'], { type: 'INDICATOR' }) + ).toEqual([ + { + id: 'facilityDDD', + status: 'full', + reasons: [], + assignment: null, + }, + ]) + }) + + it('fits any org unit for a program indicator placed by registration or an attribute', () => { + expect( + judge('piByRegistr', ['facilityDDD'], { type: 'PROGRAM_INDICATOR' }) + ).toEqual([ + { + id: 'facilityDDD', + status: 'full', + reasons: ['ANY_ORG_UNIT'], + assignment: null, + }, + ]) + expect( + judge('piByAttribu', ['facilityDDD'], { type: 'PROGRAM_INDICATOR' }) + ).toMatchObject([{ status: 'full', reasons: ['ANY_ORG_UNIT'] }]) + }) + + it('keeps the program assignment for a program indicator placed by owner', () => { + expect( + judge('piByOwner', ['facilityDDD'], { type: 'PROGRAM_INDICATOR' }) + ).toMatchObject([{ status: 'none', reasons: ['NOT_ASSIGNED'] }]) + }) + + it('cannot tell for groups or org units not loaded, or missing metadata', () => { + expect(judge('facility', ['OU_GROUP-notLoadedGr'])).toMatchObject([ + { status: 'unknown', reasons: ['UNKNOWN_ORG_UNIT'] }, + ]) + expect(judge('facility', ['notLoadedUn'])).toMatchObject([ + { status: 'unknown', reasons: ['UNKNOWN_ORG_UNIT'] }, + ]) + expect( + judge('facility', ['nationUnit1'], { coverage: null }) + ).toMatchObject([{ status: 'unknown', reasons: ['UNKNOWN_ORG_UNIT'] }]) + expect( + judge('someElement', ['nationUnit1'], { type: 'EVENT_DATA_ITEM' }) + ).toMatchObject([{ status: 'unknown', reasons: ['PROFILE_UNKNOWN'] }]) + expect( + judge('notThere', ['nationUnit1'], { type: 'PROGRAM_INDICATOR' }) + ).toMatchObject([{ status: 'unknown', reasons: ['PROFILE_UNKNOWN'] }]) + expect(judge('orphan', ['nationUnit1'])).toMatchObject([ + { status: 'unknown', reasons: ['PROFILE_UNKNOWN'] }, + ]) + }) +}) diff --git a/src/modules/dataItemProfile/compatibility/__tests__/periodAtOrgUnitResults.spec.js b/src/modules/dataItemProfile/compatibility/__tests__/periodAtOrgUnitResults.spec.js new file mode 100644 index 000000000..973c2e463 --- /dev/null +++ b/src/modules/dataItemProfile/compatibility/__tests__/periodAtOrgUnitResults.spec.js @@ -0,0 +1,88 @@ +import { + ORG_UNIT_COVERAGE as COVERAGE, + orgUnitProfileOf as profileOf, +} from '../../../../__fixtures__/dataItemProfileOrgUnits.js' +import { getPeriodAtOrgUnitResults } from '../periodAtOrgUnitResults.js' + +const judge = (id, selection, { type, coverage = COVERAGE } = {}) => + getPeriodAtOrgUnitResults(profileOf(id, type), selection, { + orgUnitCoverage: coverage, + }).map(({ periodId, orgUnitId, status, reasons }) => [ + periodId, + orgUnitId, + status, + reasons, + ]) + +/* twoForms: a monthly data set at 3 of the 4 facilities (and the nation), a + * weekly one at facilityDDD only */ +describe('getPeriodAtOrgUnitResults', () => { + it('counts only the data sets assigned at the org unit', () => { + expect( + judge('twoForms', { + periods: ['2025W2'], + orgUnits: ['facilityAAA', 'facilityDDD'], + }) + ).toEqual([ + // Only the monthly data set is assigned at facilityAAA: nothing by week + ['2025W2', 'facilityAAA', 'none', ['PERIOD_TOO_SHORT']], + // The weekly one fills it at facilityDDD; the nation's monthly values are left out + ['2025W2', 'facilityDDD', 'partial', ['ASSIGNED_AT_HIGHER_LEVEL']], + ]) + }) + + it('judges each period at each org unit', () => { + expect( + judge('twoForms', { + periods: ['202501', '2025W2'], + orgUnits: ['facilityAAA'], + }).map(([periodId, , status]) => [periodId, status]) + ).toEqual([ + ['202501', 'full'], + ['2025W2', 'none'], + ]) + }) + + it('adds up a level under parents where the data sets are assigned', () => { + expect( + judge('facility', { + periods: ['2025Q1'], + orgUnits: ['LEVEL-3', 'districtAAA', 'districtBBB'], + }) + ).toEqual([['2025Q1', 'LEVEL-3', 'full', ['PARTLY_ASSIGNED']]]) + }) + + it('is none where nothing is assigned, whatever the period', () => { + expect( + judge( + 'pi', + { periods: ['2025Q1'], orgUnits: ['facilityDDD'] }, + { + type: 'PROGRAM_INDICATOR', + } + ) + ).toEqual([['2025Q1', 'facilityDDD', 'none', ['NOT_ASSIGNED']]]) + }) + + it('gives the org unit result where it needs no period, and cannot tell without coverage or profile', () => { + expect( + judge('facility', { + periods: ['2025Q1'], + orgUnits: ['OU_GROUP-emptyGroupA'], + }) + ).toEqual([['2025Q1', 'OU_GROUP-emptyGroupA', 'none', ['EMPTY_GROUP']]]) + expect( + judge( + 'facility', + { periods: ['2025Q1'], orgUnits: ['facilityAAA'] }, + { coverage: null } + ) + ).toEqual([['2025Q1', 'facilityAAA', 'unknown', ['UNKNOWN_ORG_UNIT']]]) + expect( + judge('missing', { + periods: ['2025Q1'], + orgUnits: ['facilityAAA'], + }) + ).toEqual([['2025Q1', 'facilityAAA', 'unknown', ['PROFILE_UNKNOWN']]]) + }) +}) diff --git a/src/modules/dataItemProfile/compatibility/combineResults.js b/src/modules/dataItemProfile/compatibility/combineResults.js new file mode 100644 index 000000000..ad00fb600 --- /dev/null +++ b/src/modules/dataItemProfile/compatibility/combineResults.js @@ -0,0 +1,140 @@ +import { + COMPATIBILITY_FULL, + COMPATIBILITY_NONE, + COMPATIBILITY_PARTIAL, + COMPATIBILITY_SEVERITY, + COMPATIBILITY_UNKNOWN, + REASON_OPERAND_EMPTY, + REASON_OPERAND_PARTIAL, + REASON_ORDER, + SKIP_IF_ANY_VALUE_MISSING, +} from '../constants.js' + +export const createResult = (status, reasons = []) => ({ status, reasons }) + +export const getUnknownResult = (reason) => + createResult(COMPATIBILITY_UNKNOWN, [reason]) + +// Every reason of the results, once each, in REASON_ORDER +export const unionOfReasons = (results) => + REASON_ORDER.filter((reason) => + results.some(({ reasons }) => reasons.includes(reason)) + ) + +// The result with the most severe status, or undefined for none +export const getMostSevere = (results) => + COMPATIBILITY_SEVERITY.map((status) => + results.find((result) => result.status === status) + ).find(Boolean) + +// The most severe status, with every reason; full for no results +export const combineResults = (results) => + createResult( + getMostSevere(results)?.status ?? COMPATIBILITY_FULL, + unionOfReasons(results) + ) + +const hasStatus = + (...statuses) => + ({ status }) => + statuses.includes(status) + +/** + * Results whose values add up, such as a relative period over its fixed + * periods, or a selection over its periods and org units: none when all are, + * partial when some give values and others none or only some, otherwise the + * most severe of the rest. When those without none are all unknown, so is + * the result. + */ +export const combineAddedUpResults = (results) => { + const reasons = unionOfReasons(results) + const isNone = hasStatus(COMPATIBILITY_NONE) + + if (results.length && results.every(isNone)) { + return createResult(COMPATIBILITY_NONE, reasons) + } + + const givesValues = results.some( + hasStatus(COMPATIBILITY_FULL, COMPATIBILITY_PARTIAL) + ) + + if (results.some(hasStatus(COMPATIBILITY_PARTIAL))) { + return createResult(COMPATIBILITY_PARTIAL, reasons) + } + + if (results.some(isNone)) { + return createResult( + givesValues ? COMPATIBILITY_PARTIAL : COMPATIBILITY_UNKNOWN, + reasons + ) + } + + return createResult( + getMostSevere(results)?.status ?? COMPATIBILITY_FULL, + reasons + ) +} + +const OPERAND_REASON_BY_STATUS = { + [COMPATIBILITY_NONE]: REASON_OPERAND_EMPTY, + [COMPATIBILITY_PARTIAL]: REASON_OPERAND_PARTIAL, +} + +/** + * An expression's result, from its operands', by its missing value + * strategy. SKIP_IF_ANY_VALUE_MISSING (the default): the most severe + * decides. SKIP_IF_ALL_VALUES_MISSING: a missing value counts as 0, so the + * operands add up (combineAddedUpResults). With more than one + * operand, OPERAND_EMPTY and OPERAND_PARTIAL say first that one gives none + * or only some values. + */ +export const combineOperandResults = ( + results, + missingValueStrategy = SKIP_IF_ANY_VALUE_MISSING +) => { + const needsAll = missingValueStrategy === SKIP_IF_ANY_VALUE_MISSING + const combined = needsAll + ? combineResults(results) + : combineAddedUpResults(results) + + if (results.length < 2) { + return combined + } + + const operandReasons = needsAll + ? [OPERAND_REASON_BY_STATUS[combined.status]] + : results.map(({ status }) => OPERAND_REASON_BY_STATUS[status]) + + return createResult( + combined.status, + unionOfReasons([{ reasons: operandReasons.filter(Boolean) }, combined]) + ) +} + +/** + * An item's result from its operands' results (`resultOf(key)`), combined + * as its expression says (profile.expression); without one, all are needed. + * A part with no operand (constants only) never misses: it is left out. + */ +export const combineExpressionResults = (expression, operandKeys, resultOf) => { + const combine = ({ operand, missingValueStrategy, parts }) => { + if (operand) { + return resultOf(operand) + } + + const results = parts.map(combine).filter(Boolean) + + return results.length + ? combineOperandResults(results, missingValueStrategy) + : null + } + + return ( + combine( + expression ?? { + missingValueStrategy: SKIP_IF_ANY_VALUE_MISSING, + parts: operandKeys.map((key) => ({ operand: key })), + } + ) ?? createResult(COMPATIBILITY_FULL) + ) +} diff --git a/src/modules/dataItemProfile/compatibility/getDataItemProfileOrgUnitCompatibility.js b/src/modules/dataItemProfile/compatibility/getDataItemProfileOrgUnitCompatibility.js new file mode 100644 index 000000000..da9e9f2a0 --- /dev/null +++ b/src/modules/dataItemProfile/compatibility/getDataItemProfileOrgUnitCompatibility.js @@ -0,0 +1,269 @@ +import { + COMPATIBILITY_NONE, + COMPATIBILITY_PARTIAL, + LEFT_OUT_REASONS, + ORG_UNIT_ITEM_TYPE_GROUP, + REASON_EMPTY_GROUP, + REASON_NO_ORG_UNITS_AT_LEVEL, + REASON_NOT_ASSIGNED, + REASON_OPERAND_EMPTY, + REASON_OPERAND_PARTIAL, + REASON_PARTLY_ASSIGNED, + REASON_PROFILE_UNKNOWN, + REASON_UNKNOWN_ORG_UNIT, +} from '../constants.js' +import { + getRequestedLevels, + readOrgUnitSelection, +} from '../orgUnits/orgUnitSelection.js' +import { getItemOperands } from '../sources.js' +import { + combineExpressionResults, + createResult, + getMostSevere, + getUnknownResult, + unionOfReasons, +} from './combineResults.js' +import { + getOperandResult, + isPartlyAssigned, + withAssignment, +} from './orgUnitSourceResults.js' + +/* The org units of all requested levels add up: only those that are + * assigned count, and the assignment adds up over all of them (an org unit + * with nothing assigned adds its org units to the total). The total is + * known only when every part's total was counted. */ +const addUpAssignments = (judged) => { + const assignments = judged + .map(({ result }) => result.assignment) + .filter(Boolean) + + if (!assignments.length) { + return null + } + + const level = Math.max(...assignments.map((assignment) => assignment.level)) + const assigned = assignments.reduce((sum, item) => sum + item.assigned, 0) + const totals = judged.map( + ({ result, counts }) => + result.assignment?.total ?? counts.totals?.[level] + ) + + return { + assigned, + ...(totals.every((total) => total !== undefined) && { + total: totals.reduce((sum, total) => sum + total, 0), + }), + level, + } +} + +/* Where an operand has no value, the values of the others are dropped: they + * are left out, unlike values of an org unit nothing is assigned to */ +const DROPPED_BY_OPERAND_REASONS = new Set([ + REASON_OPERAND_EMPTY, + REASON_OPERAND_PARTIAL, +]) + +const leavesValuesOut = ({ status, reasons }) => + status === COMPATIBILITY_PARTIAL || + reasons.some( + (reason) => + LEFT_OUT_REASONS.has(reason) || + DROPPED_BY_OPERAND_REASONS.has(reason) + ) + +/* A level under several parents, or a group with members at several levels: + * the values of all add up. Where nothing is assigned, nothing is left out, + * only fewer org units are assigned (PARTLY_ASSIGNED); where values can't + * reach the level asked, or an operand has none, they are left out + * (partial). */ +const combineRequestedLevels = (judged) => { + const results = judged.map(({ result }) => result) + const reasons = unionOfReasons(results) + + if (results.every(({ status }) => status === COMPATIBILITY_NONE)) { + return withAssignment(createResult(COMPATIBILITY_NONE, reasons)) + } + + const assignment = addUpAssignments(judged) + const status = results.some(leavesValuesOut) + ? COMPATIBILITY_PARTIAL + : getMostSevere( + results.filter(({ status }) => status !== COMPATIBILITY_NONE) + ).status + const isPartly = Boolean(assignment) && isPartlyAssigned(assignment) + + return withAssignment( + createResult( + status, + unionOfReasons([ + { + reasons: reasons.filter( + (reason) => + reason !== REASON_NOT_ASSIGNED && + reason !== REASON_PARTLY_ASSIGNED + ), + }, + { reasons: isPartly ? [REASON_PARTLY_ASSIGNED] : [] }, + ]) + ), + assignment + ) +} + +/* The item at one requested level: each operand over its sources, combined + * as its expression says; the assignment of the most severe operand */ +const getResultAtLevel = ({ expression, operands }, counts) => { + const results = new Map( + operands.map((operand) => [ + operand.key, + getOperandResult(operand, counts), + ]) + ) + + return withAssignment( + combineExpressionResults(expression, [...results.keys()], (key) => + results.get(key) + ), + getMostSevere([...results.values()])?.assignment + ) +} + +const isEmptyGroup = (selectionItem, coverage) => + selectionItem.type === ORG_UNIT_ITEM_TYPE_GROUP && + coverage.groups?.[selectionItem.groupId] && + !Object.values(coverage.groups[selectionItem.groupId]).some( + (members) => members > 0 + ) + +/** + * The counts a selection item is judged by, one per level analytics + * aggregates to under each parent (`{ levels: [counts] }`, each with the + * `level` asked), or its result when it needs none (`{ result }`: an empty + * group, an org unit not loaded, no org unit there). + */ +export const getSelectionItemLevels = ( + selectionItem, + { parentItems, coverage } +) => { + if (isEmptyGroup(selectionItem, coverage)) { + return { + result: withAssignment( + createResult(COMPATIBILITY_NONE, [REASON_EMPTY_GROUP]) + ), + } + } + + const requestedLevels = getRequestedLevels( + selectionItem, + parentItems, + coverage + ) + + if (!requestedLevels) { + return { + result: withAssignment(getUnknownResult(REASON_UNKNOWN_ORG_UNIT)), + } + } + + const levels = requestedLevels + // Parents a group has no member under add nothing + .filter( + ({ groupId, countsKey, level }) => + !groupId || coverage.counts[countsKey]?.totals?.[level] > 0 + ) + .map(({ countsKey, level }) => ({ + ...coverage.counts[countsKey], + level, + })) + + return levels.length + ? { levels } + : { + result: withAssignment( + createResult(COMPATIBILITY_NONE, [ + REASON_NO_ORG_UNITS_AT_LEVEL, + ]) + ), + } +} + +const getSelectionItemCompatibility = ( + selectionItem, + { item, parentItems, coverage } +) => { + const { result, levels } = getSelectionItemLevels(selectionItem, { + parentItems, + coverage, + }) + + if (result) { + return result + } + + const judged = levels.map((counts) => ({ + counts, + result: getResultAtLevel(item, counts), + })) + + return judged.length === 1 + ? judged[0].result + : combineRequestedLevels(judged) +} + +/** + * Whether the org units of a selection (DV's org unit items) suit a data + * item, from where its data sets and programs are assigned (`coverage`, from + * fetchOrgUnitCoverage): one result per selection item, `{ id, status, + * reasons, assignment }`, with the same statuses as for periods. + * + * Assigned only at higher levels: none, ASSIGNED_AT_HIGHER_LEVEL. Not + * assigned there: none, NOT_ASSIGNED. Stopped by the element's aggregation + * levels: none, STOPPED_BY_AGGREGATION_LEVEL. Assigned to only some org units + * at the deepest level: full, since nothing is left out, with + * PARTLY_ASSIGNED and the counts (`assignment`). An element in several data + * sets is full where one is assigned, and partial when another's values can't + * reach the org unit. A group is judged at each level its members are at; a + * group without members is refused by analytics (EMPTY_GROUP). An item with + * no source (an expression of constants) has nothing limiting where it has + * values: full. + */ +export const getDataItemProfileOrgUnitCompatibility = ( + profile, + { orgUnits = [] } = {}, + { orgUnitCoverage: coverage } = {} +) => { + const { selectionItems, parentItems } = readOrgUnitSelection(orgUnits) + const judge = (getResult) => + selectionItems.map((selectionItem) => ({ + id: selectionItem.id, + ...getResult(selectionItem), + })) + + if (profile.unknown) { + return judge(() => + withAssignment(getUnknownResult(REASON_PROFILE_UNKNOWN)) + ) + } + + if (!coverage) { + return judge(() => + withAssignment(getUnknownResult(REASON_UNKNOWN_ORG_UNIT)) + ) + } + + const item = { + expression: profile.expression, + operands: getItemOperands(profile), + } + + return judge((selectionItem) => + getSelectionItemCompatibility(selectionItem, { + item, + parentItems, + coverage, + }) + ) +} diff --git a/src/modules/dataItemProfile/compatibility/getDataItemProfilePeriodCompatibility.js b/src/modules/dataItemProfile/compatibility/getDataItemProfilePeriodCompatibility.js new file mode 100644 index 000000000..c374eca5f --- /dev/null +++ b/src/modules/dataItemProfile/compatibility/getDataItemProfilePeriodCompatibility.js @@ -0,0 +1,241 @@ +import { + REASON_PROFILE_UNKNOWN, + REASON_SETTING_MISSING, + REASON_UNKNOWN_PERIOD, + REASON_UNSUPPORTED_VERSION, +} from '../constants.js' +import { getYearsTouched } from '../periods/firstLastValues.js' +import { + getPeriodDates, + isAlignedWithPeriodType, +} from '../periods/periodRanges.js' +import { + canAggregateInto, + getCandidatePeriodTypes, + getPeriodTypeOfPeriodId, + isPeriodType, + isPeriodTypeSupported, +} from '../periods/periodTypes.js' +import { getRelativePeriodFixedPeriods } from '../periods/relativePeriodRanges.js' +import { getSourcePeriodType } from '../profile/assignedPeriodTypes.js' +import { getItemOperands, getSourceId } from '../sources.js' +import { + combineAddedUpResults, + combineExpressionResults, + getUnknownResult, +} from './combineResults.js' +import { getOperandResult, getSourceResult } from './periodSourceResults.js' + +// The operands' results, combined as the item's expression says +const getItemResult = ({ expression, operands }, query) => { + const results = new Map( + operands.map((operand) => [ + operand.key, + getOperandResult(operand, query), + ]) + ) + + return combineExpressionResults(expression, [...results.keys()], (key) => + results.get(key) + ) +} + +const isSameResult = (a, b) => + a.status === b.status && a.reasons.join() === b.reasons.join() + +/* A relative period can be of several types: a result holds only when they + * all agree. A type the server version can't answer gives unknown. */ +const agreeOn = (queries, getResult) => { + const results = queries.map((query) => + query.supported + ? getResult(query) + : getUnknownResult(REASON_UNSUPPORTED_VERSION) + ) + + return results.every((candidate) => isSameResult(candidate, results[0])) + ? results[0] + : getUnknownResult(REASON_SETTING_MISSING) +} + +// Whether the period starts and ends on the edges of the data's own periods +const getAlignsWithData = (profile, { periodType, dates, calendar }) => { + const dataPeriodTypes = profile.sources + .map(getSourcePeriodType) + .filter((dataPeriodType) => + canAggregateInto(dataPeriodType, periodType) + ) + + if (!dates || !dataPeriodTypes.length) { + return null + } + + const aligned = new Set( + dataPeriodTypes.map((dataPeriodType) => + isAlignedWithPeriodType(dates, dataPeriodType, calendar) + ) + ) + + if (aligned.has(false)) { + return false + } + + return aligned.has(null) ? null : true +} + +/* The date ranges a period covers for one of its types: a fixed period's, + * the fixed periods of a relative one, none for a period type */ +const getPeriodRanges = (period, periodType, options) => { + if (getPeriodTypeOfPeriodId(period)) { + const dates = getPeriodDates(period, options.calendar) + + return dates ? [dates] : null + } + + return isPeriodType(period) + ? null + : getRelativePeriodFixedPeriods(period, periodType, options) +} + +/* The calendar years the selection's periods touch, as one request would, or + * null when a fixed or relative period can't be dated. Period types aren't + * periods of a request: they don't count. */ +export const getSelectionYears = (periods, options) => { + const ranges = periods + .filter((period) => !isPeriodType(period)) + .flatMap((period) => + getCandidatePeriodTypes(period, options).map((periodType) => + getPeriodRanges(period, periodType, options) + ) + ) + + if (!ranges.length || ranges.includes(null)) { + return null + } + + return [...new Set(ranges.flat().flatMap(getYearsTouched))].sort( + (a, b) => a - b + ) +} + +/* A result for each range of the query, added up: a relative period is + * judged over its fixed periods. Without ranges, by type alone. */ +const judgeRanges = (query, getResult) => + query.ranges + ? combineAddedUpResults( + query.ranges.map((dates) => getResult({ ...query, dates })) + ) + : getResult({ ...query, dates: null }) + +const getUnknownPeriodResult = (profile, { period, periodTypes, reason }) => ({ + id: period, + periodTypes, + ...getUnknownResult(reason), + alignsWithData: null, + sources: profile.sources.map((source) => ({ + sourceId: getSourceId(source), + ...getUnknownResult(reason), + })), +}) + +/** + * The queries a period is judged by, one per type it can be (`options` + * holding the `selectionYears`), or the reason it can't be: `{ periodTypes, + * queries }` or `{ periodTypes, unknownReason }`. judgePeriodQueries judges + * them. + */ +export const getPeriodQueries = (profile, period, options) => { + const periodTypes = getCandidatePeriodTypes(period, options) + + if (profile.unknown || !periodTypes.length) { + return { + periodTypes, + unknownReason: profile.unknown + ? REASON_PROFILE_UNKNOWN + : REASON_UNKNOWN_PERIOD, + } + } + + return { + periodTypes, + queries: periodTypes.map((periodType) => ({ + periodType, + ranges: getPeriodRanges(period, periodType, options), + years: options.selectionYears, + calendar: options.calendar, + serverVersion: options.serverVersion, + supported: isPeriodTypeSupported(periodType, options.serverVersion), + })), + } +} + +// A result from `getResult(query)` for each type and range, as one result for the period +export const judgePeriodQueries = (queries, getResult) => + agreeOn(queries, (query) => judgeRanges(query, getResult)) + +const getPeriodResult = (profile, period, options) => { + const { periodTypes, queries, unknownReason } = getPeriodQueries( + profile, + period, + options + ) + + if (unknownReason) { + return getUnknownPeriodResult(profile, { + period, + periodTypes, + reason: unknownReason, + }) + } + + const item = { + expression: profile.expression, + operands: getItemOperands(profile), + } + const isFixed = Boolean(getPeriodTypeOfPeriodId(period)) + + return { + id: period, + periodTypes, + ...judgePeriodQueries(queries, (query) => getItemResult(item, query)), + alignsWithData: isFixed + ? getAlignsWithData(profile, { + ...queries[0], + dates: queries[0].ranges?.[0], + }) + : null, + sources: profile.sources.map((source) => ({ + sourceId: getSourceId(source), + ...judgePeriodQueries(queries, (query) => + getSourceResult(source, query) + ), + })), + } +} + +/** + * Whether the periods of a selection suit a data item, from its profile: for + * each period, `{ id, periodTypes, status, reasons, alignsWithData, sources }`, + * with a result per source (aligned with `profile.sources`). + * + * `periods` are fixed ids, relative ids or period types. A relative period is + * judged over the fixed periods it covers on `options.relativePeriodDate` + * (an ISO date, today by default). `options` also sets the type of relative + * weeks and financial years (`weeklyPeriodType`, `financialYearPeriodType`), + * the `calendar` for dates, and the `serverVersion` ({ major, minor }), since + * some versions can't answer some period types. The periods are taken as one + * request: for FIRST and LAST data, the years they touch decide which data + * periods count (other items of the request, like a `.periodOffset()` + * operand, can add years and aren't seen). A period type is judged by type + * alone. + */ +export const getDataItemProfilePeriodCompatibility = ( + profile, + { periods = [] } = {}, + options = {} +) => { + const selectionYears = getSelectionYears(periods, options) + + return periods.map((period) => + getPeriodResult(profile, period, { ...options, selectionYears }) + ) +} diff --git a/src/modules/dataItemProfile/compatibility/orgUnitSourceResults.js b/src/modules/dataItemProfile/compatibility/orgUnitSourceResults.js new file mode 100644 index 000000000..8bd7e73aa --- /dev/null +++ b/src/modules/dataItemProfile/compatibility/orgUnitSourceResults.js @@ -0,0 +1,188 @@ +import { + COMPATIBILITY_FULL, + COMPATIBILITY_NONE, + COMPATIBILITY_PARTIAL, + LEFT_OUT_REASONS, + REASON_ANY_ORG_UNIT, + REASON_ASSIGNED_AT_HIGHER_LEVEL, + REASON_NOT_ASSIGNED, + REASON_PARTLY_ASSIGNED, + REASON_STOPPED_BY_AGGREGATION_LEVEL, +} from '../constants.js' +import { getLevelsWithOrgUnits } from '../profile/assignedOrgUnitLevels.js' +import { canBeAtAnyOrgUnit, getSourceId } from '../sources.js' +import { createResult, unionOfReasons } from './combineResults.js' + +/* Org unit results carry `assignment`: how many org units at the deepest + * level assigned are assigned ({ assigned, level }, and `total` when the + * coverage counted the org units there), or null */ +export const withAssignment = (result, assignment = null) => ({ + ...result, + assignment, +}) + +// Known only when the coverage counted the org units at that level +export const isPartlyAssigned = ({ assigned, total }) => + total !== undefined && assigned < total + +const getAssignedShare = ({ assigned, total }) => (total ? assigned / total : 1) + +/* Analytics nulls the levels up to each aggregation level for values from + * org units below it (dhis2-core AggregationLevelsHelper): a value from + * `assignedLevel` can't reach `requestedLevel` when an aggregation level lies + * between them (requestedLevel ≤ L < assignedLevel; checked by the test tool + * on 2.40 to 2.44) */ +const isBlockedByAggregationLevel = ( + assignedLevel, + requestedLevel, + aggregationLevels +) => + aggregationLevels.some( + (aggregationLevel) => + requestedLevel <= aggregationLevel && + aggregationLevel < assignedLevel + ) + +/* Values that don't reach the level asked are assigned higher when the + * source is assigned above it, within the org unit (its ancestors, or higher + * levels under a parent); otherwise the org unit simply isn't assigned */ +const getNotReachingReason = ({ byLevel, ancestors, level }) => + ancestors > 0 || + getLevelsWithOrgUnits(byLevel).some( + (assignedLevel) => assignedLevel < level + ) + ? REASON_ASSIGNED_AT_HIGHER_LEVEL + : REASON_NOT_ASSIGNED + +/* One data set or program at one requested level, from its assignment + * counts. Values add up from lower levels, but are never split down, so a + * source assigned only at higher levels can't fill the level asked. The + * deepest level assigned says how much of the org unit it covers. */ +const getSourceResult = ({ + sourceCounts, + aggregationLevels = [], + totals, + level, +}) => { + const { byLevel = {}, ancestors = 0 } = sourceCounts ?? {} + const assignedAtOrBelow = getLevelsWithOrgUnits(byLevel).filter( + (assignedLevel) => assignedLevel >= level + ) + const reaching = assignedAtOrBelow.filter( + (assignedLevel) => + !isBlockedByAggregationLevel( + assignedLevel, + level, + aggregationLevels + ) + ) + + if (assignedAtOrBelow.length && !reaching.length) { + return withAssignment( + createResult(COMPATIBILITY_NONE, [ + REASON_STOPPED_BY_AGGREGATION_LEVEL, + ]) + ) + } + + if (!reaching.length) { + return withAssignment( + createResult(COMPATIBILITY_NONE, [ + getNotReachingReason({ byLevel, ancestors, level }), + ]) + ) + } + + const deepestLevel = Math.max(...reaching) + const assignment = { + assigned: byLevel[deepestLevel], + ...(totals[deepestLevel] !== undefined && { + total: totals[deepestLevel], + }), + level: deepestLevel, + } + + // Org units it isn't assigned to have no values: nothing is left out + return withAssignment( + createResult( + COMPATIBILITY_FULL, + isPartlyAssigned(assignment) ? [REASON_PARTLY_ASSIGNED] : [] + ), + assignment + ) +} + +const AT_ANY_ORG_UNIT = withAssignment( + createResult(COMPATIBILITY_FULL, [REASON_ANY_ORG_UNIT]) +) + +const isLeftOut = ({ reasons }) => + reasons.some((reason) => LEFT_OUT_REASONS.has(reason)) + +/* One operand over its sources. A source not assigned there leaves nothing + * out; one whose values can't reach the level asked (assigned higher, or + * stopped by aggregation levels) leaves them out, so with another that fills + * the org unit, the value is partial. */ +const combineSources = (bySource) => { + const filling = bySource.filter( + ({ status }) => status === COMPATIBILITY_FULL + ) + const reasons = unionOfReasons(bySource) + const leftOut = bySource.some(isLeftOut) + + if (!filling.length) { + return withAssignment( + createResult( + COMPATIBILITY_NONE, + leftOut + ? reasons.filter((reason) => LEFT_OUT_REASONS.has(reason)) + : [REASON_NOT_ASSIGNED] + ) + ) + } + + const bestAssignment = filling + .map(({ assignment }) => assignment) + .filter(Boolean) + .sort((a, b) => getAssignedShare(b) - getAssignedShare(a))[0] + // Partly assigned only when no source is assigned to all its org units + const isPartly = Boolean(bestAssignment) && isPartlyAssigned(bestAssignment) + + return withAssignment( + createResult( + leftOut ? COMPATIBILITY_PARTIAL : COMPATIBILITY_FULL, + reasons.filter( + (reason) => + reason !== REASON_NOT_ASSIGNED && + (reason !== REASON_PARTLY_ASSIGNED || isPartly) + ) + ), + bestAssignment + ) +} + +/** + * Each source of one operand ({ element, sources }, getItemOperands) at one + * requested level, from the counts kept for it in the coverage, with the + * `level` asked; aligned with `sources`. + */ +export const getOperandSourceResults = ({ element, sources }, counts) => + sources.map((source) => + canBeAtAnyOrgUnit(source) + ? AT_ANY_ORG_UNIT + : getSourceResult({ + sourceCounts: counts.sources?.[getSourceId(source)], + aggregationLevels: element?.aggregationLevels, + totals: counts.totals ?? {}, + level: counts.level, + }) + ) + +// A source not assigned there doesn't apply: it leaves nothing out +export const isNotAssigned = ({ status, reasons }) => + status === COMPATIBILITY_NONE && + reasons.every((reason) => reason === REASON_NOT_ASSIGNED) + +// One operand at one requested level, over its sources +export const getOperandResult = (operand, counts) => + combineSources(getOperandSourceResults(operand, counts)) diff --git a/src/modules/dataItemProfile/compatibility/periodAtOrgUnitResults.js b/src/modules/dataItemProfile/compatibility/periodAtOrgUnitResults.js new file mode 100644 index 000000000..c1b349956 --- /dev/null +++ b/src/modules/dataItemProfile/compatibility/periodAtOrgUnitResults.js @@ -0,0 +1,143 @@ +import { + COMPATIBILITY_FULL, + COMPATIBILITY_NONE, + REASON_NOT_ASSIGNED, + REASON_UNKNOWN_ORG_UNIT, +} from '../constants.js' +import { readOrgUnitSelection } from '../orgUnits/orgUnitSelection.js' +import { getItemOperands } from '../sources.js' +import { + combineAddedUpResults, + combineExpressionResults, + createResult, + getUnknownResult, + unionOfReasons, +} from './combineResults.js' +import { getSelectionItemLevels } from './getDataItemProfileOrgUnitCompatibility.js' +import { + getPeriodQueries, + getSelectionYears, + judgePeriodQueries, +} from './getDataItemProfilePeriodCompatibility.js' +import { + getOperandSourceResults as getOrgUnitSourceResults, + isNotAssigned, +} from './orgUnitSourceResults.js' +import { getOperandSourceResults as getPeriodSourceResults } from './periodSourceResults.js' + +/* A period at an org unit: only the sources assigned there count, each + * judged for the period. A monthly data set at district A and a weekly one + * at B give nothing by week at A, and every value by week at B, which the + * period and the org unit judged apart can't tell. */ + +const NOT_ASSIGNED = createResult(COMPATIBILITY_NONE, [REASON_NOT_ASSIGNED]) + +/* One source of an operand: not assigned there, it doesn't apply; its values + * can't reach the level asked, they are left out; otherwise, the period + * decides */ +const getSourceResult = (orgUnitResult, periodResult) => { + if (isNotAssigned(orgUnitResult)) { + return null + } + + if (orgUnitResult.status !== COMPATIBILITY_FULL) { + return createResult(orgUnitResult.status, orgUnitResult.reasons) + } + + return createResult( + periodResult.status, + unionOfReasons([orgUnitResult, periodResult]) + ) +} + +// One operand, for one period query, at one requested level: its sources there add up +const getOperandResult = (operand, { query, counts }) => { + const periodResults = getPeriodSourceResults(operand, query) + const results = getOrgUnitSourceResults(operand, counts) + .map((orgUnitResult, i) => + getSourceResult(orgUnitResult, periodResults[i]) + ) + .filter(Boolean) + + return results.length ? combineAddedUpResults(results) : NOT_ASSIGNED +} + +const getItemResult = ({ expression, operands }, at) => { + const results = new Map( + operands.map((operand) => [operand.key, getOperandResult(operand, at)]) + ) + + return combineExpressionResults(expression, [...results.keys()], (key) => + results.get(key) + ) +} + +// Under several parents, or at several member levels, the org units where it applies add up +const combineLevels = (results) => { + const applying = results.filter((result) => !isNotAssigned(result)) + + return applying.length ? combineAddedUpResults(applying) : NOT_ASSIGNED +} + +const judgeSelectionItem = ( + item, + { queries, selectionItem, parentItems, coverage } +) => { + if (!coverage) { + return getUnknownResult(REASON_UNKNOWN_ORG_UNIT) + } + + const { result, levels } = getSelectionItemLevels(selectionItem, { + parentItems, + coverage, + }) + + if (result) { + return createResult(result.status, result.reasons) + } + + return judgePeriodQueries(queries, (query) => + combineLevels( + levels.map((counts) => getItemResult(item, { query, counts })) + ) + ) +} + +/** + * Each period of a selection at each of its org unit selection items, + * judged together (`{ periodId, orgUnitId, status, reasons }`), with the + * options of getDataItemProfileCompatibility. Where a data set isn't + * assigned, its period type doesn't count. + */ +export const getPeriodAtOrgUnitResults = ( + profile, + { periods = [], orgUnits = [] } = {}, + { orgUnitCoverage: coverage, ...options } = {} +) => { + const selectionYears = getSelectionYears(periods, options) + const { selectionItems, parentItems } = readOrgUnitSelection(orgUnits) + const item = { + expression: profile.expression, + operands: getItemOperands(profile), + } + + return periods.flatMap((period) => { + const { queries, unknownReason } = getPeriodQueries(profile, period, { + ...options, + selectionYears, + }) + + return selectionItems.map((selectionItem) => ({ + periodId: period, + orgUnitId: selectionItem.id, + ...(unknownReason + ? getUnknownResult(unknownReason) + : judgeSelectionItem(item, { + queries, + selectionItem, + parentItems, + coverage, + })), + })) + }) +} diff --git a/src/modules/dataItemProfile/compatibility/periodSourceResults.js b/src/modules/dataItemProfile/compatibility/periodSourceResults.js new file mode 100644 index 000000000..1d99a6ff5 --- /dev/null +++ b/src/modules/dataItemProfile/compatibility/periodSourceResults.js @@ -0,0 +1,158 @@ +import { + COMPATIBILITY_FULL, + COMPATIBILITY_NONE, + PERIOD_AGGREGATION_AVERAGE, + PERIOD_AGGREGATION_FIRST, + PERIOD_AGGREGATION_LAST, + REASON_EARLIER_PERIOD_VALUE, + REASON_NO_EARLIER_PERIOD_VALUE, + REASON_PERIOD_TOO_SHORT, + REASON_PERIOD_TYPE_MISMATCH, + REASON_REPEATED_VALUE, + REASON_REPORTING_RATE_TOO_SHORT, + REASON_UNSUPPORTED_VERSION, +} from '../constants.js' +import { getFirstOrLastValuePeriod } from '../periods/firstLastValues.js' +import { getFixedPeriodOfTypeByDate } from '../periods/periodRanges.js' +import { canAggregateInto, getFrequencyOrder } from '../periods/periodTypes.js' +import { getSourcePeriodType } from '../profile/assignedPeriodTypes.js' +import { isProgramSource } from '../sources.js' +import { + combineAddedUpResults, + combineResults, + createResult, + getUnknownResult, +} from './combineResults.js' + +/* The period rules for one source and one query ({ periodType, dates, years, + * calendar, serverVersion }): a fixed period's dates, the years the request + * touches, and a period type of the selection */ + +const FULL = createResult(COMPATIBILITY_FULL) + +const getMissingReason = (dataPeriodType, queryPeriodType) => + getFrequencyOrder(queryPeriodType) < getFrequencyOrder(dataPeriodType) + ? REASON_PERIOD_TOO_SHORT + : REASON_PERIOD_TYPE_MISMATCH + +/* FIRST and LAST data, by analytics' rule (firstLastValues.js): the value of + * a data period inside the period, of one before it, or none. It can only be + * told for fixed periods in a selection of fixed periods, since every period + * of the request decides which data periods count. */ +const getFirstOrLastResult = (element, dataPeriodType, query) => { + const canDate = + query.dates && + query.years && + getFixedPeriodOfTypeByDate( + dataPeriodType, + query.dates.endDate, + query.calendar + ) + + if (!canDate) { + const takesEarlierValue = + element.periodAggregationType === PERIOD_AGGREGATION_FIRST || + !canAggregateInto(dataPeriodType, query.periodType) + + return takesEarlierValue + ? createResult(COMPATIBILITY_FULL, [REASON_EARLIER_PERIOD_VALUE]) + : FULL + } + + const valuePeriod = getFirstOrLastValuePeriod({ + periodAggregationType: element.periodAggregationType, + periodType: dataPeriodType, + dates: query.dates, + years: query.years, + calendar: query.calendar, + }) + + if (!valuePeriod) { + return createResult(COMPATIBILITY_NONE, [ + REASON_NO_EARLIER_PERIOD_VALUE, + ]) + } + + return valuePeriod.startDate >= query.dates.startDate + ? FULL + : createResult(COMPATIBILITY_FULL, [REASON_EARLIER_PERIOD_VALUE]) +} + +/* One element of one data set, for one query. When the data can't add up + * into the period, averaged values are repeated into it, and other data + * gives none. FIRST and LAST follow their own rule. */ +const getElementResult = (element, dataPeriodType, query) => { + if ( + element.periodAggregationType === PERIOD_AGGREGATION_FIRST || + element.periodAggregationType === PERIOD_AGGREGATION_LAST + ) { + return getFirstOrLastResult(element, dataPeriodType, query) + } + + if (canAggregateInto(dataPeriodType, query.periodType)) { + return FULL + } + + return element.periodAggregationType === PERIOD_AGGREGATION_AVERAGE + ? createResult(COMPATIBILITY_FULL, [REASON_REPEATED_VALUE]) + : createResult(COMPATIBILITY_NONE, [ + getMissingReason(dataPeriodType, query.periodType), + ]) +} + +// A reporting rate asked for a shorter period gives a meaningless value +const getReportingRateResult = (dataPeriodType, query) => + canAggregateInto(dataPeriodType, query.periodType) + ? FULL + : createResult(COMPATIBILITY_NONE, [REASON_REPORTING_RATE_TOO_SHORT]) + +/* Events and enrollments are placed by their own dates: they fit any period. + * VERSION-TOGGLE: remove the check when 43 is the lowest supported version. + * Before 2.43, analytics can't query a program indicator without period + * boundaries (E7145). */ +const getProgramResult = (source, query) => { + const missingBoundariesUnsupported = + source.missingPeriodBoundaries && + query.serverVersion?.major === 2 && + query.serverVersion.minor < 43 + + return missingBoundariesUnsupported + ? getUnknownResult(REASON_UNSUPPORTED_VERSION) + : FULL +} + +export const getSourceResult = (source, query) => { + if (isProgramSource(source)) { + return getProgramResult(source, query) + } + + const dataPeriodType = getSourcePeriodType(source) + const results = source.elements.map((element) => + getElementResult(element, dataPeriodType, query) + ) + + if (source.reportingRate) { + results.push(getReportingRateResult(dataPeriodType, query)) + } + + return combineResults(results) +} + +// Each source of one operand (getItemOperands) for one query, aligned with its `sources` +export const getOperandSourceResults = ( + { element, reportingRate, sources }, + query +) => + sources.map((source) => { + if (element) { + return getElementResult(element, getSourcePeriodType(source), query) + } + + return reportingRate + ? getReportingRateResult(getSourcePeriodType(source), query) + : getProgramResult(source, query) + }) + +// One operand for one query: an element adds up over its data sets +export const getOperandResult = (operand, query) => + combineAddedUpResults(getOperandSourceResults(operand, query)) diff --git a/src/modules/dataItemProfile/constants.js b/src/modules/dataItemProfile/constants.js new file mode 100644 index 000000000..48d93b5a6 --- /dev/null +++ b/src/modules/dataItemProfile/constants.js @@ -0,0 +1,170 @@ +// Compatibility statuses: compatible with all, some or none of the item's sources that apply to the selection +export const COMPATIBILITY_FULL = 'full' +export const COMPATIBILITY_PARTIAL = 'partial' +export const COMPATIBILITY_NONE = 'none' +export const COMPATIBILITY_UNKNOWN = 'unknown' + +// Most severe first: where all results are needed (an indicator's two sides), the most severe wins +export const COMPATIBILITY_SEVERITY = [ + COMPATIBILITY_NONE, + COMPATIBILITY_PARTIAL, + COMPATIBILITY_UNKNOWN, + COMPATIBILITY_FULL, +] + +/* Why a profile is unknown (profile.reasons, each with the id it concerns): + * metadata is missing or can't be read, never guessed */ +export const PROFILE_REASON_MISSING_METADATA = 'MISSING_METADATA' +export const PROFILE_REASON_MISSING_PROGRAM = 'MISSING_PROGRAM' +export const PROFILE_REASON_UNKNOWN_OPERAND = 'UNKNOWN_OPERAND' +export const PROFILE_REASON_UNKNOWN_PERIOD_TYPE = 'UNKNOWN_PERIOD_TYPE' +export const PROFILE_REASON_UNSUPPORTED_ITEM_TYPE = 'UNSUPPORTED_ITEM_TYPE' +export const PROFILE_REASON_NO_DATA_SET = 'NO_DATA_SET' +export const PROFILE_REASON_NOT_AGGREGATABLE = 'NOT_AGGREGATABLE' + +/* Why a compatibility status, in the order results list them */ + +// An operand gives no value: a sum misses it, a side where all are missing has none (a ratio without its denominator) +export const REASON_OPERAND_EMPTY = 'OPERAND_EMPTY' +// An expression computed from an operand that leaves values out: it can be off either way +export const REASON_OPERAND_PARTIAL = 'OPERAND_PARTIAL' + +// The period is shorter than the period type of the data sets +export const REASON_PERIOD_TOO_SHORT = 'PERIOD_TOO_SHORT' +// Another period type of the same length (Wednesday weeks asked by Monday week) +export const REASON_PERIOD_TYPE_MISMATCH = 'PERIOD_TYPE_MISMATCH' +// A reporting rate asked for a shorter period: a meaningless value +export const REASON_REPORTING_RATE_TOO_SHORT = 'REPORTING_RATE_TOO_SHORT' +// FIRST or LAST data with no data period that counts for the period +export const REASON_NO_EARLIER_PERIOD_VALUE = 'NO_EARLIER_PERIOD_VALUE' +// The value of a longer data period, repeated (period aggregation AVERAGE) +export const REASON_REPEATED_VALUE = 'REPEATED_VALUE' +// The value of an earlier data period (period aggregation FIRST or LAST) +export const REASON_EARLIER_PERIOD_VALUE = 'EARLIER_PERIOD_VALUE' + +// Neither the org unit nor its ancestors are assigned: nothing is there to show +export const REASON_NOT_ASSIGNED = 'NOT_ASSIGNED' +// Assigned only at higher levels than the one asked: analytics never splits values down +export const REASON_ASSIGNED_AT_HIGHER_LEVEL = 'ASSIGNED_AT_HIGHER_LEVEL' +// The data element's aggregation levels stop values from reaching the level asked +export const REASON_STOPPED_BY_AGGREGATION_LEVEL = + 'STOPPED_BY_AGGREGATION_LEVEL' +// No org unit at the level asked under the parent org units, or no group member under them +export const REASON_NO_ORG_UNITS_AT_LEVEL = 'NO_ORG_UNITS_AT_LEVEL' +// An org unit group without members: analytics refuses it (E7143), leave it out of the request +export const REASON_EMPTY_GROUP = 'EMPTY_GROUP' +// Assigned to only some org units at the deepest level: the others aren't assigned, so nothing is left out +export const REASON_PARTLY_ASSIGNED = 'PARTLY_ASSIGNED' +// A program indicator placed by registration or an org unit attribute: values can be at any org unit +export const REASON_ANY_ORG_UNIT = 'ANY_ORG_UNIT' + +// The profile is unknown: see its reasons +export const REASON_PROFILE_UNKNOWN = 'PROFILE_UNKNOWN' +// The period id can't be read +export const REASON_UNKNOWN_PERIOD = 'UNKNOWN_PERIOD' +// A relative period's type depends on a setting that wasn't given, and its types disagree +export const REASON_SETTING_MISSING = 'SETTING_MISSING' +// The server version can't answer it (QuarterlyNov before 2.41, a program indicator without period boundaries before 2.43) +export const REASON_UNSUPPORTED_VERSION = 'UNSUPPORTED_VERSION' +// The org unit, level or group isn't loaded or can't be read +export const REASON_UNKNOWN_ORG_UNIT = 'UNKNOWN_ORG_UNIT' + +export const REASON_ORDER = [ + REASON_OPERAND_EMPTY, + REASON_OPERAND_PARTIAL, + REASON_PERIOD_TOO_SHORT, + REASON_PERIOD_TYPE_MISMATCH, + REASON_REPORTING_RATE_TOO_SHORT, + REASON_NO_EARLIER_PERIOD_VALUE, + REASON_REPEATED_VALUE, + REASON_EARLIER_PERIOD_VALUE, + REASON_NOT_ASSIGNED, + REASON_ASSIGNED_AT_HIGHER_LEVEL, + REASON_STOPPED_BY_AGGREGATION_LEVEL, + REASON_NO_ORG_UNITS_AT_LEVEL, + REASON_EMPTY_GROUP, + REASON_PARTLY_ASSIGNED, + REASON_ANY_ORG_UNIT, + REASON_PROFILE_UNKNOWN, + REASON_UNKNOWN_PERIOD, + REASON_SETTING_MISSING, + REASON_UNSUPPORTED_VERSION, + REASON_UNKNOWN_ORG_UNIT, +] + +// Values that exist but can't reach the org unit level asked +export const LEFT_OUT_REASONS = new Set([ + REASON_ASSIGNED_AT_HIGHER_LEVEL, + REASON_STOPPED_BY_AGGREGATION_LEVEL, +]) + +/* How an expression treats missing operand values (dhis2-core + * MissingValueStrategy). Indicators evaluate each side with + * SKIP_IF_ALL_VALUES_MISSING, then need both sides; expression dimension + * items are evaluated with SKIP_IF_ALL_VALUES_MISSING, whatever strategy they + * are saved with (checked by the test tool on 2.40 to 2.44). */ +export const SKIP_IF_ANY_VALUE_MISSING = 'SKIP_IF_ANY_VALUE_MISSING' +export const SKIP_IF_ALL_VALUES_MISSING = 'SKIP_IF_ALL_VALUES_MISSING' + +/* Expression operands without a dimension item type: constants, org unit + * group counts and [days] have no source; an unknown prefix makes the + * profile unknown */ +export const OPERAND_TYPE_CONSTANT = 'CONSTANT' +export const OPERAND_TYPE_ORG_UNIT_GROUP = 'ORG_UNIT_GROUP' +export const OPERAND_TYPE_DAYS = 'DAYS' +export const OPERAND_TYPE_UNKNOWN = 'UNKNOWN' + +// How values aggregate over time (dhis2-core periodAggregationType) +export const PERIOD_AGGREGATION_AVERAGE = 'AVERAGE' +export const PERIOD_AGGREGATION_FIRST = 'FIRST' +export const PERIOD_AGGREGATION_LAST = 'LAST' + +export const NOT_AGGREGATABLE_AGGREGATION_TYPES = new Set(['NONE']) + +/* A program indicator's orgUnitField that places values where its program is + * assigned: the event's or enrollment's org unit (unset, EVENT, ENROLLMENT), + * or the owner's, which falls back to it. REGISTRATION and an org unit data + * element or attribute (its id) can place values at any org unit. */ +export const PROGRAM_ORG_UNIT_FIELDS = new Set([ + 'EVENT', + 'ENROLLMENT', + 'OWNER_AT_START', + 'OWNER_AT_END', +]) + +// Org unit selection items, as DV saves them +export const ORG_UNIT_ITEM_TYPE_ORG_UNIT = 'ORG_UNIT' +export const ORG_UNIT_ITEM_TYPE_LEVEL = 'LEVEL' +export const ORG_UNIT_ITEM_TYPE_GROUP = 'GROUP' +export const ORG_UNIT_ITEM_TYPE_USER = 'USER' +export const ORG_UNIT_ITEM_TYPE_UNKNOWN = 'UNKNOWN' + +// Server period type names with their frequencyOrder, as /api/periodTypes returns them +export const PERIOD_TYPE_FREQUENCY_ORDER = { + Daily: 1, + Weekly: 7, + WeeklyWednesday: 7, + WeeklyThursday: 7, + WeeklyFriday: 7, + WeeklySaturday: 7, + WeeklySunday: 7, + BiWeekly: 14, + Monthly: 30, + BiMonthly: 61, + Quarterly: 91, + QuarterlyNov: 91, + SixMonthly: 182, + SixMonthlyApril: 182, + SixMonthlyNov: 182, + Yearly: 365, + FinancialFeb: 365, + FinancialApril: 365, + FinancialJuly: 365, + FinancialAug: 365, + FinancialSep: 365, + FinancialOct: 365, + FinancialNov: 365, + TwoYearly: 730, +} + +export const PERIOD_TYPES = Object.keys(PERIOD_TYPE_FREQUENCY_ORDER) diff --git a/src/modules/dataItemProfile/expressionOperands.js b/src/modules/dataItemProfile/expressionOperands.js new file mode 100644 index 000000000..f43333bd4 --- /dev/null +++ b/src/modules/dataItemProfile/expressionOperands.js @@ -0,0 +1,111 @@ +import { REPORTING_RATE } from '../dataSets.js' +import { + DIMENSION_TYPE_DATA_ELEMENT, + DIMENSION_TYPE_INDICATOR, + DIMENSION_TYPE_PROGRAM_ATTRIBUTE, + DIMENSION_TYPE_PROGRAM_DATA_ELEMENT, + DIMENSION_TYPE_PROGRAM_INDICATOR, +} from '../dataTypes.js' +import { + OPERAND_TYPE_CONSTANT, + OPERAND_TYPE_DAYS, + OPERAND_TYPE_ORG_UNIT_GROUP, + OPERAND_TYPE_UNKNOWN, +} from './constants.js' + +/* The full indicator and expression syntax (the library's parseExpression in + * modules/expressions.js reads only the #{} of calculations) */ +const OPERAND_TYPE_BY_PREFIX = { + '#': DIMENSION_TYPE_DATA_ELEMENT, + R: REPORTING_RATE, + N: DIMENSION_TYPE_INDICATOR, + I: DIMENSION_TYPE_PROGRAM_INDICATOR, + D: DIMENSION_TYPE_PROGRAM_DATA_ELEMENT, + A: DIMENSION_TYPE_PROGRAM_ATTRIBUTE, + C: OPERAND_TYPE_CONSTANT, + OUG: OPERAND_TYPE_ORG_UNIT_GROUP, +} + +// An operand: `#{de.coc}`, `R{ds.REPORTING_RATE}`, `[days]`… (prefixes are 1 to 3 letters) +const OPERAND_REGEX = /(#|[A-Z]{1,3})\{([^}]*)\}|\[days\]/g +// One function chained after it: `.periodOffset(-1)`, `.aggregationType(LAST)` +const FUNCTION_REGEX = /\.([a-zA-Z]+)\(([^)]*)\)/y + +// The functions chained at `position`, and where they end +const readFunctions = (expression, position) => { + const functions = [] + + FUNCTION_REGEX.lastIndex = position + + for ( + let match = FUNCTION_REGEX.exec(expression); + match; + match = FUNCTION_REGEX.exec(expression) + ) { + functions.push({ name: match[1], arg: match[2].trim() }) + position = FUNCTION_REGEX.lastIndex + } + + return { functions, end: position } +} + +/* The object to fetch for the operand: the data element of `#{de.coc.aoc}`, + * the data set of `R{ds.REPORTING_RATE}`, the whole content otherwise */ +const getOperandObjectId = (type, content) => + type === DIMENSION_TYPE_DATA_ELEMENT || type === REPORTING_RATE + ? content.split('.')[0] + : content + +// One operand found by OPERAND_REGEX: its type, the object behind it, its token and functions +const toOperand = (expression, match) => { + const [operandToken, prefix, content] = match + const { functions, end } = readFunctions( + expression, + match.index + operandToken.length + ) + const token = expression.slice(match.index, end) + + if (prefix === undefined) { + return { type: OPERAND_TYPE_DAYS, token, functions } + } + + const type = OPERAND_TYPE_BY_PREFIX[prefix] ?? OPERAND_TYPE_UNKNOWN + // A disaggregation (de.coc, de.coc.aoc); a wildcard (de.*) is the whole element + const isDisaggregation = + type === DIMENSION_TYPE_DATA_ELEMENT && + content.includes('.') && + !content.includes('*') + const aggregationType = functions.find( + ({ name }) => name === 'aggregationType' + )?.arg + + return { + type, + id: getOperandObjectId(type, content), + ...(isDisaggregation && { operand: content }), + token, + functions, + ...(aggregationType && { aggregationType }), + } +} + +/** + * Every operand of an indicator or expression dimension item expression, in + * order: its type (a dimension item type, or a constant, org unit group, + * [days] or unknown operand), the id of the object behind it, and the + * functions chained after it. + */ +export const parseExpressionOperands = (expression) => + [...(expression ?? '').matchAll(OPERAND_REGEX)].map((match) => + toOperand(expression, match) + ) + +/** + * The category option combo a disaggregation asks for (`de.coc`, + * `de.coc.aoc`), or undefined for a whole element or a wildcard (`de.*`). + */ +export const getCategoryOptionComboId = (operand) => { + const id = operand?.split('.')[1] + + return id && id !== '*' ? id : undefined +} diff --git a/src/modules/dataItemProfile/getDataItemProfile.js b/src/modules/dataItemProfile/getDataItemProfile.js new file mode 100644 index 000000000..96c6eb805 --- /dev/null +++ b/src/modules/dataItemProfile/getDataItemProfile.js @@ -0,0 +1,33 @@ +import { getAssignedPeriodTypes } from './profile/assignedPeriodTypes.js' +import { collectSources } from './profile/collectSources.js' + +/** + * The profile of a data item ({ id, dimensionItemType }), from its metadata + * (fetchDataItemProfileMetadata): where its data comes from. + * + * - `sources`: one per data set it is assigned to, with the item's elements + * in it (a reporting rate is its data set), and one per program. + * - `expression`, for an indicator or expression dimension item: how its + * operands combine, `{ missingValueStrategy, parts }`, each part an + * `{ operand }` (a key of getItemOperands) or an expression. An indicator + * needs both sides (SKIP_IF_ANY_VALUE_MISSING); each side has a value + * when one of its operands has (SKIP_IF_ALL_VALUES_MISSING). + * - `assignedPeriodTypes`: the period types of those data sets + * (getAssignedPeriodTypes). + * - `assignedOrgUnitLevels` is added by addAssignedOrgUnitLevels, from + * counts fetched apart (fetchAssignedOrgUnitCounts, or an org unit + * coverage). + * - `unknown` and `reasons`: missing metadata makes the item unknown; it is + * never guessed. + */ +export const getDataItemProfile = (item, metadata = {}) => { + const { sources, reasons, expression } = collectSources(item, metadata) + + return { + sources, + ...(expression && { expression }), + unknown: reasons.length > 0, + reasons, + assignedPeriodTypes: getAssignedPeriodTypes(sources), + } +} diff --git a/src/modules/dataItemProfile/getDataItemProfileCompatibility.js b/src/modules/dataItemProfile/getDataItemProfileCompatibility.js new file mode 100644 index 000000000..7b45912d8 --- /dev/null +++ b/src/modules/dataItemProfile/getDataItemProfileCompatibility.js @@ -0,0 +1,80 @@ +import { combineAddedUpResults } from './compatibility/combineResults.js' +import { getDataItemProfileOrgUnitCompatibility } from './compatibility/getDataItemProfileOrgUnitCompatibility.js' +import { getDataItemProfilePeriodCompatibility } from './compatibility/getDataItemProfilePeriodCompatibility.js' +import { getPeriodAtOrgUnitResults } from './compatibility/periodAtOrgUnitResults.js' +import { getSourceId } from './sources.js' + +const NO_RESULT = { status: null, reasons: [] } + +/** + * Whether a selection suits a data item, from its profile (getDataItemProfile): + * whether analytics will return all of the item's values for these periods + * and org units. + * + * The status is `full`, `partial`, `none` or `unknown`: compatible with all, + * some or none of the item's data sets and programs that apply to the + * selection. `reasons` say why, and on a full result whether values are + * repeated or taken from an earlier period rather than added up for it. + * + * - `periods`: getDataItemProfilePeriodCompatibility, one result per period. + * - `orgUnits` (DV's org unit items): getDataItemProfileOrgUnitCompatibility, + * one result per selection item, from `options.orgUnitCoverage` + * (fetchOrgUnitCoverage). Given only when org units are asked. + * - `sources`: each source over the periods (aligned with `profile.sources`). + * - Overall: with periods and org units, each period at each org unit + * (getPeriodAtOrgUnitResults), where only the data sets and programs + * assigned there count; with one of them alone, its results. They add up, + * as the fixed periods of a relative period do: none when all are none, + * partial when some give values and others none, with every reason. + * + * `periods` and `orgUnits` are each judged alone, for pickers: by week, an + * element in a monthly data set at district A and a weekly one at B is + * partial (the monthly values are left out), and at A it is full (the + * weekly data set isn't assigned there). Only the overall result sees that + * by week at A it has nothing. + * `options` are passed to the period check (relative period settings, + * relativePeriodDate, calendar, server version). + */ +export const getDataItemProfileCompatibility = ( + profile, + { periods = [], orgUnits = [] } = {}, + { orgUnitCoverage, ...options } = {} +) => { + const periodResults = getDataItemProfilePeriodCompatibility( + profile, + { periods }, + options + ) + const orgUnitResults = orgUnits.length + ? getDataItemProfileOrgUnitCompatibility( + profile, + { orgUnits }, + { orgUnitCoverage } + ) + : [] + const periodAtOrgUnitResults = + periods.length && orgUnits.length + ? getPeriodAtOrgUnitResults( + profile, + { periods, orgUnits }, + { orgUnitCoverage, ...options } + ) + : [] + const overall = periodAtOrgUnitResults.length + ? periodAtOrgUnitResults + : [...periodResults, ...orgUnitResults] + + return { + ...(overall.length ? combineAddedUpResults(overall) : NO_RESULT), + sources: profile.sources.map((source, i) => ({ + sourceId: getSourceId(source), + ...(periodResults.length + ? combineAddedUpResults( + periodResults.map(({ sources }) => sources[i]) + ) + : NO_RESULT), + })), + periods: periodResults, + ...(orgUnits.length && { orgUnits: orgUnitResults }), + } +} diff --git a/src/modules/dataItemProfile/orgUnits/__tests__/orgUnitSelection.spec.js b/src/modules/dataItemProfile/orgUnits/__tests__/orgUnitSelection.spec.js new file mode 100644 index 000000000..bd27cba1c --- /dev/null +++ b/src/modules/dataItemProfile/orgUnits/__tests__/orgUnitSelection.spec.js @@ -0,0 +1,226 @@ +import { + getRequestedLevels, + getOrgUnitsToFetch, + parseOrgUnitSelectionItem, + readOrgUnitSelection, +} from '../orgUnitSelection.js' + +describe('parseOrgUnitSelectionItem', () => { + it.each([ + ['ImspTQPwCqd', { type: 'ORG_UNIT' }], + ['LEVEL-2', { type: 'LEVEL', level: 2 }], + ['LEVEL-wjP19dkFeIk', { type: 'LEVEL', level: 'wjP19dkFeIk' }], + ['OU_GROUP-RXL3lPSK8oG', { type: 'GROUP', groupId: 'RXL3lPSK8oG' }], + ['USER_ORGUNIT', { type: 'USER', depth: 0 }], + ['USER_ORGUNIT_CHILDREN', { type: 'USER', depth: 1 }], + ['USER_ORGUNIT_GRANDCHILDREN', { type: 'USER', depth: 2 }], + ['not an id', { type: 'UNKNOWN' }], + ['toString', { type: 'UNKNOWN' }], + ])('reads %s', (id, expected) => { + expect(parseOrgUnitSelectionItem(id)).toEqual({ id, ...expected }) + }) +}) + +describe('readOrgUnitSelection', () => { + it('judges org units on their own', () => { + expect(readOrgUnitSelection(['unitAAAAAAA', 'unitBBBBBBB'])).toEqual({ + selectionItems: [ + { id: 'unitAAAAAAA', type: 'ORG_UNIT' }, + { id: 'unitBBBBBBB', type: 'ORG_UNIT' }, + ], + parentItems: [], + }) + }) + + it('takes the org units and the user org units as parents of a level or a group', () => { + expect( + readOrgUnitSelection(['unitAAAAAAA', 'LEVEL-3', 'USER_ORGUNIT']) + ).toEqual({ + selectionItems: [{ id: 'LEVEL-3', type: 'LEVEL', level: 3 }], + parentItems: [ + { id: 'unitAAAAAAA', type: 'ORG_UNIT' }, + { id: 'USER_ORGUNIT', type: 'USER', depth: 0 }, + ], + }) + }) + + it('reads nothing from no selection', () => { + expect(readOrgUnitSelection()).toEqual({ + selectionItems: [], + parentItems: [], + }) + }) +}) + +describe('getOrgUnitsToFetch', () => { + it('fetches the org units of a selection', () => { + expect(getOrgUnitsToFetch(['unitAAAAAAA', 'LEVEL-2'])).toEqual({ + orgUnitIds: ['unitAAAAAAA'], + needsRoots: false, + needsUserOrgUnits: false, + groupIds: [], + }) + }) + + it('fetches the roots for a level alone, and the user org units', () => { + expect(getOrgUnitsToFetch(['LEVEL-2'])).toMatchObject({ + needsRoots: true, + needsUserOrgUnits: false, + }) + expect( + getOrgUnitsToFetch(['LEVEL-2', 'USER_ORGUNIT_CHILDREN']) + ).toEqual({ + orgUnitIds: [], + needsRoots: false, + needsUserOrgUnits: true, + groupIds: [], + }) + expect(getOrgUnitsToFetch()).toEqual({ + orgUnitIds: [], + needsRoots: false, + needsUserOrgUnits: false, + groupIds: [], + }) + }) + + it('lists the groups once each, with no roots for them', () => { + expect( + getOrgUnitsToFetch(['OU_GROUP-groupAAAAAA', 'OU_GROUP-groupAAAAAA']) + ).toEqual({ + orgUnitIds: [], + needsRoots: false, + needsUserOrgUnits: false, + groupIds: ['groupAAAAAA'], + }) + }) +}) + +describe('getRequestedLevels', () => { + const COVERAGE = { + levels: [ + { id: 'levelNation', level: 1 }, + { id: 'levelDistri', level: 2 }, + { id: 'levelChiefd', level: 3 }, + { id: 'levelFacili', level: 4 }, + ], + orgUnits: { + nationUnit1: { id: 'nationUnit1', level: 1, path: '/nationUnit1' }, + districtAAA: { + id: 'districtAAA', + level: 2, + path: '/nationUnit1/districtAAA', + }, + facilityAAA: { + id: 'facilityAAA', + level: 4, + path: '/nationUnit1/districtAAA/chiefdomAAA/facilityAAA', + }, + }, + rootIds: ['nationUnit1'], + userOrgUnitIds: ['districtAAA'], + groups: { groupAAAAAA: { 2: 3, 3: 0, 4: 5 } }, + } + const targets = (id, parents = [], coverage = COVERAGE) => + getRequestedLevels( + parseOrgUnitSelectionItem(id), + parents.map(parseOrgUnitSelectionItem), + coverage + ) + + it('asks an org unit at its own level', () => { + expect(targets('districtAAA')).toEqual([ + { countsKey: 'districtAAA', level: 2 }, + ]) + }) + + it('asks a level under each parent that holds it', () => { + expect(targets('LEVEL-3', ['nationUnit1', 'facilityAAA'])).toEqual([ + { countsKey: 'nationUnit1', level: 3 }, + ]) + }) + + it('asks a level once under a parent given twice, or within another', () => { + expect( + targets('LEVEL-4', ['districtAAA', 'districtAAA', 'facilityAAA']) + ).toEqual([{ countsKey: 'districtAAA', level: 4 }]) + expect( + targets('LEVEL-4', ['USER_ORGUNIT', 'USER_ORGUNIT_CHILDREN']) + ).toEqual([{ countsKey: 'districtAAA', level: 4 }]) + }) + + it('keeps a parent within another that holds fewer levels', () => { + expect( + targets('LEVEL-3', ['USER_ORGUNIT_GRANDCHILDREN', 'districtAAA']) + ).toEqual([{ countsKey: 'districtAAA', level: 3 }]) + }) + + it('asks a level under the user org units, below the depth of the user item', () => { + expect(targets('LEVEL-3', ['USER_ORGUNIT_CHILDREN'])).toEqual([ + { countsKey: 'districtAAA', level: 3 }, + ]) + expect(targets('LEVEL-2', ['USER_ORGUNIT_CHILDREN'])).toEqual([]) + }) + + it('asks nothing for a level deeper than the hierarchy', () => { + expect(targets('LEVEL-7', ['nationUnit1'])).toEqual([]) + }) + + it('asks a level under the roots without parents, by number or id', () => { + expect(targets('LEVEL-levelDistri')).toEqual([ + { countsKey: 'nationUnit1', level: 2 }, + ]) + }) + + it('asks the user org units at their level plus the depth', () => { + expect(targets('USER_ORGUNIT_GRANDCHILDREN')).toEqual([ + { countsKey: 'districtAAA', level: 4 }, + ]) + }) + + it('asks a group at each level its members are at', () => { + expect(targets('OU_GROUP-groupAAAAAA')).toEqual([ + { countsKey: 'groupAAAAAA:2:', level: 2, groupId: 'groupAAAAAA' }, + { countsKey: 'groupAAAAAA:4:', level: 4, groupId: 'groupAAAAAA' }, + ]) + }) + + it('asks a group under each parent at or above its members, inside no other', () => { + expect( + targets('OU_GROUP-groupAAAAAA', ['districtAAA', 'facilityAAA']) + ).toEqual([ + { + countsKey: 'groupAAAAAA:2:districtAAA', + level: 2, + groupId: 'groupAAAAAA', + }, + { + countsKey: 'groupAAAAAA:4:districtAAA', + level: 4, + groupId: 'groupAAAAAA', + }, + ]) + expect(targets('OU_GROUP-groupAAAAAA', ['facilityAAA'])).toEqual([ + { + countsKey: 'groupAAAAAA:4:facilityAAA', + level: 4, + groupId: 'groupAAAAAA', + }, + ]) + }) + + it('cannot tell for a group, an unknown level, or org units not loaded', () => { + expect(targets('OU_GROUP-notLoadedGr')).toBeNull() + expect(targets('OU_GROUP-groupAAAAAA', ['notLoadedUn'])).toBeNull() + expect(targets('LEVEL-unknownLvl')).toBeNull() + expect(targets('LEVEL-3', ['notLoadedUn'])).toBeNull() + expect( + targets('USER_ORGUNIT', [], { ...COVERAGE, userOrgUnitIds: null }) + ).toBeNull() + expect( + targets('USER_ORGUNIT', [], { + ...COVERAGE, + userOrgUnitIds: ['other'], + }) + ).toBeNull() + }) +}) diff --git a/src/modules/dataItemProfile/orgUnits/orgUnitSelection.js b/src/modules/dataItemProfile/orgUnits/orgUnitSelection.js new file mode 100644 index 000000000..8711b0a03 --- /dev/null +++ b/src/modules/dataItemProfile/orgUnits/orgUnitSelection.js @@ -0,0 +1,267 @@ +import { + ouIdHelper, + USER_ORG_UNIT, + USER_ORG_UNIT_CHILDREN, + USER_ORG_UNIT_GRANDCHILDREN, +} from '../../ouIdHelper/index.js' +import { + ORG_UNIT_ITEM_TYPE_GROUP, + ORG_UNIT_ITEM_TYPE_LEVEL, + ORG_UNIT_ITEM_TYPE_ORG_UNIT, + ORG_UNIT_ITEM_TYPE_UNKNOWN, + ORG_UNIT_ITEM_TYPE_USER, +} from '../constants.js' + +/* An org unit selection is DV's org unit items: org unit ids, LEVEL-n (a + * number or a level id), OU_GROUP-id, and the user's org units + * (USER_ORGUNIT, its children or grandchildren). A selection item is one of + * them, not a data item. */ + +// How many levels below the user's org units each user item reaches +const USER_ITEM_DEPTHS = new Map([ + [USER_ORG_UNIT, 0], + [USER_ORG_UNIT_CHILDREN, 1], + [USER_ORG_UNIT_GRANDCHILDREN, 2], +]) + +const UID = /^[a-zA-Z][a-zA-Z0-9]{10}$/ + +export const parseOrgUnitSelectionItem = (id) => { + if (USER_ITEM_DEPTHS.has(id)) { + return { + id, + type: ORG_UNIT_ITEM_TYPE_USER, + depth: USER_ITEM_DEPTHS.get(id), + } + } + + if (ouIdHelper.hasLevelPrefix(id)) { + const level = ouIdHelper.removePrefix(id) + + return { + id, + type: ORG_UNIT_ITEM_TYPE_LEVEL, + level: /^\d+$/.test(level) ? Number(level) : level, + } + } + + if (ouIdHelper.hasGroupPrefix(id)) { + return { + id, + type: ORG_UNIT_ITEM_TYPE_GROUP, + groupId: ouIdHelper.removePrefix(id), + } + } + + return { + id, + type: UID.test(id) + ? ORG_UNIT_ITEM_TYPE_ORG_UNIT + : ORG_UNIT_ITEM_TYPE_UNKNOWN, + } +} + +const isOfType = (...types) => { + const typeSet = new Set(types) + + return ({ type }) => typeSet.has(type) +} + +const isLevelOrGroup = isOfType( + ORG_UNIT_ITEM_TYPE_LEVEL, + ORG_UNIT_ITEM_TYPE_GROUP +) + +/** + * A selection as analytics reads it: with a level or a group in it, the org + * units and the user's org units are parents (districts in Bo, a group's + * members in the user's district), not items of their own. Gives the + * `selectionItems` to judge and the `parentItems`. + */ +export const readOrgUnitSelection = (orgUnits = []) => { + const parsed = orgUnits.map(parseOrgUnitSelectionItem) + const isParent = isOfType( + ORG_UNIT_ITEM_TYPE_ORG_UNIT, + ORG_UNIT_ITEM_TYPE_USER + ) + + return parsed.some(isLevelOrGroup) + ? { + selectionItems: parsed.filter((item) => !isParent(item)), + parentItems: parsed.filter(isParent), + } + : { selectionItems: parsed, parentItems: [] } +} + +/** + * What a selection needs fetched: its org units, the roots (a level with no + * parent), the user's org units, and its groups. + */ +export const getOrgUnitsToFetch = (orgUnits = []) => { + const parsed = orgUnits.map(parseOrgUnitSelectionItem) + const ofType = (type) => parsed.filter(isOfType(type)) + + return { + orgUnitIds: ofType(ORG_UNIT_ITEM_TYPE_ORG_UNIT).map(({ id }) => id), + needsRoots: + ofType(ORG_UNIT_ITEM_TYPE_LEVEL).length > 0 && + !ofType(ORG_UNIT_ITEM_TYPE_ORG_UNIT).length && + !ofType(ORG_UNIT_ITEM_TYPE_USER).length, + needsUserOrgUnits: ofType(ORG_UNIT_ITEM_TYPE_USER).length > 0, + groupIds: [ + ...new Set( + ofType(ORG_UNIT_ITEM_TYPE_GROUP).map(({ groupId }) => groupId) + ), + ], + } +} + +/** + * The org units a level or a group is kept under, each with the shallowest + * level it holds (`minLevel`): an org unit at its own level and below; the + * user's org units, below their level plus the item's depth (the children of + * the user's org units hold levels from one below theirs). Without parents, + * the roots. A parent given twice, or within another that holds its levels, + * counts once. Null when one isn't loaded. + */ +export const resolveParents = (parentItems, coverage) => { + const { orgUnits, rootIds = [], userOrgUnitIds } = coverage + + if (!parentItems.length) { + return rootIds.map((id) => ({ orgUnitId: id, minLevel: 1 })) + } + + const parents = parentItems.flatMap(({ type, id, depth }) => + type === ORG_UNIT_ITEM_TYPE_USER + ? (userOrgUnitIds ?? [undefined]).map((userId) => ({ + orgUnitId: userId, + minLevel: (orgUnits[userId]?.level ?? 0) + depth, + })) + : [{ orgUnitId: id, minLevel: orgUnits[id]?.level }] + ) + + if (!parents.every(({ orgUnitId }) => orgUnits[orgUnitId])) { + return null + } + + // A parent given twice counts once, from the shallowest level either holds + const distinct = [ + ...parents + .reduce((byId, parent) => { + const known = byId.get(parent.orgUnitId) + + return known && known.minLevel <= parent.minLevel + ? byId + : byId.set(parent.orgUnitId, parent) + }, new Map()) + .values(), + ] + // Analytics takes the org units under all parents once each + const isWithin = (parent, other) => + other !== parent && + orgUnits[parent.orgUnitId].path.includes(`/${other.orgUnitId}/`) && + other.minLevel <= parent.minLevel + + return distinct.filter( + (parent) => !distinct.some((other) => isWithin(parent, other)) + ) +} + +// Where the counts of a group's members at one level, under one parent, are kept +export const getGroupCountsKey = (groupId, level, parentOrgUnitId) => + `${groupId}:${level}:${parentOrgUnitId ?? ''}` + +const getLevelNumber = (level, levels) => + typeof level === 'number' + ? level + : levels.find(({ id }) => id === level)?.level ?? null + +/* A group's members at each level they are at, under each parent that holds + * that level (or anywhere, without parents) */ +const getGroupRequestedLevels = (groupId, parents, groups) => { + const membersByLevel = groups?.[groupId] + + if (!membersByLevel) { + return null + } + + return Object.keys(membersByLevel) + .map(Number) + .filter((level) => membersByLevel[level] > 0) + .flatMap((level) => + (parents ?? [{ orgUnitId: null, minLevel: 1 }]) + .filter(({ minLevel }) => minLevel <= level) + .map(({ orgUnitId }) => ({ + countsKey: getGroupCountsKey(groupId, level, orgUnitId), + level, + groupId, + })) + ) +} + +/** + * The levels analytics aggregates to for a selection item, each with where + * its counts are kept in the coverage (fetchOrgUnitCoverage): an org unit at + * its own level; LEVEL-n at level n under each parent that holds it (or under + * the roots); the user's org units at their level plus the item's depth; a + * group at each level its members are at, under each parent. An empty list + * when no parent holds the level. Null when it can't be told: an unknown id + * or level, or an org unit or group that isn't loaded. + */ +export const getRequestedLevels = (selectionItem, parentItems, coverage) => { + const { orgUnits, userOrgUnitIds, levels = [] } = coverage + const atOwnLevel = (orgUnitId, depth = 0) => + orgUnits[orgUnitId] && { + countsKey: orgUnitId, + level: orgUnits[orgUnitId].level + depth, + } + + switch (selectionItem.type) { + case ORG_UNIT_ITEM_TYPE_ORG_UNIT: { + const requested = atOwnLevel(selectionItem.id) + + return requested ? [requested] : null + } + case ORG_UNIT_ITEM_TYPE_LEVEL: { + const level = getLevelNumber(selectionItem.level, levels) + const parents = resolveParents(parentItems, coverage) + + if (!level || !parents) { + return null + } + + // A level deeper than the hierarchy holds no org unit + if (levels.length && level > levels.at(-1).level) { + return [] + } + + return parents + .filter(({ minLevel }) => minLevel <= level) + .map(({ orgUnitId }) => ({ countsKey: orgUnitId, level })) + } + case ORG_UNIT_ITEM_TYPE_USER: { + const requested = (userOrgUnitIds ?? []).map((id) => + atOwnLevel(id, selectionItem.depth) + ) + + return userOrgUnitIds && !requested.includes(undefined) + ? requested + : null + } + case ORG_UNIT_ITEM_TYPE_GROUP: { + const parents = parentItems.length + ? resolveParents(parentItems, coverage) + : undefined + + return parents === null + ? null + : getGroupRequestedLevels( + selectionItem.groupId, + parents, + coverage.groups + ) + } + default: + return null + } +} diff --git a/src/modules/dataItemProfile/periods/__tests__/calendarDates.spec.js b/src/modules/dataItemProfile/periods/__tests__/calendarDates.spec.js new file mode 100644 index 000000000..cc44a7aa8 --- /dev/null +++ b/src/modules/dataItemProfile/periods/__tests__/calendarDates.spec.js @@ -0,0 +1,48 @@ +import { + formatDate, + getYear, + isIsoCalendar, + pad, + shiftDate, + fromIsoDate, +} from '../calendarDates.js' + +describe('calendarDates', () => { + it('needs no conversion for the ISO calendars only', () => { + expect(isIsoCalendar()).toBe(true) + expect(isIsoCalendar('iso8601')).toBe(true) + expect(isIsoCalendar('gregorian')).toBe(true) + expect(isIsoCalendar('nepali')).toBe(false) + }) + + it('formats and reads dates', () => { + expect(pad(7)).toBe('07') + expect(pad(825, 4)).toBe('0825') + expect(formatDate({ year: 2025, month: 1, day: 6 })).toBe('2025-01-06') + expect(getYear('2025-01-06')).toBe(2025) + }) + + it('shifts a date by days, across months and years', () => { + expect(shiftDate('2025-01-01', -1)).toBe('2024-12-31') + expect(shiftDate('2024-02-28', 1, 'iso8601')).toBe('2024-02-29') + }) + + it('shifts a date of another calendar in that calendar', () => { + expect(shiftDate('2081-01-03', 1, 'nepali')).toBe('2081-01-04') + expect(fromIsoDate('2024-04-16', 'nepali')).toBe('2081-01-04') + }) +}) + +describe('fromIsoDate', () => { + it('keeps ISO dates, and converts them to other calendars', () => { + expect(fromIsoDate('2025-01-06')).toBe('2025-01-06') + expect(fromIsoDate('2024-04-15', 'nepali')).toBe('2081-01-03') + }) +}) + +describe('a conversion that fails', () => { + it('gives null, never throws', () => { + expect(fromIsoDate('2024-04-15', 'noSuchCalendar')).toBeNull() + expect(shiftDate('2081-01-03', 1, 'noSuchCalendar')).toBeNull() + }) +}) diff --git a/src/modules/dataItemProfile/periods/__tests__/firstLastValues.spec.js b/src/modules/dataItemProfile/periods/__tests__/firstLastValues.spec.js new file mode 100644 index 000000000..2b8e2a7ba --- /dev/null +++ b/src/modules/dataItemProfile/periods/__tests__/firstLastValues.spec.js @@ -0,0 +1,214 @@ +import { + getFirstOrLastValuePeriod, + getYearsTouched, +} from '../firstLastValues.js' +import { getPeriodDates } from '../periodRanges.js' + +const sourceOf = ({ + periodAggregationType = 'LAST', + periodType, + period, + years, + calendar, +}) => { + const dates = getPeriodDates(period, calendar) + + return getFirstOrLastValuePeriod({ + periodAggregationType, + periodType, + dates, + years: years ?? getYearsTouched(dates), + calendar, + }) +} + +describe('getYearsTouched', () => { + it('lists the calendar years a period falls in', () => { + expect(getYearsTouched(getPeriodDates('2025W1'))).toEqual([2024, 2025]) + expect(getYearsTouched(getPeriodDates('2025WedW1'))).toEqual([2025]) + expect(getYearsTouched(getPeriodDates('2024April'))).toEqual([ + 2024, 2025, + ]) + }) +}) + +describe('getFirstOrLastValuePeriod', () => { + describe('LAST', () => { + it('takes the latest data period that ended by the end of the period', () => { + expect( + sourceOf({ periodType: 'Monthly', period: '20250715' }) + ).toMatchObject({ id: '202506' }) + expect( + sourceOf({ periodType: 'Monthly', period: '2025Q3' }) + ).toMatchObject({ id: '202509' }) + }) + + it('skips a gap year in the request, for weekly and monthly data', () => { + expect( + sourceOf({ + periodType: 'Weekly', + period: '20240101', + years: [2022, 2024], + }) + ).toMatchObject({ id: '2022W52' }) + expect( + sourceOf({ + periodType: 'Monthly', + period: '20240101', + years: [2020, 2024], + }) + ).toMatchObject({ id: '202012' }) + }) + + it('counts only data periods of the years touched, by the year they start in', () => { + expect( + sourceOf({ periodType: 'Monthly', period: '20250101' }) + ).toBeNull() + // 2025W1 starts in 2024, so December 2024 counts + expect( + sourceOf({ periodType: 'Monthly', period: '2025W1' }) + ).toMatchObject({ id: '202412' }) + // 2025Nov (November 2024 to October 2025) is a 2024 period + expect( + sourceOf({ periodType: 'FinancialNov', period: '20251101' }) + ).toBeNull() + expect( + sourceOf({ periodType: 'FinancialNov', period: '2025W1' }) + ).toBeNull() + expect( + sourceOf({ + periodType: 'FinancialNov', + period: '20251101', + years: [2024, 2025], + }) + ).toMatchObject({ id: '2025Nov' }) + }) + + it('counts weeks by the year in their id, and bi-weeks by their start', () => { + // 2026W1 starts on 29 December 2025: a 2026 period + expect( + sourceOf({ + periodType: 'Weekly', + period: '20260105', + years: [2026], + }) + ).toMatchObject({ id: '2026W1' }) + // 2026BiW1 starts on the same day: a 2025 period + expect( + sourceOf({ + periodType: 'BiWeekly', + period: '20260112', + years: [2026], + }) + ).toBeNull() + expect( + sourceOf({ + periodType: 'BiWeekly', + period: '20260112', + years: [2025, 2026], + }) + ).toMatchObject({ id: '2026BiW1' }) + }) + + it('skips years the request does not touch', () => { + expect( + sourceOf({ + periodType: 'Monthly', + period: '20250715', + years: [2023, 2025], + }) + ).toMatchObject({ id: '202506' }) + // 2024 isn't touched: December 2023 is the latest that counts + expect( + sourceOf({ + periodType: 'Monthly', + period: '20250101', + years: [2023, 2025], + }) + ).toMatchObject({ id: '202312' }) + expect( + sourceOf({ + periodType: 'Monthly', + period: '20250101', + years: [2026], + }) + ).toBeNull() + }) + }) + + describe('FIRST', () => { + it('takes the earliest data period of the years touched', () => { + expect( + sourceOf({ + periodAggregationType: 'FIRST', + periodType: 'Monthly', + period: '202507', + }) + ).toMatchObject({ id: '202501' }) + expect( + sourceOf({ + periodAggregationType: 'FIRST', + periodType: 'Daily', + period: '20250715', + years: [2024, 2025], + }) + ).toMatchObject({ id: '20240101' }) + }) + + it('needs that period to end by the end of the period asked for', () => { + expect( + sourceOf({ + periodAggregationType: 'FIRST', + periodType: 'Monthly', + period: '20250101', + }) + ).toBeNull() + }) + + it('starts from the first period whose id names the year', () => { + // 2024April holds 1 January 2025, but is a 2024 period + expect( + sourceOf({ + periodAggregationType: 'FIRST', + periodType: 'FinancialApril', + period: '2025April', + years: [2025, 2026], + }) + ).toMatchObject({ id: '2025April' }) + }) + }) + + it('is null without years, or for a type without dates', () => { + expect( + sourceOf({ periodType: 'Monthly', period: '20250715', years: [] }) + ).toBeNull() + expect( + sourceOf({ periodType: 'TwoYearly', period: '20250715' }) + ).toBeNull() + expect( + sourceOf({ + periodAggregationType: 'FIRST', + periodType: 'TwoYearly', + period: '20250715', + }) + ).toBeNull() + }) + + it('works in other calendars', () => { + expect( + sourceOf({ + periodType: 'Monthly', + period: '20810415', + calendar: 'nepali', + }) + ).toMatchObject({ id: '208103' }) + expect( + sourceOf({ + periodAggregationType: 'FIRST', + periodType: 'Monthly', + period: '208104', + calendar: 'nepali', + }) + ).toMatchObject({ id: '208101' }) + }) +}) diff --git a/src/modules/dataItemProfile/periods/__tests__/memoize.spec.js b/src/modules/dataItemProfile/periods/__tests__/memoize.spec.js new file mode 100644 index 000000000..d8ae8bfdb --- /dev/null +++ b/src/modules/dataItemProfile/periods/__tests__/memoize.spec.js @@ -0,0 +1,34 @@ +import { memoize } from '../memoize.js' + +describe('memoize', () => { + it('computes once per arguments', () => { + const double = jest.fn((a, b) => [a, b]) + const memoized = memoize(double) + + expect(memoized(1, 2)).toBe(memoized(1, 2)) + expect(memoized(2, 1)).toEqual([2, 1]) + expect(double).toHaveBeenCalledTimes(2) + }) + + it('starts over when full', () => { + const identity = jest.fn((a) => ({ a })) + const memoized = memoize(identity, { maxSize: 2 }) + + memoized(1) + memoized(2) + memoized(3) + memoized(2) + + expect(identity).toHaveBeenCalledTimes(4) + }) + + it('takes a key of its own', () => { + const read = jest.fn(({ id }) => id) + const memoized = memoize(read, { getKey: ({ id }) => id }) + + memoized({ id: 'a', other: 1 }) + memoized({ id: 'a', other: 2 }) + + expect(read).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/modules/dataItemProfile/periods/__tests__/multiCalendarPatches.spec.js b/src/modules/dataItemProfile/periods/__tests__/multiCalendarPatches.spec.js new file mode 100644 index 000000000..103336e1f --- /dev/null +++ b/src/modules/dataItemProfile/periods/__tests__/multiCalendarPatches.spec.js @@ -0,0 +1,38 @@ +import { + getNovemberPeriodByDate, + getNovemberPeriodDates, + isNovemberPeriodId, + isNovemberPeriodType, +} from '../multiCalendarPatches.js' + +describe('multiCalendarPatches', () => { + it('tells November periods and types apart', () => { + expect(isNovemberPeriodId('2025NovQ1')).toBe(true) + expect(isNovemberPeriodId('2025Nov')).toBe(true) + expect(isNovemberPeriodId('2025Q1')).toBe(false) + expect(isNovemberPeriodType('SixMonthlyNov')).toBe(true) + expect(isNovemberPeriodType('SixMonthly')).toBe(false) + expect(isNovemberPeriodType('toString')).toBe(false) + }) + + it('dates November periods by the year they end in', () => { + expect(getNovemberPeriodDates('2025Nov')).toEqual({ + startDate: '2024-11-01', + endDate: '2025-10-31', + }) + expect(getNovemberPeriodDates('2025NovS2')).toEqual({ + startDate: '2025-05-01', + endDate: '2025-10-31', + }) + }) + + it.each([ + ['FinancialNov', '2024-11-01', '2025Nov'], + ['FinancialNov', '2025-10-31', '2025Nov'], + ['QuarterlyNov', '2024-12-15', '2025NovQ1'], + ['QuarterlyNov', '2025-02-01', '2025NovQ2'], + ['SixMonthlyNov', '2025-05-01', '2025NovS2'], + ])('finds the %s period holding %s: %s', (periodType, date, id) => { + expect(getNovemberPeriodByDate(periodType, date).id).toBe(id) + }) +}) diff --git a/src/modules/dataItemProfile/periods/__tests__/periodRanges.spec.js b/src/modules/dataItemProfile/periods/__tests__/periodRanges.spec.js new file mode 100644 index 000000000..c3e87cb30 --- /dev/null +++ b/src/modules/dataItemProfile/periods/__tests__/periodRanges.spec.js @@ -0,0 +1,159 @@ +import { + getNextPeriod, + getPreviousPeriod, + getCoveringPeriodRange, + getFixedPeriodOfTypeByDate, + getPeriodDates, + isAlignedWithPeriodType, +} from '../periodRanges.js' + +describe('getPeriodDates', () => { + it.each([ + ['2025W1', '2024-12-30', '2025-01-05'], + ['2025WedW1', '2025-01-01', '2025-01-07'], + ['2025BiW1', '2024-12-30', '2025-01-12'], + ['202501', '2025-01-01', '2025-01-31'], + ['2025Q1', '2025-01-01', '2025-03-31'], + ['2025AprilS1', '2025-04-01', '2025-09-30'], + ['2025April', '2025-04-01', '2026-03-31'], + ['20250115', '2025-01-15', '2025-01-15'], + ])('%s: %s to %s', (periodId, startDate, endDate) => { + expect(getPeriodDates(periodId)).toEqual({ startDate, endDate }) + }) + + it.each([ + ['2025Nov', '2024-11-01', '2025-10-31'], + ['2025NovQ1', '2024-11-01', '2025-01-31'], + ['2025NovQ3', '2025-05-01', '2025-07-31'], + ['2025NovS1', '2024-11-01', '2025-04-30'], + ['2025NovS2', '2025-05-01', '2025-10-31'], + ])( + 'dates the November type %s as the server does', + (periodId, startDate, endDate) => { + expect(getPeriodDates(periodId)).toEqual({ startDate, endDate }) + expect(getPeriodDates(periodId, 'iso8601')).toEqual({ + startDate, + endDate, + }) + } + ) + + it('gives no dates for November types in other calendars', () => { + expect(getPeriodDates('2081Nov', 'nepali')).toBeNull() + }) + + it('gives dates in the calendar asked for', () => { + expect(getPeriodDates('2081W1', 'nepali')).toEqual({ + startDate: '2081-01-03', + endDate: '2081-01-09', + }) + }) + + it('is null for an id it cannot read', () => { + expect(getPeriodDates('LAST_12_MONTHS')).toBeNull() + expect(getPeriodDates('2025X1')).toBeNull() + }) +}) + +describe('getFixedPeriodOfTypeByDate', () => { + it('finds the period of a type that holds a date', () => { + expect( + getFixedPeriodOfTypeByDate('WeeklyWednesday', '2025-01-10') + ).toMatchObject({ startDate: '2025-01-08', endDate: '2025-01-14' }) + }) + + it.each([ + ['FinancialNov', '2025-01-08', '2025Nov', '2024-11-01'], + ['FinancialNov', '2024-11-01', '2025Nov', '2024-11-01'], + ['FinancialNov', '2024-10-31', '2024Nov', '2023-11-01'], + ['QuarterlyNov', '2025-01-08', '2025NovQ1', '2024-11-01'], + ['QuarterlyNov', '2025-10-31', '2025NovQ4', '2025-08-01'], + ['SixMonthlyNov', '2025-05-01', '2025NovS2', '2025-05-01'], + ])('gives %s periods the ids the server uses (%s)', (...args) => { + const [periodType, date, id, startDate] = args + + expect(getFixedPeriodOfTypeByDate(periodType, date)).toMatchObject({ + id, + startDate, + }) + }) + + it('is null for November types in other calendars', () => { + expect( + getFixedPeriodOfTypeByDate('QuarterlyNov', '2081-09-24', 'nepali') + ).toBeNull() + }) + + it('is null for a type without an ISO format', () => { + expect(getFixedPeriodOfTypeByDate('TwoYearly', '2025-01-10')).toBeNull() + }) + + it('is null for a date it cannot read', () => { + expect(getFixedPeriodOfTypeByDate('Monthly', 'not a date')).toBeNull() + expect(getFixedPeriodOfTypeByDate('Monthly', null)).toBeNull() + }) +}) + +describe('getCoveringPeriodRange', () => { + it('widens to whole periods of the type', () => { + expect( + getCoveringPeriodRange(getPeriodDates('2025W2'), 'Monthly') + ).toEqual({ + startDate: '2025-01-01', + endDate: '2025-01-31', + }) + expect( + getCoveringPeriodRange(getPeriodDates('2025W1'), 'Monthly') + ).toEqual({ + startDate: '2024-12-01', + endDate: '2025-01-31', + }) + }) + + it('is null when it cannot tell', () => { + expect( + getCoveringPeriodRange(getPeriodDates('2025W2'), 'TwoYearly') + ).toBeNull() + }) +}) + +describe('isAlignedWithPeriodType', () => { + it.each([ + ['2025Q1', 'Monthly', true], + ['2025', 'Quarterly', true], + ['2025W2', 'Daily', true], + ['2025BiW1', 'Weekly', true], + ['202501', 'Weekly', false], + ['2025', 'WeeklyWednesday', false], + ['2025April', 'Quarterly', true], + ['2025April', 'SixMonthly', false], + ['2025Q1', 'TwoYearly', null], + ])('%s on %s data: %s', (periodId, periodType, expected) => { + expect( + isAlignedWithPeriodType(getPeriodDates(periodId), periodType) + ).toBe(expected) + }) +}) + +describe('getPreviousPeriod and getNextPeriod', () => { + it('step to the adjacent period of the same type', () => { + const january = getFixedPeriodOfTypeByDate('Monthly', '2025-01-15') + + expect(getPreviousPeriod('Monthly', january).id).toBe('202412') + expect(getNextPeriod('Monthly', january).id).toBe('202502') + }) + + it('step across November periods, which the library dates itself', () => { + const quarter = getFixedPeriodOfTypeByDate('QuarterlyNov', '2025-01-15') + + expect(getNextPeriod('QuarterlyNov', quarter).id).toBe('2025NovQ2') + }) + + it('are null when the date of a calendar cannot be converted', () => { + const period = { startDate: '2081-01-01', endDate: '2081-01-31' } + + expect( + getPreviousPeriod('Monthly', period, 'noSuchCalendar') + ).toBeNull() + }) +}) diff --git a/src/modules/dataItemProfile/periods/__tests__/periodTypes.spec.js b/src/modules/dataItemProfile/periods/__tests__/periodTypes.spec.js new file mode 100644 index 000000000..67951e601 --- /dev/null +++ b/src/modules/dataItemProfile/periods/__tests__/periodTypes.spec.js @@ -0,0 +1,180 @@ +import { PERIOD_TYPES } from '../../constants.js' +import { + canAggregateInto, + getCandidatePeriodTypes, + getPeriodTypeOfPeriodId, + getRelativePeriodTypeOptions, + isPeriodType, + isPeriodTypeSupported, + sortPeriodTypes, +} from '../periodTypes.js' + +describe('PERIOD_TYPES', () => { + it('lists the 24 server period types', () => { + expect(PERIOD_TYPES).toHaveLength(24) + expect(isPeriodType('TwoYearly')).toBe(true) + expect(isPeriodType('WEEKLY')).toBe(false) + }) +}) + +describe('sortPeriodTypes', () => { + it('sorts by frequency, then in server order', () => { + expect( + sortPeriodTypes(['Yearly', 'WeeklyWednesday', 'Monthly', 'Weekly']) + ).toEqual(['Weekly', 'WeeklyWednesday', 'Monthly', 'Yearly']) + }) +}) + +describe('getPeriodTypeOfPeriodId', () => { + it.each([ + ['20250115', 'Daily'], + ['2025W2', 'Weekly'], + ['2025WedW2', 'WeeklyWednesday'], + ['2025ThuW2', 'WeeklyThursday'], + ['2025FriW2', 'WeeklyFriday'], + ['2025SatW2', 'WeeklySaturday'], + ['2025SunW2', 'WeeklySunday'], + ['2025BiW2', 'BiWeekly'], + ['202501', 'Monthly'], + ['202501B', 'BiMonthly'], + ['2025Q1', 'Quarterly'], + ['2025NovQ1', 'QuarterlyNov'], + ['2025S1', 'SixMonthly'], + ['2025AprilS1', 'SixMonthlyApril'], + ['2025NovS1', 'SixMonthlyNov'], + ['2025', 'Yearly'], + ['2025Feb', 'FinancialFeb'], + ['2025April', 'FinancialApril'], + ['2025July', 'FinancialJuly'], + ['2025Aug', 'FinancialAug'], + ['2025Sep', 'FinancialSep'], + ['2025Oct', 'FinancialOct'], + ['2025Nov', 'FinancialNov'], + ])('%s is %s', (periodId, periodType) => { + expect(getPeriodTypeOfPeriodId(periodId)).toBe(periodType) + }) + + it('is null for anything else', () => { + expect(getPeriodTypeOfPeriodId('LAST_12_MONTHS')).toBeNull() + expect(getPeriodTypeOfPeriodId('2025X1')).toBeNull() + }) +}) + +describe('getCandidatePeriodTypes', () => { + it('takes a period type as it is', () => { + expect(getCandidatePeriodTypes('TwoYearly')).toEqual(['TwoYearly']) + }) + + it('reads a fixed period', () => { + expect(getCandidatePeriodTypes('2025WedW2')).toEqual([ + 'WeeklyWednesday', + ]) + }) + + it.each([ + ['LAST_7_DAYS', ['Daily']], + ['LAST_4_BIWEEKS', ['BiWeekly']], + ['LAST_12_MONTHS', ['Monthly']], + ['BIMONTHS_THIS_YEAR', ['BiMonthly']], + ['LAST_4_QUARTERS', ['Quarterly']], + ['LAST_2_SIXMONTHS', ['SixMonthly']], + ['LAST_5_YEARS', ['Yearly']], + ])('reads the relative period %s', (periodId, expected) => { + expect(getCandidatePeriodTypes(periodId)).toEqual(expected) + }) + + it('gives every weekly type for relative weeks, unless the setting is known', () => { + expect(getCandidatePeriodTypes('LAST_4_WEEKS')).toEqual([ + 'Weekly', + 'WeeklyWednesday', + 'WeeklyThursday', + 'WeeklyFriday', + 'WeeklySaturday', + 'WeeklySunday', + ]) + expect( + getCandidatePeriodTypes('LAST_4_WEEKS', { + weeklyPeriodType: 'WeeklySunday', + }) + ).toEqual(['WeeklySunday']) + }) + + it('gives every financial type for relative financial years, unless the setting is known', () => { + expect(getCandidatePeriodTypes('THIS_FINANCIAL_YEAR')).toHaveLength(7) + expect( + getCandidatePeriodTypes('THIS_FINANCIAL_YEAR', { + financialYearPeriodType: 'FinancialOct', + }) + ).toEqual(['FinancialOct']) + }) + + it('gives nothing for an id it cannot read', () => { + expect(getCandidatePeriodTypes('NEXT_CENTURY')).toEqual([]) + }) +}) + +describe('getRelativePeriodTypeOptions', () => { + it('maps the system settings to period types', () => { + expect( + getRelativePeriodTypeOptions({ + analyticsWeeklyStart: 'WEEKLY_WEDNESDAY', + analyticsFinancialYearStart: 'FINANCIAL_YEAR_OCTOBER', + }) + ).toEqual({ + weeklyPeriodType: 'WeeklyWednesday', + financialYearPeriodType: 'FinancialOct', + }) + }) + + it('leaves out unknown or missing settings', () => { + expect(getRelativePeriodTypeOptions()).toEqual({ + weeklyPeriodType: undefined, + financialYearPeriodType: undefined, + }) + }) +}) + +describe('isPeriodTypeSupported', () => { + it('leaves out QuarterlyNov before 2.41', () => { + expect( + isPeriodTypeSupported('QuarterlyNov', { major: 2, minor: 40 }) + ).toBe(false) + expect( + isPeriodTypeSupported('QuarterlyNov', { major: 2, minor: 41 }) + ).toBe(true) + expect( + isPeriodTypeSupported('QuarterlyNov', { major: 3, minor: 0 }) + ).toBe(true) + expect(isPeriodTypeSupported('Monthly', { major: 2, minor: 40 })).toBe( + true + ) + }) + + it('supports every type without a version', () => { + expect(isPeriodTypeSupported('QuarterlyNov')).toBe(true) + }) +}) + +describe('canAggregateInto', () => { + it.each([ + ['Monthly', 'Monthly', true], + ['Weekly', 'Monthly', true], + ['Daily', 'TwoYearly', true], + ['Monthly', 'FinancialApril', true], + ['Monthly', 'Weekly', false], + ['Yearly', 'Quarterly', false], + ['WeeklyWednesday', 'Weekly', false], + ['Weekly', 'WeeklyWednesday', false], + ['Yearly', 'FinancialApril', false], + ['Quarterly', 'QuarterlyNov', false], + ['Weekly', 'BiWeekly', true], + ['WeeklyWednesday', 'BiWeekly', true], + ])('%s data into %s queries: %s', (data, query, expected) => { + expect(canAggregateInto(data, query)).toBe(expected) + }) + + it('is null for an unknown type', () => { + expect(canAggregateInto('Hourly', 'Monthly')).toBeNull() + expect(canAggregateInto('Monthly', undefined)).toBeNull() + }) +}) diff --git a/src/modules/dataItemProfile/periods/__tests__/relativePeriodRanges.spec.js b/src/modules/dataItemProfile/periods/__tests__/relativePeriodRanges.spec.js new file mode 100644 index 000000000..817cc105d --- /dev/null +++ b/src/modules/dataItemProfile/periods/__tests__/relativePeriodRanges.spec.js @@ -0,0 +1,101 @@ +import { getRelativePeriodFixedPeriods } from '../relativePeriodRanges.js' + +const ON_15_JUNE_2025 = { relativePeriodDate: '2025-06-15' } +const idsOf = (periodId, periodType, options = ON_15_JUNE_2025) => + getRelativePeriodFixedPeriods(periodId, periodType, options)?.map( + ({ id }) => id + ) + +describe('getRelativePeriodFixedPeriods', () => { + it('resolves this and last periods from the date', () => { + expect(idsOf('THIS_MONTH', 'Monthly')).toEqual(['202506']) + expect(idsOf('LAST_MONTH', 'Monthly')).toEqual(['202505']) + expect(idsOf('LAST_YEAR', 'Yearly')).toEqual(['2024']) + }) + + it('resolves the periods before this one, oldest first', () => { + expect(idsOf('LAST_3_MONTHS', 'Monthly')).toEqual([ + '202503', + '202504', + '202505', + ]) + expect(idsOf('LAST_12_MONTHS', 'Monthly')).toHaveLength(12) + expect(idsOf('LAST_7_DAYS', 'Daily')).toEqual([ + '20250608', + '20250609', + '20250610', + '20250611', + '20250612', + '20250613', + '20250614', + ]) + }) + + it('resolves the periods of this year, all of them', () => { + expect(idsOf('MONTHS_THIS_YEAR', 'Monthly')).toEqual([ + '202501', + '202502', + '202503', + '202504', + '202505', + '202506', + '202507', + '202508', + '202509', + '202510', + '202511', + '202512', + ]) + expect(idsOf('QUARTERS_THIS_YEAR', 'Quarterly')).toEqual([ + '2025Q1', + '2025Q2', + '2025Q3', + '2025Q4', + ]) + }) + + it('takes the weeks that belong to this year', () => { + const weeks = idsOf('WEEKS_THIS_YEAR', 'Weekly') + + expect(weeks[0]).toBe('2025W1') + expect(weeks.at(-1)).toBe('2025W52') + }) + + it('resolves the type a setting gives', () => { + expect(idsOf('THIS_WEEK', 'WeeklyWednesday')).toEqual(['2025WedW24']) + expect(idsOf('THIS_FINANCIAL_YEAR', 'FinancialApril')).toEqual([ + '2025April', + ]) + }) + + it('resolves dates of other calendars', () => { + expect( + idsOf('THIS_MONTH', 'Monthly', { + calendar: 'nepali', + relativePeriodDate: '2025-06-15', + }) + ).toEqual(['208202']) + }) + + it('resolves from today by default', () => { + expect(idsOf('THIS_YEAR', 'Yearly', {})).toEqual([ + String(new Date().getFullYear()), + ]) + }) + + it('cannot tell for an unknown relative period or period type', () => { + expect(idsOf('LAST_7_DECADES', 'Yearly')).toBeUndefined() + expect(idsOf('THIS_MONTH', 'Hourly')).toBeUndefined() + }) +}) + +describe('getRelativePeriodFixedPeriods, in a calendar it cannot convert to', () => { + it('cannot tell', () => { + expect( + idsOf('THIS_MONTH', 'Monthly', { + calendar: 'noSuchCalendar', + relativePeriodDate: '2025-06-15', + }) + ).toBeUndefined() + }) +}) diff --git a/src/modules/dataItemProfile/periods/calendarDates.js b/src/modules/dataItemProfile/periods/calendarDates.js new file mode 100644 index 000000000..d498a6880 --- /dev/null +++ b/src/modules/dataItemProfile/periods/calendarDates.js @@ -0,0 +1,65 @@ +import { + convertFromIso8601, + convertToIso8601, +} from '@dhis2/multi-calendar-dates' + +/* Dates are YYYY-MM-DD strings in the server's calendar. Other calendars are + * supported: their dates are converted to ISO for analytics and back for + * multi-calendar-dates. These need no conversion (gregorian is the id DHIS2 + * gives the gregorian calendar). */ +const ISO_CALENDARS = new Set(['gregory', 'gregorian', 'iso8601']) + +export const isIsoCalendar = (calendar = 'gregory') => + ISO_CALENDARS.has(calendar) + +export const pad = (number, length = 2) => String(number).padStart(length, '0') + +export const formatDate = ({ year, month, day }) => + `${pad(year, 4)}-${pad(month)}-${pad(day)}` + +export const getYear = (date) => Number(date.slice(0, 4)) + +const shiftIsoDate = (isoDate, days) => { + const date = new Date(`${isoDate}T00:00:00Z`) + date.setUTCDate(date.getUTCDate() + days) + + return date.toISOString().slice(0, 10) +} + +// A conversion multi-calendar-dates can't make (an era it doesn't match) gives null +const convertOrNull = (convert) => { + try { + return convert() + } catch { + return null + } +} + +// A date of the ISO calendar (YYYY-MM-DD) in the given calendar, or null +export const fromIsoDate = (isoDate, calendar = 'gregory') => { + if (isIsoCalendar(calendar)) { + return isoDate + } + + return convertOrNull(() => { + const { year, eraYear, month, day } = convertFromIso8601( + isoDate, + calendar + ) + + return formatDate({ year: eraYear ?? year, month, day }) + }) +} + +// The date `days` later (or earlier, when negative), in the same calendar, or null +export const shiftDate = (date, days, calendar = 'gregory') => { + if (isIsoCalendar(calendar)) { + return shiftIsoDate(date, days) + } + + const isoDate = convertOrNull(() => + formatDate(convertToIso8601(date, calendar)) + ) + + return isoDate && fromIsoDate(shiftIsoDate(isoDate, days), calendar) +} diff --git a/src/modules/dataItemProfile/periods/firstLastValues.js b/src/modules/dataItemProfile/periods/firstLastValues.js new file mode 100644 index 000000000..5f9097ba9 --- /dev/null +++ b/src/modules/dataItemProfile/periods/firstLastValues.js @@ -0,0 +1,153 @@ +import { PERIOD_AGGREGATION_FIRST } from '../constants.js' +import { getYear, pad } from './calendarDates.js' +import { memoize } from './memoize.js' +import { + getFixedPeriodOfTypeByDate, + getNextPeriod, + getPreviousPeriod, +} from './periodRanges.js' + +/* How analytics answers FIRST and LAST data (checked by the test tool on 2.40 + * to 2.44): a data period counts when it ended by the end of the period asked + * for, and its year is one of the calendar years the request's periods touch. + * FIRST takes the earliest that counts, LAST the latest; none gives no value. + * So FIRST in July gives January's value, and LAST on 1 January gives + * nothing. */ + +/* A data period's year is the year it starts in, except for weeks: the year + * in the id. 2025W1, from 30 December 2024, is a 2025 period, but 2025BiW1, + * from the same day, and 2025NovQ1, from November 2024, are 2024 periods. */ +const getDataPeriodYear = (period, periodType) => + periodType.startsWith('Weekly') + ? Number(period.id.slice(0, 4)) + : getYear(period.startDate) + +// Enough to reach the last periods of the next year in the request, after a jump +const MAX_STEPS = 20 + +const getLastPeriodEndingBy = (periodType, date, calendar) => { + const holding = getFixedPeriodOfTypeByDate(periodType, date, calendar) + + if (!holding || holding.endDate <= date) { + return holding + } + + return getPreviousPeriod(periodType, holding, calendar) +} + +/* Over a gap in the years, jump to the period holding 1 January after the + * highest year left: it, or the one before it, starts in that year. Periods + * of one type don't overlap, so one that starts earlier also ended by then. */ +const getPeriodBefore = (period, { periodType, highestYear, calendar }) => { + const jumped = getFixedPeriodOfTypeByDate( + periodType, + `${pad(highestYear + 1, 4)}-01-01`, + calendar + ) + + return jumped && jumped.startDate < period.startDate + ? jumped + : getPreviousPeriod(periodType, period, calendar) +} + +const getLatestCounting = ({ periodType, dates, years, calendar }) => { + let period = getLastPeriodEndingBy(periodType, dates.endDate, calendar) + + for (let step = 0; period && step < MAX_STEPS; step++) { + const year = getDataPeriodYear(period, periodType) + + if (years.includes(year)) { + return period + } + + const lowerYears = years.filter((otherYear) => otherYear < year) + + if (!lowerYears.length) { + return null + } + + period = getPeriodBefore(period, { + periodType, + highestYear: Math.max(...lowerYears), + calendar, + }) + } + + return null +} + +const getEarliestCounting = ({ periodType, dates, years, calendar }) => { + const firstYear = Math.min(...years) + let period = getFixedPeriodOfTypeByDate( + periodType, + `${pad(firstYear, 4)}-01-01`, + calendar + ) + + for (let step = 0; period && step < MAX_STEPS; step++) { + if (getDataPeriodYear(period, periodType) >= firstYear) { + return period.endDate <= dates.endDate ? period : null + } + + period = getNextPeriod(periodType, period, calendar) + } + + return null +} + +/** + * The data period whose value analytics returns for FIRST or LAST data of + * `periodType`, in a period with `dates`, when the request touches the + * calendar `years`; null when there is none. + */ +const findFirstOrLastValuePeriod = memoize( + ({ periodAggregationType, ...query }) => + periodAggregationType === PERIOD_AGGREGATION_FIRST + ? getEarliestCounting(query) + : getLatestCounting(query), + { + getKey: ({ + periodAggregationType, + periodType, + dates, + years, + calendar, + }) => + [ + periodAggregationType, + periodType, + dates.startDate, + dates.endDate, + years.join(','), + calendar, + ].join('|'), + } +) + +export const getFirstOrLastValuePeriod = ({ + periodAggregationType, + periodType, + dates, + years, + calendar = 'gregory', +}) => + years.length + ? findFirstOrLastValuePeriod({ + periodAggregationType, + periodType, + dates, + years, + calendar, + }) + : null + +// The calendar years a range's dates fall in +export const getYearsTouched = ({ startDate, endDate }) => { + const years = [] + + for (let year = getYear(startDate); year <= getYear(endDate); year++) { + years.push(year) + } + + return years +} diff --git a/src/modules/dataItemProfile/periods/memoize.js b/src/modules/dataItemProfile/periods/memoize.js new file mode 100644 index 000000000..1744af149 --- /dev/null +++ b/src/modules/dataItemProfile/periods/memoize.js @@ -0,0 +1,25 @@ +/* A cache for pure functions with a few small arguments. Period lookups in + * multi-calendar-dates build a whole year of periods each time, about 7 ms: + * the checks make thousands of them. The cache is cleared when it holds + * `maxSize` entries, which bounds memory without tracking use. `getKey` + * turns the arguments into the cache key (joined by default). */ +export const memoize = ( + fn, + { maxSize = 2000, getKey = (...args) => args.join('|') } = {} +) => { + const cache = new Map() + + return (...args) => { + const key = getKey(...args) + + if (!cache.has(key)) { + if (cache.size >= maxSize) { + cache.clear() + } + + cache.set(key, fn(...args)) + } + + return cache.get(key) + } +} diff --git a/src/modules/dataItemProfile/periods/multiCalendarPatches.js b/src/modules/dataItemProfile/periods/multiCalendarPatches.js new file mode 100644 index 000000000..cb5fb6e98 --- /dev/null +++ b/src/modules/dataItemProfile/periods/multiCalendarPatches.js @@ -0,0 +1,58 @@ +import { formatDate } from './calendarDates.js' + +/* Workarounds for multi-calendar-dates 1.3.2, to remove once it is fixed + * upstream. November period types name the year they end in: 2025Nov is + * November 2024 to October 2025, 2025NovQ1 November 2024 to January 2025. + * The library can't read the quarters and six-months ids, gives them ids the + * server doesn't know (2024NovemberQ1), and puts 2025Nov a year late. Only the + * ISO calendar is patched. */ + +const NOVEMBER_PERIOD_ID = /^(\d{4})Nov(?:(Q)([1-4])|(S)([12]))?$/ + +const NOVEMBER_PERIOD_TYPES = { + FinancialNov: { idPart: '', months: 12 }, + QuarterlyNov: { idPart: 'Q', months: 3 }, + SixMonthlyNov: { idPart: 'S', months: 6 }, +} + +export const isNovemberPeriodId = (periodId) => + NOVEMBER_PERIOD_ID.test(periodId) + +const NOVEMBER_PERIOD_TYPE_NAMES = new Set(Object.keys(NOVEMBER_PERIOD_TYPES)) + +export const isNovemberPeriodType = (periodType) => + NOVEMBER_PERIOD_TYPE_NAMES.has(periodType) + +const toDateString = (date) => + formatDate({ + year: date.getUTCFullYear(), + month: date.getUTCMonth() + 1, + day: date.getUTCDate(), + }) + +export const getNovemberPeriodDates = (periodId) => { + const [, year, quarter, quarterNumber, sixMonths, sixMonthsNumber] = + periodId.match(NOVEMBER_PERIOD_ID) + const idPart = quarter ?? sixMonths ?? '' + const number = quarterNumber ?? sixMonthsNumber + const { months } = Object.values(NOVEMBER_PERIOD_TYPES).find( + (type) => type.idPart === idPart + ) + const firstMonth = 10 + (Number(number ?? 1) - 1) * months + const start = new Date(Date.UTC(Number(year) - 1, firstMonth, 1)) + const end = new Date(Date.UTC(Number(year) - 1, firstMonth + months, 0)) + + return { startDate: toDateString(start), endDate: toDateString(end) } +} + +// The November period that holds an ISO date +export const getNovemberPeriodByDate = (periodType, date) => { + const { idPart, months } = NOVEMBER_PERIOD_TYPES[periodType] + const [year, month] = date.split('-').map(Number) + const endYear = month >= 11 ? year + 1 : year + const monthsSinceNovember = (month + 1) % 12 + const number = Math.floor(monthsSinceNovember / months) + 1 + const id = `${endYear}Nov${idPart && idPart + number}` + + return { id, ...getNovemberPeriodDates(id) } +} diff --git a/src/modules/dataItemProfile/periods/periodRanges.js b/src/modules/dataItemProfile/periods/periodRanges.js new file mode 100644 index 000000000..0de87660c --- /dev/null +++ b/src/modules/dataItemProfile/periods/periodRanges.js @@ -0,0 +1,176 @@ +import { + createFixedPeriodFromPeriodId, + generateFixedPeriods, +} from '@dhis2/multi-calendar-dates' +import { SERVER_PT_TO_MULTI_CALENDAR_PT } from '../../../components/PeriodDimension/utils/enabledPeriodTypes.js' +import { getYear, isIsoCalendar, shiftDate } from './calendarDates.js' +import { memoize } from './memoize.js' +import { + getNovemberPeriodByDate, + getNovemberPeriodDates, + isNovemberPeriodId, + isNovemberPeriodType, +} from './multiCalendarPatches.js' +import { getPeriodTypeOfPeriodId } from './periodTypes.js' + +/* A period range is { startDate, endDate }, YYYY-MM-DD strings in one + * calendar, so they compare as strings */ + +const isYearLongType = (libraryPeriodType) => + libraryPeriodType === 'YEARLY' || libraryPeriodType.startsWith('FY') + +/* Every period of a type in one year of the calendar (yearly and financial + * types: the one starting that year), built once */ +const getPeriodsOfYear = memoize( + (libraryPeriodType, year, calendar) => { + try { + return generateFixedPeriods({ + year, + periodType: libraryPeriodType, + calendar, + locale: 'en', + ...(isYearLongType(libraryPeriodType) && { yearsCount: 1 }), + }) + } catch { + return [] + } + }, + { maxSize: 500 } +) + +const readPeriodDates = memoize((periodId, calendar) => { + if (isNovemberPeriodId(periodId)) { + return isIsoCalendar(calendar) ? getNovemberPeriodDates(periodId) : null + } + + // The id names its year: the period is in that year's list + const libraryPeriodType = + SERVER_PT_TO_MULTI_CALENDAR_PT[getPeriodTypeOfPeriodId(periodId)] + const listed = + libraryPeriodType && + getPeriodsOfYear( + libraryPeriodType, + Number(periodId.slice(0, 4)), + calendar + ).find(({ id }) => id === periodId) + + if (listed) { + return { startDate: listed.startDate, endDate: listed.endDate } + } + + try { + const { startDate, endDate } = createFixedPeriodFromPeriodId({ + periodId, + calendar, + }) + + return { startDate, endDate } + } catch { + return null + } +}) + +// A fixed period's range, or null for an id that can't be read +export const getPeriodDates = (periodId, calendar = 'gregory') => + readPeriodDates(periodId, calendar) + +// Weeks and financial years can start in the year before or end in the year after +const findPeriodHolding = (libraryPeriodType, date, calendar) => { + const year = getYear(date) + + for (const candidateYear of [year, year - 1, year + 1]) { + const period = getPeriodsOfYear( + libraryPeriodType, + candidateYear, + calendar + ).find(({ startDate, endDate }) => startDate <= date && date <= endDate) + + if (period) { + const { id, startDate, endDate } = period + + return { id, startDate, endDate } + } + } + + return null +} + +// The period of `periodType` that holds `date` ({ id, startDate, endDate }), or null +export const getFixedPeriodOfTypeByDate = ( + periodType, + date, + calendar = 'gregory' +) => { + if (!date) { + return null + } + + if (isNovemberPeriodType(periodType)) { + return isIsoCalendar(calendar) + ? getNovemberPeriodByDate(periodType, date) + : null + } + + const libraryPeriodType = SERVER_PT_TO_MULTI_CALENDAR_PT[periodType] + + return libraryPeriodType + ? findPeriodHolding(libraryPeriodType, date, calendar) + : null +} + +// The period of the same type just before or just after `period`, or null +export const getPreviousPeriod = (periodType, period, calendar = 'gregory') => + getFixedPeriodOfTypeByDate( + periodType, + shiftDate(period.startDate, -1, calendar), + calendar + ) + +export const getNextPeriod = (periodType, period, calendar = 'gregory') => + getFixedPeriodOfTypeByDate( + periodType, + shiftDate(period.endDate, 1, calendar), + calendar + ) + +/** + * The range from the start of the `periodType` period holding the start of + * `range`, to the end of the one holding its end: the whole periods of that + * type that cover it. Null when it can't be told. + */ +export const getCoveringPeriodRange = ( + range, + periodType, + calendar = 'gregory' +) => { + const first = getFixedPeriodOfTypeByDate( + periodType, + range.startDate, + calendar + ) + const last = getFixedPeriodOfTypeByDate(periodType, range.endDate, calendar) + + if (!first || !last) { + return null + } + + return { startDate: first.startDate, endDate: last.endDate } +} + +/** + * Whether a range starts and ends on the edges of `periodType` periods, so + * data of that type fits it exactly (a quarter on monthly data, not a month on + * weekly data). Null when it can't be told. + */ +export const isAlignedWithPeriodType = ( + range, + periodType, + calendar = 'gregory' +) => { + const covering = getCoveringPeriodRange(range, periodType, calendar) + + return covering + ? covering.startDate === range.startDate && + covering.endDate === range.endDate + : null +} diff --git a/src/modules/dataItemProfile/periods/periodTypes.js b/src/modules/dataItemProfile/periods/periodTypes.js new file mode 100644 index 000000000..114fb1c30 --- /dev/null +++ b/src/modules/dataItemProfile/periods/periodTypes.js @@ -0,0 +1,157 @@ +import { + FINANCIAL_YEAR_START_TO_PERIOD_TYPE, + SERVER_PT_TO_MULTI_CALENDAR_PT, + WEEKLY_START_TO_PERIOD_TYPE, +} from '../../../components/PeriodDimension/utils/enabledPeriodTypes.js' +import { PERIOD_TYPE_REGEX } from '../../../components/PeriodDimension/utils/fixedPeriods.js' +import { getRelativePeriodsDetails } from '../../../components/PeriodDimension/utils/relativePeriods.js' +import { PERIOD_TYPE_FREQUENCY_ORDER, PERIOD_TYPES } from '../constants.js' + +const PERIOD_TYPE_NAMES = new Set(PERIOD_TYPES) + +export const isPeriodType = (value) => PERIOD_TYPE_NAMES.has(value) + +export const getFrequencyOrder = (periodType) => + PERIOD_TYPE_FREQUENCY_ORDER[periodType] + +// Shortest first, then in the server's order +export const sortPeriodTypes = (periodTypes) => + [...periodTypes].sort( + (a, b) => + getFrequencyOrder(a) - getFrequencyOrder(b) || + PERIOD_TYPES.indexOf(a) - PERIOD_TYPES.indexOf(b) + ) + +/** + * Whether analytics adds up values of data sets with `dataPeriodType` into + * periods of `queryPeriodType`: it does into the same type and into any + * longer type (a higher frequencyOrder), even when the periods don't nest + * (Wednesday weeks into BiWeekly, checked by the test tool). A type of the + * same length gets nothing (Wednesday weeks asked by Monday week). Null when + * either type is unknown. + */ +export const canAggregateInto = (dataPeriodType, queryPeriodType) => { + if (!isPeriodType(dataPeriodType) || !isPeriodType(queryPeriodType)) { + return null + } + + return ( + dataPeriodType === queryPeriodType || + getFrequencyOrder(queryPeriodType) > getFrequencyOrder(dataPeriodType) + ) +} + +/* VERSION-TOGGLE: remove when 41 is the lowest supported version. Analytics + * fails on QuarterlyNov periods in 2.40 ("Can't find resource for bundle … + * key format.QuarterlyNov.startDate"), and answers from 2.41. */ +const MIN_MINOR_VERSION_BY_PERIOD_TYPE = { QuarterlyNov: 41 } + +// Without a server version, every type counts as supported +export const isPeriodTypeSupported = (periodType, serverVersion) => + !serverVersion || + serverVersion.major > 2 || + serverVersion.minor >= (MIN_MINOR_VERSION_BY_PERIOD_TYPE[periodType] ?? 0) + +const SERVER_PERIOD_TYPE_BY_LIBRARY_TYPE = Object.fromEntries( + Object.entries(SERVER_PT_TO_MULTI_CALENDAR_PT).map( + ([serverType, libraryType]) => [libraryType, serverType] + ) +) + +/* The period picker's PERIOD_TYPE_REGEX leaves out the November quarters and + * six-months, since it doesn't offer them; analytics answers them */ +const PERIOD_ID_PATTERNS = [ + ...Object.entries(PERIOD_TYPE_REGEX).map(([libraryType, regex]) => [ + SERVER_PERIOD_TYPE_BY_LIBRARY_TYPE[libraryType], + regex, + ]), + ['QuarterlyNov', /^(\d{4})NovQ([1-4])$/], + ['SixMonthlyNov', /^(\d{4})NovS([12])$/], +] + +export const getPeriodTypeOfPeriodId = (periodId) => + PERIOD_ID_PATTERNS.find(([, regex]) => regex.test(periodId))?.[0] ?? null + +let relativePeriodShapes + +/* The type (category), offset and duration of a relative period, or + * undefined: PeriodDimension builds its table, with names, on each call */ +export const getRelativePeriodShape = (periodId) => { + relativePeriodShapes ??= Object.fromEntries( + Object.values(getRelativePeriodsDetails()).map( + ({ id, type, offset, duration }) => [id, { type, offset, duration }] + ) + ) + + return relativePeriodShapes[periodId] +} + +const WEEKLY_PERIOD_TYPES = PERIOD_TYPES.filter((type) => + type.startsWith('Weekly') +) +const FINANCIAL_PERIOD_TYPES = PERIOD_TYPES.filter((type) => + type.startsWith('Financial') +) + +// The period type of each relative period category; weeks and financial years depend on a setting +const PERIOD_TYPE_BY_RELATIVE_CATEGORY = { + DAILY: 'Daily', + BIWEEKLY: 'BiWeekly', + MONTHLY: 'Monthly', + BIMONTHLY: 'BiMonthly', + QUARTERLY: 'Quarterly', + SIXMONTHLY: 'SixMonthly', + YEARLY: 'Yearly', +} + +/* Relative weeks and financial years follow the analyticsWeeklyStart and + * analyticsFinancialYearStart settings. Without them, every type they could + * be is returned. */ +const getRelativePeriodTypes = (category, options) => { + if (category === 'WEEKLY') { + return options.weeklyPeriodType + ? [options.weeklyPeriodType] + : WEEKLY_PERIOD_TYPES + } + + if (category === 'FINANCIAL') { + return options.financialYearPeriodType + ? [options.financialYearPeriodType] + : FINANCIAL_PERIOD_TYPES + } + + const periodType = PERIOD_TYPE_BY_RELATIVE_CATEGORY[category] + + return periodType ? [periodType] : [] +} + +/** + * The period types a period can be: one for a fixed period or a period type, + * several for a relative period whose type depends on a server setting, none + * when it isn't recognized. + */ +export const getCandidatePeriodTypes = (period, options = {}) => { + if (isPeriodType(period)) { + return [period] + } + + const fixedPeriodType = getPeriodTypeOfPeriodId(period) + + if (fixedPeriodType) { + return [fixedPeriodType] + } + + const category = getRelativePeriodShape(period)?.type + + return category ? getRelativePeriodTypes(category, options) : [] +} + +// The options getCandidatePeriodTypes needs, from the two server settings +export const getRelativePeriodTypeOptions = ({ + analyticsWeeklyStart, + analyticsFinancialYearStart, +} = {}) => ({ + weeklyPeriodType: WEEKLY_START_TO_PERIOD_TYPE[analyticsWeeklyStart], + financialYearPeriodType: + FINANCIAL_YEAR_START_TO_PERIOD_TYPE[analyticsFinancialYearStart], +}) diff --git a/src/modules/dataItemProfile/periods/relativePeriodRanges.js b/src/modules/dataItemProfile/periods/relativePeriodRanges.js new file mode 100644 index 000000000..654c641ee --- /dev/null +++ b/src/modules/dataItemProfile/periods/relativePeriodRanges.js @@ -0,0 +1,114 @@ +import { fromIsoDate, pad } from './calendarDates.js' +import { memoize } from './memoize.js' +import { + getFixedPeriodOfTypeByDate, + getNextPeriod, + getPreviousPeriod, +} from './periodRanges.js' +import { getRelativePeriodShape, isPeriodType } from './periodTypes.js' + +// Today in the user's time zone, as an ISO date +const getLocalIsoDate = () => { + const now = new Date() + + return [ + now.getFullYear(), + pad(now.getMonth() + 1), + pad(now.getDate()), + ].join('-') +} + +// Far more than the longest relative period (LAST_52_WEEKS, LAST_180_DAYS…) +const MAX_PERIODS = 400 + +const stepPeriods = (period, steps, { periodType, calendar }) => { + const step = steps < 0 ? getPreviousPeriod : getNextPeriod + let current = period + + for (let i = 0; current && i < Math.abs(steps); i++) { + current = step(periodType, current, calendar) + } + + return current +} + +// Weeks belong to the year that holds their Thursday: 4 January and 28 December always do +const getYearEdges = (periodType, year) => + periodType.startsWith('Weekly') + ? [`${pad(year, 4)}-01-04`, `${pad(year, 4)}-12-28`] + : [`${pad(year, 4)}-01-01`, `${pad(year, 4)}-12-31`] + +/* The first and last fixed periods of a relative period: from the period + * holding `date`, `offset` periods away for the last one, `duration` periods + * long. The "this year" ones (MONTHS_THIS_YEAR…) cover every period of the + * year. */ +const getEdgePeriods = (periodId, date, { periodType, calendar }) => { + const { offset, duration } = getRelativePeriodShape(periodId) + + if (periodId.endsWith('_THIS_YEAR')) { + return getYearEdges(periodType, Number(date.slice(0, 4))).map((edge) => + getFixedPeriodOfTypeByDate(periodType, edge, calendar) + ) + } + + const current = getFixedPeriodOfTypeByDate(periodType, date, calendar) + const context = { periodType, calendar } + const last = current && stepPeriods(current, offset, context) + const first = last && stepPeriods(last, -(duration - 1), context) + + return [first, last] +} + +const resolveRelativePeriod = memoize( + (periodId, periodType, { calendar, date }) => { + const [first, last] = getEdgePeriods(periodId, date, { + periodType, + calendar, + }) + + if (!first || !last) { + return null + } + + const periods = [first] + + while (periods.at(-1).id !== last.id && periods.length < MAX_PERIODS) { + const next = getNextPeriod(periodType, periods.at(-1), calendar) + + if (!next) { + return null + } + + periods.push(next) + } + + return periods + }, + { + getKey: (periodId, periodType, { calendar, date }) => + [periodId, periodType, calendar, date].join('|'), + } +) + +/** + * The fixed periods of `periodType` a relative period covers, as analytics + * resolves it on `relativePeriodDate` (an ISO date, today by default), in + * date order; null when it can't be told. + */ +export const getRelativePeriodFixedPeriods = ( + periodId, + periodType, + { calendar = 'gregory', relativePeriodDate } = {} +) => { + const date = fromIsoDate(relativePeriodDate ?? getLocalIsoDate(), calendar) + + if ( + !getRelativePeriodShape(periodId) || + !isPeriodType(periodType) || + !date + ) { + return null + } + + return resolveRelativePeriod(periodId, periodType, { calendar, date }) +} diff --git a/src/modules/dataItemProfile/profile/__tests__/assignedOrgUnitLevels.spec.js b/src/modules/dataItemProfile/profile/__tests__/assignedOrgUnitLevels.spec.js new file mode 100644 index 000000000..7fb8f2f35 --- /dev/null +++ b/src/modules/dataItemProfile/profile/__tests__/assignedOrgUnitLevels.spec.js @@ -0,0 +1,87 @@ +import { + getAssignedOrgUnitLevels, + addAssignedOrgUnitLevels, +} from '../assignedOrgUnitLevels.js' + +const source = (id, assignedOrgUnitCounts) => ({ + dataSet: id && { id, periodType: 'Monthly' }, + elements: [], + reportingRate: false, + ...(assignedOrgUnitCounts && { assignedOrgUnitCounts }), +}) + +describe('getAssignedOrgUnitLevels', () => { + it('gives the levels assigned, deepest first, and the deepest', () => { + expect( + getAssignedOrgUnitLevels([source('formA', { 1: 1, 2: 0, 4: 1159 })]) + ).toEqual({ levels: [4, 1], deepestLevel: 4, hasSeveral: false }) + }) + + it('has several when data sets are assigned at different deepest levels', () => { + expect( + getAssignedOrgUnitLevels([ + source('formA', { 4: 10 }), + source('formB', { 2: 3 }), + ]) + ).toEqual({ levels: [4, 2], deepestLevel: 4, hasSeveral: true }) + }) + + it('has no level without assignments', () => { + expect( + getAssignedOrgUnitLevels([source('formA', {}), source(null)]) + ).toEqual({ + levels: [], + deepestLevel: null, + hasSeveral: false, + }) + }) +}) + +describe('addAssignedOrgUnitLevels', () => { + it('gives each source its counts, and the profile its assigned org unit levels', () => { + const profile = { + sources: [source('formA'), source(null)], + unknown: false, + reasons: [], + assignedPeriodTypes: { types: ['Monthly'] }, + } + + expect(addAssignedOrgUnitLevels(profile, { formA: { 4: 2 } })).toEqual({ + ...profile, + sources: [source('formA', { 4: 2 }), source(null)], + assignedOrgUnitLevels: { + levels: [4], + deepestLevel: 4, + hasSeveral: false, + }, + }) + expect( + addAssignedOrgUnitLevels(profile, {}).sources[0] + .assignedOrgUnitCounts + ).toEqual({}) + }) + + it('gives no levels to a program indicator placed anywhere', () => { + const placedAnywhere = { + dataSet: null, + program: { id: 'programAAA' }, + orgUnitField: 'REGISTRATION', + elements: [], + reportingRate: false, + } + + expect( + addAssignedOrgUnitLevels( + { sources: [placedAnywhere] }, + { programAAA: { 4: 2 } } + ) + ).toEqual({ + sources: [placedAnywhere], + assignedOrgUnitLevels: { + levels: [], + deepestLevel: null, + hasSeveral: false, + }, + }) + }) +}) diff --git a/src/modules/dataItemProfile/profile/assignedOrgUnitLevels.js b/src/modules/dataItemProfile/profile/assignedOrgUnitLevels.js new file mode 100644 index 000000000..1ee8d558f --- /dev/null +++ b/src/modules/dataItemProfile/profile/assignedOrgUnitLevels.js @@ -0,0 +1,56 @@ +import { canBeAtAnyOrgUnit, getSourceId } from '../sources.js' + +// The levels with at least one org unit, from counts by level +export const getLevelsWithOrgUnits = (countsByLevel = {}) => + Object.keys(countsByLevel) + .map(Number) + .filter((level) => countsByLevel[level] > 0) + +/** + * The org unit levels an item's data sets and programs are assigned at, + * deepest first, from each source's `assignedOrgUnitCounts`; the deepest + * (`deepestLevel`); and whether sources have different deepest levels + * (`hasSeveral`). + */ +export const getAssignedOrgUnitLevels = (sources) => { + const levelsBySource = sources + .filter(({ assignedOrgUnitCounts }) => assignedOrgUnitCounts) + .map(({ assignedOrgUnitCounts }) => + getLevelsWithOrgUnits(assignedOrgUnitCounts) + ) + const levels = [...new Set(levelsBySource.flat())].sort((a, b) => b - a) + const deepestOfEach = levelsBySource + .filter((sourceLevels) => sourceLevels.length) + .map((sourceLevels) => Math.max(...sourceLevels)) + + return { + levels, + deepestLevel: levels[0] ?? null, + hasSeveral: new Set(deepestOfEach).size > 1, + } +} + +/** + * The profile with its assigned org unit levels, from the number of org units + * each data set or program is assigned to per level (`{ [sourceId]: + * { [level]: count } }`, as fetchAssignedOrgUnitCounts gives them): each + * source gains its `assignedOrgUnitCounts`, except program indicators whose + * values can be at any org unit. + */ +export const addAssignedOrgUnitLevels = (profile, assignedOrgUnitCounts) => { + const sources = profile.sources.map((source) => + getSourceId(source) && !canBeAtAnyOrgUnit(source) + ? { + ...source, + assignedOrgUnitCounts: + assignedOrgUnitCounts[getSourceId(source)] ?? {}, + } + : source + ) + + return { + ...profile, + sources, + assignedOrgUnitLevels: getAssignedOrgUnitLevels(sources), + } +} diff --git a/src/modules/dataItemProfile/profile/assignedPeriodTypes.js b/src/modules/dataItemProfile/profile/assignedPeriodTypes.js new file mode 100644 index 000000000..cdbcb8850 --- /dev/null +++ b/src/modules/dataItemProfile/profile/assignedPeriodTypes.js @@ -0,0 +1,39 @@ +import { PERIOD_TYPES } from '../constants.js' +import { + canAggregateInto, + isPeriodType, + sortPeriodTypes, +} from '../periods/periodTypes.js' + +// The source's period type, or null for a program, an element in no data set, or an unknown type +export const getSourcePeriodType = ({ dataSet }) => + isPeriodType(dataSet?.periodType) ? dataSet.periodType : null + +/* The shortest query type that every type adds up into: the longest of them + * when they nest, the next type up when two have the same length (Monday and + * Wednesday weeks: BiWeekly) */ +const getShortestDirectType = (periodTypes) => + sortPeriodTypes(PERIOD_TYPES).find((queryPeriodType) => + periodTypes.every((periodType) => + canAggregateInto(periodType, queryPeriodType) + ) + ) ?? null + +/** + * The period types of the data sets an item is assigned to, shortest first; + * `shortestDirectType`, the shortest type at which every value adds up + * directly (shorter ones get repeated or earlier values, or none, see + * getDataItemProfilePeriodCompatibility), or null when nothing is assigned by + * period (event data); and whether there are several types (`hasSeveral`). + */ +export const getAssignedPeriodTypes = (sources) => { + const types = sortPeriodTypes([ + ...new Set(sources.map(getSourcePeriodType).filter(Boolean)), + ]) + + return { + types, + shortestDirectType: types.length ? getShortestDirectType(types) : null, + hasSeveral: types.length > 1, + } +} diff --git a/src/modules/dataItemProfile/profile/collectSources.js b/src/modules/dataItemProfile/profile/collectSources.js new file mode 100644 index 000000000..7169293b2 --- /dev/null +++ b/src/modules/dataItemProfile/profile/collectSources.js @@ -0,0 +1,318 @@ +import { REPORTING_RATE } from '../../dataSets.js' +import { + DIMENSION_TYPE_DATA_ELEMENT, + DIMENSION_TYPE_DATA_ELEMENT_OPERAND, + DIMENSION_TYPE_EVENT_DATA_ITEM, + DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM, + DIMENSION_TYPE_INDICATOR, + DIMENSION_TYPE_PROGRAM_ATTRIBUTE, + DIMENSION_TYPE_PROGRAM_ATTRIBUTE_OPTION, + DIMENSION_TYPE_PROGRAM_DATA_ELEMENT, + DIMENSION_TYPE_PROGRAM_DATA_ELEMENT_OPTION, + DIMENSION_TYPE_PROGRAM_INDICATOR, +} from '../../dataTypes.js' +import { + NOT_AGGREGATABLE_AGGREGATION_TYPES, + SKIP_IF_ALL_VALUES_MISSING, + SKIP_IF_ANY_VALUE_MISSING, + PERIOD_AGGREGATION_AVERAGE, + PERIOD_AGGREGATION_FIRST, + PERIOD_AGGREGATION_LAST, + OPERAND_TYPE_UNKNOWN, + PROFILE_REASON_MISSING_METADATA, + PROFILE_REASON_MISSING_PROGRAM, + PROFILE_REASON_NO_DATA_SET, + PROFILE_REASON_NOT_AGGREGATABLE, + PROFILE_REASON_UNKNOWN_OPERAND, + PROFILE_REASON_UNSUPPORTED_ITEM_TYPE, +} from '../constants.js' +import { + getCategoryOptionComboId, + parseExpressionOperands, +} from '../expressionOperands.js' +import { + getElementOperandKey, + getProgramOperandKey, + getReportingRateOperandKey, +} from '../sources.js' +import { + addElementToSource, + addReason, + checkDataSetPeriodType, + createCollector, + getDataSetSource, + getProgramSource, + getUnassignedElementSource, +} from './sourceCollector.js' + +/* How each aggregation type aggregates over time, when it differs from the + * type itself (dhis2-core AnalyticsAggregationType.fromAggregationType) */ +const PERIOD_AGGREGATION_BY_AGGREGATION_TYPE = { + AVERAGE_SUM_ORG_UNIT: PERIOD_AGGREGATION_AVERAGE, + LAST_AVERAGE_ORG_UNIT: PERIOD_AGGREGATION_LAST, + LAST_LAST_ORG_UNIT: PERIOD_AGGREGATION_LAST, + LAST_IN_PERIOD_AVERAGE_ORG_UNIT: 'LAST_IN_PERIOD', + FIRST_AVERAGE_ORG_UNIT: PERIOD_AGGREGATION_FIRST, + FIRST_FIRST_ORG_UNIT: PERIOD_AGGREGATION_FIRST, + MAX_SUM_ORG_UNIT: 'MAX', + MIN_SUM_ORG_UNIT: 'MIN', +} + +export const getPeriodAggregationType = (aggregationType) => + PERIOD_AGGREGATION_BY_AGGREGATION_TYPE[aggregationType] ?? aggregationType + +/* Each add* function adds the sources of an operand and gives its part of + * the item's expression: `{ operand: key }` for an operand (sources.js keys), + * `{ missingValueStrategy, parts }` for an expression, null when its metadata + * is missing. */ + +const toPart = (key) => ({ operand: key }) + +/* A disaggregation (de.coc) is collected only by the data sets whose + * category combo holds its option combo: others give the element another + * combo. When either combo isn't known, every data set counts. */ +const getCollectingDataSets = (dataSets, { operand, metadata }) => { + const optionComboId = getCategoryOptionComboId(operand) + const categoryComboId = + optionComboId && + metadata.categoryOptionCombos?.[optionComboId]?.categoryComboId + + return categoryComboId + ? dataSets.filter( + (dataSet) => + !dataSet.categoryComboId || + dataSet.categoryComboId === categoryComboId + ) + : dataSets +} + +const addDataElement = ( + collector, + metadata, + { id, operand, aggregationType: aggregationTypeOverride } +) => { + const dataElement = metadata.dataElements?.[id] + + if (!dataElement) { + addReason(collector, { code: PROFILE_REASON_MISSING_METADATA, id }) + return null + } + + const aggregationType = + aggregationTypeOverride ?? dataElement.aggregationType + const dataSets = getCollectingDataSets(dataElement.dataSets ?? [], { + operand, + metadata, + }) + /* `operand`: the disaggregation analytics is asked for (de.coc), if any. + * `aggregationLevels`: the org unit levels values from lower levels stop at */ + const element = { + id, + ...(operand && { operand }), + aggregationType, + periodAggregationType: getPeriodAggregationType(aggregationType), + ...(dataElement.aggregationLevels?.length && { + aggregationLevels: dataElement.aggregationLevels, + }), + } + + if (NOT_AGGREGATABLE_AGGREGATION_TYPES.has(aggregationType)) { + addReason(collector, { code: PROFILE_REASON_NOT_AGGREGATABLE, id }) + } + + if (!dataSets.length) { + addReason(collector, { code: PROFILE_REASON_NO_DATA_SET, id }) + addElementToSource(getUnassignedElementSource(collector, id), element) + } + + dataSets.forEach((dataSet) => { + checkDataSetPeriodType(collector, id, dataSet.periodType) + addElementToSource(getDataSetSource(collector, dataSet), element) + }) + + return toPart(getElementOperandKey(element)) +} + +const addReportingRate = (collector, metadata, dataSetId) => { + const periodType = metadata.dataSets?.[dataSetId]?.periodType + + if (!periodType) { + addReason(collector, { + code: PROFILE_REASON_MISSING_METADATA, + id: dataSetId, + }) + return null + } + + checkDataSetPeriodType(collector, dataSetId, periodType) + getDataSetSource(collector, { + id: dataSetId, + periodType, + }).reportingRate = true + + return toPart(getReportingRateOperandKey(dataSetId)) +} + +const toProgramPart = (source) => + source ? toPart(getProgramOperandKey(source)) : null + +const addProgramIndicator = (collector, metadata, id) => { + const programIndicator = metadata.programIndicators?.[id] + + if (!programIndicator?.program) { + addReason(collector, { code: PROFILE_REASON_MISSING_METADATA, id }) + return null + } + + return toProgramPart( + getProgramSource(collector, metadata, { + id: programIndicator.program, + orgUnitField: programIndicator.orgUnitField, + missingPeriodBoundaries: + programIndicator.hasPeriodBoundaries === false, + }) + ) +} + +// An event or tracker item named by its program: program.element, program.attribute… +const addProgramItem = (collector, metadata, id) => { + if (!id.includes('.')) { + addReason(collector, { code: PROFILE_REASON_MISSING_PROGRAM, id }) + return null + } + + return toProgramPart( + getProgramSource(collector, metadata, { id: id.split('.')[0] }) + ) +} + +const addOperand = (collector, metadata, operand) => { + switch (operand.type) { + case DIMENSION_TYPE_DATA_ELEMENT: + return addDataElement(collector, metadata, operand) + case REPORTING_RATE: + return addReportingRate(collector, metadata, operand.id) + case DIMENSION_TYPE_INDICATOR: + return addIndicator(collector, metadata, operand.id) + case DIMENSION_TYPE_PROGRAM_INDICATOR: + return addProgramIndicator(collector, metadata, operand.id) + case DIMENSION_TYPE_PROGRAM_DATA_ELEMENT: + case DIMENSION_TYPE_PROGRAM_ATTRIBUTE: + return addProgramItem(collector, metadata, operand.id) + case OPERAND_TYPE_UNKNOWN: + addReason(collector, { + code: PROFILE_REASON_UNKNOWN_OPERAND, + token: operand.token, + }) + return null + default: + // Constants, org unit groups and [days] have no source, and never miss + return null + } +} + +const addExpression = ( + collector, + metadata, + { expression, missingValueStrategy } +) => ({ + missingValueStrategy, + parts: parseExpressionOperands(expression) + .map((operand) => addOperand(collector, metadata, operand)) + .filter(Boolean), +}) + +// Each side skips only when all its values are missing; the indicator needs both +const addIndicator = (collector, metadata, id) => { + const indicator = metadata.indicators?.[id] + + if (!indicator) { + addReason(collector, { code: PROFILE_REASON_MISSING_METADATA, id }) + return null + } + + // Nested indicators (N{}) can refer to each other, which analytics refuses + if (collector.indicatorsInProgress.has(id)) { + return null + } + + collector.indicatorsInProgress.add(id) + + const sides = [indicator.numerator, indicator.denominator].map((side) => + addExpression(collector, metadata, { + expression: side, + missingValueStrategy: SKIP_IF_ALL_VALUES_MISSING, + }) + ) + + collector.indicatorsInProgress.delete(id) + + return { missingValueStrategy: SKIP_IF_ANY_VALUE_MISSING, parts: sides } +} + +/* Analytics evaluates an expression dimension item with + * SKIP_IF_ALL_VALUES_MISSING, whatever strategy it is saved with: a missing + * operand counts as 0, and no value comes back only when all are missing, + * even with NEVER_SKIP (checked by the test tool on 2.40 to 2.44) */ +const addExpressionDimensionItem = (collector, metadata, id) => { + const expression = metadata.expressionDimensionItems?.[id]?.expression + + if (expression === undefined) { + addReason(collector, { code: PROFILE_REASON_MISSING_METADATA, id }) + return null + } + + return addExpression(collector, metadata, { + expression, + missingValueStrategy: SKIP_IF_ALL_VALUES_MISSING, + }) +} + +const addItem = (collector, metadata, { id, dimensionItemType }) => { + switch (dimensionItemType) { + case DIMENSION_TYPE_DATA_ELEMENT: + case DIMENSION_TYPE_DATA_ELEMENT_OPERAND: + return addDataElement(collector, metadata, { + id: id.split('.')[0], + ...(id.includes('.') && { operand: id }), + }) + case REPORTING_RATE: + return addReportingRate(collector, metadata, id.split('.')[0]) + case DIMENSION_TYPE_INDICATOR: + return addIndicator(collector, metadata, id) + case DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM: + return addExpressionDimensionItem(collector, metadata, id) + case DIMENSION_TYPE_PROGRAM_INDICATOR: + return addProgramIndicator(collector, metadata, id) + case DIMENSION_TYPE_PROGRAM_DATA_ELEMENT: + case DIMENSION_TYPE_PROGRAM_DATA_ELEMENT_OPTION: + case DIMENSION_TYPE_PROGRAM_ATTRIBUTE: + case DIMENSION_TYPE_PROGRAM_ATTRIBUTE_OPTION: + case DIMENSION_TYPE_EVENT_DATA_ITEM: + return addProgramItem(collector, metadata, id) + default: + addReason(collector, { + code: PROFILE_REASON_UNSUPPORTED_ITEM_TYPE, + id, + dimensionItemType, + }) + return null + } +} + +/** + * The sources of a data item ({ id, dimensionItemType }), from its metadata + * (fetchDataItemProfileMetadata), with the reasons the profile can't be told + * or should note, and for an indicator or expression dimension item its + * `expression`: how its operands combine. + */ +export const collectSources = (item, metadata) => { + const collector = createCollector() + const part = addItem(collector, metadata, item) + + return { + sources: [...collector.sources.values()], + reasons: collector.reasons, + ...(part?.parts && { expression: part }), + } +} diff --git a/src/modules/dataItemProfile/profile/sourceCollector.js b/src/modules/dataItemProfile/profile/sourceCollector.js new file mode 100644 index 000000000..7ead7f1f6 --- /dev/null +++ b/src/modules/dataItemProfile/profile/sourceCollector.js @@ -0,0 +1,96 @@ +import { + PROFILE_REASON_MISSING_METADATA, + PROFILE_REASON_UNKNOWN_PERIOD_TYPE, +} from '../constants.js' +import { isPeriodType } from '../periods/periodTypes.js' +import { usesProgramOrgUnits } from '../sources.js' + +/* Sources, by key: one per data set; one per program, and per way its + * indicators place values; one per data element in no data set */ + +export const createCollector = () => ({ + sources: new Map(), + reasons: [], + // The indicators being read, against indicators that refer to each other + indicatorsInProgress: new Set(), +}) + +export const addReason = (collector, reason) => collector.reasons.push(reason) + +const getSource = (collector, key, createSource) => { + if (!collector.sources.has(key)) { + collector.sources.set(key, createSource()) + } + + return collector.sources.get(key) +} + +export const getDataSetSource = (collector, { id, periodType }) => + getSource(collector, `dataSet:${id}`, () => ({ + dataSet: { id, periodType }, + elements: [], + reportingRate: false, + })) + +export const getUnassignedElementSource = (collector, elementId) => + getSource(collector, `element:${elementId}`, () => ({ + dataSet: null, + elements: [], + reportingRate: false, + })) + +/* A program is a source of its own: events and enrollments are placed by + * their own dates, so it has no period type, and by the org units it's + * assigned to. A program indicator that places values elsewhere, or has no + * period boundaries, is a source apart. */ +export const getProgramSource = ( + collector, + metadata, + { id, orgUnitField, missingPeriodBoundaries = false } +) => { + if (!metadata.programs?.[id]) { + addReason(collector, { code: PROFILE_REASON_MISSING_METADATA, id }) + return null + } + + const atAnyOrgUnit = !usesProgramOrgUnits(orgUnitField) + const key = [ + `program:${id}`, + atAnyOrgUnit && orgUnitField, + missingPeriodBoundaries && 'missingPeriodBoundaries', + ] + .filter(Boolean) + .join(':') + + return getSource(collector, key, () => ({ + dataSet: null, + program: { id }, + ...(atAnyOrgUnit && { orgUnitField }), + ...(missingPeriodBoundaries && { missingPeriodBoundaries }), + elements: [], + reportingRate: false, + })) +} + +export const addElementToSource = (source, element) => { + const isListed = source.elements.some( + ({ id, operand, aggregationType }) => + id === element.id && + operand === element.operand && + aggregationType === element.aggregationType + ) + + if (!isListed) { + source.elements.push(element) + } +} + +export const checkDataSetPeriodType = (collector, id, periodType) => { + if (!isPeriodType(periodType)) { + addReason(collector, { + code: PROFILE_REASON_UNKNOWN_PERIOD_TYPE, + id, + periodType, + }) + } +} diff --git a/src/modules/dataItemProfile/sources.js b/src/modules/dataItemProfile/sources.js new file mode 100644 index 000000000..b0dab7c5a --- /dev/null +++ b/src/modules/dataItemProfile/sources.js @@ -0,0 +1,83 @@ +import { PROGRAM_ORG_UNIT_FIELDS } from './constants.js' + +/* A profile source is where an item's data comes from: + * - a data set: { dataSet: { id, periodType }, elements, reportingRate }; + * - a program: { dataSet: null, program: { id }, elements: [], reportingRate: false }, + * with `orgUnitField` when its values can be at any org unit, and + * `missingPeriodBoundaries` for a program indicator without them; + * - a data element in no data set: { dataSet: null, elements, reportingRate: false }, + * assigned nowhere. */ + +export const isProgramSource = ({ program }) => Boolean(program) + +// The id of the data set or program behind a source, or null +export const getSourceId = ({ dataSet, program }) => + dataSet?.id ?? program?.id ?? null + +// The org unit field that lists the org units a source is assigned to +export const getAssignmentField = (source) => + isProgramSource(source) ? 'programs' : 'dataSets' + +// Whether a program indicator's orgUnitField places values where its program is assigned +export const usesProgramOrgUnits = (orgUnitField) => + !orgUnitField || PROGRAM_ORG_UNIT_FIELDS.has(orgUnitField) + +// Whether a source's values can be at any org unit, wherever it is assigned +export const canBeAtAnyOrgUnit = ({ orgUnitField }) => + !usesProgramOrgUnits(orgUnitField) + +/* Operand keys: how a profile's expression (profile.expression) names the + * operands getItemOperands gives */ +export const getElementOperandKey = ({ id, aggregationType }) => + `element:${id}:${aggregationType}` + +export const getReportingRateOperandKey = (dataSetId) => + `reportingRate:${dataSetId}` + +export const getProgramOperandKey = ({ + program, + orgUnitField, + missingPeriodBoundaries, +}) => + [ + 'program', + program.id, + orgUnitField ?? '', + missingPeriodBoundaries ? 'missingPeriodBoundaries' : '', + ].join(':') + +/** + * The operands an item's value is computed from, each with its `key`: each + * data element (by id and aggregation type) with the sources it is in, each + * reporting rate, and each program. One element adds up over its sources; + * profile.expression says how the operands combine. + */ +export const getItemOperands = (profile) => { + const elements = new Map() + + profile.sources.forEach((source) => + source.elements.forEach((element) => { + const key = getElementOperandKey(element) + const operand = elements.get(key) ?? { key, element, sources: [] } + + operand.sources.push(source) + elements.set(key, operand) + }) + ) + + return [ + ...elements.values(), + ...profile.sources + .filter(({ reportingRate }) => reportingRate) + .map((source) => ({ + key: getReportingRateOperandKey(source.dataSet.id), + reportingRate: true, + sources: [source], + })), + ...profile.sources.filter(isProgramSource).map((source) => ({ + key: getProgramOperandKey(source), + program: true, + sources: [source], + })), + ] +} diff --git a/yarn.lock b/yarn.lock index 779e1541b..bf90a71b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2338,7 +2338,7 @@ "@js-temporal/polyfill" "0.4.3" classnames "^2.3.2" -"@dhis2/multi-calendar-dates@^1.2.2": +"@dhis2/multi-calendar-dates@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@dhis2/multi-calendar-dates/-/multi-calendar-dates-1.3.2.tgz#34e5896f7fdfb761a2ee6035d848cba00446cde5" integrity sha512-H37EptumkqZeHUpbR4wl3y2NZjeipxUNUI2VaHX28z2fbVD7O9H+k1InSskeP5nNWzTLMdPAM4lt/zQP8oRbrg==