Skip to content

Commit 18d50b5

Browse files
committed
Update incident forms
1 parent 0367b18 commit 18d50b5

4 files changed

Lines changed: 152 additions & 24 deletions

File tree

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,37 @@
1-
import { FLOOD, floodSpecificKeys, koboKeys } from '@wfp-dmp/interfaces';
1+
import {
2+
FLOOD,
3+
floodSpecificKeys,
4+
INCIDENT,
5+
incidentSpecificKeys,
6+
koboKeys,
7+
} from '@wfp-dmp/interfaces';
28
import dayjs from 'dayjs';
39

410
import { FloodFormType } from 'components/FormValidation/FloodFormValidation/FloodFormType';
11+
import { IncidentFormType } from 'components/FormValidation/IncidentFormValidation/IncidentFormType';
512
import { formatFormToRaw } from 'utils/formatFormToRaw';
613

714
describe('formatFormToRaw', () => {
8-
const formValues = {
9-
region: {
10-
province: ['01'],
11-
district: ['0102'],
12-
commune: ['010203'],
13-
village: 'village',
14-
},
15-
interviewer: 'tester',
16-
disTyp: '1',
17-
phone: '012',
18-
reportDate: dayjs('2024-01-02'),
19-
incidentDate: dayjs('2024-01-01'),
20-
specific: {
21-
NumFamAff: 50,
22-
floodN: '3',
23-
FarmAff: 31,
24-
},
25-
} as unknown as FloodFormType;
26-
2715
it('stringifies numeric DataGrid values and omits unmapped keys', () => {
16+
const formValues = {
17+
region: {
18+
province: ['01'],
19+
district: ['0102'],
20+
commune: ['010203'],
21+
village: 'village',
22+
},
23+
interviewer: 'tester',
24+
disTyp: '1',
25+
phone: '012',
26+
reportDate: dayjs('2024-01-02'),
27+
incidentDate: dayjs('2024-01-01'),
28+
specific: {
29+
NumFamAff: 50,
30+
floodN: '3',
31+
FarmAff: 31,
32+
},
33+
} as unknown as FloodFormType;
34+
2835
const raw = formatFormToRaw(formValues, koboKeys[FLOOD], floodSpecificKeys);
2936

3037
expect(raw['g3/g3_1/g3_2/NumFamAff']).toBe('50');
@@ -33,4 +40,34 @@ describe('formatFormToRaw', () => {
3340
expect(raw).not.toHaveProperty('g11/g11_1/FarmAff');
3441
expect(raw).not.toHaveProperty('undefined');
3542
});
43+
44+
it('writes incident factory fields to current Kobo xpaths', () => {
45+
const incidentValues = {
46+
region: {
47+
province: ['05'],
48+
district: ['0503'],
49+
commune: ['050303'],
50+
village: 'village',
51+
},
52+
interviewer: 'tester',
53+
disTyp: '11',
54+
phone: '012',
55+
reportDate: dayjs('2024-01-02'),
56+
incidentDate: dayjs('2024-01-01'),
57+
specific: {
58+
FactoryAff: 7,
59+
FactoryDam: 4,
60+
},
61+
} as unknown as IncidentFormType;
62+
63+
const raw = formatFormToRaw(
64+
incidentValues,
65+
koboKeys[INCIDENT],
66+
incidentSpecificKeys,
67+
);
68+
69+
expect(raw['group_pk03i04/group_az7bv13/FactoryAff']).toBe('7');
70+
expect(raw['group_pk03i04/group_az7bv13/FactoryDam']).toBe('4');
71+
expect(raw).not.toHaveProperty('group_gh6ag70/group_az7bv13/FactoryAff');
72+
});
3673
});
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import { FloodDto, IncidentDto } from '@wfp-dmp/interfaces';
2+
3+
import { formatFloodFields, formatIncidentFields } from 'utils/formatRawToForm';
4+
5+
const baseFlood = {
6+
_id: 816716609,
7+
'formhub/uuid': 'uid',
8+
start: '2026-09-03T00:00:00.000Z',
9+
end: '2026-09-03T00:00:00.000Z',
10+
'g1/q_Enum': 'admin',
11+
'g1/Date_report': '2026-09-03',
12+
'g2/Province': '24',
13+
'g2/District': '2401',
14+
'g2/Commune': '240103',
15+
'g2/Date_Dis': '2026-09-03',
16+
'g2/DisTyp': '1',
17+
__version__: 'version',
18+
'meta/instanceID': 'uuid',
19+
_xform_id_string: 'ids',
20+
_uuid: 'uid',
21+
_attachments: [],
22+
_status: 'submitted_via_web',
23+
_geolocation: [null, null],
24+
_submission_time: '2026-09-03T08:00:00',
25+
_tags: [],
26+
_notes: [],
27+
_validation_status: {},
28+
_submitted_by: null,
29+
} as FloodDto;
30+
31+
describe('formatFloodFields agriculture mapping', () => {
32+
it('maps current Kobo agriculture xpaths into review fields', () => {
33+
const formatted = formatFloodFields({
34+
...baseFlood,
35+
'g11/ToNamAgriAff': '33',
36+
'g11/NumFarmCroAff': '32',
37+
'g11/Crop/FarmAff': '31',
38+
'g11/Crop/FarmDam': '30',
39+
'g11/NumFarmPaddyAff': '29',
40+
'g11/g11_2/SamNabAff': '28',
41+
} as FloodDto);
42+
43+
expect(formatted.ToNamAgriAff).toBe('33');
44+
expect(formatted.NumFarmCroAff).toBe('32');
45+
expect(formatted.FarmAff).toBe('31');
46+
expect(formatted.FarmDam).toBe('30');
47+
expect(formatted.NumFarmPaddyAff).toBe('29');
48+
expect(formatted.SamNabAff).toBe('28');
49+
});
50+
});
51+
52+
const baseIncident = {
53+
_id: 3,
54+
'formhub/uuid': 'uid',
55+
start: '2026-09-03T00:00:00.000Z',
56+
end: '2026-09-03T00:00:00.000Z',
57+
'G1/q_Enum': 'admin',
58+
'G1/Date_report': '2026-09-03',
59+
'G2/Province': '05',
60+
'G2/District': '0503',
61+
'G2/Commune': '050303',
62+
'G2/Date_Dis': '2026-09-03',
63+
'G2/DisTyp': '11',
64+
__version__: 'version',
65+
'meta/instanceID': 'uuid',
66+
_xform_id_string: 'ids',
67+
_uuid: 'uid',
68+
_attachments: [],
69+
_status: 'submitted_via_web',
70+
_geolocation: [null, null],
71+
_submission_time: '2026-09-03T08:00:00',
72+
_tags: [],
73+
_notes: [],
74+
_validation_status: {},
75+
_submitted_by: null,
76+
} as IncidentDto;
77+
78+
describe('formatIncidentFields factory mapping', () => {
79+
it('maps current Kobo factory xpaths into review fields', () => {
80+
const formatted = formatIncidentFields({
81+
...baseIncident,
82+
'group_pk03i04/group_az7bv13/FactoryAff': '7',
83+
'group_pk03i04/group_az7bv13/FactoryDam': '4',
84+
'group_gh6ag70/group_na4yi04/CropAff': '2',
85+
} as IncidentDto);
86+
87+
expect(formatted.FactoryAff).toBe('7');
88+
expect(formatted.FactoryDam).toBe('4');
89+
expect(formatted.CropAff).toBe('2');
90+
});
91+
});

‎packages/interfaces/src/kobo/IncidentDto.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ export class IncidentDto {
8585
@IsOptional() @IsNumberString() readonly 'group_pk03i04/group_lf9ou90/StorageDam'?: string;
8686
@IsOptional() @IsNumberString() readonly 'group_pk03i04/group_ub2hp14/CraftAff'?: string;
8787
@IsOptional() @IsNumberString() readonly 'group_pk03i04/group_ub2hp14/CraftDam'?: string;
88+
@IsOptional() @IsNumberString() readonly 'group_pk03i04/group_az7bv13/FactoryAff'?: string;
89+
@IsOptional() @IsNumberString() readonly 'group_pk03i04/group_az7bv13/FactoryDam'?: string;
8890
@IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_na4yi04/CropAff'?: string;
8991
@IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_na4yi04/CropDam'?: string;
90-
@IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_az7bv13/FactoryAff'?: string;
91-
@IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_az7bv13/FactoryDam'?: string;
9292
@IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_yh83p68/SamnabAff'?: string;
9393
@IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_yh83p68/SamnabDam'?: string;
9494
@IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_en38q31/PaddyAff'?: string;

‎packages/interfaces/src/kobo/mapping/incident.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ export const incidentSpecificKeys = {
134134
[IncidentSpecific.CraftDam]: 'group_pk03i04/group_ub2hp14/CraftDam',
135135
[IncidentSpecific.CropAff]: 'group_gh6ag70/group_na4yi04/CropAff',
136136
[IncidentSpecific.CropDam]: 'group_gh6ag70/group_na4yi04/CropDam',
137-
[IncidentSpecific.FactoryAff]: 'group_gh6ag70/group_az7bv13/FactoryAff',
138-
[IncidentSpecific.FactoryDam]: 'group_gh6ag70/group_az7bv13/FactoryDam',
137+
[IncidentSpecific.FactoryAff]: 'group_pk03i04/group_az7bv13/FactoryAff',
138+
[IncidentSpecific.FactoryDam]: 'group_pk03i04/group_az7bv13/FactoryDam',
139139
[IncidentSpecific.SamnabAff]: 'group_gh6ag70/group_yh83p68/SamnabAff',
140140
[IncidentSpecific.SamnabDam]: 'group_gh6ag70/group_yh83p68/SamnabDam',
141141
[IncidentSpecific.PaddyAff]: 'group_gh6ag70/group_en38q31/PaddyAff',

0 commit comments

Comments
 (0)